diff --git a/jOOQ/src/main/java/org/jooq/DiagnosticsContext.java b/jOOQ/src/main/java/org/jooq/DiagnosticsContext.java index fd39f4a795..6450b771a6 100644 --- a/jOOQ/src/main/java/org/jooq/DiagnosticsContext.java +++ b/jOOQ/src/main/java/org/jooq/DiagnosticsContext.java @@ -172,4 +172,10 @@ public interface DiagnosticsContext { */ @NotNull List repeatedStatements(); + + /** + * The exception that occurred while diagnosing a statement. + */ + @Nullable + Throwable exception(); } diff --git a/jOOQ/src/main/java/org/jooq/DiagnosticsListener.java b/jOOQ/src/main/java/org/jooq/DiagnosticsListener.java index d0ef1fd0ad..7cc659d291 100644 --- a/jOOQ/src/main/java/org/jooq/DiagnosticsListener.java +++ b/jOOQ/src/main/java/org/jooq/DiagnosticsListener.java @@ -42,6 +42,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import org.jooq.impl.DSL; +import org.jooq.impl.ParserException; /** * A diagnostics listener. @@ -203,4 +204,18 @@ public interface DiagnosticsListener { + + /** + * Something went wrong while diagnosing a SQL query. + *

+ * The actual exception will be provided by + * {@link DiagnosticsContext#exception()}. Likely exceptions include: + *

+ */ + void exception(DiagnosticsContext ctx); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsContext.java index d64f6c5f66..002a4ba1d1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsContext.java @@ -39,6 +39,8 @@ package org.jooq.impl; import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; +import static java.util.Collections.singleton; +import static java.util.Collections.singletonList; import java.sql.ResultSet; import java.sql.ResultSetMetaData; @@ -72,16 +74,34 @@ final class DefaultDiagnosticsContext implements DiagnosticsContext { boolean resultSetUnnecessaryWasNullCall; boolean resultSetMissingWasNullCall; int resultSetColumnIndex; + final Throwable exception; DefaultDiagnosticsContext(String actualStatement) { - this(actualStatement, actualStatement, Collections.singleton(actualStatement), Collections.singletonList(actualStatement)); + this(actualStatement, null); } - DefaultDiagnosticsContext(String actualStatement, String normalisedStatement, Set duplicateStatements, List repeatedStatements) { + DefaultDiagnosticsContext(String actualStatement, Throwable exception) { + this( + actualStatement, + actualStatement, + singleton(actualStatement), + singletonList(actualStatement), + exception + ); + } + + DefaultDiagnosticsContext( + String actualStatement, + String normalisedStatement, + Set duplicateStatements, + List repeatedStatements, + Throwable exception + ) { this.actualStatement = actualStatement; this.normalisedStatement = normalisedStatement; this.duplicateStatements = duplicateStatements == null ? emptySet() : duplicateStatements; this.repeatedStatements = repeatedStatements == null ? emptyList() : repeatedStatements; + this.exception = exception; } @Override @@ -185,4 +205,9 @@ final class DefaultDiagnosticsContext implements DiagnosticsContext { public final List repeatedStatements() { return Collections.unmodifiableList(repeatedStatements); } + + @Override + public final Throwable exception() { + return exception; + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsListener.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsListener.java index bf524946ff..90aeaa0648 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsListener.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsListener.java @@ -73,4 +73,6 @@ public class DefaultDiagnosticsListener implements DiagnosticsListener { + @Override + public void exception(DiagnosticsContext ctx) {} } diff --git a/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java b/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java index 63251fae07..5c13628393 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java +++ b/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java @@ -169,38 +169,47 @@ final class DiagnosticsConnection extends DefaultConnection { queries = parser.parse(sql); normalised = normalisingRenderer.render(queries); } - catch (ParserException ignore) { + catch (ParserException exception) { normalised = sql; + listeners.exception(new DefaultDiagnosticsContext(sql, exception)); } - Set duplicates; - synchronized (DUPLICATE_SQL) { - duplicates = duplicates(DUPLICATE_SQL, sql, normalised); + try { + Set duplicates = null; + synchronized (DUPLICATE_SQL) { + duplicates = duplicates(DUPLICATE_SQL, sql, normalised); + } + + if (duplicates != null) + listeners.duplicateStatements(new DefaultDiagnosticsContext(sql, normalised, duplicates, null, null)); + + List repetitions = repetitions(repeatedSQL, sql, normalised); + + if (repetitions != null) + listeners.repeatedStatements(new DefaultDiagnosticsContext(sql, normalised, null, repetitions, null)); + + + + + + + + + + + + + + + + + } + catch (Error e) { + throw e; + } + catch (Throwable exception) { + listeners.exception(new DefaultDiagnosticsContext(sql, normalised, null, null, exception)); } - - if (duplicates != null) - listeners.duplicateStatements(new DefaultDiagnosticsContext(sql, normalised, duplicates, null)); - - List repetitions = repetitions(repeatedSQL, sql, normalised); - - if (repetitions != null) - listeners.repeatedStatements(new DefaultDiagnosticsContext(sql, normalised, null, repetitions)); - - - - - - - - - - - - - - - - return sql; } diff --git a/jOOQ/src/main/java/org/jooq/impl/DiagnosticsListeners.java b/jOOQ/src/main/java/org/jooq/impl/DiagnosticsListeners.java index 9d0b0d43f7..339dffa2d7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DiagnosticsListeners.java +++ b/jOOQ/src/main/java/org/jooq/impl/DiagnosticsListeners.java @@ -104,4 +104,10 @@ final class DiagnosticsListeners implements DiagnosticsListener { + + @Override + public final void exception(DiagnosticsContext ctx) { + for (DiagnosticsListener listener : listeners) + listener.exception(ctx); + } }