package liquibase.sqlgenerator.core; import liquibase.database.Database; import liquibase.database.core.*; import liquibase.exception.DatabaseException; import liquibase.exception.UnexpectedLiquibaseException; import liquibase.exception.ValidationErrors; import liquibase.sql.Sql; import liquibase.sql.UnparsedSql; import liquibase.sqlgenerator.SqlGenerator; import liquibase.sqlgenerator.SqlGeneratorChain; import liquibase.statement.core.DropDefaultValueStatement; public class DropDefaultValueGenerator extends AbstractSqlGenerator<DropDefaultValueStatement> { @Override public boolean supports(DropDefaultValueStatement statement, Database database) { return !(database instanceof SQLiteDatabase); } public ValidationErrors validate(DropDefaultValueStatement dropDefaultValueStatement, Database database, SqlGeneratorChain sqlGeneratorChain) { ValidationErrors validationErrors = new ValidationErrors(); validationErrors.checkRequiredField("tableName", dropDefaultValueStatement.getTableName()); validationErrors.checkRequiredField("columnName", dropDefaultValueStatement.getColumnName()); if (database instanceof InformixDatabase) { validationErrors.checkRequiredField("columnDataType", dropDefaultValueStatement.getColumnDataType()); } return validationErrors; } public Sql[] generateSql(DropDefaultValueStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { String sql; if (database instanceof MSSQLDatabase) { String productVersion = null; try { productVersion = database.getDatabaseProductVersion(); } catch (DatabaseException e) { throw new UnexpectedLiquibaseException(e); } if(productVersion.startsWith("9") || productVersion.startsWith("10")) { // SQL Server 2005/2008 // SQL Server 2005 does not often work with the simpler query shown below String query = "DECLARE @default sysname\n"; query += "SELECT @default = object_name(default_object_id) FROM sys.columns WHERE object_id=object_id('" + statement.getSchemaName() + "." + statement.getTableName() + "') AND name='" + statement.getColumnName() + "'\n"; query += "EXEC ('ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " DROP CONSTRAINT ' + @default)"; //System.out.println("DROP QUERY : " + query); sql = query; } else { // FIXME this syntax does not supported by MSSQL 2000 sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " DROP CONSTRAINT select d.name from syscolumns c,sysobjects d, sysobjects t where c.id=t.id AND d.parent_obj=t.id AND d.type='D' AND t.type='U' AND c.name='"+statement.getColumnName()+"' AND t.name='"+statement.getTableName()+"'"; } } else if (database instanceof MySQLDatabase) { sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " ALTER " + database.escapeColumnName(statement.getSchemaName(), statement.getTableName(), statement.getColumnName()) + " DROP DEFAULT"; } else if (database instanceof OracleDatabase || database instanceof SybaseASADatabase) { sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " MODIFY " + database.escapeColumnName(statement.getSchemaName(), statement.getTableName(), statement.getColumnName()) + " DEFAULT NULL"; } else if (database instanceof DerbyDatabase) { sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " ALTER COLUMN " + database.escapeColumnName(statement.getSchemaName(), statement.getTableName(), statement.getColumnName()) + " WITH DEFAULT NULL"; } else if (database instanceof MaxDBDatabase) { sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " COLUMN " + database.escapeColumnName(statement.getSchemaName(), statement.getTableName(), statement.getColumnName()) + " DROP DEFAULT"; } else if (database instanceof InformixDatabase) { /* * TODO If dropped from a not null column the not null constraint will be dropped, too. * If the column is "NOT NULL" it has to be added behind the datatype. */ sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " MODIFY (" + database.escapeColumnName(statement.getSchemaName(), statement.getTableName(), statement.getColumnName()) + " " + statement.getColumnDataType() + ")"; } else { sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " ALTER COLUMN " + database.escapeColumnName(statement.getSchemaName(), statement.getTableName(), statement.getColumnName()) + " SET DEFAULT NULL"; } return new Sql[] { new UnparsedSql(sql) }; } }