[jOOQ/jOOQ#7263] Parser should accept qualified field references in

MERGE .. INSERT statement
This commit is contained in:
Lukas Eder 2024-09-17 16:22:43 +02:00
parent e4d98094eb
commit 807ec8850e

View File

@ -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<Name> parseIdentifiers() {
LinkedHashSet<Name> 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 <T> List<T> parseUniqueList(String objectType, char separator, Function<? super ParseContext, ? extends T> element) {
return parseUniqueList(objectType, c -> c.parseIf(separator), element);
}
private final <T> List<T> parseUniqueList(String objectType, String separator, Function<? super ParseContext, ? extends T> element) {
return parseUniqueList(objectType, c -> c.parseIf(separator), element);
}
private final <T> List<T> parseUniqueList(String objectType, Predicate<? super ParseContext> separator, Function<? super ParseContext, ? extends T> element) {
Set<T> 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> T parseParenthesised(Function<? super ParseContext, ? extends T> content) {
return parseParenthesised('(', content, ')');