diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java index 0baf8ab4e..8aec85abc 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java +++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java @@ -26,7 +26,7 @@ public class MySqlDdl extends PlatformDdl { */ @Override public String dropIndex(String indexName, String tableName) { - return "drop index " + indexName + " on " + tableName; + return "drop index " + maxConstraintName(indexName) + " on " + tableName; } /** @@ -34,7 +34,7 @@ public class MySqlDdl extends PlatformDdl { */ @Override public String alterTableDropForeignKey(String tableName, String fkName) { - return "alter table " + tableName + " drop foreign key " + fkName; + return "alter table " + tableName + " drop foreign key " + maxConstraintName(fkName); } @Override diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl.java index 512d6efc2..145fd6fc2 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl.java +++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl.java @@ -13,6 +13,7 @@ import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer; import io.ebeaninternal.dbmigration.ddlgeneration.DdlHandler; import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite; import io.ebeaninternal.dbmigration.ddlgeneration.platform.util.PlatformTypeConverter; +import io.ebeaninternal.dbmigration.ddlgeneration.platform.util.VowelRemover; import io.ebeaninternal.dbmigration.migration.AddHistoryTable; import io.ebeaninternal.dbmigration.migration.AlterColumn; import io.ebeaninternal.dbmigration.migration.Column; @@ -238,7 +239,7 @@ public class PlatformDdl { * Return the drop foreign key clause. */ public String alterTableDropForeignKey(String tableName, String fkName) { - return "alter table " + alterTableIfExists + tableName + " " + dropConstraintIfExists + " " + fkName; + return "alter table " + alterTableIfExists + tableName + " " + dropConstraintIfExists + " " + maxConstraintName(fkName); } /** @@ -326,7 +327,7 @@ public class PlatformDdl { * Return the drop index statement. */ public String dropIndex(String indexName, String tableName) { - return dropIndexIfExists + indexName; + return dropIndexIfExists + maxConstraintName(indexName); } /** @@ -335,7 +336,7 @@ public class PlatformDdl { public String createIndex(String indexName, String tableName, String[] columns) { StringBuilder buffer = new StringBuilder(); - buffer.append("create index ").append(indexName).append(" on ").append(tableName); + buffer.append("create index ").append(maxConstraintName(indexName)).append(" on ").append(tableName); appendColumns(columns, buffer); return buffer.toString(); @@ -363,7 +364,7 @@ public class PlatformDdl { StringBuilder buffer = new StringBuilder(90); buffer .append("alter table ").append(lowerTableName(request.table())) - .append(" add constraint ").append(request.fkName()) + .append(" add constraint ").append(maxConstraintName(request.fkName())) .append(" foreign key"); appendColumns(request.cols(), buffer); buffer @@ -410,14 +411,14 @@ public class PlatformDdl { * Drop a unique constraint from the table (Sometimes this is an index). */ public String alterTableDropUniqueConstraint(String tableName, String uniqueConstraintName) { - return "alter table " + tableName + " " + dropUniqueConstraint + " " + uniqueConstraintName; + return "alter table " + tableName + " " + dropUniqueConstraint + " " + maxConstraintName(uniqueConstraintName); } /** * Drop a unique constraint from the table. */ public String alterTableDropConstraint(String tableName, String constraintName) { - return "alter table " + tableName + " " + dropConstraint + " " + constraintName; + return "alter table " + tableName + " " + dropConstraint + " " + maxConstraintName(constraintName); } /** @@ -428,7 +429,7 @@ public class PlatformDdl { public String alterTableAddUniqueConstraint(String tableName, String uqName, String[] columns, String[] nullableColumns) { StringBuilder buffer = new StringBuilder(90); - buffer.append("alter table ").append(tableName).append(" add constraint ").append(uqName).append(" unique "); + buffer.append("alter table ").append(tableName).append(" add constraint ").append(maxConstraintName(uqName)).append(" unique "); appendColumns(columns, buffer); return buffer.toString(); } @@ -506,7 +507,7 @@ public class PlatformDdl { */ public String alterTableAddCheckConstraint(String tableName, String checkConstraintName, String checkConstraint) { - return "alter table " + tableName + " " + addConstraint + " " + checkConstraintName + " " + checkConstraint; + return "alter table " + tableName + " " + addConstraint + " " + maxConstraintName(checkConstraintName) + " " + checkConstraint; } /** @@ -622,4 +623,14 @@ public class PlatformDdl { } + protected String maxConstraintName(String name) { + if (name.length() > platform.getMaxConstraintNameLength()) { + int hash = name.hashCode() & 0x7FFFFFFF; + name = VowelRemover.trim(name, 4); + if (name.length() > platform.getMaxConstraintNameLength()) { + return name.substring(0, platform.getMaxConstraintNameLength()-7) + "_" + Integer.toString(hash, 36); + } + } + return name; + } } diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerDdl.java index 6b094f9d9..e063f0898 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerDdl.java +++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SqlServerDdl.java @@ -43,7 +43,7 @@ public class SqlServerDdl extends PlatformDdl { @Override public String alterTableDropForeignKey(String tableName, String fkName) { int pos = tableName.lastIndexOf('.'); - String objectId = fkName; + String objectId = maxConstraintName(fkName); if (pos != -1) { objectId = tableName.substring(0, pos + 1) + fkName; } @@ -57,7 +57,8 @@ public class SqlServerDdl extends PlatformDdl { @Override public String dropIndex(String indexName, String tableName) { - return "IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('" + tableName +"','U') AND name = '" + indexName + "') drop index " + indexName + " ON " + tableName; + return "IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('" + tableName + "','U') AND name = '" + + maxConstraintName(indexName) + "') drop index " + maxConstraintName(indexName) + " ON " + tableName; } /** * MsSqlServer specific null handling on unique constraints. @@ -102,7 +103,7 @@ public class SqlServerDdl extends PlatformDdl { @Override public String alterTableDropUniqueConstraint(String tableName, String uniqueConstraintName) { StringBuilder sb = new StringBuilder(); - sb.append("IF (OBJECT_ID('").append(uniqueConstraintName).append("', 'UQ') IS NOT NULL) "); + sb.append("IF (OBJECT_ID('").append(maxConstraintName(uniqueConstraintName)).append("', 'UQ') IS NOT NULL) "); sb.append(super.alterTableDropUniqueConstraint(tableName, uniqueConstraintName)).append(";\n"); sb.append(dropIndex(uniqueConstraintName, tableName)); return sb.toString(); diff --git a/src/test/resources/dbmigration/migrationtest/db2/1.0__initial.sql b/src/test/resources/dbmigration/migrationtest/db2/1.0__initial.sql index 2ed9f31ab..96e7aebd1 100644 --- a/src/test/resources/dbmigration/migrationtest/db2/1.0__initial.sql +++ b/src/test/resources/dbmigration/migrationtest/db2/1.0__initial.sql @@ -53,8 +53,8 @@ create table migtest_e_basic ( constraint ck_migtest_e_basic_status check ( status in ('N','A','I')), constraint pk_migtest_e_basic primary key (id) ); --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest2 unique (indextest2); --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest6 unique (indextest6); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4aybzy unique (indextest2); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4ayc02 unique (indextest6); create table migtest_e_history ( id integer generated by default as identity not null, @@ -79,14 +79,14 @@ create table migtest_e_softdelete ( constraint pk_migtest_e_softdelete primary key (id) ); -create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); -create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5); -alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade; -create index ix_migtest_fk_cascade_one_id on migtest_fk_cascade (one_id); +create index ix_mgtst__b_eu8csq on migtest_e_basic (indextest1); +create index ix_mgtst__b_eu8csu on migtest_e_basic (indextest5); +alter table migtest_fk_cascade add constraint fk_mgtst_fk_65kf6l foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade; +create index ix_mgtst_fk_mok1xj on migtest_fk_cascade (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; -create index ix_migtest_fk_set_null_one_id on migtest_fk_set_null (one_id); +alter table migtest_fk_set_null add constraint fk_mgtst_fk_wicx8x foreign key (one_id) references migtest_fk_one (id) on delete set null; +create index ix_mgtst_fk_c4p3mv on migtest_fk_set_null (one_id); -alter table migtest_e_basic add constraint fk_migtest_e_basic_eref_id foreign key (eref_id) references migtest_e_ref (id) on delete restrict; -create index ix_migtest_e_basic_eref_id on migtest_e_basic (eref_id); +alter table migtest_e_basic add constraint fk_mgtst__bsc_rf_d foreign key (eref_id) references migtest_e_ref (id) on delete restrict; +create index ix_mgtst__bsc_rf_d on migtest_e_basic (eref_id); diff --git a/src/test/resources/dbmigration/migrationtest/db2/1.1.sql b/src/test/resources/dbmigration/migrationtest/db2/1.1.sql index 2304caa0c..b9e748e6d 100644 --- a/src/test/resources/dbmigration/migrationtest/db2/1.1.sql +++ b/src/test/resources/dbmigration/migrationtest/db2/1.1.sql @@ -5,28 +5,28 @@ create table migtest_e_user ( constraint pk_migtest_e_user primary key (id) ); -alter table migtest_fk_cascade drop constraint fk_migtest_fk_cascade_one_id; -alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete restrict; -alter table migtest_fk_none add constraint fk_migtest_fk_none_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict; -alter table migtest_fk_none_via_join add constraint fk_migtest_fk_none_via_join_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict; -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 restrict; +alter table migtest_fk_cascade drop constraint fk_mgtst_fk_65kf6l; +alter table migtest_fk_cascade add constraint fk_mgtst_fk_65kf6l foreign key (one_id) references migtest_fk_cascade_one (id) on delete restrict; +alter table migtest_fk_none add constraint fk_mgtst_fk_nn_n_d foreign key (one_id) references migtest_fk_one (id) on delete restrict; +alter table migtest_fk_none_via_join add constraint fk_mgtst_fk_9tknzj foreign key (one_id) references migtest_fk_one (id) on delete restrict; +alter table migtest_fk_set_null drop constraint fk_mgtst_fk_wicx8x; +alter table migtest_fk_set_null add constraint fk_mgtst_fk_wicx8x foreign key (one_id) references migtest_fk_one (id) on delete restrict; update migtest_e_basic set status = 'A' where status is null; -alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; +alter table migtest_e_basic drop constraint ck_mgtst__bsc_stts; alter table migtest_e_basic alter column status set default 'A'; alter table migtest_e_basic alter column status set not null; -alter table migtest_e_basic add constraint ck_migtest_e_basic_status check ( status in ('N','A','I','?')); +alter table migtest_e_basic add constraint ck_mgtst__bsc_stts check ( status in ('N','A','I','?')); -- rename all collisions; --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_description unique (description); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_vs45xo unique (description); update migtest_e_basic set some_date = '2000-01-01T00:00:00' where some_date is null; alter table migtest_e_basic alter column some_date set default '2000-01-01T00:00:00'; alter table migtest_e_basic alter column some_date set not null; insert into migtest_e_user (id) select distinct user_id from migtest_e_basic; -alter table migtest_e_basic add constraint fk_migtest_e_basic_user_id foreign key (user_id) references migtest_e_user (id) on delete restrict; +alter table migtest_e_basic add constraint fk_mgtst__bsc_sr_d foreign key (user_id) references migtest_e_user (id) on delete restrict; alter table migtest_e_basic alter column user_id set null; alter table migtest_e_basic add column new_string_field varchar(255) default 'foo''bar' not null; alter table migtest_e_basic add column new_boolean_field boolean default true not null; @@ -34,14 +34,14 @@ update migtest_e_basic set new_boolean_field = old_boolean; alter table migtest_e_basic add column new_boolean_field2 boolean default true not null; alter table migtest_e_basic add column progress integer default 0 not null; -alter table migtest_e_basic add constraint ck_migtest_e_basic_progress check ( progress in (0,1,2)); +alter table migtest_e_basic add constraint ck_mgtst__b_l39g41 check ( progress in (0,1,2)); alter table migtest_e_basic add column new_integer integer default 42 not null; -alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest2; -alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest6; --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_name unique (name); --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest4 unique (indextest4); --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest5 unique (indextest5); +alter table migtest_e_basic drop constraint uq_mgtst__b_4aybzy; +alter table migtest_e_basic drop constraint uq_mgtst__b_4ayc02; +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__bsc_nm unique (name); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4ayc00 unique (indextest4); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4ayc01 unique (indextest5); comment on column migtest_e_history.test_string is 'Column altered to long now'; alter table migtest_e_history alter column test_string bigint; comment on table migtest_e_history is 'We have history now'; @@ -56,7 +56,7 @@ alter table migtest_e_history2_history add column test_string3 varchar(255); alter table migtest_e_softdelete add column deleted boolean default false not null; -create index ix_migtest_e_basic_indextest3 on migtest_e_basic (indextest3); -create index ix_migtest_e_basic_indextest6 on migtest_e_basic (indextest6); -drop index ix_migtest_e_basic_indextest1; -drop index ix_migtest_e_basic_indextest5; +create index ix_mgtst__b_eu8css on migtest_e_basic (indextest3); +create index ix_mgtst__b_eu8csv on migtest_e_basic (indextest6); +drop index ix_mgtst__b_eu8csq; +drop index ix_mgtst__b_eu8csu; diff --git a/src/test/resources/dbmigration/migrationtest/db2/1.3.sql b/src/test/resources/dbmigration/migrationtest/db2/1.3.sql index e99cc4048..17a7ba123 100644 --- a/src/test/resources/dbmigration/migrationtest/db2/1.3.sql +++ b/src/test/resources/dbmigration/migrationtest/db2/1.3.sql @@ -5,41 +5,41 @@ create table migtest_e_ref ( constraint pk_migtest_e_ref primary key (id) ); -alter table migtest_fk_cascade drop constraint fk_migtest_fk_cascade_one_id; -alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade; -alter table migtest_fk_none drop constraint fk_migtest_fk_none_one_id; -alter table migtest_fk_none_via_join drop constraint fk_migtest_fk_none_via_join_one_id; -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; -alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; +alter table migtest_fk_cascade drop constraint fk_mgtst_fk_65kf6l; +alter table migtest_fk_cascade add constraint fk_mgtst_fk_65kf6l foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade; +alter table migtest_fk_none drop constraint fk_mgtst_fk_nn_n_d; +alter table migtest_fk_none_via_join drop constraint fk_mgtst_fk_9tknzj; +alter table migtest_fk_set_null drop constraint fk_mgtst_fk_wicx8x; +alter table migtest_fk_set_null add constraint fk_mgtst_fk_wicx8x foreign key (one_id) references migtest_fk_one (id) on delete set null; +alter table migtest_e_basic drop constraint ck_mgtst__bsc_stts; alter table migtest_e_basic alter column status drop default; alter table migtest_e_basic alter column status set null; -alter table migtest_e_basic add constraint ck_migtest_e_basic_status check ( status in ('N','A','I')); -alter table migtest_e_basic drop constraint uq_migtest_e_basic_description; +alter table migtest_e_basic add constraint ck_mgtst__bsc_stts check ( status in ('N','A','I')); +alter table migtest_e_basic drop constraint uq_mgtst__b_vs45xo; alter table migtest_e_basic alter column some_date drop default; alter table migtest_e_basic alter column some_date set null; update migtest_e_basic set user_id = 23 where user_id is null; -alter table migtest_e_basic drop constraint fk_migtest_e_basic_user_id; +alter table migtest_e_basic drop constraint fk_mgtst__bsc_sr_d; alter table migtest_e_basic alter column user_id set default 23; alter table migtest_e_basic alter column user_id set not null; alter table migtest_e_basic add column old_boolean boolean default false not null; alter table migtest_e_basic add column old_boolean2 boolean; alter table migtest_e_basic add column eref_id integer; -alter table migtest_e_basic drop constraint uq_migtest_e_basic_name; -alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest4; -alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest5; --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest2 unique (indextest2); --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest6 unique (indextest6); +alter table migtest_e_basic drop constraint uq_mgtst__bsc_nm; +alter table migtest_e_basic drop constraint uq_mgtst__b_4ayc00; +alter table migtest_e_basic drop constraint uq_mgtst__b_4ayc01; +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4aybzy unique (indextest2); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4ayc02 unique (indextest6); comment on column migtest_e_history.test_string is ''; comment on table migtest_e_history is ''; alter table migtest_e_history2 alter column test_string drop default; alter table migtest_e_history2 alter column test_string set null; -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; -drop index ix_migtest_e_basic_indextest6; -alter table migtest_e_basic add constraint fk_migtest_e_basic_eref_id foreign key (eref_id) references migtest_e_ref (id) on delete restrict; -create index ix_migtest_e_basic_eref_id on migtest_e_basic (eref_id); +create index ix_mgtst__b_eu8csq on migtest_e_basic (indextest1); +create index ix_mgtst__b_eu8csu on migtest_e_basic (indextest5); +drop index ix_mgtst__b_eu8css; +drop index ix_mgtst__b_eu8csv; +alter table migtest_e_basic add constraint fk_mgtst__bsc_rf_d foreign key (eref_id) references migtest_e_ref (id) on delete restrict; +create index ix_mgtst__bsc_rf_d on migtest_e_basic (eref_id); diff --git a/src/test/resources/dbmigration/migrationtest/oracle/1.1.sql b/src/test/resources/dbmigration/migrationtest/oracle/1.1.sql index 6f280989f..ba1870ec5 100644 --- a/src/test/resources/dbmigration/migrationtest/oracle/1.1.sql +++ b/src/test/resources/dbmigration/migrationtest/oracle/1.1.sql @@ -9,7 +9,7 @@ create sequence migtest_e_user_seq; alter table migtest_fk_cascade drop constraint fk_migtest_fk_cascade_one_id; alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id); alter table migtest_fk_none add constraint fk_migtest_fk_none_one_id foreign key (one_id) references migtest_fk_one (id); -alter table migtest_fk_none_via_join add constraint fk_migtest_fk_none_via_join_one_id foreign key (one_id) references migtest_fk_one (id); +alter table migtest_fk_none_via_join add constraint fk_mgtst_fk_nn_v_jn_n_d foreign key (one_id) references migtest_fk_one (id); 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); diff --git a/src/test/resources/dbmigration/migrationtest/oracle/1.3.sql b/src/test/resources/dbmigration/migrationtest/oracle/1.3.sql index f5cc85a85..fc8570f4d 100644 --- a/src/test/resources/dbmigration/migrationtest/oracle/1.3.sql +++ b/src/test/resources/dbmigration/migrationtest/oracle/1.3.sql @@ -9,7 +9,7 @@ create sequence migtest_e_ref_seq; alter table migtest_fk_cascade drop constraint fk_migtest_fk_cascade_one_id; alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade; alter table migtest_fk_none drop constraint fk_migtest_fk_none_one_id; -alter table migtest_fk_none_via_join drop constraint fk_migtest_fk_none_via_join_one_id; +alter table migtest_fk_none_via_join drop constraint fk_mgtst_fk_nn_v_jn_n_d; 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; alter table migtest_e_basic drop constraint ck_migtest_e_basic_status;