1 package liquibase.sqlgenerator.ext;
2
3 import liquibase.database.Database;
4 import liquibase.database.core.*;
5 import liquibase.exception.ValidationErrors;
6 import liquibase.sql.Sql;
7 import liquibase.sql.UnparsedSql;
8 import liquibase.sqlgenerator.SqlGenerator;
9 import liquibase.sqlgenerator.SqlGeneratorChain;
10 import liquibase.statement.core.AddUniqueConstraintStatement;
11 import liquibase.util.StringUtils;
12
13 import static liquibase.ext.Constants.EXTENSION_PRIORITY;
14
15 public class AddUniqueConstraintGenerator extends liquibase.sqlgenerator.core.AddUniqueConstraintGenerator {
16
17 @Override
18 public int getPriority() {
19 return EXTENSION_PRIORITY;
20 }
21
22 public Sql[] generateSql(AddUniqueConstraintStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
23
24 String sql = null;
25 if (statement.getConstraintName() == null) {
26 sql = String.format("ALTER TABLE %s ADD UNIQUE (%s)"
27 , database.escapeTableName(null, statement.getTableName())
28 , database.escapeColumnNameList(statement.getColumnNames())
29 );
30 } else {
31 sql = String.format("ALTER TABLE %s ADD CONSTRAINT %s UNIQUE (%s)"
32 , database.escapeTableName(null, statement.getTableName())
33 , database.escapeConstraintName(statement.getConstraintName())
34 , database.escapeColumnNameList(statement.getColumnNames())
35 );
36 }
37 if(database instanceof OracleDatabase) {
38 if (statement.isDeferrable() || statement.isInitiallyDeferred()) {
39 if (statement.isDeferrable()) {
40 sql += " DEFERRABLE";
41 }
42
43 if (statement.isInitiallyDeferred()) {
44 sql +=" INITIALLY DEFERRED";
45 }
46 }
47 if (statement.isDisabled()) {
48 sql +=" DISABLE";
49 }
50 }
51
52 if (StringUtils.trimToNull(statement.getTablespace()) != null && database.supportsTablespaces()) {
53 if (database instanceof MSSQLDatabase) {
54 sql += " ON " + statement.getTablespace();
55 } else if (database instanceof DB2Database
56 || database instanceof SybaseASADatabase
57 || database instanceof InformixDatabase) {
58 ;
59 } else {
60 sql += " USING INDEX TABLESPACE " + statement.getTablespace();
61 }
62 }
63
64 return new Sql[] {
65 new UnparsedSql(sql)
66 };
67
68 }
69 }