From db6562df765bcab7b09e51b891ae826d5ba69942 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Wed, 1 Nov 2017 21:54:48 +1300 Subject: [PATCH] #1190 - MySql throwing DataIntegrityException when it should throw the more specific DuplicateKeyException --- .../java/io/ebean/config/dbplatform/SqlCodeTranslator.java | 4 ++++ .../io/ebean/config/dbplatform/mysql/MySqlPlatform.java | 6 +++--- src/test/java/org/tests/rawsql/TestRawSqlOrmQuery.java | 7 +++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java b/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java index 8db905d1d..71d56c7a1 100644 --- a/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java +++ b/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java @@ -34,6 +34,10 @@ public class SqlCodeTranslator implements SqlExceptionTranslator { public PersistenceException translate(String message, SQLException e) { DataErrorType errorType = map.get(e.getSQLState()); + if (errorType == null) { + // fall back to error code + errorType = map.get(String.valueOf(e.getErrorCode())); + } if (errorType != null) { switch (errorType) { case AcquireLock: 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 ee37d0c37..bade92794 100644 --- a/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java @@ -42,8 +42,8 @@ public class MySqlPlatform extends DatabasePlatform { this.exceptionTranslator = new SqlErrorCodes() .addAcquireLock("1205") - .addDuplicateKey("1062") - .addDataIntegrity("630","839","840","893","1169","1215","1216","1217","1364","1451","1452","1557","23000") + .addDuplicateKey("1062", "1169", "23000") + .addDataIntegrity("630", "839", "840", "893", "1215", "1216", "1217", "1364", "1451", "1452", "1557") .build(); this.openQuote = "`"; @@ -79,7 +79,7 @@ public class MySqlPlatform extends DatabasePlatform { // NOWAIT and SKIP LOCKED currently not supported with MySQL return sql + " for update"; } - + @Override protected void escapeLikeCharacter(char ch, StringBuilder sb) { sb.append('|').append(ch); diff --git a/src/test/java/org/tests/rawsql/TestRawSqlOrmQuery.java b/src/test/java/org/tests/rawsql/TestRawSqlOrmQuery.java index 4aab8ff57..03a64a71e 100644 --- a/src/test/java/org/tests/rawsql/TestRawSqlOrmQuery.java +++ b/src/test/java/org/tests/rawsql/TestRawSqlOrmQuery.java @@ -8,6 +8,8 @@ import io.ebean.PagedList; import io.ebean.Query; import io.ebean.RawSql; import io.ebean.RawSqlBuilder; +import io.ebean.annotation.IgnorePlatform; +import io.ebean.annotation.Platform; import org.tests.model.basic.Customer; import org.tests.model.basic.Order; import org.tests.model.basic.ResetBasicData; @@ -67,6 +69,7 @@ public class TestRawSqlOrmQuery extends BaseTestCase { } @Test + @IgnorePlatform(Platform.MYSQL) public void test_upperCaseSql() { ResetBasicData.reset(); @@ -185,14 +188,14 @@ public class TestRawSqlOrmQuery extends BaseTestCase { query.setRawSql(rawSql); query.setMaxRows(100); - + if (isSqlServer()) { query.order("coalesce(shipDate, getdate()) desc"); query.findList(); assertThat(sqlOf(query)).contains("order by coalesce(o.ship_date, getdate()) desc, o.id"); assertThat(sqlOf(query)).contains("select top 100"); - + } else { query.order("coalesce(shipDate, now()) desc"); query.findList();