diff --git a/jOOQ/src/main/java/org/jooq/ParseListener.java b/jOOQ/src/main/java/org/jooq/ParseListener.java index fa3979a0d2..ecdc1d4abd 100644 --- a/jOOQ/src/main/java/org/jooq/ParseListener.java +++ b/jOOQ/src/main/java/org/jooq/ParseListener.java @@ -123,6 +123,40 @@ package org.jooq; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/CallbackParseListener.java b/jOOQ/src/main/java/org/jooq/impl/CallbackParseListener.java index 2d870d65b2..8a56763376 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CallbackParseListener.java +++ b/jOOQ/src/main/java/org/jooq/impl/CallbackParseListener.java @@ -101,6 +101,51 @@ package org.jooq.impl; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultParseListener.java b/jOOQ/src/main/java/org/jooq/impl/DefaultParseListener.java index 23cc14682c..c4fb72800d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultParseListener.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultParseListener.java @@ -67,6 +67,12 @@ package org.jooq.impl; + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/ParseListeners.java b/jOOQ/src/main/java/org/jooq/impl/ParseListeners.java index 78a6f5e4e0..a04fb12b3b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParseListeners.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParseListeners.java @@ -96,6 +96,18 @@ import static org.jooq.impl.Tools.map; + + + + + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 50a715c346..8374d77b5c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -110,6 +110,7 @@ import java.util.function.BooleanSupplier; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; +import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -474,22 +475,24 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { static final Set SUPPORTS_HASH_COMMENT_SYNTAX = SQLDialect.supportedBy(MARIADB, MYSQL); final Queries parse() { - List result = new ArrayList<>(); - Query query; + return wrap(() -> { + List result = new ArrayList<>(); + Query query; - do { - parseDelimiterSpecifications(); - while (parseDelimiterIf(false)); + do { + parseDelimiterSpecifications(); + while (parseDelimiterIf(false)); - query = patchParsedQuery(parseQuery(false, false)); - if (query == IGNORE || query == IGNORE_NO_DELIMITER) - continue; - if (query != null) - result.add(query); - } - while (parseDelimiterIf(true) && !done()); + query = patchParsedQuery(parseQuery(false, false)); + if (query == IGNORE || query == IGNORE_NO_DELIMITER) + continue; + if (query != null) + result.add(query); + } + while (parseDelimiterIf(true) && !done()); - return done("Unexpected token or missing query delimiter", dsl.queries(result)); + return done("Unexpected token or missing query delimiter", dsl.queries(result)); + }); } private static final Pattern P_SEARCH_PATH = Pattern.compile("(?i:select\\s+(pg_catalog\\s*\\.\\s*)?set_config\\s*\\(\\s*'search_path'\\s*,\\s*'([^']*)'\\s*,\\s*\\w+\\s*\\))"); @@ -527,11 +530,11 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } final Query parseQuery0() { - return done("Unexpected clause", parseQuery(false, false)); + return wrap(() -> done("Unexpected clause", parseQuery(false, false))); } final Statement parseStatement0() { - return this.done("Unexpected content", parseStatementAndSemicolonIf()); + return wrap(() -> done("Unexpected content", parseStatementAndSemicolonIf())); } @@ -550,32 +553,34 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { + + final ResultQuery parseResultQuery0() { - return done("Unexpected content after end of query input", (ResultQuery) parseQuery(true, false)); + return wrap(() -> done("Unexpected content after end of query input", (ResultQuery) parseQuery(true, false))); } final Select parseSelect0() { - return done("Unexpected content after end of query input", (Select) parseQuery(true, true)); + return wrap(() -> done("Unexpected content after end of query input", (Select) parseQuery(true, true))); } final Table parseTable0() { - return done("Unexpected content after end of table input", parseTable()); + return wrap(() -> done("Unexpected content after end of table input", parseTable())); } final Field parseField0() { - return done("Unexpected content after end of field input", parseField()); + return wrap(() -> done("Unexpected content after end of field input", parseField())); } final Row parseRow0() { - return done("Unexpected content after end of row input", parseRow()); + return wrap(() -> done("Unexpected content after end of row input", parseRow())); } final Condition parseCondition0() { - return done("Unexpected content after end of condition input", parseCondition()); + return wrap(() -> done("Unexpected content after end of condition input", parseCondition())); } final Name parseName0() { - return done("Unexpected content after end of name input", parseName()); + return wrap(() -> done("Unexpected content after end of name input", parseName())); } @@ -1226,7 +1231,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return lhs; } - private SelectQueryImpl degreeCheck(int expected, SelectQueryImpl s) { + private final SelectQueryImpl degreeCheck(int expected, SelectQueryImpl s) { if (expected == 0) return s; @@ -13427,6 +13432,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { + parseWhitespaceIf(); } @@ -13707,6 +13713,30 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { throw exception(message); } + private final Q wrap(Supplier supplier) { + ParserException suppressed = null; + + try { + return supplier.get(); + } + catch (ParserException e) { + throw suppressed = e; + } + finally { + + + + + + + + + + + + } + } + private final Q notify(Q result) { if (bindParamListener != null) { final Map> params = new LinkedHashMap<>();