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..a726034e6f8 100644 --- a/liquibase-snowflake/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGeneratorSnowflake.java +++ b/liquibase-snowflake/src/main/java/liquibase/snapshot/jvm/UniqueConstraintSnapshotGeneratorSnowflake.java @@ -10,10 +10,7 @@ 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 java.sql.SQLException; import java.util.List; @@ -47,25 +44,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));