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, ')');