Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into dependabot/maven/li…
Browse files Browse the repository at this point in the history
…quibase-dist/com.h2database-h2-2.0.202
  • Loading branch information
nvoxland committed Dec 22, 2021
2 parents 5c1a4af + 83535ee commit 9e426ee
Show file tree
Hide file tree
Showing 11 changed files with 89 additions and 68 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package liquibase.database.core;

import liquibase.database.DatabaseConnection;
import liquibase.exception.DatabaseException;
import liquibase.statement.SqlStatement;
import liquibase.statement.core.RawSqlStatement;

public class EnterpriseDBDatabase extends PostgresDatabase {

@Override
public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException {
final String url = conn.getURL();
return url.contains("edb") || (url.contains("postgres") && url.contains(":5444"));
}

@Override
public String getShortName() {
return "edb";
}

@Override
public int getPriority() {
return PRIORITY_DATABASE + 5;
}


@Override
public String getDefaultDriver(String url) {
if (url.startsWith("jdbc:edb:")) {
return "com.edb.Driver";
}
return null;
}

@Override
public Integer getDefaultPort() {
return 5444;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,6 @@ public class PostgresDatabase extends AbstractJdbcDatabase {
private static final int PGSQL_DEFAULT_TCP_PORT_NUMBER = 5432;
private static final Logger LOG = Scope.getCurrentScope().getLog(PostgresDatabase.class);

/**
* Represents Postgres DB types.
* Note: As we know COMMUNITY, RDS and AWS AURORA have the same Postgres engine. We use just COMMUNITY for those 3
* If we need we can extend this ENUM in future
*/
public enum DbTypes {
EDB, COMMUNITY, RDS, AURORA
}

private Set<String> systemTablesAndViews = new HashSet<>();

private Set<String> reservedWords = new HashSet<>();
Expand Down Expand Up @@ -415,22 +406,4 @@ public String getDatabaseFullVersion() throws DatabaseException {

throw new DatabaseException("Connection set to Postgres type we don't support !");
}

/**
* Method to get Postgres DB type
* @return Db types
* */
public DbTypes getDbType() {
boolean enterpriseDb = false;
try {
enterpriseDb = getDatabaseFullVersion().toLowerCase().contains("enterprisedb");
} catch (DatabaseException e) {
if (getConnection() != null) {
Scope.getCurrentScope().getLog(getClass()).severe("Can't get full version of Postgres DB. Used EDB as default", e);
return DbTypes.EDB;
}
}
return enterpriseDb ? DbTypes.EDB : DbTypes.COMMUNITY;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@
import liquibase.structure.core.Table;
import liquibase.util.StringUtil;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class ForeignKeyComparator implements DatabaseObjectComparator {
Expand All @@ -28,11 +26,16 @@ public int getPriority(Class<? extends DatabaseObject> objectType, Database data

@Override
public String[] hash(DatabaseObject databaseObject, Database accordingTo, DatabaseObjectComparatorChain chain) {
Set<String> hashes = new HashSet<>();
hashes.addAll(Arrays.asList(DatabaseObjectComparatorFactory.getInstance().hash(((ForeignKey) databaseObject).getForeignKeyTable(), null, accordingTo)));
hashes.addAll(Arrays.asList(chain.hash(databaseObject, accordingTo)));

return hashes.toArray(new String[hashes.size()]);
ForeignKey fk = (ForeignKey) databaseObject;
if (databaseObject.getName() == null) {
return DatabaseObjectComparatorFactory.getInstance().hash(fk.getForeignKeyTable(), chain.getSchemaComparisons(), accordingTo);
} else {
if ((fk.getForeignKeyTable() == null) || (fk.getForeignKeyTable().getName() == null)) {
return new String[]{fk.getName().toLowerCase()};
} else {
return new String[]{fk.getName().toLowerCase(), fk.getForeignKeyTable().getName().toLowerCase()};
}
}
}


Expand All @@ -45,40 +48,46 @@ public boolean isSameObject(DatabaseObject databaseObject1, DatabaseObject datab
ForeignKey thisForeignKey = (ForeignKey) databaseObject1;
ForeignKey otherForeignKey = (ForeignKey) databaseObject2;

if ((thisForeignKey.getName() != null) && (otherForeignKey.getName() != null)) {
if (chain.isSameObject(thisForeignKey, otherForeignKey, accordingTo)) {
return true;
if ((thisForeignKey.getPrimaryKeyTable() == null) || (thisForeignKey.getForeignKeyTable() == null) ||
(otherForeignKey.getPrimaryKeyTable() == null) || (otherForeignKey.getForeignKeyTable() == null)) {
//not all table information is set, have to rely on name

if (thisForeignKey.getForeignKeyTable() != null && otherForeignKey.getForeignKeyTable() != null) {
//FK names are not necessarily unique across all tables, so first check if FK tables are different
if (!chain.isSameObject(thisForeignKey.getForeignKeyTable(), otherForeignKey.getForeignKeyTable(), accordingTo)) {
return false;
}
}
}

if ((thisForeignKey.getPrimaryKeyTable() == null) || (thisForeignKey.getForeignKeyTable() == null) ||
(otherForeignKey.getPrimaryKeyTable() == null) || (otherForeignKey.getForeignKeyTable() == null)) {
return false; //tables not set, have to rely on name
if ((thisForeignKey.getName() != null) && (otherForeignKey.getName() != null)) {
if(accordingTo.isCaseSensitive()) {
return thisForeignKey.getName().equals(otherForeignKey.getName());
} else {
return thisForeignKey.getName().equalsIgnoreCase(otherForeignKey.getName());
}
} else {
return false;
}
}

if ((thisForeignKey.getForeignKeyColumns() != null) && (thisForeignKey.getPrimaryKeyColumns() != null) &&
(otherForeignKey.getForeignKeyColumns() != null) && (otherForeignKey.getPrimaryKeyColumns() != null)) {
boolean columnsTheSame;
StringUtil.StringUtilFormatter formatter = new StringUtil.StringUtilFormatter<Column>() {
@Override
public String toString(Column obj) {
return obj.toString(false);
}
};
(otherForeignKey.getForeignKeyColumns() != null) && (otherForeignKey.getPrimaryKeyColumns() != null)) {
boolean columnsTheSame;
StringUtil.StringUtilFormatter<Column> formatter = obj -> obj.toString(false);

if (accordingTo.isCaseSensitive()) {
if (accordingTo.isCaseSensitive()) {
columnsTheSame = StringUtil.join(thisForeignKey.getForeignKeyColumns(), ",", formatter).equals(StringUtil.join(otherForeignKey.getForeignKeyColumns(), ",", formatter)) &&
StringUtil.join(thisForeignKey.getPrimaryKeyColumns(), ",", formatter).equals(StringUtil.join(otherForeignKey.getPrimaryKeyColumns(), ",", formatter));
} else {
} else {
columnsTheSame = StringUtil.join(thisForeignKey.getForeignKeyColumns(), ",", formatter).equalsIgnoreCase(StringUtil.join(otherForeignKey.getForeignKeyColumns(), ",", formatter)) &&
StringUtil.join(thisForeignKey.getPrimaryKeyColumns(), ",", formatter).equalsIgnoreCase(StringUtil.join(otherForeignKey.getPrimaryKeyColumns(), ",", formatter));
}
}

return columnsTheSame &&
DatabaseObjectComparatorFactory.getInstance().isSameObject(thisForeignKey.getForeignKeyTable(), otherForeignKey.getForeignKeyTable(), chain.getSchemaComparisons(), accordingTo) &&
DatabaseObjectComparatorFactory.getInstance().isSameObject(thisForeignKey.getPrimaryKeyTable(), otherForeignKey.getPrimaryKeyTable(), chain.getSchemaComparisons(), accordingTo);
return columnsTheSame &&
DatabaseObjectComparatorFactory.getInstance().isSameObject(thisForeignKey.getForeignKeyTable(), otherForeignKey.getForeignKeyTable(), chain.getSchemaComparisons(), accordingTo) &&
DatabaseObjectComparatorFactory.getInstance().isSameObject(thisForeignKey.getPrimaryKeyTable(), otherForeignKey.getPrimaryKeyTable(), chain.getSchemaComparisons(), accordingTo);

}
}

return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,7 @@ public static void surroundWithSchemaSets(List<Sql> sql, String schemaName, Data
}

if (!originalSearchPath.equals(schemaName) && !originalSearchPath.startsWith(schemaName + ",") && !originalSearchPath.startsWith("\"" + schemaName + "\",")) {
PostgresDatabase.DbTypes dbType = ((PostgresDatabase) database).getDbType();
if (PostgresDatabase.DbTypes.EDB.equals(dbType)){
if (database instanceof EnterpriseDBDatabase){
sql.add(0, new UnparsedSql("ALTER SESSION SET SEARCH_PATH TO " + database.escapeObjectName(defaultSchema, Schema.class) + ", " + originalSearchPath));
sql.add(new UnparsedSql("ALTER SESSION SET CURRENT SCHEMA " + originalSearchPath));
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ liquibase.database.core.CockroachDatabase
liquibase.database.core.DB2Database
liquibase.database.core.Db2zDatabase
liquibase.database.core.DerbyDatabase
liquibase.database.core.EnterpriseDBDatabase
liquibase.database.core.Firebird3Database
liquibase.database.core.FirebirdDatabase
liquibase.database.core.H2Database
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ public void computedDatabasesCorrect(){

ChangeParameterMetaData replaceIfExists = Scope.getCurrentScope().getSingleton(ChangeFactory.class).getChangeMetaData(new CreateViewChange()).getParameters().get("replaceIfExists");
assertSetsEqual(new String[]{}, replaceIfExists.analyzeRequiredDatabases(new String[]{ChangeParameterMetaData.COMPUTE}));
assertSetsEqual(new String[]{"sybase","mssql","postgresql","cockroachdb","firebird","oracle","sqlite","mysql","mariadb","h2","hsqldb","db2", "ingres"}, replaceIfExists.analyzeSupportedDatabases(new String[]{ChangeParameterMetaData.COMPUTE}));
assertSetsEqual(new String[]{"sybase","mssql","postgresql","cockroachdb","firebird","oracle","sqlite","mysql","mariadb","h2","hsqldb","db2", "ingres", "edb"}, replaceIfExists.analyzeSupportedDatabases(new String[]{ChangeParameterMetaData.COMPUTE}));
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ protected List<? extends SqlStatement> setupStatements(Database database) {
public void noSchema() throws Exception {
this.statementUnderTest = new AddAutoIncrementStatement(null, null, TABLE_NAME, COLUMN_NAME, "int", null, null, null, null);

assertCorrect("alter table [table_name] modify column_name integer generated by default as identity", PostgresDatabase.class, CockroachDatabase.class);
assertCorrect("alter table [table_name] modify column_name integer generated by default as identity", PostgresDatabase.class, CockroachDatabase.class, EnterpriseDBDatabase.class);
assertCorrect("alter table table_name modify column_name int auto_increment", MySQLDatabase.class);
assertCorrect("ALTER TABLE [table_name] ALTER COLUMN [column_name] SET GENERATED BY DEFAULT AS IDENTITY", DB2Database.class);
assertCorrect("alter table table_name alter column column_name int generated by default as identity", HsqlDatabase.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public void execute_noSchema() throws Exception {
assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq)", MySQLDatabase.class);
assertCorrect("alter table adduqtest add constraint unique (coltomakeuq) constraint uq_test", InformixDatabase.class);
assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq)", OracleDatabase.class);
assertCorrect("alter table \"adduqtest\" add constraint uq_test unique (\"coltomakeuq\")", PostgresDatabase.class, CockroachDatabase.class);
assertCorrect("alter table \"adduqtest\" add constraint uq_test unique (\"coltomakeuq\")", PostgresDatabase.class, CockroachDatabase.class, EnterpriseDBDatabase.class);
assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq)", DerbyDatabase.class);
assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq])");
assertCorrect(" alter table adduqtest add constraint \"primary\" primary key (id ASC, coltomakeuq DESC)", CockroachDatabase.class);
Expand All @@ -114,7 +114,7 @@ public void execute_noConstraintName() throws Exception {
assertCorrect("alter table adduqtest add unique (coltomakeuq)", MySQLDatabase.class);
assertCorrect("alter table adduqtest add constraint unique (coltomakeuq)", InformixDatabase.class);
assertCorrect("alter table adduqtest add unique (coltomakeuq)", OracleDatabase.class);
assertCorrect("alter table \"adduqtest\" add unique (\"coltomakeuq\")", PostgresDatabase.class, CockroachDatabase.class);
assertCorrect("alter table \"adduqtest\" add unique (\"coltomakeuq\")", PostgresDatabase.class, CockroachDatabase.class, EnterpriseDBDatabase.class);
assertCorrect("alter table adduqtest add unique (coltomakeuq)", DerbyDatabase.class);
assertCorrect("alter table [adduqtest] add unique ([coltomakeuq])", SybaseASADatabase.class, SybaseDatabase.class);
assertCorrect("alter table [adduqtest] add unique ([coltomakeuq])", MSSQLDatabase.class);
Expand Down Expand Up @@ -146,7 +146,7 @@ public void execute_withSchema() throws Exception {
"uq_test", InformixDatabase.class);

assertCorrect("alter table liquibasec.adduqtest add constraint uq_test unique (coltomakeuq)", OracleDatabase.class);
assertCorrect("alter table liquibaseb.\"adduqtest\" add constraint uq_test unique (\"coltomakeuq\")", PostgresDatabase.class, CockroachDatabase.class);
assertCorrect("alter table liquibaseb.\"adduqtest\" add constraint uq_test unique (\"coltomakeuq\")", PostgresDatabase.class, CockroachDatabase.class,EnterpriseDBDatabase.class);
assertCorrect("alter table liquibasec.adduqtest add constraint uq_test unique (coltomakeuq)", DerbyDatabase
.class);
assertCorrect("alter table [liquibaseb].[adduqtest] add constraint [uq_test] unique ([coltomakeuq])",
Expand All @@ -170,7 +170,7 @@ public void execute_withTablespace() throws Exception {
assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq])", SybaseASADatabase.class, SybaseDatabase.class);
assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq]) on liquibase2", MSSQLDatabase.class);
assertCorrect("alter table adduqtest add constraint unique (coltomakeuq) constraint uq_test", InformixDatabase.class);
assertCorrect("alter table \"adduqtest\" add constraint uq_test unique (\"coltomakeuq\") USING INDEX TABLESPACE " + TABLESPACE_NAME, PostgresDatabase.class);
assertCorrect("alter table \"adduqtest\" add constraint uq_test unique (\"coltomakeuq\") USING INDEX TABLESPACE " + TABLESPACE_NAME, PostgresDatabase.class, EnterpriseDBDatabase.class);
assertCorrect("alter table \"adduqtest\" add constraint uq_test unique (\"coltomakeuq\")", CockroachDatabase.class);
assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq)", MySQLDatabase.class);
assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq)", MariaDBDatabase.class);
Expand All @@ -192,7 +192,7 @@ public void execute_withDefferedAndDisabled() throws Exception {
assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq) DEFERRABLE INITIALLY " +
"DEFERRED DISABLE", OracleDatabase.class);
assertCorrect("ALTER TABLE \"adduqtest\" ADD CONSTRAINT uq_test unique (\"coltomakeuq\") DEFERRABLE INITIALLY" +
" DEFERRED", PostgresDatabase.class, CockroachDatabase.class);
" DEFERRED", PostgresDatabase.class, CockroachDatabase.class, EnterpriseDBDatabase.class);
assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq)", DerbyDatabase.class);
assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq])");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ public void generate() throws Exception {
"[locked] boolean not null, " +
"[lockgranted] datetime, " +
"[lockedby] varchar(255), " +
"constraint [databasechangeloglock_pkey] primary key ([id]))"}, PostgresDatabase.class, CockroachDatabase.class);
"constraint [databasechangeloglock_pkey] primary key ([id]))"}, PostgresDatabase.class, CockroachDatabase.class, EnterpriseDBDatabase.class);

assertCorrect(new String[]{"create table [databasechangeloglock] (" +
"[id] int not null, " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ public void generateSql_insert() throws Exception {
"('a', 'b', 'c', now(), 1, " +
"'8:d41d8cd98f00b204e9800998ecf8427e', 'empty', '', 'executed', 'e', null, '" + version + "'," +
" null)",
PostgresDatabase.class, H2Database.class, CockroachDatabase.class);
PostgresDatabase.class, H2Database.class, CockroachDatabase.class, EnterpriseDBDatabase.class);
assertCorrect("insert into databasechangelog (id, author, filename, dateexecuted, orderexecuted, " +
"md5sum, description, comments, exectype, contexts, labels, liquibase, deployment_id) values " +
"('a', 'b', 'c', date('now'), 1, " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public void generateSql() throws Exception {
assertCorrect("update [databasechangeloglock] set [locked] = 0, [lockedby] = null, [lockgranted] = null where [id] = 1", MSSQLDatabase.class, SybaseDatabase.class);
assertCorrect("update [databasechangeloglock] set [locked] = 0, [lockedby] = null, [lockgranted] = null where [id] = 1", MSSQLDatabase.class, SybaseASADatabase.class);
assertCorrect("update [databasechangeloglock] set [locked] = 'f', [lockedby] = null, [lockgranted] = null where [id] = 1", InformixDatabase.class);
assertCorrect("update [databasechangeloglock] set [locked] = false, [lockedby] = null, [lockgranted] = null where [id] = 1", PostgresDatabase.class, CockroachDatabase.class, HsqlDatabase.class, H2Database.class, Ingres9Database.class, Firebird3Database.class);
assertCorrect("update [databasechangeloglock] set [locked] = false, [lockedby] = null, [lockgranted] = null where [id] = 1", PostgresDatabase.class, CockroachDatabase.class, EnterpriseDBDatabase.class, HsqlDatabase.class, H2Database.class, Ingres9Database.class, Firebird3Database.class);
assertCorrectOnRest("update [databasechangeloglock] set [locked] = 0, [lockedby] = null, [lockgranted] = null where [id] = 1");
}
}

0 comments on commit 9e426ee

Please sign in to comment.