From f47010666ec1af4772b53cb8afe25a0ae1d534b8 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 28 May 2025 15:05:14 +0200 Subject: [PATCH] [jOOQ/jOOQ#18543] Parser cannot handle left-associative parenthesised nested set operations in derived table --- .../main/java/org/jooq/impl/ParserImpl.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index c2ac72d064..62ce8db9bd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -1457,8 +1457,12 @@ final class DefaultParseContext extends AbstractParseContext implements ParseCon } private final SelectQueryImpl parseSelect(Integer degree, WithImpl with) { + return parseSelect(degree, with, null); + } + + private final SelectQueryImpl parseSelect(Integer degree, WithImpl with, SelectQueryImpl prefix) { scope.scopeStart(); - SelectQueryImpl result = parseQueryExpressionBody(degree, with, null); + SelectQueryImpl result = parseQueryExpressionBody(degree, with, prefix); List> orderBy = null; for (Field field : result.getSelect()) @@ -7651,6 +7655,18 @@ final class DefaultParseContext extends AbstractParseContext implements ParseCon } else { result = parseJoinedTable(forbiddenKeywords); + + // [#18543] We don't really know what the parentheses mean at this point, so + // after the fact, if we happen to have parsed what looks like a + // "derived table, we could still encounter more set operations or + // ORDER BY .. LIMIT clauses + if (result instanceof Table t) { + Select s = Tools.extractSelectFromDerivedTable(t); + + if (s != null) + result = parseSelect(null, null, selectQueryImpl(s)); + } + parse(')'); } }