diff --git a/jOOQ/src/main/java/org/jooq/exception/DataAccessException.java b/jOOQ/src/main/java/org/jooq/exception/DataAccessException.java index c7037b4194..b637b41965 100644 --- a/jOOQ/src/main/java/org/jooq/exception/DataAccessException.java +++ b/jOOQ/src/main/java/org/jooq/exception/DataAccessException.java @@ -157,12 +157,19 @@ public class DataAccessException extends RuntimeException { if (e.getSQLState() != null) return SQLStateClass.fromCode(e.getSQLState()); - else if (e.getSQLState() == null && "org.sqlite.SQLiteException".equals(e.getClass().getName())) + else if (e.getSQLState() == null && causePrefix(e, "org.sqlite")) return SQLStateClass.fromSQLiteVendorCode(e.getErrorCode()); + else if (e.getSQLState() == null && causePrefix(e, "io.trino")) + return SQLStateClass.fromTrinoVendorCode(e.getErrorCode()); else return SQLStateClass.NONE; } + private static final boolean causePrefix(SQLException e, String prefix) { + return e.getClass().getName().startsWith(prefix) + || e.getCause() != null && e.getCause().getClass().getName().startsWith(prefix); + } + /** * Decode the {@link R2dbcException#getSqlState()} into * {@link SQLStateClass}. diff --git a/jOOQ/src/main/java/org/jooq/exception/SQLStateClass.java b/jOOQ/src/main/java/org/jooq/exception/SQLStateClass.java index 0e10f7d3af..1fe144547b 100644 --- a/jOOQ/src/main/java/org/jooq/exception/SQLStateClass.java +++ b/jOOQ/src/main/java/org/jooq/exception/SQLStateClass.java @@ -201,6 +201,20 @@ public enum SQLStateClass { return SQLStateClass.OTHER; } + @NotNull + static SQLStateClass fromTrinoVendorCode(int errorCode) { + + // See https://github.com/trinodb/trino/blob/master/core/trino-spi/src/main/java/io/trino/spi/StandardErrorCode.java + switch (errorCode) { + case 1: return C42_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION; + case 9: + case 19: return C22_DATA_EXCEPTION; + case 16: return C23_INTEGRITY_CONSTRAINT_VIOLATION; + } + + return SQLStateClass.OTHER; + } +