diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 2782fe6580..1521c26e18 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -1850,25 +1850,32 @@ final class DefaultParseContext extends AbstractParseContext implements ParseCon boolean withTies = false; // T-SQL style TOP .. START AT - if (parseKeywordIf("TOP")) { - limit = (Field) parseField(); - percent = parseProKeywordIf("PERCENT"); + try { + supportArraySubscripts = false; - if (parseKeywordIf("START AT")) - offset = (Field) parseField(); - else if (parseKeywordIf("WITH TIES")) - withTies = true; - } - - // Informix style SKIP .. FIRST - else if (parseKeywordIf("SKIP")) { - offset = (Field) parseField(); - - if (parseKeywordIf("FIRST")) + if (parseKeywordIf("TOP")) { limit = (Field) parseField(); + percent = parseProKeywordIf("PERCENT"); + + if (parseKeywordIf("START AT")) + offset = (Field) parseField(); + else if (parseKeywordIf("WITH TIES")) + withTies = true; + } + + // Informix style SKIP .. FIRST + else if (parseKeywordIf("SKIP")) { + offset = (Field) parseField(); + + if (parseKeywordIf("FIRST")) + limit = (Field) parseField(); + } + else if (parseKeywordIf("FIRST")) { + limit = (Field) parseField(); + } } - else if (parseKeywordIf("FIRST")) { - limit = (Field) parseField(); + finally { + supportArraySubscripts = true; } List select = parseSelectList(); @@ -8864,7 +8871,7 @@ final class DefaultParseContext extends AbstractParseContext implements ParseCon - if (parseIf('[')) { + if (peek('[') && possiblyArrayTyped(r) && parseIf('[')) { r = arrayGet((Field) toField(r), (Field) parseField()); parse(']'); } @@ -8873,6 +8880,25 @@ final class DefaultParseContext extends AbstractParseContext implements ParseCon return r; } + private final boolean possiblyArrayTyped(FieldOrRowOrSelect r) { + if (!supportArraySubscripts) + return false; + else if (r instanceof Row) + return false; + else if (r instanceof Field f) + return f.getDataType().isArray() || f.getDataType().isOther(); + else if (r instanceof Select s) { + List> l = s.getSelect(); + + if (l.size() != 1) + return false; + else if (!l.get(0).getDataType().isArray() && !l.get(0).getDataType().isOther()) + return false; + } + + return true; + } + private final FieldOrRowOrSelect parseMethodCallIf(FieldOrRowOrSelect r) { @@ -15949,15 +15975,17 @@ final class DefaultParseContext extends AbstractParseContext implements ParseCon private final ParseWithMetaLookups metaLookups; private boolean metaLookupsForceIgnore; private final Consumer> bindParamListener; - private boolean ignoreHints = true; + private boolean ignoreHints = true; private final Object[] bindings; - 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(); + 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 boolean supportArraySubscripts = true; + private ParseScope scope = new ParseScope(); +