diff --git a/jOOQ/src/main/java/org/jooq/impl/DDL.java b/jOOQ/src/main/java/org/jooq/impl/DDL.java index 86189c9868..ff61aebccc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DDL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DDL.java @@ -74,6 +74,7 @@ import java.util.regex.Pattern; import org.jooq.Check; import org.jooq.Comment; +import org.jooq.Configuration; import org.jooq.Constraint; import org.jooq.ConstraintEnforcementStep; import org.jooq.CreateDomainAsStep; @@ -214,7 +215,12 @@ final class DDL { try { if (!FALSE.equals(ctx.settings().isParseMetaViewSources())) { - Query[] queries = ctx.parser().parse(options.source()).queries(); + + // [#16979] Internal, undocumented flag to prevent + // [#17013] TODO: Use new Settings instead, once implemented + Configuration c = ctx.configuration().derive(); + c.data("org.jooq.parser.delimiter-required", true); + Query[] queries = c.dsl().parser().parse(options.source()).queries(); if (queries.length > 0) { if (queries[0] instanceof CreateViewImpl cv) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index f5747f811b..8dc71df3ef 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -7268,7 +7268,10 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { @Override public final Table parseTable() { - return parseJoinedTable(() -> peekKeyword(KEYWORD_LOOKUP_IN_SELECT_FROM)); + return parseJoinedTable(() -> peekKeyword(delimiterRequired + ? KEYWORD_LOOKUP_IN_FROM + : KEYWORD_LOOKUP_IN_SELECT_FROM + )); } private final Table parseLateral(BooleanSupplier forbiddenKeywords) { @@ -8093,7 +8096,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { if (parseKeywordIf("AS")) alias = parseIdentifier(true, false); - else if (!peekKeyword(KEYWORD_LOOKUP_IN_SELECT) && !peekKeyword(KEYWORD_LOOKUP_IN_STATEMENTS)) + else if (!peekKeyword(KEYWORD_LOOKUP_IN_SELECT) && (delimiterRequired || !peekKeyword(KEYWORD_LOOKUP_IN_STATEMENTS))) alias = parseIdentifierIf(true, false); } @@ -15684,6 +15687,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { private int bindIndex = 0; private final Map> bindParams = new LinkedHashMap<>(); private String delimiter = ";"; + private boolean delimiterRequired = false; private LanguageContext languageContext = LanguageContext.QUERY; private EnumSet forbidden = EnumSet.noneOf(FunctionKeyword.class); private ParseScope scope = new ParseScope(); @@ -15720,6 +15724,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { // [#8722] This is an undocumented flag that allows for collecting parameters from the parser // Do not rely on this flag. It will change incompatibly in the future. this.bindParamListener = (Consumer>) dsl.configuration().data("org.jooq.parser.param-collector"); + this.delimiterRequired = TRUE.equals(dsl.configuration().data("org.jooq.parser.delimiter-required"));