diff --git a/jOOQ/src/main/java/org/jooq/exception/DataAccessException.java b/jOOQ/src/main/java/org/jooq/exception/DataAccessException.java index f93e8967d1..eed3be0fd7 100644 --- a/jOOQ/src/main/java/org/jooq/exception/DataAccessException.java +++ b/jOOQ/src/main/java/org/jooq/exception/DataAccessException.java @@ -96,7 +96,10 @@ public class DataAccessException extends RuntimeException { public SQLStateClass sqlStateClass() { SQLException e = getCause(SQLException.class); if (e != null) - return SQLStateClass.fromCode(e.getSQLState()); + if (e.getSQLState() != null) + return SQLStateClass.fromCode(e.getSQLState()); + else if (e.getSQLState() == null && "org.sqlite.SQLiteException".equals(e.getClass().getName())) + return SQLStateClass.fromSQLiteVendorCode(e.getErrorCode()); return SQLStateClass.NONE; } diff --git a/jOOQ/src/main/java/org/jooq/exception/SQLStateClass.java b/jOOQ/src/main/java/org/jooq/exception/SQLStateClass.java index 4e09c5f194..16714704db 100644 --- a/jOOQ/src/main/java/org/jooq/exception/SQLStateClass.java +++ b/jOOQ/src/main/java/org/jooq/exception/SQLStateClass.java @@ -176,4 +176,21 @@ public enum SQLStateClass { SQLStateClass result = lookup.get(code.substring(0, 2)); return result != null ? result : SQLStateClass.OTHER; } + + static SQLStateClass fromSQLiteVendorCode(int errorCode) { + + // See https://sqlite.org/c3ref/c_abort.html + // And https://sqlite.org/c3ref/c_abort_rollback.html + switch (errorCode & 0xFF) { + case 0: return C00_SUCCESSFUL_COMPLETION; + case 3: return C42_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION; + case 18: return C22_DATA_EXCEPTION; + case 19: return C23_INTEGRITY_CONSTRAINT_VIOLATION; + case 20: return C22_DATA_EXCEPTION; + case 27: return C01_WARNING; + case 28: return C01_WARNING; + } + + return SQLStateClass.OTHER; + } } diff --git a/jOOQ/src/main/java/org/jooq/exception/SQLStateSubclass.java b/jOOQ/src/main/java/org/jooq/exception/SQLStateSubclass.java index 8b924de62c..ed1c1143b3 100644 --- a/jOOQ/src/main/java/org/jooq/exception/SQLStateSubclass.java +++ b/jOOQ/src/main/java/org/jooq/exception/SQLStateSubclass.java @@ -487,4 +487,21 @@ public enum SQLStateSubclass { else return SQLStateSubclass.OTHER; } + + static SQLStateSubclass fromSQLiteVendorCode(int errorCode) { + + // See https://sqlite.org/c3ref/c_abort.html + // And https://sqlite.org/c3ref/c_abort_rollback.html + switch (errorCode & 0xFF) { + case 0: return C00000_NO_SUBCLASS; + case 3: return C42000_NO_SUBCLASS; + case 18: return C22001_STRING_DATA_RIGHT_TRUNCATION; + case 19: return C23000_NO_SUBCLASS; + case 20: return C22000_NO_SUBCLASS; + case 27: return C01000_NO_SUBCLASS; + case 28: return C01000_NO_SUBCLASS; + } + + return SQLStateSubclass.OTHER; + } }