package liquibase.sqlgenerator.core; import liquibase.change.ColumnConfig; import liquibase.database.Database; import liquibase.database.core.*; import liquibase.exception.ValidationErrors; import liquibase.sql.Sql; import liquibase.sql.UnparsedSql; import liquibase.sqlgenerator.SqlGenerator; import liquibase.sqlgenerator.SqlGeneratorChain; import liquibase.statement.core.DropUniqueConstraintStatement; import liquibase.structure.core.Column; import liquibase.structure.core.Table; import liquibase.structure.core.UniqueConstraint; import liquibase.util.StringUtils; public class DropUniqueConstraintGenerator extends AbstractSqlGenerator<DropUniqueConstraintStatement> { @Override public boolean supports(DropUniqueConstraintStatement statement, Database database) { return !(database instanceof SQLiteDatabase); } @Override public ValidationErrors validate(DropUniqueConstraintStatement dropUniqueConstraintStatement, Database database, SqlGeneratorChain sqlGeneratorChain) { ValidationErrors validationErrors = new ValidationErrors(); validationErrors.checkRequiredField("tableName", dropUniqueConstraintStatement.getTableName()); validationErrors.checkRequiredField("constraintName", dropUniqueConstraintStatement.getConstraintName()); return validationErrors; } @Override public Sql[] generateSql(DropUniqueConstraintStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { String sql; if (database instanceof MySQLDatabase) { sql = "ALTER TABLE " + database.escapeTableName(statement.getCatalogName(), statement.getSchemaName(), statement.getTableName()) + " DROP KEY " + database.escapeConstraintName(statement.getConstraintName()); } else if (database instanceof OracleDatabase) { sql = "ALTER TABLE " + database.escapeTableName(statement.getCatalogName(), statement.getSchemaName(), statement.getTableName()) + " DROP CONSTRAINT " + database.escapeConstraintName(statement.getConstraintName()) + " DROP INDEX"; } else if (database instanceof SybaseASADatabase) { sql = "ALTER TABLE " + database.escapeTableName(statement.getCatalogName(), statement.getSchemaName(), statement.getTableName()) + " DROP UNIQUE (" + StringUtils.join(statement.getUniqueColumns(), ", ", new StringUtils.StringUtilsFormatter<ColumnConfig>() { @Override public String toString(ColumnConfig obj) { return obj.getName(); } }) + ")"; } else { sql = "ALTER TABLE " + database.escapeTableName(statement.getCatalogName(), statement.getSchemaName(), statement.getTableName()) + " DROP CONSTRAINT " + database.escapeConstraintName(statement.getConstraintName()); } return new Sql[] { new UnparsedSql(sql, getAffectedUniqueConstraint(statement)) }; } protected UniqueConstraint getAffectedUniqueConstraint(DropUniqueConstraintStatement statement) { UniqueConstraint constraint = new UniqueConstraint().setName(statement.getConstraintName()).setTable((Table) new Table().setName(statement.getTableName()).setSchema(statement.getCatalogName(), statement.getSchemaName())); if (statement.getUniqueColumns() != null) { int i = 0; for (ColumnConfig column : statement.getUniqueColumns()) { constraint.addColumn(i++, new Column(column)); } } return constraint; } }