Skip to content

Commit

Permalink
Recognize jdbc:edb urls as a distinct EnterpriseDB dialect (#2244)
Browse files Browse the repository at this point in the history
* added new EnterpriseDB dialect support
* Removed old/unused Postgresql DbTypes enum
* Updated code to use standard "instanceof EnterpriseDBDatabase" style vs. getDbType() logic

Co-authored-by: Nathan Voxland <nathan@voxland.net>
  • Loading branch information
szandany and nvoxland committed Dec 21, 2021
1 parent f62273e commit 83535ee
Show file tree
Hide file tree
Showing 10 changed files with 51 additions and 39 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 @@ -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 83535ee

Please sign in to comment.