From 4281f9cdacd5f7b709599e710e1c3089a4a1780c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Dec 2021 05:42:18 +0000 Subject: [PATCH 1/4] Bump h2 from 1.4.200 to 2.0.202 in /liquibase-dist Bumps [h2](https://github.com/h2database/h2database) from 1.4.200 to 2.0.202. - [Release notes](https://github.com/h2database/h2database/releases) - [Commits](https://github.com/h2database/h2database/compare/version-1.4.200...version-2.0.202) --- updated-dependencies: - dependency-name: com.h2database:h2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- liquibase-dist/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liquibase-dist/pom.xml b/liquibase-dist/pom.xml index 9fc54dc9d4e..8e125d12105 100644 --- a/liquibase-dist/pom.xml +++ b/liquibase-dist/pom.xml @@ -19,7 +19,7 @@ github https://maven.pkg.github.com/liquibase - 1.4.200 + 2.0.202 2.5.2 42.2.15 8.4.0.jre8 From 6c8a05c8dbb3281faa566cb01533d592e4e405e7 Mon Sep 17 00:00:00 2001 From: Nathan Voxland Date: Tue, 21 Dec 2021 11:59:55 -0600 Subject: [PATCH 2/4] Fixed failing integration tests under h2 2.0 --- .../StandardChangeLogHistoryService.java | 2 +- .../liquibase/database/core/H2Database.java | 31 +++++++++++++++++-- .../liquibase/datatype/core/BlobType.java | 3 ++ .../liquibase/datatype/core/CharType.java | 7 ++++- .../liquibase/datatype/core/DoubleType.java | 7 +++-- .../snapshot/JdbcDatabaseSnapshot.java | 19 ++++++++++++ .../snapshot/jvm/IndexSnapshotGenerator.java | 2 +- .../jvm/SequenceSnapshotGenerator.java | 9 +++++- .../UniqueConstraintSnapshotGenerator.java | 26 +++++++++++++++- pom.xml | 2 +- 10 files changed, 98 insertions(+), 10 deletions(-) diff --git a/liquibase-core/src/main/java/liquibase/changelog/StandardChangeLogHistoryService.java b/liquibase-core/src/main/java/liquibase/changelog/StandardChangeLogHistoryService.java index 30828191a30..05f9d4667b9 100644 --- a/liquibase-core/src/main/java/liquibase/changelog/StandardChangeLogHistoryService.java +++ b/liquibase-core/src/main/java/liquibase/changelog/StandardChangeLogHistoryService.java @@ -137,7 +137,7 @@ public void init() throws DatabaseException { boolean checksumNotRightSize = false; if (!(this.getDatabase() instanceof SQLiteDatabase)) { DataType type = changeLogTable.getColumn("MD5SUM").getType(); - if (type.getTypeName().toLowerCase().startsWith("varchar")) { + if (type.getTypeName().toLowerCase().startsWith("varchar") || type.getTypeName().toLowerCase().startsWith("character varying")) { Integer columnSize = type.getColumnSize(); checksumNotRightSize = (columnSize != null) && (columnSize < 35); } else { diff --git a/liquibase-core/src/main/java/liquibase/database/core/H2Database.java b/liquibase-core/src/main/java/liquibase/database/core/H2Database.java index 5c6e2eb97f5..35802bd8863 100644 --- a/liquibase-core/src/main/java/liquibase/database/core/H2Database.java +++ b/liquibase-core/src/main/java/liquibase/database/core/H2Database.java @@ -34,21 +34,31 @@ public class H2Database extends AbstractJdbcDatabase { private static List keywords = Arrays.asList( "ALL", "AND", + "ANY", "ARRAY", "AS", + "ASYMMETRIC", + "AUTHORIZATION", "BETWEEN", "BOTH", "CASE", + "CAST", "CHECK", "CONSTRAINT", "CROSS", "CURRENT_CATALOG", "CURRENT_DATE", + "CURRENT_PATH", + "CURRENT_ROLE", "CURRENT_SCHEMA", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", + "DAY", + "DEFAULT", "DISTINCT", + "ELSE", + "END", "EXCEPT", "EXISTS", "FALSE", @@ -61,15 +71,19 @@ public class H2Database extends AbstractJdbcDatabase { "GROUP", "GROUPS", "HAVING", + "HOUR", "IF", "ILIKE", "IN", + "ILIKE", + "IN", "INNER", "INTERSECT", "INTERSECTS", "INTERVAL", "IS", "JOIN", + "KEY", "LEADING", "LEFT", "LIKE", @@ -77,6 +91,8 @@ public class H2Database extends AbstractJdbcDatabase { "LOCALTIME", "LOCALTIMESTAMP", "MINUS", + "MINUTE", + "MONTH", "NATURAL", "NOT", "NULL", @@ -92,26 +108,37 @@ public class H2Database extends AbstractJdbcDatabase { "REGEXP", "RIGHT", "ROW", - "_ROWID_", "ROWNUM", "ROWS", "SELECT", + "SESSION_USER", + "SET", + "SOME", + "SYMMETRIC", + "SYSTEM_USER", "SYSDATE", "SYSTIME", "SYSTIMESTAMP", "TABLE", + "TO", "TODAY", "TOP", "TRAILING", "TRUE", + "UNESCAPE", "UNION", "UNIQUE", "UNKNOWN", + "USER", "USING", + "VALUE", "VALUES", + "WHEN", "WHERE", "WINDOW", - "WITH" + "WITH", + "YEAR", + "_ROWID_" ); private String connectionSchemaName = "PUBLIC"; diff --git a/liquibase-core/src/main/java/liquibase/datatype/core/BlobType.java b/liquibase-core/src/main/java/liquibase/datatype/core/BlobType.java index 497899e209b..7e9129de57e 100644 --- a/liquibase-core/src/main/java/liquibase/datatype/core/BlobType.java +++ b/liquibase-core/src/main/java/liquibase/datatype/core/BlobType.java @@ -20,6 +20,9 @@ public DatabaseDataType toDatabaseDataType(Database database) { String originalDefinition = StringUtil.trimToEmpty(getRawDefinition()); if ((database instanceof H2Database) || (database instanceof HsqlDatabase)) { + if (originalDefinition.toLowerCase(Locale.US).contains("large object")) { + return new DatabaseDataType("BINARY LARGE OBJECT"); + } if (originalDefinition.toLowerCase(Locale.US).startsWith("varbinary") || originalDefinition.startsWith("java.sql.Types.VARBINARY")) { return new DatabaseDataType("VARBINARY", getParameters()); } else if (originalDefinition.toLowerCase(Locale.US).startsWith("longvarbinary") || originalDefinition.startsWith("java.sql.Types.LONGVARBINARY")) { diff --git a/liquibase-core/src/main/java/liquibase/datatype/core/CharType.java b/liquibase-core/src/main/java/liquibase/datatype/core/CharType.java index 57a161435c9..0f1db8d1fcd 100644 --- a/liquibase-core/src/main/java/liquibase/datatype/core/CharType.java +++ b/liquibase-core/src/main/java/liquibase/datatype/core/CharType.java @@ -2,6 +2,7 @@ import liquibase.change.core.LoadDataChange; import liquibase.database.Database; +import liquibase.database.core.H2Database; import liquibase.database.core.MSSQLDatabase; import liquibase.database.core.PostgresDatabase; import liquibase.datatype.DataTypeInfo; @@ -14,7 +15,7 @@ import java.util.Arrays; import java.util.Locale; -@DataTypeInfo(name="char", aliases = {"java.sql.Types.CHAR", "bpchar"}, minParameters = 0, maxParameters = 1, priority = LiquibaseDataType.PRIORITY_DEFAULT) +@DataTypeInfo(name="char", aliases = {"java.sql.Types.CHAR", "bpchar", "character"}, minParameters = 0, maxParameters = 1, priority = LiquibaseDataType.PRIORITY_DEFAULT) public class CharType extends LiquibaseDataType { @Override public DatabaseDataType toDatabaseDataType(Database database) { @@ -45,6 +46,10 @@ public DatabaseDataType toDatabaseDataType(Database database) { return type; } return super.toDatabaseDataType(database); + } else if (database instanceof H2Database) { + if (getRawDefinition().toLowerCase(Locale.US).contains("large object")) { + return new DatabaseDataType("CHARACTER LARGE OBJECT"); + } } return super.toDatabaseDataType(database); diff --git a/liquibase-core/src/main/java/liquibase/datatype/core/DoubleType.java b/liquibase-core/src/main/java/liquibase/datatype/core/DoubleType.java index 5fde7ba7f7d..052fe4d4d54 100644 --- a/liquibase-core/src/main/java/liquibase/datatype/core/DoubleType.java +++ b/liquibase-core/src/main/java/liquibase/datatype/core/DoubleType.java @@ -21,10 +21,13 @@ public DatabaseDataType toDatabaseDataType(Database database) { return new DatabaseDataType("DOUBLE"); } } - if ((database instanceof AbstractDb2Database) || (database instanceof DerbyDatabase) || (database instanceof - HsqlDatabase)) { + if ((database instanceof AbstractDb2Database) || (database instanceof DerbyDatabase) || (database instanceof HsqlDatabase)) { return new DatabaseDataType("DOUBLE"); } + if (database instanceof H2Database && getRawDefinition().toLowerCase().contains("precision")) { + return new DatabaseDataType("DOUBLE PRECISION"); + } + if (database instanceof OracleDatabase) { return new DatabaseDataType("FLOAT", 24); } diff --git a/liquibase-core/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java b/liquibase-core/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java index 3520e7a4883..150f72d5d26 100644 --- a/liquibase-core/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java +++ b/liquibase-core/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java @@ -1653,6 +1653,25 @@ private String createSql(String catalogName, String schemaName, String tableName sql += " and systable.table_name = '" + tableName + "'"; } } else { + if (database instanceof H2Database) { + try { + if (database.getDatabaseMajorVersion() >= 2) { + sql = "select CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME " + + "from " + database.getSystemSchema() + ".table_constraints " + + "where constraint_schema='" + jdbcSchemaName + "' " + + "and constraint_catalog='" + jdbcCatalogName + "' " + + "and constraint_type='UNIQUE'"; + if (tableName != null) { + sql += " and table_name='" + tableName + "'"; + } + + return sql; + } + } catch (DatabaseException e) { + Scope.getCurrentScope().getLog(getClass()).fine("Cannot determine h2 version, using default unique constraint query"); + } + } + sql = "select CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME " + "from " + database.getSystemSchema() + ".constraints " + "where constraint_schema='" + jdbcSchemaName + "' " diff --git a/liquibase-core/src/main/java/liquibase/snapshot/jvm/IndexSnapshotGenerator.java b/liquibase-core/src/main/java/liquibase/snapshot/jvm/IndexSnapshotGenerator.java index 7588a6a1e9f..e4f034759d9 100644 --- a/liquibase-core/src/main/java/liquibase/snapshot/jvm/IndexSnapshotGenerator.java +++ b/liquibase-core/src/main/java/liquibase/snapshot/jvm/IndexSnapshotGenerator.java @@ -200,7 +200,7 @@ protected DatabaseObject snapshotObject(DatabaseObject example, DatabaseSnapshot continue; } - if (type == DatabaseMetaData.tableIndexStatistic) { + if (!(database instanceof H2Database) && type == DatabaseMetaData.tableIndexStatistic) { continue; } diff --git a/liquibase-core/src/main/java/liquibase/snapshot/jvm/SequenceSnapshotGenerator.java b/liquibase-core/src/main/java/liquibase/snapshot/jvm/SequenceSnapshotGenerator.java index c1583aaa90c..8e63809abb9 100644 --- a/liquibase-core/src/main/java/liquibase/snapshot/jvm/SequenceSnapshotGenerator.java +++ b/liquibase-core/src/main/java/liquibase/snapshot/jvm/SequenceSnapshotGenerator.java @@ -173,7 +173,14 @@ protected String getSelectSequenceSql(Schema schema, Database database) { } else if (database instanceof FirebirdDatabase) { return "SELECT TRIM(RDB$GENERATOR_NAME) AS SEQUENCE_NAME FROM RDB$GENERATORS WHERE RDB$SYSTEM_FLAG IS NULL OR RDB$SYSTEM_FLAG = 0"; } else if (database instanceof H2Database) { - return "SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA = '" + schema.getName() + "' AND IS_GENERATED=FALSE"; + try { + if (database.getDatabaseMajorVersion() <= 1) { + return "SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA = '" + schema.getName() + "' AND IS_GENERATED=FALSE"; + } + } catch (DatabaseException e) { + Scope.getCurrentScope().getLog(getClass()).fine("Cannot determine h2 version in order to generate sequence snapshot query"); + } + return "SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA = '" + schema.getName() + "'"; } else if (database instanceof HsqlDatabase) { return "SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SYSTEM_SEQUENCES WHERE SEQUENCE_SCHEMA = '" + schema.getName() + "'"; } else if (database instanceof InformixDatabase) { diff --git a/liquibase-core/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGenerator.java b/liquibase-core/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGenerator.java index 7adc7f56847..a9098ee6df9 100644 --- a/liquibase-core/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGenerator.java +++ b/liquibase-core/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGenerator.java @@ -330,9 +330,33 @@ protected List listConstraints(Table table, DatabaseSnapshot snapshot + "where KC.CONSTNAME = TC.CONSTNAME " + "and KC.TBCREATOR = TC.TBCREATOR " + "and TC.TYPE='U' " - + (bulkQuery? "" : "and KC.CONSTNAME='" + database.correctObjectName(name, UniqueConstraint.class) + "' ") + + (bulkQuery ? "" : "and KC.CONSTNAME='" + database.correctObjectName(name, UniqueConstraint.class) + "' ") + "and TC.TBCREATOR = '" + database.correctObjectName(schema.getName(), Schema.class) + "' " + "order by KC.COLSEQ"; + } else if (database instanceof H2Database && database.getDatabaseMajorVersion() >= 2) { + String catalogName = database.correctObjectName(schema.getCatalogName(), Catalog.class); + String schemaName = database.correctObjectName(schema.getName(), Schema.class); + String constraintName = database.correctObjectName(name, UniqueConstraint.class); + String tableName = database.correctObjectName(table.getName(), Table.class); + sql = "select table_constraints.CONSTRAINT_NAME, index_columns.COLUMN_NAME, table_constraints.constraint_schema as CONSTRAINT_CONTAINER " + + "from information_schema.table_constraints " + + "join information_schema.index_columns on index_columns.index_name=table_constraints.index_name " + + "where constraint_type='UNIQUE' "; + if (catalogName != null) { + sql += "and constraint_catalog='" + catalogName + "' "; + } + if (schemaName != null) { + sql += "and constraint_schema='" + schemaName + "' "; + } + + if (!bulkQuery) { + if (tableName != null) { + sql += "and table_constraints.table_name='" + tableName + "' "; + } + if (constraintName != null) { + sql += "and constraint_name='" + constraintName + "'"; + } + } } else { // If we do not have a specific handler for the RDBMS, we assume that the database has an // INFORMATION_SCHEMA we can use. This is a last-resort measure and might fail. diff --git a/pom.xml b/pom.xml index d213adccb17..5cbad23c91f 100644 --- a/pom.xml +++ b/pom.xml @@ -160,7 +160,7 @@ com.h2database h2 - 1.4.200 + 2.0.202 test From 65ad35683b3b975cf418398b2c4f9ea4b9380329 Mon Sep 17 00:00:00 2001 From: Nathan Voxland Date: Tue, 21 Dec 2021 13:53:58 -0600 Subject: [PATCH 3/4] Fixed failing integration tests under h2 2.0 --- .../integration/ant/DatabaseRollbackTaskTest.xml | 16 ++++++++-------- .../integration/ant/DropAllTaskTest.xml | 12 +++++------- .../ant/changelog/changelog-with-properties.xml | 4 ++-- .../ant/changelog/changelog-with-rollback.xml | 6 +++--- .../ant/changelog/simple-changelog.xml | 4 ++-- .../liquibase/integration/ant/sql/h2-setup.sql | 4 ++-- 6 files changed, 22 insertions(+), 24 deletions(-) diff --git a/liquibase-core/src/test/resources/liquibase/integration/ant/DatabaseRollbackTaskTest.xml b/liquibase-core/src/test/resources/liquibase/integration/ant/DatabaseRollbackTaskTest.xml index 4f1a23d72f7..fc5a46b7503 100644 --- a/liquibase-core/src/test/resources/liquibase/integration/ant/DatabaseRollbackTaskTest.xml +++ b/liquibase-core/src/test/resources/liquibase/integration/ant/DatabaseRollbackTaskTest.xml @@ -47,13 +47,13 @@ + table="TEST_USERS" count="1"/> + table="TEST_USERS" count="0"/> @@ -74,13 +74,13 @@ + table="TEST_USERS" count="1"/> + table="TEST_USERS" count="0"/> @@ -93,13 +93,13 @@ + table="TEST_USERS" count="1"/> + table="TEST_USERS" count="0"/> @@ -146,14 +146,14 @@ + table="TEST_USERS" count="1"/> + table="TEST_USERS" count="1"/> diff --git a/liquibase-core/src/test/resources/liquibase/integration/ant/DropAllTaskTest.xml b/liquibase-core/src/test/resources/liquibase/integration/ant/DropAllTaskTest.xml index 92c7da89e03..67c77402044 100644 --- a/liquibase-core/src/test/resources/liquibase/integration/ant/DropAllTaskTest.xml +++ b/liquibase-core/src/test/resources/liquibase/integration/ant/DropAllTaskTest.xml @@ -28,20 +28,18 @@ - + - + + table="TEST_USERS"/> + table="TEST_USERS"/> - \ No newline at end of file + diff --git a/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/changelog-with-properties.xml b/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/changelog-with-properties.xml index 901eedf0ab1..4ff73975784 100644 --- a/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/changelog-with-properties.xml +++ b/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/changelog-with-properties.xml @@ -3,9 +3,9 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.2.xsd"> - + - \ No newline at end of file + diff --git a/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/changelog-with-rollback.xml b/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/changelog-with-rollback.xml index 4193df57a76..3cc9bee21d4 100644 --- a/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/changelog-with-rollback.xml +++ b/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/changelog-with-rollback.xml @@ -3,12 +3,12 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.2.xsd"> - + - DELETE FROM users WHERE first_name = 'test' AND last_name = 'name' LIMIT 1; + DELETE FROM test_users WHERE first_name = 'test' AND last_name = 'name' LIMIT 1; - \ No newline at end of file + diff --git a/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/simple-changelog.xml b/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/simple-changelog.xml index 027053e5f51..551351c3c8e 100644 --- a/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/simple-changelog.xml +++ b/liquibase-core/src/test/resources/liquibase/integration/ant/changelog/simple-changelog.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.2.xsd"> - + @@ -24,4 +24,4 @@ - \ No newline at end of file + diff --git a/liquibase-core/src/test/resources/liquibase/integration/ant/sql/h2-setup.sql b/liquibase-core/src/test/resources/liquibase/integration/ant/sql/h2-setup.sql index 9517a7bf4d8..f16f8712634 100644 --- a/liquibase-core/src/test/resources/liquibase/integration/ant/sql/h2-setup.sql +++ b/liquibase-core/src/test/resources/liquibase/integration/ant/sql/h2-setup.sql @@ -1,5 +1,5 @@ -CREATE TABLE users ( - user_id BIGINT NOT NULL IDENTITY, +CREATE TABLE test_users ( + user_id BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, CONSTRAINT pk_users PRIMARY KEY (user_id) From 5c1a4af97fd297615afe6ff5c64870ca378f47f6 Mon Sep 17 00:00:00 2001 From: Nathan Voxland Date: Wed, 22 Dec 2021 07:48:21 -0600 Subject: [PATCH 4/4] Upgraded h2 version to 2.0.202 --- liquibase-dist/src/main/archive/examples/start-h2 | 5 +---- liquibase-dist/src/main/archive/examples/start-h2.bat | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/liquibase-dist/src/main/archive/examples/start-h2 b/liquibase-dist/src/main/archive/examples/start-h2 index 718090807bf..83793b84a41 100644 --- a/liquibase-dist/src/main/archive/examples/start-h2 +++ b/liquibase-dist/src/main/archive/examples/start-h2 @@ -35,7 +35,4 @@ else JAVA_PATH="${JAVA_HOME}/bin/java" fi - -# echo "${JAVA_PATH}" -cp "${LIQUIBASE_HOME}/lib/h2-1.4.200.jar:${LIQUIBASE_HOME}/liquibase.jar" liquibase.example.StartH2Main - -"${JAVA_PATH}" -cp "${LIQUIBASE_HOME}/lib/h2-1.4.200.jar:${LIQUIBASE_HOME}/liquibase.jar" liquibase.example.StartH2Main +"${JAVA_PATH}" -cp "${LIQUIBASE_HOME}/lib/h2-2.0.202.jar:${LIQUIBASE_HOME}/liquibase.jar" liquibase.example.StartH2Main diff --git a/liquibase-dist/src/main/archive/examples/start-h2.bat b/liquibase-dist/src/main/archive/examples/start-h2.bat index 21603ba57e4..41e8781eef5 100644 --- a/liquibase-dist/src/main/archive/examples/start-h2.bat +++ b/liquibase-dist/src/main/archive/examples/start-h2.bat @@ -31,4 +31,4 @@ if "%JAVA_HOME%"=="" ( set JAVA_PATH=%JAVA_HOME%\bin\java ) -"%JAVA_PATH%" -cp "%LIQUIBASE_HOME%\lib\h2-1.4.200.jar;%LIQUIBASE_HOME%\liquibase.jar" liquibase.example.StartH2Main +"%JAVA_PATH%" -cp "%LIQUIBASE_HOME%\lib\h2-2.0.202.jar;%LIQUIBASE_HOME%\liquibase.jar" liquibase.example.StartH2Main