From 1529a2f12bd6c4c4fabb2ded6953b2038711a4f8 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Mon, 7 Mar 2022 15:35:36 +0100 Subject: [PATCH 1/2] Prepared PlatformDdl to to have only one 'alterColumn' method (required for further refactoring) --- .../platform/AbstractHanaDdl.java | 26 +- .../ddlgeneration/platform/BaseTableDdl.java | 89 +-- .../platform/DbTriggerBasedHistoryDdl.java | 7 +- .../ddlgeneration/platform/HanaTableDdl.java | 13 +- .../ddlgeneration/platform/MySqlDdl.java | 62 +- .../ddlgeneration/platform/PlatformDdl.java | 70 ++- .../ddlgeneration/platform/PostgresDdl.java | 12 +- .../ddlgeneration/platform/SQLiteDdl.java | 17 +- .../ddlgeneration/platform/SqlServerDdl.java | 126 +++-- .../platform/SqlServerHistoryDdl.java | 12 +- .../platform/BaseTableDdlTest.java | 6 +- .../ddlgeneration/platform/HanaDdlTest.java | 4 +- .../platform/PlatformDdl_AlterColumnTest.java | 528 ++++++++++++------ .../PlatformDdl_dropUniqueConstraintTest.java | 2 +- 14 files changed, 594 insertions(+), 380 deletions(-) diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/AbstractHanaDdl.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/AbstractHanaDdl.java index e2b796a9d..d9833753a 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/AbstractHanaDdl.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/AbstractHanaDdl.java @@ -5,6 +5,7 @@ import io.ebean.config.dbplatform.DatabasePlatform; import io.ebean.config.dbplatform.DbPlatformType; import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer; import io.ebeaninternal.dbmigration.ddlgeneration.DdlHandler; +import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite; import io.ebeaninternal.dbmigration.migration.AlterColumn; import java.util.Objects; @@ -38,7 +39,7 @@ public abstract class AbstractHanaDdl extends PlatformDdl { } @Override - public String alterColumnBaseAttributes(AlterColumn alter) { + public void alterColumn(DdlWrite writer, AlterColumn alter) { String tableName = alter.getTableName(); String columnName = alter.getColumnName(); String currentType = alter.getCurrentType(); @@ -51,7 +52,7 @@ public abstract class AbstractHanaDdl extends PlatformDdl { : (alter.getDefaultValue() != null ? alter.getDefaultValue() : alter.getCurrentDefaultValue()); String defaultValueClause = (defaultValue == null || defaultValue.isEmpty()) ? "" : " default " + defaultValue; - DdlBuffer buffer = new BaseDdlBuffer(); + DdlBuffer buffer = writer.apply(); if (!isConvertible(currentType, type)) { // add an intermediate conversion if possible if (isNumberType(currentType)) { @@ -73,17 +74,7 @@ public abstract class AbstractHanaDdl extends PlatformDdl { buffer.append("alter table ").append(tableName).append(" ").append(alterColumn).append(" ").append(columnName) .append(" ").append(type).append(defaultValueClause).append(notnullClause).append(alterColumnSuffix); - return buffer.getBuffer(); - } - - @Override - public String alterColumnDefaultValue(String tableName, String columnName, String defaultValue) { - throw new UnsupportedOperationException(); - } - - @Override - public String alterColumnNotnull(String tableName, String columnName, boolean notnull) { - return null; + buffer.endOfStatement(); } @Override @@ -91,11 +82,6 @@ public abstract class AbstractHanaDdl extends PlatformDdl { return new HanaDdlHandler(config, this); } - @Override - public String alterColumnType(String tableName, String columnName, String type) { - return null; - } - @Override protected String convertArrayType(String logicalArrayType) { Matcher matcher = ARRAY_PATTERN.matcher(logicalArrayType); @@ -140,8 +126,8 @@ public abstract class AbstractHanaDdl extends PlatformDdl { * foreign keys. That's why we call a user stored procedure here */ @Override - public void alterTableDropColumn(DdlBuffer buffer, String tableName, String columnName) { - buffer.append("CALL usp_ebean_drop_column('").append(tableName).append("', '").append(columnName).append("')") + public void alterTableDropColumn(DdlWrite writer, String tableName, String columnName) { + writer.apply().append("CALL usp_ebean_drop_column('").append(tableName).append("', '").append(columnName).append("')") .endOfStatement(); } diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdl.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdl.java index 5effa54e5..f4b8980c1 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdl.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdl.java @@ -646,14 +646,14 @@ public class BaseTableDdl implements TableDdl { String tableName = addColumn.getTableName(); List columns = addColumn.getColumn(); for (Column column : columns) { - alterTableAddColumn(writer.apply(), tableName, column, false, isTrue(addColumn.isWithHistory())); + alterTableAddColumn(writer, tableName, column, false, isTrue(addColumn.isWithHistory())); } if (isTrue(addColumn.isWithHistory()) && historySupport == HistorySupport.TRIGGER_BASED) { // make same changes to the history table String historyTable = historyTable(tableName); for (Column column : columns) { regenerateHistoryTriggers(tableName, HistoryTableUpdate.Change.ADD, column.getName()); - alterTableAddColumn(writer.apply(), historyTable, column, true, true); + alterTableAddColumn(writer, historyTable, column, true, true); } } for (Column column : columns) { @@ -686,12 +686,12 @@ public class BaseTableDdl implements TableDdl { @Override public void generate(DdlWrite writer, DropColumn dropColumn) { String tableName = dropColumn.getTableName(); - alterTableDropColumn(writer.apply(), tableName, dropColumn.getColumnName()); + alterTableDropColumn(writer, tableName, dropColumn.getColumnName()); if (isTrue(dropColumn.isWithHistory()) && historySupport == HistorySupport.TRIGGER_BASED) { // also drop from the history table regenerateHistoryTriggers(tableName, HistoryTableUpdate.Change.DROP, dropColumn.getColumnName()); - alterTableDropColumn(writer.apply(), historyTable(tableName), dropColumn.getColumnName()); + alterTableDropColumn(writer, historyTable(tableName), dropColumn.getColumnName()); } writer.apply().end(); } @@ -739,22 +739,13 @@ public class BaseTableDdl implements TableDdl { // drop constraint before altering type etc dropCheckConstraint(writer, alterColumn, alterColumn.getCheckConstraintName()); } - boolean alterBaseAttributes = false; - if (hasValue(alterColumn.getType())) { - alterColumnType(writer, alterColumn); - alterBaseAttributes = true; - } - if (hasValue(alterColumn.getDefaultValue())) { - alterColumnDefaultValue(writer, alterColumn); - alterBaseAttributes = true; - } - if (alterColumn.isNotnull() != null) { - alterColumnNotnull(writer, alterColumn); - alterBaseAttributes = true; - } - if (alterBaseAttributes) { - alterColumnBaseAttributes(writer, alterColumn); + + if (hasValue(alterColumn.getType()) + || hasValue(alterColumn.getDefaultValue()) + || alterColumn.isNotnull() != null) { + alterColumn(writer, alterColumn); } + if (alterCheckConstraint) { // add constraint last (after potential type change) addCheckConstraint(writer, alterColumn); @@ -785,28 +776,19 @@ public class BaseTableDdl implements TableDdl { * This is mysql specific - alter all the base attributes of the column together. * Will be called, if there is a type, dbdefault or notnull change. */ - protected void alterColumnBaseAttributes(DdlWrite writer, AlterColumn alter) { - String ddl = platformDdl.alterColumnBaseAttributes(alter); - if (hasValue(ddl)) { - writer.apply().appendStatement(ddl); + protected void alterColumn(DdlWrite writer, AlterColumn alter) { + platformDdl.alterColumn(writer, alter); - if (isTrue(alter.isWithHistory()) && alter.getType() != null && historySupport == HistorySupport.TRIGGER_BASED) { - // mysql and sql server column type change allowing nulls in the history table column - regenerateHistoryTriggers(alter.getTableName(), HistoryTableUpdate.Change.ALTER, alter.getColumnName()); - AlterColumn alterHistoryColumn = new AlterColumn(); - alterHistoryColumn.setTableName(historyTable(alter.getTableName())); - alterHistoryColumn.setColumnName(alter.getColumnName()); - alterHistoryColumn.setType(alter.getType()); - String histColumnDdl = platformDdl.alterColumnBaseAttributes(alterHistoryColumn); - - // write the apply to history table - writer.apply().appendStatement(histColumnDdl); - } + if (isTrue(alter.isWithHistory()) && alter.getType() != null && historySupport == HistorySupport.TRIGGER_BASED) { + // mysql and sql server column type change allowing nulls in the history table column + regenerateHistoryTriggers(alter.getTableName(), HistoryTableUpdate.Change.ALTER, alter.getColumnName()); + AlterColumn alterHistoryColumn = new AlterColumn(); + alterHistoryColumn.setTableName(historyTable(alter.getTableName())); + alterHistoryColumn.setColumnName(alter.getColumnName()); + alterHistoryColumn.setType(alter.getType()); + platformDdl.alterColumn(writer, alterHistoryColumn); } - } - protected void alterColumnDefaultValue(DdlWrite writer, AlterColumn alter) { - writer.apply().appendStatement(platformDdl.alterColumnDefaultValue(alter.getTableName(), alter.getColumnName(), alter.getDefaultValue())); } protected void dropCheckConstraint(DdlWrite writer, AlterColumn alter, String constraintName) { @@ -817,23 +799,6 @@ public class BaseTableDdl implements TableDdl { writer.apply().appendStatement(platformDdl.alterTableAddCheckConstraint(alter.getTableName(), alter.getCheckConstraintName(), alter.getCheckConstraint())); } - protected void alterColumnNotnull(DdlWrite writer, AlterColumn alter) { - writer.apply().appendStatement(platformDdl.alterColumnNotnull(alter.getTableName(), alter.getColumnName(), alter.isNotnull())); - } - - protected void alterColumnType(DdlWrite writer, AlterColumn alter) { - String ddl = platformDdl.alterColumnType(alter.getTableName(), alter.getColumnName(), alter.getType()); - if (hasValue(ddl)) { - writer.apply().appendStatement(ddl); - if (isTrue(alter.isWithHistory()) && historySupport == HistorySupport.TRIGGER_BASED) { - regenerateHistoryTriggers(alter.getTableName(), HistoryTableUpdate.Change.ALTER, alter.getColumnName()); - // apply same type change to matching column in the history table - ddl = platformDdl.alterColumnType(historyTable(alter.getTableName()), alter.getColumnName(), alter.getType()); - writer.apply().appendStatement(ddl); - } - } - } - protected void alterColumnAddForeignKey(DdlWrite writer, AlterColumn alterColumn) { alterTableAddForeignKey(writer.getOptions(), writer.apply(), new WriteForeignKey(alterColumn)); } @@ -863,24 +828,24 @@ public class BaseTableDdl implements TableDdl { } - protected void alterTableDropColumn(DdlBuffer buffer, String tableName, String columnName) { - platformDdl.alterTableDropColumn(buffer, tableName, columnName); + protected void alterTableDropColumn(DdlWrite writer, String tableName, String columnName) { + platformDdl.alterTableDropColumn(writer, tableName, columnName); } - protected void alterTableAddColumn(DdlBuffer buffer, String tableName, Column column, boolean onHistoryTable, boolean withHistory) { + protected void alterTableAddColumn(DdlWrite writer, String tableName, Column column, boolean onHistoryTable, boolean withHistory) { DdlMigrationHelp help = new DdlMigrationHelp(tableName, column, withHistory); if (!onHistoryTable) { - help.writeBefore(buffer); + help.writeBefore(writer.apply()); } - platformDdl.alterTableAddColumn(buffer, tableName, column, onHistoryTable, help.getDefaultValue()); + platformDdl.alterTableAddColumn(writer, tableName, column, onHistoryTable, help.getDefaultValue()); final String comment = column.getComment(); if (comment != null && !comment.isEmpty()) { - platformDdl.addColumnComment(buffer, tableName, column.getName(), comment); + platformDdl.addColumnComment(writer.apply(), tableName, column.getName(), comment); } if (!onHistoryTable) { - help.writeAfter(buffer); + help.writeAfter(writer.apply()); } } diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java index 5b34a08ea..252cd271b 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java @@ -5,6 +5,7 @@ import io.ebean.config.DbConstraintNaming; import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer; import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite; import io.ebeaninternal.dbmigration.migration.AddHistoryTable; +import io.ebeaninternal.dbmigration.migration.AlterColumn; import io.ebeaninternal.dbmigration.migration.DropHistoryTable; import io.ebeaninternal.dbmigration.model.MColumn; import io.ebeaninternal.dbmigration.model.MTable; @@ -241,8 +242,10 @@ public abstract class DbTriggerBasedHistoryDdl implements PlatformHistoryDdl { } protected void dropSysPeriodColumns(DdlBuffer buffer, String baseTableName) { - platformDdl.alterTableDropColumn(buffer, baseTableName, sysPeriodStart); - platformDdl.alterTableDropColumn(buffer, baseTableName, sysPeriodEnd); + DdlWrite writer = new DdlWrite(); + platformDdl.alterTableDropColumn(writer, baseTableName, sysPeriodStart); + platformDdl.alterTableDropColumn(writer, baseTableName, sysPeriodEnd); + buffer.append(writer.apply().getBuffer()); // Workaround - will be removed later } protected void appendInsertIntoHistory(DdlBuffer buffer, String historyTable, List columns) { diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/HanaTableDdl.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/HanaTableDdl.java index f15d7c718..2500ad179 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/HanaTableDdl.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/HanaTableDdl.java @@ -27,11 +27,6 @@ public class HanaTableDdl extends BaseTableDdl { } } - @Override - protected void alterColumnDefaultValue(DdlWrite writer, AlterColumn alter) { - // done in alterColumnBaseAttributes - } - @Override public void generate(DdlWrite writer, AddColumn addColumn) { String tableName = addColumn.getTableName(); @@ -54,7 +49,7 @@ public class HanaTableDdl extends BaseTableDdl { String historyTable = historyTable(tableName); List columns = addColumn.getColumn(); for (Column column : columns) { - alterTableAddColumn(writer.apply(), historyTable, column, true, true); + alterTableAddColumn(writer, historyTable, column, true, true); } historyDdl.enableSystemVersioning(writer.apply(), table.getName(), historyTable, false, this.generateUniqueDdl); @@ -91,10 +86,8 @@ public class HanaTableDdl extends BaseTableDdl { alterHistoryColumn.setCurrentType(alterColumn.getCurrentType()); alterHistoryColumn.setCurrentDefaultValue(alterColumn.getCurrentDefaultValue()); alterHistoryColumn.setCurrentNotnull(alterColumn.isCurrentNotnull()); - String histColumnDdl = platformDdl.alterColumnBaseAttributes(alterHistoryColumn); + platformDdl.alterColumn(writer, alterHistoryColumn); - // write the apply to history table - writer.apply().append(histColumnDdl).endOfStatement(); } historyDdl.enableSystemVersioning(writer.apply(), tableName, historyTable, false, this.generateUniqueDdl); @@ -121,7 +114,7 @@ public class HanaTableDdl extends BaseTableDdl { if (manageSystemVersioning) { // also drop from the history table String historyTable = historyTable(tableName); - alterTableDropColumn(writer.apply(), historyTable, dropColumn.getColumnName()); + alterTableDropColumn(writer, historyTable, dropColumn.getColumnName()); historyDdl.enableSystemVersioning(writer.apply(), tableName, historyTable, false, this.generateUniqueDdl); } diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java index 91a3760c2..492584fd5 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java @@ -3,6 +3,7 @@ package io.ebeaninternal.dbmigration.ddlgeneration.platform; import io.ebean.config.dbplatform.DatabasePlatform; import io.ebean.util.StringHelper; import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer; +import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite; import io.ebeaninternal.dbmigration.migration.AlterColumn; import io.ebeaninternal.dbmigration.migration.Column; @@ -21,7 +22,7 @@ public class MySqlDdl extends PlatformDdl { public MySqlDdl(DatabasePlatform platform) { super(platform); - this.alterColumn = "modify"; + this.alterColumn = "alter"; this.dropUniqueConstraint = "drop index"; this.historyDdl = new MySqlHistoryDdl(); this.inlineComments = true; @@ -37,11 +38,11 @@ public class MySqlDdl extends PlatformDdl { } @Override - public void alterTableDropColumn(final DdlBuffer buffer, final String tableName, final String columnName) { + public void alterTableDropColumn(DdlWrite writer, String tableName, String columnName) { if (this.useMigrationStoredProcedures) { - buffer.append("CALL usp_ebean_drop_column('").append(tableName).append("', '").append(columnName).append("')").endOfStatement(); + writer.apply().append("CALL usp_ebean_drop_column('").append(tableName).append("', '").append(columnName).append("')").endOfStatement(); } else { - super.alterTableDropColumn(buffer, tableName, columnName); + super.alterTableDropColumn(writer, tableName, columnName); } } @@ -91,38 +92,33 @@ public class MySqlDdl extends PlatformDdl { } @Override - public String alterColumnType(String tableName, String columnName, String type) { - // can't alter itself - done in alterColumnBaseAttributes() - return null; - } - - @Override - public String alterColumnNotnull(String tableName, String columnName, boolean notnull) { - // can't alter itself - done in alterColumnBaseAttributes() - return null; - } - - @Override - public String alterColumnDefaultValue(String tableName, String columnName, String defaultValue) { - String suffix = DdlHelp.isDropDefault(defaultValue) ? columnDropDefault : columnSetDefault + " " + convertDefaultValue(defaultValue); - return "alter table " + tableName + " alter " + columnName + " " + suffix; - } - - @Override - public String alterColumnBaseAttributes(AlterColumn alter) { - if (alter.getType() == null && alter.isNotnull() == null) { - // No type change or notNull change - // defaultValue change already handled in alterColumnDefaultValue - return null; - } + public void alterColumn(DdlWrite writer, AlterColumn alter) { String tableName = alter.getTableName(); String columnName = alter.getColumnName(); - String type = alter.getType() != null ? alter.getType() : alter.getCurrentType(); - type = convert(type); - boolean notnull = (alter.isNotnull() != null) ? alter.isNotnull() : Boolean.TRUE.equals(alter.isCurrentNotnull()); - String notnullClause = notnull ? " not null" : ""; - return "alter table " + tableName + " modify " + columnName + " " + type + notnullClause; + if (alter.getType() == null && alter.isNotnull() == null) { + // No type change or notNull change -> handle default value change + if (hasValue(alter.getDefaultValue())) { + alterColumnDefault(writer, alter); + } + } else { + // we must regenerate whole statement -> read altered and current value + String type = alter.getType() != null ? alter.getType() : alter.getCurrentType(); + type = convert(type); + boolean notnull = (alter.isNotnull() != null) ? alter.isNotnull() : Boolean.TRUE.equals(alter.isCurrentNotnull()); + String defaultValue = alter.getDefaultValue() != null ? alter.getDefaultValue() : alter.getCurrentDefaultValue(); + + DdlBuffer buffer = writer.apply().append("alter table ").append(tableName) + .appendWithSpace("modify").appendWithSpace(columnName); + buffer.appendWithSpace(type); + if (notnull) { + buffer.append(" not null"); + } + if (hasValue(defaultValue) && !DdlHelp.isDropDefault(defaultValue)) { + buffer.append(" default ").append(convertDefaultValue(defaultValue)); + } + buffer.endOfStatement(); + } } @Override diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl.java index 285e962fa..f439d366e 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl.java @@ -538,10 +538,10 @@ public class PlatformDdl { return buffer.toString(); } - public void alterTableAddColumn(DdlBuffer buffer, String tableName, Column column, boolean onHistoryTable, String defaultValue) { + public void alterTableAddColumn(DdlWrite writer, String tableName, Column column, boolean onHistoryTable, String defaultValue) { String convertedType = convert(column.getType()); - + DdlBuffer buffer = writer.apply(); buffer.append("alter table ").append(tableName) .append(" ").append(addColumn).append(" ").append(column.getName()) .append(" ").append(convertedType); @@ -575,8 +575,9 @@ public class PlatformDdl { } - public void alterTableDropColumn(DdlBuffer buffer, String tableName, String columnName) { - buffer.append("alter table ").append(tableName).append(" ").append(dropColumn).append(" ").append(columnName) + public void alterTableDropColumn(DdlWrite writer, String tableName, String columnName) { + writer.apply().append("alter table ").append(tableName).append(" ") + .append(dropColumn).append(" ").append(columnName) .append(dropColumnSuffix).endOfStatement(); } @@ -592,22 +593,32 @@ public class PlatformDdl { /** * Alter a column type. *

- * Note that that MySql and SQL Server instead use alterColumnBaseAttributes() + * Note that that MySql, SQL Server, and HANA instead use alterColumn() *

*/ - public String alterColumnType(String tableName, String columnName, String type) { - return "alter table " + tableName + " " + alterColumn + " " + columnName + " " + columnSetType + convert(type) + alterColumnSuffix; + protected void alterColumnType(DdlWrite writer, AlterColumn alter) { + writer.apply().append("alter table ").append(alter.getTableName()) + .appendWithSpace(alterColumn).appendWithSpace(alter.getColumnName()) + .append(" ").append(columnSetType).append(convert(alter.getType())) + .endOfStatement(); } /** * Alter a column adding or removing the not null constraint. *

- * Note that that MySql, SQL Server, and HANA instead use alterColumnBaseAttributes() + * Note that that MySql, SQL Server, and HANA instead use alterColumn() *

*/ - public String alterColumnNotnull(String tableName, String columnName, boolean notnull) { - String suffix = notnull ? columnSetNotnull : columnSetNull; - return "alter table " + tableName + " " + alterColumn + " " + columnName + " " + suffix + alterColumnSuffix; + protected void alterColumnNotnull(DdlWrite writer, AlterColumn alter) { + + DdlBuffer buffer = writer.apply().append("alter table ").append(alter.getTableName()) + .appendWithSpace(alterColumn).appendWithSpace(alter.getColumnName()); + if (Boolean.TRUE.equals(alter.isNotnull())) { + buffer.appendWithSpace(columnSetNotnull); + } else { + buffer.appendWithSpace(columnSetNull); + } + buffer.endOfStatement(); } /** @@ -619,22 +630,41 @@ public class PlatformDdl { /** * Alter column setting the default value. + *

+ * Note that that MySql, SQL Server, and HANA instead use alterColumn() + *

*/ - public String alterColumnDefaultValue(String tableName, String columnName, String defaultValue) { - String suffix = DdlHelp.isDropDefault(defaultValue) ? columnDropDefault : columnSetDefault + " " + convertDefaultValue(defaultValue); - return "alter table " + tableName + " " + alterColumn + " " + columnName + " " + suffix + alterColumnSuffix; + protected void alterColumnDefault(DdlWrite writer, AlterColumn alter) { + DdlBuffer buffer = writer.apply().append("alter table ").append(alter.getTableName()) + .appendWithSpace(alterColumn).appendWithSpace(alter.getColumnName()); + if (DdlHelp.isDropDefault(alter.getDefaultValue())) { + buffer.appendWithSpace(columnDropDefault); + } else { + buffer.appendWithSpace(columnSetDefault).appendWithSpace(convertDefaultValue(alter.getDefaultValue())); + } + buffer.endOfStatement(); } /** - * Alter column setting both the type and not null constraint. + * Alter column setting (type, default value and not null constraint). *

- * Used by MySql, SQL Server, and HANA as these require both column attributes to be set together. + * Used by MySql, SQL Server, and HANA as these require all column attributes to + * be set together. *

*/ - public String alterColumnBaseAttributes(AlterColumn alter) { - // by default do nothing, only used by mysql, sql server, and HANA as they can only - // modify the column with the full column definition - return null; + public void alterColumn(DdlWrite writer, AlterColumn alter) { + + if (hasValue(alter.getType())) { + alterColumnType(writer, alter); + } + + if (hasValue(alter.getDefaultValue())) { + alterColumnDefault(writer, alter); + } + + if (alter.isNotnull() != null) { + alterColumnNotnull(writer, alter); + } } protected void appendColumns(String[] columns, StringBuilder buffer) { diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java index f9bf55276..984333fbb 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java @@ -2,6 +2,8 @@ package io.ebeaninternal.dbmigration.ddlgeneration.platform; import io.ebean.config.dbplatform.DatabasePlatform; import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer; +import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite; +import io.ebeaninternal.dbmigration.migration.AlterColumn; /** * Postgres specific DDL. @@ -56,7 +58,13 @@ public class PostgresDdl extends PlatformDdl { } @Override - public String alterColumnType(String tableName, String columnName, String type) { - return super.alterColumnType(tableName, columnName, type) + " using " + columnName + "::" + convert(type); + protected void alterColumnType(DdlWrite writer, AlterColumn alter) { + String type = convert(alter.getType()); + + writer.apply().append("alter table ").append(alter.getTableName()) + .appendWithSpace(alterColumn).appendWithSpace(alter.getColumnName()) + .appendWithSpace(columnSetType).append(type) + .append(" using ").append(alter.getColumnName()).append("::").append(type) + .endOfStatement(); } } diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SQLiteDdl.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SQLiteDdl.java index 8db601cfd..2242721c7 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SQLiteDdl.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SQLiteDdl.java @@ -3,6 +3,8 @@ package io.ebeaninternal.dbmigration.ddlgeneration.platform; import io.ebean.config.dbplatform.DatabasePlatform; import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer; import io.ebeaninternal.dbmigration.ddlgeneration.DdlOptions; +import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite; +import io.ebeaninternal.dbmigration.migration.AlterColumn; /** * SQLite platform specific DDL. @@ -59,18 +61,21 @@ public class SQLiteDdl extends PlatformDdl { } @Override - public String alterColumnDefaultValue(String tableName, String columnName, String defaultValue) { - return "-- not supported: " + super.alterColumnDefaultValue(tableName, columnName, defaultValue); + public void alterColumnType(DdlWrite writer, AlterColumn alter) { + writer.apply().append("-- not supported: "); + super.alterColumnType(writer, alter); } @Override - public String alterColumnType(String tableName, String columnName, String type) { - return "-- not supported: " + super.alterColumnType(tableName, columnName, type); + public void alterColumnDefault(DdlWrite writer, AlterColumn alter) { + writer.apply().append("-- not supported: "); + super.alterColumnDefault(writer, alter); } @Override - public String alterColumnNotnull(String tableName, String columnName, boolean notnull) { - return "-- not supported: " + super.alterColumnNotnull(tableName, columnName, notnull); + public void alterColumnNotnull(DdlWrite writer, AlterColumn alter) { + writer.apply().append("-- not supported: "); + super.alterColumnNotnull(writer, alter); } } diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerDdl.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerDdl.java index 62b86be4a..0cd256c30 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerDdl.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerDdl.java @@ -11,6 +11,12 @@ import io.ebeaninternal.dbmigration.migration.AlterColumn; */ public class SqlServerDdl extends PlatformDdl { + private static final String CONSTRAINT = "C"; + private static final String UNIQUE_CONSTRAINT = "UQ"; + private static final String USER_TABLE = "U"; + private static final String FOREIGN_KEY = "F"; + private static final String SEQUENCE_OBJECT = "SO"; + public SqlServerDdl(DatabasePlatform platform) { super(platform); this.identitySuffix = " identity(1,1)"; @@ -31,12 +37,7 @@ public class SqlServerDdl extends PlatformDdl { @Override public String dropTable(String tableName) { - StringBuilder buffer = new StringBuilder(); - buffer.append("IF OBJECT_ID('"); - buffer.append(tableName); - buffer.append("', 'U') IS NOT NULL drop table "); - buffer.append(tableName); - return buffer.toString(); + return ifObjectExists(tableName, USER_TABLE) + "drop table " + tableName; } @Override @@ -46,12 +47,12 @@ public class SqlServerDdl extends PlatformDdl { if (pos != -1) { objectId = tableName.substring(0, pos + 1) + fkName; } - return "IF OBJECT_ID('" + objectId + "', 'F') IS NOT NULL " + super.alterTableDropForeignKey(tableName, fkName); + return ifObjectExists(objectId, FOREIGN_KEY) + super.alterTableDropForeignKey(tableName, fkName); } @Override public String dropSequence(String sequenceName) { - return "IF OBJECT_ID('" + sequenceName + "', 'SO') IS NOT NULL drop sequence " + sequenceName; + return ifObjectExists(sequenceName, SEQUENCE_OBJECT) + "drop sequence " + sequenceName; } @Override @@ -71,12 +72,11 @@ public class SqlServerDdl extends PlatformDdl { throw new NullPointerException(); } // issues#233 - String start = "create unique nonclustered index " + uqName + " on " + tableName + "("; - StringBuilder sb = new StringBuilder(start); - + StringBuilder sb = new StringBuilder(256); + sb.append("create unique nonclustered index ").append(uqName).append(" on ").append(tableName).append('('); for (int i = 0; i < columns.length; i++) { if (i > 0) { - sb.append(","); + sb.append(','); } sb.append(columns[i]); } @@ -91,11 +91,9 @@ public class SqlServerDdl extends PlatformDdl { @Override public String alterTableDropConstraint(String tableName, String constraintName) { - StringBuilder sb = new StringBuilder(); - sb.append("IF (OBJECT_ID('").append(constraintName).append("', 'C') IS NOT NULL) "); - sb.append(super.alterTableDropConstraint(tableName, constraintName)); - return sb.toString(); + return ifObjectExists(maxConstraintName(constraintName), CONSTRAINT) + super.alterTableDropConstraint(tableName, constraintName); } + /** * Drop a unique constraint from the table (Sometimes this is an index). */ @@ -103,10 +101,12 @@ public class SqlServerDdl extends PlatformDdl { public String alterTableDropUniqueConstraint(String tableName, String uniqueConstraintName) { StringBuilder sb = new StringBuilder(); sb.append(dropIndex(uniqueConstraintName, tableName)).append(";\n"); - sb.append("IF (OBJECT_ID('").append(maxConstraintName(uniqueConstraintName)).append("', 'UQ') IS NOT NULL) "); - sb.append(super.alterTableDropUniqueConstraint(tableName, uniqueConstraintName)); + + sb.append(ifObjectExists(maxConstraintName(uniqueConstraintName), UNIQUE_CONSTRAINT)) + .append(super.alterTableDropUniqueConstraint(tableName, uniqueConstraintName)); return sb.toString(); } + /** * Generate and return the create sequence DDL. */ @@ -133,50 +133,57 @@ public class SqlServerDdl extends PlatformDdl { } @Override - public String alterColumnDefaultValue(String tableName, String columnName, String defaultValue) { + protected void alterColumnDefault(DdlWrite writer, AlterColumn alter) { // Unfortunately, the SqlServer creates default values with a random name. // You can specify a name in DDL, but this does not work in conjunction with // temporal tables in certain cases. So we have to delete the constraint with // a rather complex statement. - StringBuilder sb = new StringBuilder(); - if (DdlHelp.isDropDefault(defaultValue)) { - sb.append("EXEC usp_ebean_drop_default_constraint ").append(tableName).append(", ").append(columnName); - } else { - sb.append("alter table ").append(tableName); - sb.append(" add default ").append(convertDefaultValue(defaultValue)).append(" for ").append(columnName); - } - return sb.toString(); - } - - @Override - public String alterColumnBaseAttributes(AlterColumn alter) { - if (alter.getType() == null && alter.isNotnull() == null) { - // No type change or notNull change - // defaultValue change already handled in alterColumnDefaultValue - return null; - } String tableName = alter.getTableName(); String columnName = alter.getColumnName(); - String type = alter.getType() != null ? alter.getType() : alter.getCurrentType(); - type = convert(type); - boolean notnull = (alter.isNotnull() != null) ? alter.isNotnull() : Boolean.TRUE.equals(alter.isCurrentNotnull()); - String notnullClause = notnull ? " not null" : ""; - - return "alter table " + tableName + " " + alterColumn + " " + columnName + " " + type + notnullClause; + String defaultValue = alter.getDefaultValue(); + if (DdlHelp.isDropDefault(defaultValue)) { + writer.apply().appendStatement(execUspDropDefaultConstraint(tableName, columnName)); + } else { + writer.apply().appendStatement(execUspDropDefaultConstraint(tableName, columnName)); + setDefaultValue(writer, tableName, columnName, defaultValue); + } } @Override - public String alterColumnType(String tableName, String columnName, String type) { + public void alterColumn(DdlWrite writer, AlterColumn alter) { + String tableName = alter.getTableName(); + String columnName = alter.getColumnName(); + if (alter.getType() == null && alter.isNotnull() == null) { + // No type change or notNull change + if (hasValue(alter.getDefaultValue())) { + alterColumnDefault(writer, alter); + } + } else { + // we must regenerate whole statement -> read altered and current value + String type = alter.getType() != null ? alter.getType() : alter.getCurrentType(); + type = convert(type); + boolean notnull = (alter.isNotnull() != null) ? alter.isNotnull() : Boolean.TRUE.equals(alter.isCurrentNotnull()); + String defaultValue = alter.getDefaultValue() != null ? alter.getDefaultValue() : alter.getCurrentDefaultValue(); + DdlBuffer buffer = writer.apply(); + if (hasValue(defaultValue)) { + // default value present -> drop default constraint before altering + buffer.appendStatement(execUspDropDefaultConstraint(tableName, columnName)); + } - // can't alter itself - done in alterColumnBaseAttributes() - return null; - } + buffer = writer.apply().append("alter table ").append(tableName) + .appendWithSpace(alterColumn).appendWithSpace(columnName); + buffer.appendWithSpace(type); + if (notnull) { + buffer.append(" not null"); + } - @Override - public String alterColumnNotnull(String tableName, String columnName, boolean notnull) { + buffer.endOfStatement(); - // can't alter itself - done in alterColumnBaseAttributes() - return null; + // re add - default constraint + if (hasValue(defaultValue) && !DdlHelp.isDropDefault(defaultValue)) { + setDefaultValue(writer, tableName, columnName, defaultValue); + } + } } /** @@ -202,9 +209,8 @@ public class SqlServerDdl extends PlatformDdl { * (constraints, default values, indices and foreign keys). That's why we call a user stored procedure here */ @Override - public void alterTableDropColumn(DdlBuffer buffer, String tableName, String columnName) { - - buffer.append("EXEC usp_ebean_drop_column ").append(tableName).append(", ").append(columnName).endOfStatement(); + public void alterTableDropColumn(DdlWrite writer, String tableName, String columnName) { + writer.apply().append("EXEC usp_ebean_drop_column ").append(tableName).append(", ").append(columnName).endOfStatement(); } /** @@ -246,4 +252,18 @@ public class SqlServerDdl extends PlatformDdl { .endOfStatement(); } + private String ifObjectExists(String object, String objectType) { + return "IF OBJECT_ID('" + object + "', '" + objectType + "') IS NOT NULL "; + } + + private String execUspDropDefaultConstraint(String tableName, String columnName) { + return "EXEC usp_ebean_drop_default_constraint " + tableName + ", " + columnName; + } + + private void setDefaultValue(DdlWrite writer, String tableName, String columnName, String defaultValue) { + writer.apply().append("alter table ").append(tableName) + .append(" add default ").append(convertDefaultValue(defaultValue)).append(" for ").append(columnName) + .endOfStatement(); + } + } diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerHistoryDdl.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerHistoryDdl.java index f82ea20da..812389c2d 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerHistoryDdl.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerHistoryDdl.java @@ -4,6 +4,7 @@ import io.ebean.config.DatabaseConfig; import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer; import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite; import io.ebeaninternal.dbmigration.migration.AddHistoryTable; +import io.ebeaninternal.dbmigration.migration.AlterColumn; import io.ebeaninternal.dbmigration.migration.DropHistoryTable; import io.ebeaninternal.dbmigration.model.MTable; @@ -62,9 +63,16 @@ public class SqlServerHistoryDdl implements PlatformHistoryDdl { DdlBuffer apply = writer.applyHistoryView(); apply.append("-- dropping history support for ").append(baseTable).endOfStatement(); // drop default constraints + DdlWrite tmpWriter = new DdlWrite(); + AlterColumn alter = new AlterColumn(); + alter.setTableName(baseTable); + alter.setDefaultValue(DdlHelp.DROP_DEFAULT); + alter.setColumnName(systemPeriodStart); + platformDdl.alterColumn(tmpWriter, alter); + alter.setColumnName(systemPeriodEnd); + platformDdl.alterColumn(tmpWriter, alter); + apply.append(tmpWriter.apply().getBuffer()); // workaround - will be refactored later - apply.append(platformDdl.alterColumnDefaultValue(baseTable, systemPeriodStart, DdlHelp.DROP_DEFAULT)).endOfStatement(); - apply.append(platformDdl.alterColumnDefaultValue(baseTable, systemPeriodEnd, DdlHelp.DROP_DEFAULT)).endOfStatement(); // switch of versioning & period apply.append("alter table ").append(baseTable).append(" set (system_versioning = off)").endOfStatement(); apply.append("alter table ").append(baseTable).append(" drop period for system_time").endOfStatement(); diff --git a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdlTest.java b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdlTest.java index 737916367..58e328a64 100644 --- a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdlTest.java +++ b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdlTest.java @@ -55,7 +55,7 @@ public class BaseTableDdlTest { column.setName("col_name"); column.setType("varchar(20)"); - ddlGen.alterTableAddColumn(writer.apply(), "mytable", column, false, false); + ddlGen.alterTableAddColumn(writer, "mytable", column, false, false); String ddl = writer.apply().getBuffer(); assertThat(ddl).contains("alter table mytable add col_name varchar2(20)"); @@ -72,7 +72,7 @@ public class BaseTableDdlTest { column.setName("col_name"); column.setType("varchar(20)"); - ddlGen.alterTableAddColumn(writer.apply(), "mytable", column, false, false); + ddlGen.alterTableAddColumn(writer, "mytable", column, false, false); String ddl = writer.apply().getBuffer(); assertThat(ddl).contains("alter table mytable add column col_name String"); @@ -105,7 +105,7 @@ public class BaseTableDdlTest { column.setComment("some comment"); column.setType("int"); - ddl.alterTableAddColumn(writer.apply(), "my_table", column, false, false); + ddl.alterTableAddColumn(writer, "my_table", column, false, false); assertEquals( "alter table my_table add column my_column int;\n" + "comment on column my_table.my_column is 'some comment';\n", diff --git a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/HanaDdlTest.java b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/HanaDdlTest.java index 861e37d63..4eb4e91f9 100644 --- a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/HanaDdlTest.java +++ b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/HanaDdlTest.java @@ -13,7 +13,7 @@ public class HanaDdlTest { public void alterTableDropColumn() { HanaColumnStoreDdl ddl = new HanaColumnStoreDdl(new HanaPlatform()); DdlWrite writer = new DdlWrite(); - ddl.alterTableDropColumn(writer.apply(), "my_table", "my_column"); + ddl.alterTableDropColumn(writer, "my_table", "my_column"); assertEquals("CALL usp_ebean_drop_column('my_table', 'my_column');\n", writer.apply().getBuffer()); } @@ -33,7 +33,7 @@ public class HanaDdlTest { column.setCheckConstraintName("check_constraint"); column.setHistoryExclude(Boolean.TRUE); column.setIdentity(Boolean.TRUE); - ddl.alterTableAddColumn(writer.apply(), "my_table", column, false, "1"); + ddl.alterTableAddColumn(writer, "my_table", column, false, "1"); assertEquals("alter table my_table add ( my_column int default 1 not null);\nalter table my_table add constraint check_constraint CHECK(my_column > 0);\n", writer.apply().getBuffer()); } } diff --git a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java index e6cbea55c..67a39f011 100644 --- a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java +++ b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java @@ -3,6 +3,7 @@ package io.ebeaninternal.dbmigration.ddlgeneration.platform; import io.ebean.DB; import io.ebean.config.DatabaseConfig; import io.ebean.config.dbplatform.IdType; +import io.ebean.config.dbplatform.db2.DB2LuwPlatform; import io.ebean.config.dbplatform.h2.H2Platform; import io.ebean.config.dbplatform.hana.HanaPlatform; import io.ebean.config.dbplatform.mysql.MySqlPlatform; @@ -14,12 +15,12 @@ import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder; import io.ebeaninternal.dbmigration.migration.AlterColumn; import io.ebeaninternal.dbmigration.migration.AlterForeignKey; import io.ebeaninternal.dbmigration.migration.Column; + +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.assertj.core.api.SoftAssertions; public class PlatformDdl_AlterColumnTest { @@ -31,229 +32,359 @@ public class PlatformDdl_AlterColumnTest { private final PlatformDdl oraDdl = PlatformDdlBuilder.create(new OraclePlatform()); private final PlatformDdl sqlServerDdl = PlatformDdlBuilder.create(new SqlServer17Platform()); private final PlatformDdl hanaDdl = PlatformDdlBuilder.create(new HanaPlatform()); + private final PlatformDdl db2Ddl = PlatformDdlBuilder.create(new DB2LuwPlatform()); + + private final SoftAssertions softly = new SoftAssertions(); { DatabaseConfig serverConfig = DB.getDefault().pluginApi().config(); sqlServerDdl.configure(serverConfig); } - AlterColumn alterNotNull() { - AlterColumn alterColumn = new AlterColumn(); - alterColumn.setTableName("mytab"); - alterColumn.setColumnName("acol"); - alterColumn.setCurrentType("varchar(5)"); - alterColumn.setNotnull(Boolean.TRUE); - - return alterColumn; + @AfterEach + void assertAll() { + softly.assertAll(); } @Test public void convertArrayType_default() { - assertThat(mysqlDdl.convertArrayType("varchar[](90)")).isEqualTo("varchar(90)"); - assertThat(mysqlDdl.convertArrayType("integer[](60)")).isEqualTo("varchar(60)"); - assertThat(mysqlDdl.convertArrayType("varchar[]")).isEqualTo("varchar(1000)"); - assertThat(mysqlDdl.convertArrayType("integer[]")).isEqualTo("varchar(1000)"); + softly.assertThat(mysqlDdl.convertArrayType("varchar[](90)")).isEqualTo("varchar(90)"); + softly.assertThat(mysqlDdl.convertArrayType("integer[](60)")).isEqualTo("varchar(60)"); + softly.assertThat(mysqlDdl.convertArrayType("varchar[]")).isEqualTo("varchar(1000)"); + softly.assertThat(mysqlDdl.convertArrayType("integer[]")).isEqualTo("varchar(1000)"); } @Test public void convertArrayType_h2() { if (useV1Syntax) { - assertThat(h2Ddl.convertArrayType("varchar[](90)")).isEqualTo("array"); - assertThat(h2Ddl.convertArrayType("integer[](60)")).isEqualTo("array"); - assertThat(h2Ddl.convertArrayType("varchar[]")).isEqualTo("array"); - assertThat(h2Ddl.convertArrayType("integer[]")).isEqualTo("array"); + softly.assertThat(h2Ddl.convertArrayType("varchar[](90)")).isEqualTo("array"); + softly.assertThat(h2Ddl.convertArrayType("integer[](60)")).isEqualTo("array"); + softly.assertThat(h2Ddl.convertArrayType("varchar[]")).isEqualTo("array"); + softly.assertThat(h2Ddl.convertArrayType("integer[]")).isEqualTo("array"); } else { - assertThat(h2Ddl.convertArrayType("varchar[](90)")).isEqualTo("varchar array"); - assertThat(h2Ddl.convertArrayType("integer[](60)")).isEqualTo("integer array"); - assertThat(h2Ddl.convertArrayType("varchar[]")).isEqualTo("varchar array"); - assertThat(h2Ddl.convertArrayType("integer[]")).isEqualTo("integer array"); + softly.assertThat(h2Ddl.convertArrayType("varchar[](90)")).isEqualTo("varchar array"); + softly.assertThat(h2Ddl.convertArrayType("integer[](60)")).isEqualTo("integer array"); + softly.assertThat(h2Ddl.convertArrayType("varchar[]")).isEqualTo("varchar array"); + softly.assertThat(h2Ddl.convertArrayType("integer[]")).isEqualTo("integer array"); } } @Test public void convertArrayType_postgres() { - assertThat(pgDdl.convertArrayType("varchar[](90)")).isEqualTo("varchar[]"); - assertThat(pgDdl.convertArrayType("integer[](60)")).isEqualTo("integer[]"); - assertThat(pgDdl.convertArrayType("varchar[]")).isEqualTo("varchar[]"); - assertThat(pgDdl.convertArrayType("integer[]")).isEqualTo("integer[]"); + softly.assertThat(pgDdl.convertArrayType("varchar[](90)")).isEqualTo("varchar[]"); + softly.assertThat(pgDdl.convertArrayType("integer[](60)")).isEqualTo("integer[]"); + softly.assertThat(pgDdl.convertArrayType("varchar[]")).isEqualTo("varchar[]"); + softly.assertThat(pgDdl.convertArrayType("integer[]")).isEqualTo("integer[]"); } @Test public void convertArrayType_hana() { - assertThat(hanaDdl.convertArrayType("varchar[](90)")).isEqualTo("nvarchar(255) array(90)"); - assertThat(hanaDdl.convertArrayType("integer[](60)")).isEqualTo("integer array(60)"); - assertThat(hanaDdl.convertArrayType("varchar[]")).isEqualTo("nvarchar(255) array"); - assertThat(hanaDdl.convertArrayType("integer[]")).isEqualTo("integer array"); + softly.assertThat(hanaDdl.convertArrayType("varchar[](90)")).isEqualTo("nvarchar(255) array(90)"); + softly.assertThat(hanaDdl.convertArrayType("integer[](60)")).isEqualTo("integer array(60)"); + softly.assertThat(hanaDdl.convertArrayType("varchar[]")).isEqualTo("nvarchar(255) array"); + softly.assertThat(hanaDdl.convertArrayType("integer[]")).isEqualTo("integer array"); } @Test public void testAlterColumnBaseAttributes() { - AlterColumn alterColumn = alterNotNull(); - assertNull(h2Ddl.alterColumnBaseAttributes(alterColumn)); - assertNull(pgDdl.alterColumnBaseAttributes(alterColumn)); - assertNull(oraDdl.alterColumnBaseAttributes(alterColumn)); + AlterColumn alter = new AlterColumn(); + alter.setTableName("mytab"); + alter.setColumnName("acol"); + alter.setCurrentType("varchar(5)"); + alter.setCurrentDefaultValue("'ho'"); + alter.setCurrentNotnull(Boolean.FALSE); - String sql = mysqlDdl.alterColumnBaseAttributes(alterColumn); - assertEquals("alter table mytab modify acol varchar(5) not null", sql); + // alter all attributes + alter.setNotnull(Boolean.TRUE); // -> alter to not null + alter.setDefaultValue("'hi'"); // and set default + alter.setType("varchar(50)"); // and alter type - sql = sqlServerDdl.alterColumnBaseAttributes(alterColumn); - assertEquals("alter table mytab alter column acol nvarchar(5) not null", sql); + String sql = alterColumn(h2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol varchar(50);\n" + + "alter table mytab alter column acol set default 'hi';\n" + + "alter table mytab alter column acol set not null;\n"); - sql = hanaDdl.alterColumnBaseAttributes(alterColumn); - assertEquals("alter table mytab alter ( acol nvarchar(5) not null)", sql); + sql = alterColumn(pgDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol type varchar(50) using acol::varchar(50);\n" + + "alter table mytab alter column acol set default 'hi';\n" + + "alter table mytab alter column acol set not null;\n"); - alterColumn.setNotnull(Boolean.FALSE); - sql = mysqlDdl.alterColumnBaseAttributes(alterColumn); - assertEquals("alter table mytab modify acol varchar(5)", sql); + sql = alterColumn(oraDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol varchar2(50);\n" + + "alter table mytab modify acol default 'hi';\n" + + "alter table mytab modify acol not null;\n"); - sql = hanaDdl.alterColumnBaseAttributes(alterColumn); - assertEquals("alter table mytab alter ( acol nvarchar(5))", sql); + sql = alterColumn(mysqlDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol varchar(50) not null default 'hi';\n"); - alterColumn.setNotnull(null); - alterColumn.setType("varchar(100)"); + sql = alterColumn(sqlServerDdl, alter); + softly.assertThat(sql).isEqualTo("EXEC usp_ebean_drop_default_constraint mytab, acol;\n" + + "alter table mytab alter column acol nvarchar(50) not null;\n" + + "alter table mytab add default 'hi' for acol;\n"); - sql = mysqlDdl.alterColumnBaseAttributes(alterColumn); - assertEquals("alter table mytab modify acol varchar(100)", sql); + sql = alterColumn(hanaDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter ( acol nvarchar(50) default 'hi' not null);\n"); - sql = hanaDdl.alterColumnBaseAttributes(alterColumn); - assertEquals("alter table mytab alter ( acol nvarchar(100))", sql); + sql = alterColumn(db2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set data type varchar(50);\n" + + "alter table mytab alter column acol set default 'hi';\n" + + "alter table mytab alter column acol set not null;\n"); - alterColumn.setCurrentNotnull(Boolean.TRUE); - sql = mysqlDdl.alterColumnBaseAttributes(alterColumn); - assertEquals("alter table mytab modify acol varchar(100) not null", sql); + // + alter.setCurrentNotnull(Boolean.TRUE); + alter.setNotnull(Boolean.FALSE); + alter.setDefaultValue("DROP DEFAULT"); + alter.setType(null); // do not alter type + + sql = alterColumn(h2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol drop default;\n" + + "alter table mytab alter column acol set null;\n"); + + sql = alterColumn(pgDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol drop default;\n" + + "alter table mytab alter column acol drop not null;\n"); + + sql = alterColumn(oraDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol default null;\n" + + "alter table mytab modify acol null;\n"); + + sql = alterColumn(mysqlDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol varchar(5);\n"); + + sql = alterColumn(sqlServerDdl, alter); + softly.assertThat(sql).isEqualTo("EXEC usp_ebean_drop_default_constraint mytab, acol;\n" + + "alter table mytab alter column acol nvarchar(5);\n"); + + sql = alterColumn(hanaDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter ( acol nvarchar(5) default null);\n"); + + sql = alterColumn(db2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol drop default;\n" + + "alter table mytab alter column acol drop not null;\n"); - sql = hanaDdl.alterColumnBaseAttributes(alterColumn); - assertEquals("alter table mytab alter ( acol nvarchar(100) not null)", sql); } @Test public void testAlterColumnType() { - String sql = h2Ddl.alterColumnType("mytab", "acol", "varchar(20)"); - assertEquals("alter table mytab alter column acol varchar(20)", sql); + AlterColumn alter = new AlterColumn(); + alter.setTableName("mytab"); + alter.setColumnName("acol"); + alter.setCurrentType("integer"); + alter.setType("varchar(20)"); - sql = pgDdl.alterColumnType("mytab", "acol", "varchar(20)"); - assertEquals("alter table mytab alter column acol type varchar(20) using acol::varchar(20)", sql); - sql = pgDdl.alterColumnType("mytab", "acol", "bigint"); - assertEquals("alter table mytab alter column acol type bigint using acol::bigint", sql); + String sql = alterColumn(h2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol varchar(20);\n"); - sql = oraDdl.alterColumnType("mytab", "acol", "varchar(20)"); - assertEquals("alter table mytab modify acol varchar2(20)", sql); + sql = alterColumn(pgDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol type varchar(20) using acol::varchar(20);\n"); - sql = mysqlDdl.alterColumnType("mytab", "acol", "varchar(20)"); - assertNull(sql); + sql = alterColumn(oraDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol varchar2(20);\n"); - sql = sqlServerDdl.alterColumnType("mytab", "acol", "varchar(20)"); - assertNull(sql); + sql = alterColumn(mysqlDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol varchar(20);\n"); + + sql = alterColumn(sqlServerDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol nvarchar(20);\n"); + + sql = alterColumn(hanaDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter ( acol nvarchar(20));\n"); + + sql = alterColumn(db2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set data type varchar(20);\n"); + + alter.setType("bigint"); + sql = alterColumn(pgDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol type bigint using acol::bigint;\n"); + + alter.setCurrentType("bigint"); + alter.setType("integer"); + sql = alterColumn(hanaDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter ( acol decimal );\n" + + "alter table mytab alter ( acol integer);\n"); + + alter.setCurrentType("varchar(20)"); + alter.setType("varchar(10)"); + sql = alterColumn(hanaDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter ( acol nclob);\n" + + "alter table mytab alter ( acol nvarchar(10));\n"); - sql = hanaDdl.alterColumnType("mytab", "acol", "varchar(20)"); - assertNull(sql); } @Test public void testAlterColumnNotnull() { + AlterColumn alter = new AlterColumn(); + alter.setTableName("mytab"); + alter.setColumnName("acol"); + alter.setCurrentType("varchar(20)"); + alter.setCurrentNotnull(Boolean.FALSE); + alter.setNotnull(Boolean.TRUE); - String sql = h2Ddl.alterColumnNotnull("mytab", "acol", true); - assertEquals("alter table mytab alter column acol set not null", sql); + String sql = alterColumn(h2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set not null;\n"); - sql = pgDdl.alterColumnNotnull("mytab", "acol", true); - assertEquals("alter table mytab alter column acol set not null", sql); + sql = alterColumn(pgDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set not null;\n"); - sql = oraDdl.alterColumnNotnull("mytab", "acol", true); - assertEquals("alter table mytab modify acol not null", sql); + sql = alterColumn(oraDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol not null;\n"); - sql = mysqlDdl.alterColumnNotnull("mytab", "acol", true); - assertNull(sql); + sql = alterColumn(mysqlDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol varchar(20) not null;\n"); - sql = sqlServerDdl.alterColumnNotnull("mytab", "acol", true); - assertNull(sql); + sql = alterColumn(sqlServerDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol nvarchar(20) not null;\n"); + + sql = alterColumn(hanaDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter ( acol nvarchar(20) not null);\n"); + + sql = alterColumn(db2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set not null;\n"); - sql = hanaDdl.alterColumnNotnull("mytab", "acol", true); - assertNull(sql); } @Test public void testAlterColumnNull() { - String sql = h2Ddl.alterColumnNotnull("mytab", "acol", false); - assertEquals("alter table mytab alter column acol set null", sql); + AlterColumn alter = new AlterColumn(); + alter.setTableName("mytab"); + alter.setColumnName("acol"); + alter.setCurrentType("varchar(20)"); + alter.setCurrentDefaultValue("'hi'"); + alter.setCurrentNotnull(Boolean.TRUE); - sql = pgDdl.alterColumnNotnull("mytab", "acol", false); - assertEquals("alter table mytab alter column acol drop not null", sql); + alter.setNotnull(Boolean.FALSE); + String sql = alterColumn(h2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set null;\n"); - sql = oraDdl.alterColumnNotnull("mytab", "acol", false); - assertEquals("alter table mytab modify acol null", sql); + sql = alterColumn(pgDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol drop not null;\n"); - sql = mysqlDdl.alterColumnNotnull("mytab", "acol", false); - assertNull(sql); + sql = alterColumn(oraDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol null;\n"); - sql = sqlServerDdl.alterColumnNotnull("mytab", "acol", false); - assertNull(sql); + sql = alterColumn(mysqlDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol varchar(20) default 'hi';\n"); - sql = hanaDdl.alterColumnNotnull("mytab", "acol", false); - assertNull(sql); + sql = alterColumn(sqlServerDdl, alter); + softly.assertThat(sql).isEqualTo("EXEC usp_ebean_drop_default_constraint mytab, acol;\n" + + "alter table mytab alter column acol nvarchar(20);\n" + + "alter table mytab add default 'hi' for acol;\n"); + + sql = alterColumn(hanaDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter ( acol nvarchar(20) default 'hi');\n"); + + sql = alterColumn(db2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol drop not null;\n"); } @Test - public void testAlterColumnDefaultValue() { + public void testAlterColumnAddDefaultValue() { + AlterColumn alter = new AlterColumn(); + alter.setTableName("mytab"); + alter.setColumnName("acol"); + alter.setCurrentType("varchar(20)"); + alter.setCurrentNotnull(Boolean.TRUE); + alter.setDefaultValue("'hi'"); - String sql = h2Ddl.alterColumnDefaultValue("mytab", "acol", "'hi'"); - assertEquals("alter table mytab alter column acol set default 'hi'", sql); + String sql = alterColumn(h2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set default 'hi';\n"); - sql = pgDdl.alterColumnDefaultValue("mytab", "acol", "'hi'"); - assertEquals("alter table mytab alter column acol set default 'hi'", sql); + sql = alterColumn(pgDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set default 'hi';\n"); - sql = oraDdl.alterColumnDefaultValue("mytab", "acol", "'hi'"); - assertEquals("alter table mytab modify acol default 'hi'", sql); + sql = alterColumn(oraDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol default 'hi';\n"); - sql = mysqlDdl.alterColumnDefaultValue("mytab", "acol", "'hi'"); - assertEquals("alter table mytab alter acol set default 'hi'", sql); + sql = alterColumn(mysqlDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter acol set default 'hi';\n"); - sql = sqlServerDdl.alterColumnDefaultValue("mytab", "acol", "'hi'"); - assertEquals("alter table mytab add default 'hi' for acol", sql); + sql = alterColumn(sqlServerDdl, alter); + softly.assertThat(sql).isEqualTo("EXEC usp_ebean_drop_default_constraint mytab, acol;\n" + + "alter table mytab add default 'hi' for acol;\n"); - boolean exceptionCaught = false; - try { - hanaDdl.alterColumnDefaultValue("mytab", "acol", "'hi'"); - } catch (UnsupportedOperationException e) { - exceptionCaught = true; - } - assertTrue(exceptionCaught); + sql = alterColumn(hanaDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter ( acol nvarchar(20) default 'hi' not null);\n"); + + sql = alterColumn(db2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set default 'hi';\n"); + } + + @Test + public void testAlterColumnChangeDefaultValue() { + AlterColumn alter = new AlterColumn(); + alter.setTableName("mytab"); + alter.setColumnName("acol"); + alter.setCurrentType("varchar(20)"); + alter.setCurrentNotnull(Boolean.TRUE); + alter.setDefaultValue("'ho'"); + alter.setDefaultValue("'hi'"); + + String sql = alterColumn(h2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set default 'hi';\n"); + + sql = alterColumn(pgDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set default 'hi';\n"); + + sql = alterColumn(oraDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol default 'hi';\n"); + + sql = alterColumn(mysqlDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter acol set default 'hi';\n"); + + sql = alterColumn(sqlServerDdl, alter); + softly.assertThat(sql).isEqualTo("EXEC usp_ebean_drop_default_constraint mytab, acol;\n" + + "alter table mytab add default 'hi' for acol;\n"); + + sql = alterColumn(hanaDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter ( acol nvarchar(20) default 'hi' not null);\n"); + + sql = alterColumn(db2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol set default 'hi';\n"); } @Test public void testAlterColumnDropDefault() { - String sql = h2Ddl.alterColumnDefaultValue("mytab", "acol", "DROP DEFAULT"); - assertEquals("alter table mytab alter column acol drop default", sql); + AlterColumn alter = new AlterColumn(); + alter.setTableName("mytab"); + alter.setColumnName("acol"); + alter.setCurrentType("varchar(20)"); + alter.setCurrentNotnull(Boolean.TRUE); + alter.setCurrentDefaultValue("'hi'"); + alter.setDefaultValue("DROP DEFAULT"); - sql = pgDdl.alterColumnDefaultValue("mytab", "acol", "DROP DEFAULT"); - assertEquals("alter table mytab alter column acol drop default", sql); + String sql = alterColumn(h2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol drop default;\n"); - sql = oraDdl.alterColumnDefaultValue("mytab", "acol", "DROP DEFAULT"); - assertEquals("alter table mytab modify acol default null", sql); + sql = alterColumn(pgDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol drop default;\n"); - sql = mysqlDdl.alterColumnDefaultValue("mytab", "acol", "DROP DEFAULT"); - assertEquals("alter table mytab alter acol drop default", sql); + sql = alterColumn(oraDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab modify acol default null;\n"); - sql = sqlServerDdl.alterColumnDefaultValue("mytab", "acol", "DROP DEFAULT"); - assertEquals("EXEC usp_ebean_drop_default_constraint mytab, acol", sql); + sql = alterColumn(mysqlDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter acol drop default;\n"); + + sql = alterColumn(sqlServerDdl, alter); + softly.assertThat(sql).isEqualTo("EXEC usp_ebean_drop_default_constraint mytab, acol;\n"); + + sql = alterColumn(hanaDdl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter ( acol nvarchar(20) default null not null);\n"); + + sql = alterColumn(db2Ddl, alter); + softly.assertThat(sql).isEqualTo("alter table mytab alter column acol drop default;\n"); - boolean exceptionCaught = false; - try { - hanaDdl.alterColumnDefaultValue("mytab", "acol", "DROP DEFAULT"); - } catch (UnsupportedOperationException e) { - exceptionCaught = true; - } - assertTrue(exceptionCaught); } @Test public void oracle_alterTableAddColumn() { DdlWrite writer = new DdlWrite(); - oraDdl.alterTableAddColumn(writer.apply(), "my_table", simpleColumn(), false, "1"); - assertThat(writer.apply().getBuffer()).isEqualTo("alter table my_table add my_column int default 1 not null;\n"); + oraDdl.alterTableAddColumn(writer, "my_table", simpleColumn(), false, "1"); + softly.assertThat(writer.apply().getBuffer()) + .isEqualTo("alter table my_table add my_column int default 1 not null;\n"); } private Column simpleColumn() { @@ -267,79 +398,148 @@ public class PlatformDdl_AlterColumnTest { @Test public void useIdentityType_h2() { - assertEquals(h2Ddl.useIdentityType(null), IdType.IDENTITY); - assertEquals(h2Ddl.useIdentityType(IdType.SEQUENCE), IdType.SEQUENCE); - assertEquals(h2Ddl.useIdentityType(IdType.IDENTITY), IdType.IDENTITY); - assertEquals(h2Ddl.useIdentityType(IdType.GENERATOR), IdType.GENERATOR); - assertEquals(h2Ddl.useIdentityType(IdType.EXTERNAL), IdType.EXTERNAL); + softly.assertThat(h2Ddl.useIdentityType(null)).isEqualTo(IdType.IDENTITY); + softly.assertThat(h2Ddl.useIdentityType(IdType.SEQUENCE)).isEqualTo(IdType.SEQUENCE); + softly.assertThat(h2Ddl.useIdentityType(IdType.IDENTITY)).isEqualTo(IdType.IDENTITY); + softly.assertThat(h2Ddl.useIdentityType(IdType.GENERATOR)).isEqualTo(IdType.GENERATOR); + softly.assertThat(h2Ddl.useIdentityType(IdType.EXTERNAL)).isEqualTo(IdType.EXTERNAL); } @Test public void useIdentityType_postgres() { - assertEquals(pgDdl.useIdentityType(IdType.GENERATOR), IdType.GENERATOR); - assertEquals(pgDdl.useIdentityType(IdType.EXTERNAL), IdType.EXTERNAL); + softly.assertThat(pgDdl.useIdentityType(IdType.GENERATOR)).isEqualTo(IdType.GENERATOR); + softly.assertThat(pgDdl.useIdentityType(IdType.EXTERNAL)).isEqualTo(IdType.EXTERNAL); - assertEquals(pgDdl.useIdentityType(null), IdType.IDENTITY); - assertEquals(pgDdl.useIdentityType(IdType.SEQUENCE), IdType.SEQUENCE); - assertEquals(pgDdl.useIdentityType(IdType.IDENTITY), IdType.IDENTITY); + softly.assertThat(pgDdl.useIdentityType(null)).isEqualTo(IdType.IDENTITY); + softly.assertThat(pgDdl.useIdentityType(IdType.SEQUENCE)).isEqualTo(IdType.SEQUENCE); + softly.assertThat(pgDdl.useIdentityType(IdType.IDENTITY)).isEqualTo(IdType.IDENTITY); } @Test public void useIdentityType_mysql() { - assertEquals(mysqlDdl.useIdentityType(null), IdType.IDENTITY); - assertEquals(mysqlDdl.useIdentityType(IdType.SEQUENCE), IdType.IDENTITY); - assertEquals(mysqlDdl.useIdentityType(IdType.IDENTITY), IdType.IDENTITY); - assertEquals(mysqlDdl.useIdentityType(IdType.GENERATOR), IdType.GENERATOR); - assertEquals(mysqlDdl.useIdentityType(IdType.EXTERNAL), IdType.EXTERNAL); + softly.assertThat(mysqlDdl.useIdentityType(null)).isEqualTo(IdType.IDENTITY); + softly.assertThat(mysqlDdl.useIdentityType(IdType.SEQUENCE)).isEqualTo(IdType.IDENTITY); + softly.assertThat(mysqlDdl.useIdentityType(IdType.IDENTITY)).isEqualTo(IdType.IDENTITY); + softly.assertThat(mysqlDdl.useIdentityType(IdType.GENERATOR)).isEqualTo(IdType.GENERATOR); + softly.assertThat(mysqlDdl.useIdentityType(IdType.EXTERNAL)).isEqualTo(IdType.EXTERNAL); } @Test public void useIdentityType_oracle() { - assertEquals(oraDdl.useIdentityType(null), IdType.IDENTITY); - assertEquals(oraDdl.useIdentityType(IdType.SEQUENCE), IdType.SEQUENCE); - assertEquals(oraDdl.useIdentityType(IdType.IDENTITY), IdType.IDENTITY); - assertEquals(oraDdl.useIdentityType(IdType.GENERATOR), IdType.GENERATOR); - assertEquals(oraDdl.useIdentityType(IdType.EXTERNAL), IdType.EXTERNAL); + softly.assertThat(oraDdl.useIdentityType(null)).isEqualTo(IdType.IDENTITY); + softly.assertThat(oraDdl.useIdentityType(IdType.SEQUENCE)).isEqualTo(IdType.SEQUENCE); + softly.assertThat(oraDdl.useIdentityType(IdType.IDENTITY)).isEqualTo(IdType.IDENTITY); + softly.assertThat(oraDdl.useIdentityType(IdType.GENERATOR)).isEqualTo(IdType.GENERATOR); + softly.assertThat(oraDdl.useIdentityType(IdType.EXTERNAL)).isEqualTo(IdType.EXTERNAL); } @Test public void useIdentityType_hana() { - assertEquals(hanaDdl.useIdentityType(null), IdType.IDENTITY); - assertEquals(hanaDdl.useIdentityType(IdType.SEQUENCE), IdType.IDENTITY); - assertEquals(hanaDdl.useIdentityType(IdType.IDENTITY), IdType.IDENTITY); - assertEquals(hanaDdl.useIdentityType(IdType.GENERATOR), IdType.GENERATOR); - assertEquals(hanaDdl.useIdentityType(IdType.EXTERNAL), IdType.EXTERNAL); + softly.assertThat(hanaDdl.useIdentityType(null)).isEqualTo(IdType.IDENTITY); + softly.assertThat(hanaDdl.useIdentityType(IdType.SEQUENCE)).isEqualTo(IdType.IDENTITY); + softly.assertThat(hanaDdl.useIdentityType(IdType.IDENTITY)).isEqualTo(IdType.IDENTITY); + softly.assertThat(hanaDdl.useIdentityType(IdType.GENERATOR)).isEqualTo(IdType.GENERATOR); + softly.assertThat(hanaDdl.useIdentityType(IdType.EXTERNAL)).isEqualTo(IdType.EXTERNAL); } @Test public void appendForeignKeySuffix_when_defaults() { - assertThat(alterFkey(null, null)).isEqualTo(" on delete restrict on update restrict"); + softly.assertThat(alterFkey(h2Ddl, null, null)).isEqualTo(" on delete restrict on update restrict"); + softly.assertThat(alterFkey(pgDdl, null, null)).isEqualTo(" on delete restrict on update restrict"); + softly.assertThat(alterFkey(mysqlDdl, null, null)).isEqualTo(" on delete restrict on update restrict"); + softly.assertThat(alterFkey(oraDdl, null, null)).isEqualTo(""); + softly.assertThat(alterFkey(sqlServerDdl, null, null)).isEqualTo(""); + softly.assertThat(alterFkey(hanaDdl, null, null)).isEqualTo(" on delete restrict on update restrict"); + softly.assertThat(alterFkey(db2Ddl, null, null)).isEqualTo(" on delete restrict"); } @Test public void appendForeignKeySuffix_when_RestrictSetNull() { - assertThat(alterFkey("RESTRICT", "SET_NULL")).isEqualTo(" on delete restrict on update set null"); + softly.assertThat(alterFkey(h2Ddl, "RESTRICT", "SET_NULL")) + .isEqualTo(" on delete restrict on update set null"); + + softly.assertThat(alterFkey(pgDdl, "RESTRICT", "SET_NULL")) + .isEqualTo(" on delete restrict on update set null"); + + softly.assertThat(alterFkey(mysqlDdl, "RESTRICT", "SET_NULL")) + .isEqualTo(" on delete restrict on update set null"); + + softly.assertThat(alterFkey(oraDdl, "RESTRICT", "SET_NULL")) + .isEqualTo(""); + + softly.assertThat(alterFkey(sqlServerDdl, "RESTRICT", "SET_NULL")) + .isEqualTo(" on update set null"); + + softly.assertThat(alterFkey(hanaDdl, "RESTRICT", "SET_NULL")) + .isEqualTo(" on delete restrict on update set null"); + + softly.assertThat(alterFkey(db2Ddl, "RESTRICT", "SET_NULL")) + .isEqualTo(" on delete restrict"); } @Test public void appendForeignKeySuffix_when_SetNullRestrict() { - assertThat(alterFkey("SET_NULL", "RESTRICT")).isEqualTo(" on delete set null on update restrict"); + softly.assertThat(alterFkey(h2Ddl, "SET_NULL", "RESTRICT")) + .isEqualTo(" on delete set null on update restrict"); + + softly.assertThat(alterFkey(pgDdl, "SET_NULL", "RESTRICT")) + .isEqualTo(" on delete set null on update restrict"); + + softly.assertThat(alterFkey(mysqlDdl, "SET_NULL", "RESTRICT")) + .isEqualTo(" on delete set null on update restrict"); + + softly.assertThat(alterFkey(oraDdl, "SET_NULL", "RESTRICT")) + .isEqualTo(" on delete set null"); + + softly.assertThat(alterFkey(sqlServerDdl, "SET_NULL", "RESTRICT")) + .isEqualTo(" on delete set null"); + + softly.assertThat(alterFkey(hanaDdl, "SET_NULL", "RESTRICT")) + .isEqualTo(" on delete set null on update restrict"); + + softly.assertThat(alterFkey(db2Ddl, "SET_NULL", "RESTRICT")) + .isEqualTo(" on delete set null"); } @Test public void appendForeignKeySuffix_when_SetDefaultCascade() { - assertThat(alterFkey("SET_DEFAULT", "CASCADE")).isEqualTo(" on delete set default on update cascade"); + softly.assertThat(alterFkey(h2Ddl, "SET_DEFAULT", "CASCADE")) + .isEqualTo(" on delete set default on update cascade"); + + softly.assertThat(alterFkey(pgDdl, "SET_DEFAULT", "CASCADE")) + .isEqualTo(" on delete set default on update cascade"); + + softly.assertThat(alterFkey(mysqlDdl, "SET_DEFAULT", "CASCADE")) + .isEqualTo(" on delete set default on update cascade"); + + softly.assertThat(alterFkey(oraDdl, "SET_DEFAULT", "CASCADE")) + .isEqualTo(""); + + softly.assertThat(alterFkey(sqlServerDdl, "SET_DEFAULT", "CASCADE")) + .isEqualTo(" on delete set default on update cascade"); + + softly.assertThat(alterFkey(hanaDdl, "SET_DEFAULT", "CASCADE")) + .isEqualTo(" on delete set default on update cascade"); + + softly.assertThat(alterFkey(db2Ddl, "SET_DEFAULT", "CASCADE")) + .isEqualTo(" on delete set default"); } - private String alterFkey(String onDelete, String onUpdate) { + private String alterColumn(PlatformDdl ddl, AlterColumn alterColumn) { + DdlWrite write = new DdlWrite(); + ddl.alterColumn(write, alterColumn); + return write.apply().getBuffer(); + } + + private String alterFkey(PlatformDdl ddl, String onDelete, String onUpdate) { AlterForeignKey afk = new AlterForeignKey(); afk.setOnDelete(onDelete); afk.setOnUpdate(onUpdate); StringBuilder buffer = new StringBuilder(); - h2Ddl.appendForeignKeySuffix(new WriteForeignKey(afk), buffer); + ddl.appendForeignKeySuffix(new WriteForeignKey(afk), buffer); return buffer.toString(); } diff --git a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_dropUniqueConstraintTest.java b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_dropUniqueConstraintTest.java index 7833898f7..cebab093f 100644 --- a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_dropUniqueConstraintTest.java +++ b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_dropUniqueConstraintTest.java @@ -42,7 +42,7 @@ public class PlatformDdl_dropUniqueConstraintTest { sql = sqlServerDdl.alterTableDropUniqueConstraint("mytab", "uq_name"); assertEquals( "IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('mytab','U') AND name = 'uq_name') drop index uq_name ON mytab;\n" - + "IF (OBJECT_ID('uq_name', 'UQ') IS NOT NULL) alter table mytab drop constraint uq_name", + + "IF OBJECT_ID('uq_name', 'UQ') IS NOT NULL alter table mytab drop constraint uq_name", sql); sql = mysqlDdl.alterTableDropUniqueConstraint("mytab", "uq_name"); From 9bcba0b80d5ce8e3519b92b34e4cfe592f76ab3a Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Mon, 7 Mar 2022 15:40:45 +0100 Subject: [PATCH 2/2] Sql-scripts --- .../dbmigration/mariadb-noprocs/1.1.sql | 10 +++----- .../dbmigration/mariadb-noprocs/1.3.sql | 12 +++------ .../mariadb-noprocs/idx_mariadb.migrations | 4 +-- .../migrationtest/dbmigration/mariadb/1.1.sql | 10 +++----- .../migrationtest/dbmigration/mariadb/1.3.sql | 12 +++------ .../mariadb/idx_mariadb.migrations | 4 +-- .../migrationtest/dbmigration/mysql/1.1.sql | 10 +++----- .../migrationtest/dbmigration/mysql/1.3.sql | 12 +++------ .../dbmigration/mysql/idx_mysql.migrations | 4 +-- .../migrationtest/dbmigration/mysql55/1.1.sql | 10 +++----- .../migrationtest/dbmigration/mysql55/1.3.sql | 12 +++------ .../dbmigration/mysql55/idx_mysql.migrations | 4 +-- .../dbmigration/sqlserver16/1.1.sql | 19 ++++++++------ .../dbmigration/sqlserver16/1.3.sql | 25 +++++++++++-------- .../sqlserver16/idx_sqlserver.migrations | 4 +-- .../dbmigration/sqlserver17/1.1.sql | 19 ++++++++------ .../dbmigration/sqlserver17/1.3.sql | 25 +++++++++++-------- .../sqlserver17/idx_sqlserver.migrations | 4 +-- 18 files changed, 86 insertions(+), 114 deletions(-) diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/1.1.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/1.1.sql index 04603643f..ec9514319 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/1.1.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/1.1.sql @@ -36,9 +36,7 @@ alter table migtest_fk_set_null drop foreign key fk_migtest_fk_set_null_one_id; alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict on update restrict; update migtest_e_basic set status = 'A' where status is null; -alter table migtest_e_basic alter status set default 'A'; -alter table migtest_e_basic modify status varchar(1) not null; -alter table migtest_e_basic alter status2 drop default; +alter table migtest_e_basic modify status varchar(1) not null default 'A'; alter table migtest_e_basic modify status2 varchar(127); -- rename all collisions; @@ -67,8 +65,7 @@ alter table migtest_e_history comment = 'We have history now'; -- NOTE: table has @History - special migration may be necessary SET @@system_versioning_alter_history = 1; update migtest_e_history2 set test_string = 'unknown' where test_string is null; -alter table migtest_e_history2 alter test_string set default 'unknown'; -alter table migtest_e_history2 modify test_string varchar(255) not null; +alter table migtest_e_history2 modify test_string varchar(255) not null default 'unknown'; alter table migtest_e_history2 add column test_string2 varchar(255); alter table migtest_e_history2 add column test_string3 varchar(255) default 'unknown' not null; alter table migtest_e_history2 add column new_column varchar(20); @@ -79,8 +76,7 @@ alter table migtest_e_history5 add column test_boolean tinyint(1) default 0 not -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number1 = 42 where test_number1 is null; -alter table migtest_e_history6 alter test_number1 set default 42; -alter table migtest_e_history6 modify test_number1 integer not null; +alter table migtest_e_history6 modify test_number1 integer not null default 42; alter table migtest_e_history6 modify test_number2 integer; alter table migtest_e_softdelete add column deleted tinyint(1) default 0 not null; diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/1.3.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/1.3.sql index c3f1dd68f..0425230ac 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/1.3.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/1.3.sql @@ -14,18 +14,15 @@ alter table migtest_fk_none drop foreign key fk_migtest_fk_none_one_id; alter table migtest_fk_none_via_join drop foreign key fk_migtest_fk_none_via_join_one_id; alter table migtest_fk_set_null drop foreign key fk_migtest_fk_set_null_one_id; alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete set null on update restrict; -alter table migtest_e_basic alter status drop default; alter table migtest_e_basic modify status varchar(1); update migtest_e_basic set status2 = 'N' where status2 is null; -alter table migtest_e_basic alter status2 set default 'N'; -alter table migtest_e_basic modify status2 varchar(1) not null; +alter table migtest_e_basic modify status2 varchar(1) not null default 'N'; alter table migtest_e_basic drop index uq_migtest_e_basic_description; update migtest_e_basic set user_id = 23 where user_id is null; alter table migtest_e_basic drop foreign key fk_migtest_e_basic_user_id; -alter table migtest_e_basic alter user_id set default 23; -alter table migtest_e_basic modify user_id integer not null; +alter table migtest_e_basic modify user_id integer not null default 23; alter table migtest_e_basic add column description_file longblob; alter table migtest_e_basic add column old_boolean tinyint(1) default 0 not null; alter table migtest_e_basic add column old_boolean2 tinyint(1); @@ -38,19 +35,16 @@ alter table migtest_e_basic drop index uq_migtest_e_basic_indextest5; alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest2 unique (indextest2); alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest6 unique (indextest6); alter table migtest_e_history comment = ''; -alter table migtest_e_history2 alter test_string drop default; alter table migtest_e_history2 modify test_string varchar(255); alter table migtest_e_history2 add column obsolete_string1 varchar(255); alter table migtest_e_history2 add column obsolete_string2 varchar(255); alter table migtest_e_history4 modify test_number integer; -alter table migtest_e_history6 alter test_number1 drop default; alter table migtest_e_history6 modify test_number1 integer; -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number2 = 7 where test_number2 is null; -alter table migtest_e_history6 alter test_number2 set default 7; -alter table migtest_e_history6 modify test_number2 integer not null; +alter table migtest_e_history6 modify test_number2 integer not null default 7; create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5); drop index ix_migtest_e_basic_indextest3 on migtest_e_basic; diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/idx_mariadb.migrations b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/idx_mariadb.migrations index a66b70c10..d1d18beb6 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/idx_mariadb.migrations +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb-noprocs/idx_mariadb.migrations @@ -1,7 +1,7 @@ -616900688, 1.0__initial.sql -128637084, 1.1.sql +-786596816, 1.1.sql -2077736415, 1.2__dropsFor_1.1.sql --1744111309, 1.3.sql +1262945599, 1.3.sql 89701608, 1.4__dropsFor_1.3.sql 561281075, R__order_views.sql diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/1.1.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/1.1.sql index 04603643f..ec9514319 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/1.1.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/1.1.sql @@ -36,9 +36,7 @@ alter table migtest_fk_set_null drop foreign key fk_migtest_fk_set_null_one_id; alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict on update restrict; update migtest_e_basic set status = 'A' where status is null; -alter table migtest_e_basic alter status set default 'A'; -alter table migtest_e_basic modify status varchar(1) not null; -alter table migtest_e_basic alter status2 drop default; +alter table migtest_e_basic modify status varchar(1) not null default 'A'; alter table migtest_e_basic modify status2 varchar(127); -- rename all collisions; @@ -67,8 +65,7 @@ alter table migtest_e_history comment = 'We have history now'; -- NOTE: table has @History - special migration may be necessary SET @@system_versioning_alter_history = 1; update migtest_e_history2 set test_string = 'unknown' where test_string is null; -alter table migtest_e_history2 alter test_string set default 'unknown'; -alter table migtest_e_history2 modify test_string varchar(255) not null; +alter table migtest_e_history2 modify test_string varchar(255) not null default 'unknown'; alter table migtest_e_history2 add column test_string2 varchar(255); alter table migtest_e_history2 add column test_string3 varchar(255) default 'unknown' not null; alter table migtest_e_history2 add column new_column varchar(20); @@ -79,8 +76,7 @@ alter table migtest_e_history5 add column test_boolean tinyint(1) default 0 not -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number1 = 42 where test_number1 is null; -alter table migtest_e_history6 alter test_number1 set default 42; -alter table migtest_e_history6 modify test_number1 integer not null; +alter table migtest_e_history6 modify test_number1 integer not null default 42; alter table migtest_e_history6 modify test_number2 integer; alter table migtest_e_softdelete add column deleted tinyint(1) default 0 not null; diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/1.3.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/1.3.sql index c3f1dd68f..0425230ac 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/1.3.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/1.3.sql @@ -14,18 +14,15 @@ alter table migtest_fk_none drop foreign key fk_migtest_fk_none_one_id; alter table migtest_fk_none_via_join drop foreign key fk_migtest_fk_none_via_join_one_id; alter table migtest_fk_set_null drop foreign key fk_migtest_fk_set_null_one_id; alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete set null on update restrict; -alter table migtest_e_basic alter status drop default; alter table migtest_e_basic modify status varchar(1); update migtest_e_basic set status2 = 'N' where status2 is null; -alter table migtest_e_basic alter status2 set default 'N'; -alter table migtest_e_basic modify status2 varchar(1) not null; +alter table migtest_e_basic modify status2 varchar(1) not null default 'N'; alter table migtest_e_basic drop index uq_migtest_e_basic_description; update migtest_e_basic set user_id = 23 where user_id is null; alter table migtest_e_basic drop foreign key fk_migtest_e_basic_user_id; -alter table migtest_e_basic alter user_id set default 23; -alter table migtest_e_basic modify user_id integer not null; +alter table migtest_e_basic modify user_id integer not null default 23; alter table migtest_e_basic add column description_file longblob; alter table migtest_e_basic add column old_boolean tinyint(1) default 0 not null; alter table migtest_e_basic add column old_boolean2 tinyint(1); @@ -38,19 +35,16 @@ alter table migtest_e_basic drop index uq_migtest_e_basic_indextest5; alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest2 unique (indextest2); alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest6 unique (indextest6); alter table migtest_e_history comment = ''; -alter table migtest_e_history2 alter test_string drop default; alter table migtest_e_history2 modify test_string varchar(255); alter table migtest_e_history2 add column obsolete_string1 varchar(255); alter table migtest_e_history2 add column obsolete_string2 varchar(255); alter table migtest_e_history4 modify test_number integer; -alter table migtest_e_history6 alter test_number1 drop default; alter table migtest_e_history6 modify test_number1 integer; -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number2 = 7 where test_number2 is null; -alter table migtest_e_history6 alter test_number2 set default 7; -alter table migtest_e_history6 modify test_number2 integer not null; +alter table migtest_e_history6 modify test_number2 integer not null default 7; create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5); drop index ix_migtest_e_basic_indextest3 on migtest_e_basic; diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/idx_mariadb.migrations b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/idx_mariadb.migrations index d7958ff29..00322e59e 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/idx_mariadb.migrations +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mariadb/idx_mariadb.migrations @@ -1,8 +1,8 @@ 1835064798, I__create_procs.sql -616900688, 1.0__initial.sql -128637084, 1.1.sql +-786596816, 1.1.sql -2098746494, 1.2__dropsFor_1.1.sql --1744111309, 1.3.sql +1262945599, 1.3.sql 930722740, 1.4__dropsFor_1.3.sql 561281075, R__order_views.sql diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/1.1.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/1.1.sql index 16d54565f..020fbaa27 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/1.1.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/1.1.sql @@ -42,9 +42,7 @@ alter table migtest_fk_set_null drop foreign key fk_migtest_fk_set_null_one_id; alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict on update restrict; update migtest_e_basic set status = 'A' where status is null; -alter table migtest_e_basic alter status set default 'A'; -alter table migtest_e_basic modify status varchar(1) not null; -alter table migtest_e_basic alter status2 drop default; +alter table migtest_e_basic modify status varchar(1) not null default 'A'; alter table migtest_e_basic modify status2 varchar(127); -- rename all collisions; @@ -72,8 +70,7 @@ alter table migtest_e_history comment = 'We have history now'; -- NOTE: table has @History - special migration may be necessary update migtest_e_history2 set test_string = 'unknown' where test_string is null; -alter table migtest_e_history2 alter test_string set default 'unknown'; -alter table migtest_e_history2 modify test_string varchar(255) not null; +alter table migtest_e_history2 modify test_string varchar(255) not null default 'unknown'; alter table migtest_e_history2 add column test_string2 varchar(255); alter table migtest_e_history2 add column test_string3 varchar(255) default 'unknown' not null; alter table migtest_e_history2 add column new_column varchar(20); @@ -89,8 +86,7 @@ alter table migtest_e_history5_history add column test_boolean tinyint(1) defaul -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number1 = 42 where test_number1 is null; -alter table migtest_e_history6 alter test_number1 set default 42; -alter table migtest_e_history6 modify test_number1 integer not null; +alter table migtest_e_history6 modify test_number1 integer not null default 42; alter table migtest_e_history6 modify test_number2 integer; alter table migtest_e_softdelete add column deleted tinyint(1) default 0 not null; diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/1.3.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/1.3.sql index b3d9845a5..2eb7ccc79 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/1.3.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/1.3.sql @@ -19,18 +19,15 @@ alter table migtest_fk_none drop foreign key fk_migtest_fk_none_one_id; alter table migtest_fk_none_via_join drop foreign key fk_migtest_fk_none_via_join_one_id; alter table migtest_fk_set_null drop foreign key fk_migtest_fk_set_null_one_id; alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete set null on update restrict; -alter table migtest_e_basic alter status drop default; alter table migtest_e_basic modify status varchar(1); update migtest_e_basic set status2 = 'N' where status2 is null; -alter table migtest_e_basic alter status2 set default 'N'; -alter table migtest_e_basic modify status2 varchar(1) not null; +alter table migtest_e_basic modify status2 varchar(1) not null default 'N'; alter table migtest_e_basic drop index uq_migtest_e_basic_description; update migtest_e_basic set user_id = 23 where user_id is null; alter table migtest_e_basic drop foreign key fk_migtest_e_basic_user_id; -alter table migtest_e_basic alter user_id set default 23; -alter table migtest_e_basic modify user_id integer not null; +alter table migtest_e_basic modify user_id integer not null default 23; alter table migtest_e_basic add column description_file longblob; alter table migtest_e_basic add column old_boolean tinyint(1) default 0 not null; alter table migtest_e_basic add column old_boolean2 tinyint(1); @@ -43,7 +40,6 @@ alter table migtest_e_basic drop index uq_migtest_e_basic_indextest5; alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest2 unique (indextest2); alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest6 unique (indextest6); alter table migtest_e_history comment = ''; -alter table migtest_e_history2 alter test_string drop default; alter table migtest_e_history2 modify test_string varchar(255); alter table migtest_e_history2 add column obsolete_string1 varchar(255); alter table migtest_e_history2 add column obsolete_string2 varchar(255); @@ -52,13 +48,11 @@ alter table migtest_e_history2_history add column obsolete_string2 varchar(255); alter table migtest_e_history4 modify test_number integer; alter table migtest_e_history4_history modify test_number integer; -alter table migtest_e_history6 alter test_number1 drop default; alter table migtest_e_history6 modify test_number1 integer; -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number2 = 7 where test_number2 is null; -alter table migtest_e_history6 alter test_number2 set default 7; -alter table migtest_e_history6 modify test_number2 integer not null; +alter table migtest_e_history6 modify test_number2 integer not null default 7; alter table migtest_oto_child add constraint uq_m12_otoc72 unique (name); alter table migtest_oto_master add constraint uq_migtest_oto_master_name unique (name); create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/idx_mysql.migrations b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/idx_mysql.migrations index 5dbbf2fd2..2ff170b68 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/idx_mysql.migrations +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql/idx_mysql.migrations @@ -1,8 +1,8 @@ 1835064798, I__create_procs.sql 890673066, 1.0__initial.sql --1627573867, 1.1.sql +67386209, 1.1.sql 1986189381, 1.2__dropsFor_1.1.sql -798979911, 1.3.sql +2054074037, 1.3.sql -1373040825, 1.4__dropsFor_1.3.sql 561281075, R__order_views.sql diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/1.1.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/1.1.sql index 16d54565f..020fbaa27 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/1.1.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/1.1.sql @@ -42,9 +42,7 @@ alter table migtest_fk_set_null drop foreign key fk_migtest_fk_set_null_one_id; alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict on update restrict; update migtest_e_basic set status = 'A' where status is null; -alter table migtest_e_basic alter status set default 'A'; -alter table migtest_e_basic modify status varchar(1) not null; -alter table migtest_e_basic alter status2 drop default; +alter table migtest_e_basic modify status varchar(1) not null default 'A'; alter table migtest_e_basic modify status2 varchar(127); -- rename all collisions; @@ -72,8 +70,7 @@ alter table migtest_e_history comment = 'We have history now'; -- NOTE: table has @History - special migration may be necessary update migtest_e_history2 set test_string = 'unknown' where test_string is null; -alter table migtest_e_history2 alter test_string set default 'unknown'; -alter table migtest_e_history2 modify test_string varchar(255) not null; +alter table migtest_e_history2 modify test_string varchar(255) not null default 'unknown'; alter table migtest_e_history2 add column test_string2 varchar(255); alter table migtest_e_history2 add column test_string3 varchar(255) default 'unknown' not null; alter table migtest_e_history2 add column new_column varchar(20); @@ -89,8 +86,7 @@ alter table migtest_e_history5_history add column test_boolean tinyint(1) defaul -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number1 = 42 where test_number1 is null; -alter table migtest_e_history6 alter test_number1 set default 42; -alter table migtest_e_history6 modify test_number1 integer not null; +alter table migtest_e_history6 modify test_number1 integer not null default 42; alter table migtest_e_history6 modify test_number2 integer; alter table migtest_e_softdelete add column deleted tinyint(1) default 0 not null; diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/1.3.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/1.3.sql index b3d9845a5..2eb7ccc79 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/1.3.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/1.3.sql @@ -19,18 +19,15 @@ alter table migtest_fk_none drop foreign key fk_migtest_fk_none_one_id; alter table migtest_fk_none_via_join drop foreign key fk_migtest_fk_none_via_join_one_id; alter table migtest_fk_set_null drop foreign key fk_migtest_fk_set_null_one_id; alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete set null on update restrict; -alter table migtest_e_basic alter status drop default; alter table migtest_e_basic modify status varchar(1); update migtest_e_basic set status2 = 'N' where status2 is null; -alter table migtest_e_basic alter status2 set default 'N'; -alter table migtest_e_basic modify status2 varchar(1) not null; +alter table migtest_e_basic modify status2 varchar(1) not null default 'N'; alter table migtest_e_basic drop index uq_migtest_e_basic_description; update migtest_e_basic set user_id = 23 where user_id is null; alter table migtest_e_basic drop foreign key fk_migtest_e_basic_user_id; -alter table migtest_e_basic alter user_id set default 23; -alter table migtest_e_basic modify user_id integer not null; +alter table migtest_e_basic modify user_id integer not null default 23; alter table migtest_e_basic add column description_file longblob; alter table migtest_e_basic add column old_boolean tinyint(1) default 0 not null; alter table migtest_e_basic add column old_boolean2 tinyint(1); @@ -43,7 +40,6 @@ alter table migtest_e_basic drop index uq_migtest_e_basic_indextest5; alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest2 unique (indextest2); alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest6 unique (indextest6); alter table migtest_e_history comment = ''; -alter table migtest_e_history2 alter test_string drop default; alter table migtest_e_history2 modify test_string varchar(255); alter table migtest_e_history2 add column obsolete_string1 varchar(255); alter table migtest_e_history2 add column obsolete_string2 varchar(255); @@ -52,13 +48,11 @@ alter table migtest_e_history2_history add column obsolete_string2 varchar(255); alter table migtest_e_history4 modify test_number integer; alter table migtest_e_history4_history modify test_number integer; -alter table migtest_e_history6 alter test_number1 drop default; alter table migtest_e_history6 modify test_number1 integer; -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number2 = 7 where test_number2 is null; -alter table migtest_e_history6 alter test_number2 set default 7; -alter table migtest_e_history6 modify test_number2 integer not null; +alter table migtest_e_history6 modify test_number2 integer not null default 7; alter table migtest_oto_child add constraint uq_m12_otoc72 unique (name); alter table migtest_oto_master add constraint uq_migtest_oto_master_name unique (name); create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/idx_mysql.migrations b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/idx_mysql.migrations index 5994ca140..cba785aa6 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/idx_mysql.migrations +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/mysql55/idx_mysql.migrations @@ -1,8 +1,8 @@ 1835064798, I__create_procs.sql 881444156, 1.0__initial.sql --1627573867, 1.1.sql +67386209, 1.1.sql 1986189381, 1.2__dropsFor_1.1.sql -798979911, 1.3.sql +2054074037, 1.3.sql -1373040825, 1.4__dropsFor_1.3.sql 561281075, R__order_views.sql diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/1.1.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/1.1.sql index 51c12789a..bd340a266 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/1.1.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/1.1.sql @@ -36,11 +36,12 @@ IF OBJECT_ID('fk_migtest_fk_set_null_one_id', 'F') IS NOT NULL alter table migte alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id); update migtest_e_basic set status = 'A' where status is null; -IF (OBJECT_ID('ck_migtest_e_basic_status', 'C') IS NOT NULL) alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; -alter table migtest_e_basic add default 'A' for status; +IF OBJECT_ID('ck_migtest_e_basic_status', 'C') IS NOT NULL alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; +EXEC usp_ebean_drop_default_constraint migtest_e_basic, status; alter table migtest_e_basic alter column status varchar(1) not null; +alter table migtest_e_basic add default 'A' for status; alter table migtest_e_basic add constraint ck_migtest_e_basic_status check ( status in ('N','A','I','?')); -IF (OBJECT_ID('ck_migtest_e_basic_status2', 'C') IS NOT NULL) alter table migtest_e_basic drop constraint ck_migtest_e_basic_status2; +IF OBJECT_ID('ck_migtest_e_basic_status2', 'C') IS NOT NULL alter table migtest_e_basic drop constraint ck_migtest_e_basic_status2; EXEC usp_ebean_drop_default_constraint migtest_e_basic, status2; alter table migtest_e_basic alter column status2 varchar(127); @@ -60,20 +61,21 @@ alter table migtest_e_basic add constraint ck_migtest_e_basic_progress check ( p alter table migtest_e_basic add new_integer integer default 42 not null; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_indextest2') drop index uq_migtest_e_basic_indextest2 ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_indextest2', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest2; +IF OBJECT_ID('uq_migtest_e_basic_indextest2', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest2; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_indextest6') drop index uq_migtest_e_basic_indextest6 ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_indextest6', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest6; +IF OBJECT_ID('uq_migtest_e_basic_indextest6', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest6; create unique nonclustered index uq_migtest_e_basic_status_indextest1 on migtest_e_basic(status,indextest1) where indextest1 is not null; create unique nonclustered index uq_migtest_e_basic_name on migtest_e_basic(name) where name is not null; create unique nonclustered index uq_migtest_e_basic_indextest4 on migtest_e_basic(indextest4) where indextest4 is not null; create unique nonclustered index uq_migtest_e_basic_indextest5 on migtest_e_basic(indextest5) where indextest5 is not null; -IF (OBJECT_ID('ck_migtest_e_enum_test_status', 'C') IS NOT NULL) alter table migtest_e_enum drop constraint ck_migtest_e_enum_test_status; +IF OBJECT_ID('ck_migtest_e_enum_test_status', 'C') IS NOT NULL alter table migtest_e_enum drop constraint ck_migtest_e_enum_test_status; alter table migtest_e_history alter column test_string numeric(19); -- NOTE: table has @History - special migration may be necessary update migtest_e_history2 set test_string = 'unknown' where test_string is null; -alter table migtest_e_history2 add default 'unknown' for test_string; +EXEC usp_ebean_drop_default_constraint migtest_e_history2, test_string; alter table migtest_e_history2 alter column test_string varchar(255) not null; +alter table migtest_e_history2 add default 'unknown' for test_string; alter table migtest_e_history2 add test_string2 varchar(255); alter table migtest_e_history2 add test_string3 varchar(255) default 'unknown' not null; alter table migtest_e_history2 add new_column varchar(20); @@ -84,8 +86,9 @@ alter table migtest_e_history5 add test_boolean bit default 0 not null; -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number1 = 42 where test_number1 is null; -alter table migtest_e_history6 add default 42 for test_number1; +EXEC usp_ebean_drop_default_constraint migtest_e_history6, test_number1; alter table migtest_e_history6 alter column test_number1 integer not null; +alter table migtest_e_history6 add default 42 for test_number1; alter table migtest_e_history6 alter column test_number2 integer; alter table migtest_e_softdelete add deleted bit default 0 not null; diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/1.3.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/1.3.sql index 004107385..7915d515c 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/1.3.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/1.3.sql @@ -14,39 +14,41 @@ IF OBJECT_ID('fk_migtest_fk_none_one_id', 'F') IS NOT NULL alter table migtest_f IF OBJECT_ID('fk_migtest_fk_none_via_join_one_id', 'F') IS NOT NULL alter table migtest_fk_none_via_join drop constraint fk_migtest_fk_none_via_join_one_id; IF OBJECT_ID('fk_migtest_fk_set_null_one_id', 'F') IS NOT NULL alter table migtest_fk_set_null drop constraint fk_migtest_fk_set_null_one_id; alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete set null; -IF (OBJECT_ID('ck_migtest_e_basic_status', 'C') IS NOT NULL) alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; +IF OBJECT_ID('ck_migtest_e_basic_status', 'C') IS NOT NULL alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; EXEC usp_ebean_drop_default_constraint migtest_e_basic, status; alter table migtest_e_basic alter column status varchar(1); alter table migtest_e_basic add constraint ck_migtest_e_basic_status check ( status in ('N','A','I')); update migtest_e_basic set status2 = 'N' where status2 is null; -IF (OBJECT_ID('ck_migtest_e_basic_status2', 'C') IS NOT NULL) alter table migtest_e_basic drop constraint ck_migtest_e_basic_status2; -alter table migtest_e_basic add default 'N' for status2; +IF OBJECT_ID('ck_migtest_e_basic_status2', 'C') IS NOT NULL alter table migtest_e_basic drop constraint ck_migtest_e_basic_status2; +EXEC usp_ebean_drop_default_constraint migtest_e_basic, status2; alter table migtest_e_basic alter column status2 varchar(1) not null; +alter table migtest_e_basic add default 'N' for status2; alter table migtest_e_basic add constraint ck_migtest_e_basic_status2 check ( status2 in ('N','A','I')); IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_description') drop index uq_migtest_e_basic_description ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_description', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_description; +IF OBJECT_ID('uq_migtest_e_basic_description', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_description; update migtest_e_basic set user_id = 23 where user_id is null; IF OBJECT_ID('fk_migtest_e_basic_user_id', 'F') IS NOT NULL alter table migtest_e_basic drop constraint fk_migtest_e_basic_user_id; -alter table migtest_e_basic add default 23 for user_id; +EXEC usp_ebean_drop_default_constraint migtest_e_basic, user_id; alter table migtest_e_basic alter column user_id integer not null; +alter table migtest_e_basic add default 23 for user_id; alter table migtest_e_basic add description_file image; alter table migtest_e_basic add old_boolean bit default 0 not null; alter table migtest_e_basic add old_boolean2 bit; alter table migtest_e_basic add eref_id integer; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_status_indextest1') drop index uq_migtest_e_basic_status_indextest1 ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_status_indextest1', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_status_indextest1; +IF OBJECT_ID('uq_migtest_e_basic_status_indextest1', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_status_indextest1; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_name') drop index uq_migtest_e_basic_name ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_name', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_name; +IF OBJECT_ID('uq_migtest_e_basic_name', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_name; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_indextest4') drop index uq_migtest_e_basic_indextest4 ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_indextest4', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest4; +IF OBJECT_ID('uq_migtest_e_basic_indextest4', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest4; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_indextest5') drop index uq_migtest_e_basic_indextest5 ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_indextest5', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest5; +IF OBJECT_ID('uq_migtest_e_basic_indextest5', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest5; create unique nonclustered index uq_migtest_e_basic_indextest2 on migtest_e_basic(indextest2) where indextest2 is not null; create unique nonclustered index uq_migtest_e_basic_indextest6 on migtest_e_basic(indextest6) where indextest6 is not null; -IF (OBJECT_ID('ck_migtest_e_enum_test_status', 'C') IS NOT NULL) alter table migtest_e_enum drop constraint ck_migtest_e_enum_test_status; +IF OBJECT_ID('ck_migtest_e_enum_test_status', 'C') IS NOT NULL alter table migtest_e_enum drop constraint ck_migtest_e_enum_test_status; alter table migtest_e_enum add constraint ck_migtest_e_enum_test_status check ( test_status in ('N','A','I')); EXEC usp_ebean_drop_default_constraint migtest_e_history2, test_string; alter table migtest_e_history2 alter column test_string varchar(255); @@ -59,8 +61,9 @@ alter table migtest_e_history6 alter column test_number1 integer; -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number2 = 7 where test_number2 is null; -alter table migtest_e_history6 add default 7 for test_number2; +EXEC usp_ebean_drop_default_constraint migtest_e_history6, test_number2; alter table migtest_e_history6 alter column test_number2 integer not null; +alter table migtest_e_history6 add default 7 for test_number2; create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5); IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'ix_migtest_e_basic_indextest3') drop index ix_migtest_e_basic_indextest3 ON migtest_e_basic; diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/idx_sqlserver.migrations b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/idx_sqlserver.migrations index a147ed2f5..619e350d6 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/idx_sqlserver.migrations +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver16/idx_sqlserver.migrations @@ -1,8 +1,8 @@ -2122378240, I__create_procs.sql 1983037247, 1.0__initial.sql --1042228916, 1.1.sql +1735900055, 1.1.sql 1019731053, 1.2__dropsFor_1.1.sql --897790738, 1.3.sql +239521374, 1.3.sql -1335541264, 1.4__dropsFor_1.3.sql 1607822082, R__order_views_mssql.sql diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/1.1.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/1.1.sql index 9090ca711..4b142aa09 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/1.1.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/1.1.sql @@ -37,11 +37,12 @@ IF OBJECT_ID('fk_migtest_fk_set_null_one_id', 'F') IS NOT NULL alter table migte alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id); update migtest_e_basic set status = 'A' where status is null; -IF (OBJECT_ID('ck_migtest_e_basic_status', 'C') IS NOT NULL) alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; -alter table migtest_e_basic add default 'A' for status; +IF OBJECT_ID('ck_migtest_e_basic_status', 'C') IS NOT NULL alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; +EXEC usp_ebean_drop_default_constraint migtest_e_basic, status; alter table migtest_e_basic alter column status nvarchar(1) not null; +alter table migtest_e_basic add default 'A' for status; alter table migtest_e_basic add constraint ck_migtest_e_basic_status check ( status in ('N','A','I','?')); -IF (OBJECT_ID('ck_migtest_e_basic_status2', 'C') IS NOT NULL) alter table migtest_e_basic drop constraint ck_migtest_e_basic_status2; +IF OBJECT_ID('ck_migtest_e_basic_status2', 'C') IS NOT NULL alter table migtest_e_basic drop constraint ck_migtest_e_basic_status2; EXEC usp_ebean_drop_default_constraint migtest_e_basic, status2; alter table migtest_e_basic alter column status2 nvarchar(127); @@ -61,20 +62,21 @@ alter table migtest_e_basic add constraint ck_migtest_e_basic_progress check ( p alter table migtest_e_basic add new_integer integer default 42 not null; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_indextest2') drop index uq_migtest_e_basic_indextest2 ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_indextest2', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest2; +IF OBJECT_ID('uq_migtest_e_basic_indextest2', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest2; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_indextest6') drop index uq_migtest_e_basic_indextest6 ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_indextest6', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest6; +IF OBJECT_ID('uq_migtest_e_basic_indextest6', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest6; create unique nonclustered index uq_migtest_e_basic_status_indextest1 on migtest_e_basic(status,indextest1) where indextest1 is not null; create unique nonclustered index uq_migtest_e_basic_name on migtest_e_basic(name) where name is not null; create unique nonclustered index uq_migtest_e_basic_indextest4 on migtest_e_basic(indextest4) where indextest4 is not null; create unique nonclustered index uq_migtest_e_basic_indextest5 on migtest_e_basic(indextest5) where indextest5 is not null; -IF (OBJECT_ID('ck_migtest_e_enum_test_status', 'C') IS NOT NULL) alter table migtest_e_enum drop constraint ck_migtest_e_enum_test_status; +IF OBJECT_ID('ck_migtest_e_enum_test_status', 'C') IS NOT NULL alter table migtest_e_enum drop constraint ck_migtest_e_enum_test_status; alter table migtest_e_history alter column test_string numeric(19); -- NOTE: table has @History - special migration may be necessary update migtest_e_history2 set test_string = 'unknown' where test_string is null; -alter table migtest_e_history2 add default 'unknown' for test_string; +EXEC usp_ebean_drop_default_constraint migtest_e_history2, test_string; alter table migtest_e_history2 alter column test_string nvarchar(255) not null; +alter table migtest_e_history2 add default 'unknown' for test_string; alter table migtest_e_history2 add test_string2 nvarchar(255); alter table migtest_e_history2 add test_string3 nvarchar(255) default 'unknown' not null; alter table migtest_e_history2 add new_column nvarchar(20); @@ -85,8 +87,9 @@ alter table migtest_e_history5 add test_boolean bit default 0 not null; -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number1 = 42 where test_number1 is null; -alter table migtest_e_history6 add default 42 for test_number1; +EXEC usp_ebean_drop_default_constraint migtest_e_history6, test_number1; alter table migtest_e_history6 alter column test_number1 integer not null; +alter table migtest_e_history6 add default 42 for test_number1; alter table migtest_e_history6 alter column test_number2 integer; alter table migtest_e_softdelete add deleted bit default 0 not null; diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/1.3.sql b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/1.3.sql index fde85d001..23dacc249 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/1.3.sql +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/1.3.sql @@ -15,39 +15,41 @@ IF OBJECT_ID('fk_migtest_fk_none_one_id', 'F') IS NOT NULL alter table migtest_f IF OBJECT_ID('fk_migtest_fk_none_via_join_one_id', 'F') IS NOT NULL alter table migtest_fk_none_via_join drop constraint fk_migtest_fk_none_via_join_one_id; IF OBJECT_ID('fk_migtest_fk_set_null_one_id', 'F') IS NOT NULL alter table migtest_fk_set_null drop constraint fk_migtest_fk_set_null_one_id; alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete set null; -IF (OBJECT_ID('ck_migtest_e_basic_status', 'C') IS NOT NULL) alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; +IF OBJECT_ID('ck_migtest_e_basic_status', 'C') IS NOT NULL alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; EXEC usp_ebean_drop_default_constraint migtest_e_basic, status; alter table migtest_e_basic alter column status nvarchar(1); alter table migtest_e_basic add constraint ck_migtest_e_basic_status check ( status in ('N','A','I')); update migtest_e_basic set status2 = 'N' where status2 is null; -IF (OBJECT_ID('ck_migtest_e_basic_status2', 'C') IS NOT NULL) alter table migtest_e_basic drop constraint ck_migtest_e_basic_status2; -alter table migtest_e_basic add default 'N' for status2; +IF OBJECT_ID('ck_migtest_e_basic_status2', 'C') IS NOT NULL alter table migtest_e_basic drop constraint ck_migtest_e_basic_status2; +EXEC usp_ebean_drop_default_constraint migtest_e_basic, status2; alter table migtest_e_basic alter column status2 nvarchar(1) not null; +alter table migtest_e_basic add default 'N' for status2; alter table migtest_e_basic add constraint ck_migtest_e_basic_status2 check ( status2 in ('N','A','I')); IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_description') drop index uq_migtest_e_basic_description ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_description', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_description; +IF OBJECT_ID('uq_migtest_e_basic_description', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_description; update migtest_e_basic set user_id = 23 where user_id is null; IF OBJECT_ID('fk_migtest_e_basic_user_id', 'F') IS NOT NULL alter table migtest_e_basic drop constraint fk_migtest_e_basic_user_id; -alter table migtest_e_basic add default 23 for user_id; +EXEC usp_ebean_drop_default_constraint migtest_e_basic, user_id; alter table migtest_e_basic alter column user_id integer not null; +alter table migtest_e_basic add default 23 for user_id; alter table migtest_e_basic add description_file image; alter table migtest_e_basic add old_boolean bit default 0 not null; alter table migtest_e_basic add old_boolean2 bit; alter table migtest_e_basic add eref_id integer; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_status_indextest1') drop index uq_migtest_e_basic_status_indextest1 ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_status_indextest1', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_status_indextest1; +IF OBJECT_ID('uq_migtest_e_basic_status_indextest1', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_status_indextest1; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_name') drop index uq_migtest_e_basic_name ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_name', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_name; +IF OBJECT_ID('uq_migtest_e_basic_name', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_name; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_indextest4') drop index uq_migtest_e_basic_indextest4 ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_indextest4', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest4; +IF OBJECT_ID('uq_migtest_e_basic_indextest4', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest4; IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'uq_migtest_e_basic_indextest5') drop index uq_migtest_e_basic_indextest5 ON migtest_e_basic; -IF (OBJECT_ID('uq_migtest_e_basic_indextest5', 'UQ') IS NOT NULL) alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest5; +IF OBJECT_ID('uq_migtest_e_basic_indextest5', 'UQ') IS NOT NULL alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest5; create unique nonclustered index uq_migtest_e_basic_indextest2 on migtest_e_basic(indextest2) where indextest2 is not null; create unique nonclustered index uq_migtest_e_basic_indextest6 on migtest_e_basic(indextest6) where indextest6 is not null; -IF (OBJECT_ID('ck_migtest_e_enum_test_status', 'C') IS NOT NULL) alter table migtest_e_enum drop constraint ck_migtest_e_enum_test_status; +IF OBJECT_ID('ck_migtest_e_enum_test_status', 'C') IS NOT NULL alter table migtest_e_enum drop constraint ck_migtest_e_enum_test_status; alter table migtest_e_enum add constraint ck_migtest_e_enum_test_status check ( test_status in ('N','A','I')); EXEC usp_ebean_drop_default_constraint migtest_e_history2, test_string; alter table migtest_e_history2 alter column test_string nvarchar(255); @@ -60,8 +62,9 @@ alter table migtest_e_history6 alter column test_number1 integer; -- NOTE: table has @History - special migration may be necessary update migtest_e_history6 set test_number2 = 7 where test_number2 is null; -alter table migtest_e_history6 add default 7 for test_number2; +EXEC usp_ebean_drop_default_constraint migtest_e_history6, test_number2; alter table migtest_e_history6 alter column test_number2 integer not null; +alter table migtest_e_history6 add default 7 for test_number2; create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5); IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('migtest_e_basic','U') AND name = 'ix_migtest_e_basic_indextest3') drop index ix_migtest_e_basic_indextest3 ON migtest_e_basic; diff --git a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/idx_sqlserver.migrations b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/idx_sqlserver.migrations index 95435eb0b..69734f2f2 100644 --- a/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/idx_sqlserver.migrations +++ b/ebean-test/src/test/resources/migrationtest/dbmigration/sqlserver17/idx_sqlserver.migrations @@ -1,8 +1,8 @@ -2122378240, I__create_procs.sql -813787447, 1.0__initial.sql --898063858, 1.1.sql +-925841767, 1.1.sql 1019731053, 1.2__dropsFor_1.1.sql --494373130, 1.3.sql +-1858208, 1.3.sql -1335541264, 1.4__dropsFor_1.3.sql 1607822082, R__order_views_mssql.sql