From 807ec8850ea37c93c769e2b5cec3d7b0ca88c877 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 17 Sep 2024 16:22:43 +0200 Subject: [PATCH] [jOOQ/jOOQ#7263] Parser should accept qualified field references in MERGE .. INSERT statement --- .../main/java/org/jooq/impl/ParserImpl.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 7d70f188ff..89a30d1065 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -680,6 +680,7 @@ import org.jooq.MergeUsingStep; import org.jooq.Meta; import org.jooq.Name; import org.jooq.Name.Quoted; +import org.jooq.Named; import org.jooq.OptionallyOrderedAggregateFunction; import org.jooq.OrderedAggregateFunction; import org.jooq.OrderedAggregateFunctionOfDeferredType; @@ -2654,7 +2655,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { parseKeyword("THEN INSERT"); parse('('); - insertColumns = Tools.fieldsByName(parseIdentifiers().toArray(EMPTY_NAME)); + insertColumns = parseUniqueList("identifier", ',', c -> parseFieldName()); parse(')'); parseKeyword("VALUES"); parse('('); @@ -13362,13 +13363,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } private final List parseIdentifiers() { - LinkedHashSet result = new LinkedHashSet<>(); - - do - if (!result.add(parseIdentifier())) - throw exception("Duplicate identifier encountered"); - while (parseIf(',')); - return new ArrayList<>(result); + return parseUniqueList("identifier", ',', c -> parseIdentifier()); } @Override @@ -14539,6 +14534,25 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return result; } + private final List parseUniqueList(String objectType, char separator, Function element) { + return parseUniqueList(objectType, c -> c.parseIf(separator), element); + } + + private final List parseUniqueList(String objectType, String separator, Function element) { + return parseUniqueList(objectType, c -> c.parseIf(separator), element); + } + + private final List parseUniqueList(String objectType, Predicate separator, Function element) { + Set result = new LinkedHashSet<>(); + + do + if (!result.add(element.apply(this))) + throw exception("Duplicate " + objectType + " encountered: "); + while (separator.test(this)); + + return new ArrayList<>(result); + } + @Override public final T parseParenthesised(Function content) { return parseParenthesised('(', content, ')');