diff --git a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdl.java b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdl.java index 1914b333b..cb26d5433 100644 --- a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdl.java +++ b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdl.java @@ -635,6 +635,13 @@ public class BaseTableDdl implements TableDdl { alterColumnAddUniqueOneToOneConstraint(writer, alterColumn); } + + boolean alterCheckConstraint = hasValue(alterColumn.getCheckConstraint()); + + if (alterCheckConstraint) { + // drop constraint before altering type etc + dropCheckConstraint(writer, alterColumn); + } boolean alterBaseAttributes = false; if (hasValue(alterColumn.getType())) { alterColumnType(writer, alterColumn); @@ -648,10 +655,13 @@ public class BaseTableDdl implements TableDdl { alterColumnNotnull(writer, alterColumn); alterBaseAttributes = true; } - if (alterBaseAttributes) { alterColumnBaseAttributes(writer, alterColumn); } + if (alterCheckConstraint) { + // add constraint last (after potential type change) + addCheckConstraint(writer, alterColumn); + } } /** @@ -705,6 +715,22 @@ public class BaseTableDdl implements TableDdl { } } + protected void dropCheckConstraint(DdlWrite writer, AlterColumn alter) throws IOException { + + String ddl = platformDdl.alterTableDropConstraint(alter.getTableName(), alter.getCheckConstraintName()); + if (hasValue(ddl)) { + writer.apply().append(ddl).endOfStatement(); + } + } + + protected void addCheckConstraint(DdlWrite writer, AlterColumn alter) throws IOException { + + String ddl = platformDdl.alterTableAddCheckConstraint(alter.getTableName(), alter.getCheckConstraintName(), alter.getCheckConstraint()); + if (hasValue(ddl)) { + writer.apply().append(ddl).endOfStatement(); + } + } + protected void alterColumnNotnull(DdlWrite writer, AlterColumn alter) throws IOException { String ddl = platformDdl.alterColumnNotnull(alter.getTableName(), alter.getColumnName(), alter.isNotnull()); diff --git a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/MySqlDdl.java b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/MySqlDdl.java index 6861967f3..545b5ba43 100644 --- a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/MySqlDdl.java +++ b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/MySqlDdl.java @@ -38,8 +38,13 @@ public class MySqlDdl extends PlatformDdl { } @Override - public String alterColumnType(String tableName, String columnName, String type) { + public String alterTableDropConstraint(String tableName, String constraintName) { + // drop constraint not supported + return null; + } + @Override + public String alterColumnType(String tableName, String columnName, String type) { // can't alter itself - done in alterColumnBaseAttributes() return null; } diff --git a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/PlatformDdl.java b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/PlatformDdl.java index 3b2c0ad0b..38470fed5 100644 --- a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/PlatformDdl.java +++ b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/PlatformDdl.java @@ -67,8 +67,12 @@ public class PlatformDdl { protected String alterColumn = "alter column"; + protected String dropConstraint = "drop constraint"; + protected String dropUniqueConstraint = "drop constraint"; + protected String addConstraint = "add constraint"; + protected String columnSetType = ""; protected String columnSetDefault = "set default"; @@ -327,12 +331,19 @@ public class PlatformDdl { } /** - * Drop a unique constraint from the table. + * Drop a unique constraint from the table (Sometimes this is an index). */ public String alterTableDropUniqueConstraint(String tableName, String uniqueConstraintName) { return "alter table " + tableName + " " + dropUniqueConstraint + " " + uniqueConstraintName; } + /** + * Drop a unique constraint from the table. + */ + public String alterTableDropConstraint(String tableName, String constraintName) { + return "alter table " + tableName + " " + dropConstraint + " " + constraintName; + } + /** * Add a unique constraint to the table. *
@@ -377,6 +388,14 @@ public class PlatformDdl { return "alter table " + tableName + " " + alterColumn + " " + columnName + " " + suffix; } + /** + * Alter table adding the check constraint. + */ + public String alterTableAddCheckConstraint(String tableName, String checkConstraintName, String checkConstraint) { + + return "alter table " + tableName + " " + addConstraint + " " + checkConstraintName + " " + checkConstraint; + } + /** * Return true if the default value is the special DROP DEFAULT value. */ diff --git a/src/main/java/com/avaje/ebean/dbmigration/model/MColumn.java b/src/main/java/com/avaje/ebean/dbmigration/model/MColumn.java index fd7e4429e..20e5eb3a0 100644 --- a/src/main/java/com/avaje/ebean/dbmigration/model/MColumn.java +++ b/src/main/java/com/avaje/ebean/dbmigration/model/MColumn.java @@ -317,7 +317,7 @@ public class MColumn { if (different(checkConstraint, newColumn.checkConstraint)) { AlterColumn alter = getAlterColumn(tableName, tableWithHistory); - if (hasValue(checkConstraint)) { + if (hasValue(checkConstraint) && !hasValue(newColumn.checkConstraint)) { alter.setDropCheckConstraint(checkConstraintName); } if (hasValue(newColumn.checkConstraint)) { diff --git a/src/main/java/com/avaje/ebean/dbmigration/runner/MigrationMetaRow.java b/src/main/java/com/avaje/ebean/dbmigration/runner/MigrationMetaRow.java index 6d629c887..2da2556b5 100644 --- a/src/main/java/com/avaje/ebean/dbmigration/runner/MigrationMetaRow.java +++ b/src/main/java/com/avaje/ebean/dbmigration/runner/MigrationMetaRow.java @@ -49,7 +49,6 @@ class MigrationMetaRow { version = row.getString("mversion"); comment = row.getString("mcomment"); checksum = row.getInteger("mchecksum"); - runOn = row.getTimestamp("run_on"); runBy = row.getString("run_by"); runTime = row.getLong("run_time"); } diff --git a/src/main/java/com/avaje/ebean/dbmigration/runner/MigrationTable.java b/src/main/java/com/avaje/ebean/dbmigration/runner/MigrationTable.java index 74e0fb21f..a1c620507 100644 --- a/src/main/java/com/avaje/ebean/dbmigration/runner/MigrationTable.java +++ b/src/main/java/com/avaje/ebean/dbmigration/runner/MigrationTable.java @@ -142,7 +142,11 @@ public class MigrationTable { * Return true if the table exists. */ private boolean tableExists(Connection connection) throws SQLException { - return databasePlatform.tableExists(connection, catalog, schema, table); + boolean exists = databasePlatform.tableExists(connection, catalog, schema, table); + if (!exists) { + exists = databasePlatform.tableExists(connection, catalog, schema, table.toUpperCase()); + } + return exists; } /** diff --git a/src/test/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdlTest.java b/src/test/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdlTest.java index af6d87fb6..4857c0b13 100644 --- a/src/test/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdlTest.java +++ b/src/test/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdlTest.java @@ -5,10 +5,12 @@ import com.avaje.ebean.config.ServerConfig; import com.avaje.ebean.config.dbplatform.H2Platform; import com.avaje.ebean.dbmigration.ddlgeneration.DdlWrite; import com.avaje.ebean.dbmigration.ddlgeneration.Helper; +import com.avaje.ebean.dbmigration.migration.AlterColumn; import com.avaje.ebean.dbmigration.migration.Column; import com.avaje.ebean.dbmigration.migration.CreateTable; import org.junit.Test; +import java.io.IOException; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -18,6 +20,25 @@ public class BaseTableDdlTest { ServerConfig serverConfig = new ServerConfig(); + @Test + public void testAlterColumn() throws IOException { + + BaseTableDdl ddlGen = new BaseTableDdl(serverConfig, new H2Platform().getPlatformDdl()); + + DdlWrite write = new DdlWrite(); + + AlterColumn alterColumn = new AlterColumn(); + alterColumn.setTableName("mytab"); + alterColumn.setCheckConstraint("check (acol in ('A','B'))"); + alterColumn.setCheckConstraintName("ck_mytab_acol"); + + ddlGen.generate(write, alterColumn); + + String ddl = write.apply().getBuffer(); + assertThat(ddl).contains("alter table mytab drop constraint ck_mytab_acol"); + assertThat(ddl).contains("alter table mytab add constraint ck_mytab_acol check (acol in ('A','B'))"); + } + @Test public void testGenerate() throws Exception { diff --git a/src/test/java/com/avaje/ebean/dbmigration/model/MColumnTest.java b/src/test/java/com/avaje/ebean/dbmigration/model/MColumnTest.java index 479f09ed8..7793999c7 100644 --- a/src/test/java/com/avaje/ebean/dbmigration/model/MColumnTest.java +++ b/src/test/java/com/avaje/ebean/dbmigration/model/MColumnTest.java @@ -99,7 +99,7 @@ public class MColumnTest { assertChanges(diff); assertThat(getAlterColumn(diff).getCheckConstraint()).isEqualTo("abc"); - assertThat(getAlterColumn(diff).getDropCheckConstraint()).isEqualTo("d"); + assertThat(getAlterColumn(diff).getDropCheckConstraint()).isNull(); } @Test