From 0309c1f388ce7a1843560535cb3a10b4278fac87 Mon Sep 17 00:00:00 2001 From: yodzhubeiskyi Date: Thu, 28 Jul 2022 16:02:13 +0300 Subject: [PATCH 1/2] DAT-11181 Workaround to retrieve columnNames for uniqueConstraints in Snowflake --- ...eConstraintSnapshotGeneratorSnowflake.java | 57 ++++++++++++------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/liquibase-snowflake/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGeneratorSnowflake.java b/liquibase-snowflake/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGeneratorSnowflake.java index f855f177850..c90674e5f59 100644 --- a/liquibase-snowflake/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGeneratorSnowflake.java +++ b/liquibase-snowflake/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGeneratorSnowflake.java @@ -2,6 +2,7 @@ import liquibase.Scope; import liquibase.database.Database; +import liquibase.database.core.H2Database; import liquibase.database.core.SnowflakeDatabase; import liquibase.exception.DatabaseException; import liquibase.executor.ExecutorService; @@ -10,10 +11,8 @@ import liquibase.snapshot.SnapshotGenerator; import liquibase.statement.core.RawSqlStatement; import liquibase.structure.DatabaseObject; -import liquibase.structure.core.Relation; -import liquibase.structure.core.Schema; -import liquibase.structure.core.Table; -import liquibase.structure.core.UniqueConstraint; +import liquibase.structure.core.*; +import liquibase.util.StringUtil; import java.sql.SQLException; import java.util.List; @@ -31,6 +30,32 @@ public int getPriority(Class objectType, Database data } } + @Override + protected DatabaseObject snapshotObject(DatabaseObject example, DatabaseSnapshot snapshot) throws DatabaseException { + Database database = snapshot.getDatabase(); + UniqueConstraint exampleConstraint = (UniqueConstraint) example; + Relation table = exampleConstraint.getRelation(); + + List> metadata = listColumns(exampleConstraint, database, snapshot); + + if (metadata.isEmpty()) { + return null; + } + UniqueConstraint constraint = new UniqueConstraint(); + constraint.setRelation(table); + constraint.setName(example.getName()); + constraint.setBackingIndex(exampleConstraint.getBackingIndex()); + constraint.setInitiallyDeferred(((UniqueConstraint) example).isInitiallyDeferred()); + constraint.setDeferrable(((UniqueConstraint) example).isDeferrable()); + constraint.setClustered(((UniqueConstraint) example).isClustered()); + + for (Map col : metadata) { + constraint.getColumns().add(new Column((String) col.get("COLUMN_NAME")).setRelation(table)); + } + + return constraint; + } + @Override public Class[] replaces() { return new Class[] { UniqueConstraintSnapshotGenerator.class }; @@ -47,25 +72,15 @@ protected List listConstraints(Table table, DatabaseSnapshot snapshot protected List> listColumns(UniqueConstraint example, Database database, DatabaseSnapshot snapshot) throws DatabaseException { Relation table = example.getRelation(); - Schema schema = table.getSchema(); String name = example.getName(); - String schemaName = database.correctObjectName(schema.getName(), Schema.class); - String constraintName = database.correctObjectName(name, UniqueConstraint.class); String tableName = database.correctObjectName(table.getName(), Table.class); - //TODO figure out what to do with COLUMN_NAME - // https://community.snowflake.com/s/question/0D50Z00008Y3VUbSAN/table-details-including-the-constraints - String sql = "select CONSTRAINT_NAME, CONSTRAINT_NAME as COLUMN_NAME " + "from " + database.getSystemSchema() + - ".TABLE_CONSTRAINTS " - + "where CONSTRAINT_TYPE='UNIQUE'"; - if (schemaName != null) { - sql += "and CONSTRAINT_SCHEMA='" + schemaName + "' "; - } - if (tableName != null) { - sql += "and TABLE_NAME='" + tableName + "' "; - } - if (constraintName != null) { - sql += "and CONSTRAINT_NAME='" + constraintName + "'"; - } + String constraintName = database.correctObjectName(name, UniqueConstraint.class); + + String showSql = "SHOW UNIQUE KEYS IN " + tableName; + String sql = "SELECT \"column_name\" AS COLUMN_NAME FROM TABLE(result_scan(last_query_id())) WHERE \"constraint_name\"= '" + constraintName +"'"; + + Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", database) + .queryForList(new RawSqlStatement(showSql)); return Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", database) .queryForList(new RawSqlStatement(sql)); From 40e5ab66b3915f079a716f573c519fadc4b5f4d4 Mon Sep 17 00:00:00 2001 From: yodzhubeiskyi Date: Tue, 2 Aug 2022 15:05:29 +0300 Subject: [PATCH 2/2] DAT-11181 Removed unecessary snapshotObject method override --- ...eConstraintSnapshotGeneratorSnowflake.java | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/liquibase-snowflake/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGeneratorSnowflake.java b/liquibase-snowflake/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGeneratorSnowflake.java index c90674e5f59..a726034e6f8 100644 --- a/liquibase-snowflake/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGeneratorSnowflake.java +++ b/liquibase-snowflake/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGeneratorSnowflake.java @@ -2,7 +2,6 @@ import liquibase.Scope; import liquibase.database.Database; -import liquibase.database.core.H2Database; import liquibase.database.core.SnowflakeDatabase; import liquibase.exception.DatabaseException; import liquibase.executor.ExecutorService; @@ -12,7 +11,6 @@ import liquibase.statement.core.RawSqlStatement; import liquibase.structure.DatabaseObject; import liquibase.structure.core.*; -import liquibase.util.StringUtil; import java.sql.SQLException; import java.util.List; @@ -30,32 +28,6 @@ public int getPriority(Class objectType, Database data } } - @Override - protected DatabaseObject snapshotObject(DatabaseObject example, DatabaseSnapshot snapshot) throws DatabaseException { - Database database = snapshot.getDatabase(); - UniqueConstraint exampleConstraint = (UniqueConstraint) example; - Relation table = exampleConstraint.getRelation(); - - List> metadata = listColumns(exampleConstraint, database, snapshot); - - if (metadata.isEmpty()) { - return null; - } - UniqueConstraint constraint = new UniqueConstraint(); - constraint.setRelation(table); - constraint.setName(example.getName()); - constraint.setBackingIndex(exampleConstraint.getBackingIndex()); - constraint.setInitiallyDeferred(((UniqueConstraint) example).isInitiallyDeferred()); - constraint.setDeferrable(((UniqueConstraint) example).isDeferrable()); - constraint.setClustered(((UniqueConstraint) example).isClustered()); - - for (Map col : metadata) { - constraint.getColumns().add(new Column((String) col.get("COLUMN_NAME")).setRelation(table)); - } - - return constraint; - } - @Override public Class[] replaces() { return new Class[] { UniqueConstraintSnapshotGenerator.class };