From ab88ab10ebc68f725b4d4e7b6734a13557f44965 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 15 Dec 2022 21:23:36 +0100 Subject: [PATCH] [jOOQ/jOOQ#5799] Add parser support for WITH ORDINALITY --- jOOQ/src/main/java/org/jooq/impl/DSL.java | 10 +------ .../java/org/jooq/impl/OrdinalityTable.java | 2 +- .../main/java/org/jooq/impl/ParserImpl.java | 30 +++++++------------ 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 24cf29e468..2eea487e2d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -32753,15 +32753,7 @@ public class DSL { @NotNull @Support static Table values0(Row... rows) { - Values.assertNotEmpty(rows); - int size = rows[0].size(); - - String[] columns = new String[size]; - - for (int i = 0; i < size; i++) - columns[i] = "c" + (i + 1); - - return new Values(rows).as("v", columns); + return new Values(Values.assertNotEmpty(rows)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/OrdinalityTable.java b/jOOQ/src/main/java/org/jooq/impl/OrdinalityTable.java index f6d70abf8c..7d519c36bd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/OrdinalityTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/OrdinalityTable.java @@ -196,7 +196,7 @@ implements else - ctx.sql(' ').visit(K_WITH).sql(' ').visit(K_ORDINALITY); + ctx.visit(delegate).sql(' ').visit(K_WITH).sql(' ').visit(K_ORDINALITY); } private final void acceptEmulation(Context ctx) { diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 4af93ee4c5..4c1f4922d5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -2237,9 +2237,9 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } parseKeywordIf("FROM"); - Table table = scope.scope(parseTable(() -> peekKeyword(KEYWORDS_IN_DELETE_FROM))); + Table table = scope.scope(parseJoinedTable(() -> peekKeyword(KEYWORDS_IN_DELETE_FROM))); DeleteUsingStep s1 = with == null ? dsl.delete(table) : with.delete(table); - DeleteWhereStep s2 = parseKeywordIf("USING", "FROM") ? s1.using(parseList(',', t -> scope.scope(parseTable(() -> peekKeyword(KEYWORDS_IN_DELETE_FROM))))) : s1; + DeleteWhereStep s2 = parseKeywordIf("USING", "FROM") ? s1.using(parseList(',', t -> scope.scope(parseJoinedTable(() -> peekKeyword(KEYWORDS_IN_DELETE_FROM))))) : s1; DeleteOrderByStep s3 = parseKeywordIf("ALL") ? s2 : parseKeywordIf("WHERE") @@ -2430,9 +2430,9 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { // percent = parseKeywordIf("PERCENT") && requireProEdition(); } - Table table = scope.scope(parseTable(() -> peekKeyword(KEYWORDS_IN_UPDATE_FROM))); + Table table = scope.scope(parseJoinedTable(() -> peekKeyword(KEYWORDS_IN_UPDATE_FROM))); UpdateSetFirstStep s1 = (with == null ? dsl.update(table) : with.update(table)); - List> from = parseKeywordIf("FROM") ? parseList(',', t -> scope.scope(parseTable(() -> peekKeyword(KEYWORDS_IN_UPDATE_FROM)))) : null; + List> from = parseKeywordIf("FROM") ? parseList(',', t -> scope.scope(parseJoinedTable(() -> peekKeyword(KEYWORDS_IN_UPDATE_FROM)))) : null; parseKeyword("SET"); UpdateFromStep s2; @@ -2457,7 +2457,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { UpdateWhereStep s3 = from != null ? s2.from(from) : parseKeywordIf("FROM") - ? s2.from(parseList(',', t -> parseTable(() -> peekKeyword(KEYWORDS_IN_UPDATE_FROM)))) + ? s2.from(parseList(',', t -> parseJoinedTable(() -> peekKeyword(KEYWORDS_IN_UPDATE_FROM)))) : s2; UpdateOrderByStep s4 = parseKeywordIf("ALL") ? s3 @@ -6811,20 +6811,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { @Override public final Table parseTable() { - return parseTable(() -> peekKeyword(KEYWORDS_IN_SELECT_FROM)); - } - - private final Table parseTable(BooleanSupplier forbiddenKeywords) { - Table result = parseLateral(forbiddenKeywords); - - for (;;) { - Table joined = parseJoinedTableIf(result, forbiddenKeywords); - - if (joined == null) - return result; - else - result = joined; - } + return parseJoinedTable(() -> peekKeyword(KEYWORDS_IN_SELECT_FROM)); } private final Table parseLateral(BooleanSupplier forbiddenKeywords) { @@ -7115,6 +7102,9 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } + if (parseKeywordIf("WITH ORDINALITY")) + result = t(result).withOrdinality(); + if (!ignoreProEdition() && parseKeywordIf("PIVOT") && requireProEdition()) { @@ -7471,7 +7461,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { if (joinType == null) return null; - Table right = joinType.qualified() ? parseTable(forbiddenKeywords) : parseLateral(forbiddenKeywords); + Table right = joinType.qualified() ? parseJoinedTable(forbiddenKeywords) : parseLateral(forbiddenKeywords); TableOptionalOnStep s0; TablePartitionByStep s1;