diff --git a/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java b/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java index 16ca47608..ffef6d563 100644 --- a/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java +++ b/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java @@ -1,6 +1,7 @@ package io.ebean.config.dbplatform.db2; import io.ebean.BackgroundExecutor; +import io.ebean.PersistBatch; import io.ebean.Platform; import io.ebean.config.dbplatform.DatabasePlatform; import io.ebean.config.dbplatform.DbPlatformType; @@ -30,15 +31,21 @@ public class DB2Platform extends DatabasePlatform { this.exceptionTranslator = new SqlErrorCodes() - //.addAcquireLock("") - .addDuplicateKey("-803") - .addDataIntegrity("-407","-530","-531","-532","-543","-544","-545","-603","-667") + .addAcquireLock("40001","57033") // key -911/-913 + .addDuplicateKey("23505") // -803 + // .addDataIntegrity("-407","-530","-531","-532","-543","-544","-545","-603","-667") + // we need SQLState, not code: https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/codes/src/tpc/db2z_n.html + .addDataIntegrity("23502","23503","23504","23511","23512","23511","42917","23515") .build(); booleanDbType = Types.BOOLEAN; + dbTypeMap.put(DbType.TINYINT, new DbPlatformType("smallint", false)); + dbTypeMap.put(DbType.INTEGER, new DbPlatformType("integer", false)); + dbTypeMap.put(DbType.BIGINT, new DbPlatformType("bigint", false)); dbTypeMap.put(DbType.REAL, new DbPlatformType("real")); - dbTypeMap.put(DbType.TINYINT, new DbPlatformType("smallint")); dbTypeMap.put(DbType.DECIMAL, new DbPlatformType("decimal", 15)); + + persistBatchOnCascade = PersistBatch.NONE; } /** diff --git a/src/main/java/io/ebean/config/dbplatform/h2/H2Platform.java b/src/main/java/io/ebean/config/dbplatform/h2/H2Platform.java index 8cff6db10..c541c0bc7 100644 --- a/src/main/java/io/ebean/config/dbplatform/h2/H2Platform.java +++ b/src/main/java/io/ebean/config/dbplatform/h2/H2Platform.java @@ -30,7 +30,7 @@ public class H2Platform extends DatabasePlatform { this.exceptionTranslator = new SqlErrorCodes() - .addAcquireLock("50200") + .addAcquireLock("50200","HYT00") .addDuplicateKey("23001","23505") .addDataIntegrity("22001","22003","22012","22018","22025","23000","23002","23003","23502","23503","23506","23507","23513") .build(); diff --git a/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java b/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java index 54ad3ebe4..14d9c45c6 100644 --- a/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java @@ -45,7 +45,7 @@ public class MySqlPlatform extends DatabasePlatform { new SqlErrorCodes() .addAcquireLock("1205") .addDuplicateKey("1062") - .addDataIntegrity("630","839","840","893","1169","1215","1216","1217","1364","1451","1452","1557") + .addDataIntegrity("630","839","840","893","1169","1215","1216","1217","1364","1451","1452","1557","23000") .build(); this.openQuote = "`"; diff --git a/src/main/java/io/ebean/dbmigration/ddlgeneration/platform/DB2Ddl.java b/src/main/java/io/ebean/dbmigration/ddlgeneration/platform/DB2Ddl.java index ae15e85ea..ed9a42b87 100644 --- a/src/main/java/io/ebean/dbmigration/ddlgeneration/platform/DB2Ddl.java +++ b/src/main/java/io/ebean/dbmigration/ddlgeneration/platform/DB2Ddl.java @@ -9,6 +9,10 @@ public class DB2Ddl extends PlatformDdl { public DB2Ddl(DatabasePlatform platform) { super(platform); + this.dropTableIfExists = "drop table "; + this.dropSequenceIfExists = "drop sequence "; + this.dropConstraintIfExists = "drop constraint"; + this.dropIndexIfExists = "drop index "; this.identitySuffix = " generated by default as identity"; this.inlineUniqueWhenNullable = false; } diff --git a/src/test/java/org/tests/basic/TestQueryForUpdate.java b/src/test/java/org/tests/basic/TestQueryForUpdate.java index d179f5bf3..aa4b357a8 100644 --- a/src/test/java/org/tests/basic/TestQueryForUpdate.java +++ b/src/test/java/org/tests/basic/TestQueryForUpdate.java @@ -17,10 +17,14 @@ import static org.junit.Assert.assertTrue; public class TestQueryForUpdate extends BaseTestCase { + private boolean isSupportLocking() { + return isH2() || isOracle() || isPostgres() || isSqlServer() || isMySql(); + } + @Test public void testForUpdate() { - if (isH2() || isPostgres()) { + if (isSupportLocking()) { ResetBasicData.reset(); Query query = Ebean.find(Customer.class) @@ -29,14 +33,18 @@ public class TestQueryForUpdate extends BaseTestCase { .order().desc("id"); query.findList(); - assertThat(sqlOf(query)).contains("for update"); + if (isSqlServer()) { + assertThat(sqlOf(query)).contains("with (updlock)"); + } else { + assertThat(sqlOf(query)).contains("for update"); + } } } @Test public void testForUpdate_noWait() { - if (isPostgres() || isOracle()) { + if (isSupportLocking()) { ResetBasicData.reset(); EbeanServer server = Ebean.getDefaultServer(); @@ -50,9 +58,13 @@ public class TestQueryForUpdate extends BaseTestCase { List list = query.findList(); Customer first = list.get(0); - - assertThat(sqlOf(query)).contains("for update nowait"); - + if (isSqlServer()) { + assertThat(sqlOf(query)).contains("with (updlock,nowait)"); + } else if (isH2()){ + assertThat(sqlOf(query)).contains("for update"); + } else { + assertThat(sqlOf(query)).contains("for update nowait"); + } // create a 2nd transaction to test that the // row is locked and we can't acquire it Transaction txn2 = server.createTransaction();