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(')'); } }