This is an automated email from the ASF dual-hosted git repository.

tkalkirill pushed a commit to branch ignite-28739
in repository https://gitbox.apache.org/repos/asf/ignite.git

commit 38de61700a3875d6f8455a0ac837b7e28dc7dc45
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Mon Jun 1 14:57:29 2026 +0300

    IGNITE-28793 wip
---
 modules/calcite/pom.xml                            |    4 +
 .../src/main/codegen/includes/parserImpls.ftl      |   14 +
 .../codegen/patches/select-fetch-expression.patch  |   26 +
 .../query/calcite/exec/LogicalRelImplementor.java  |    4 +-
 .../query/calcite/exec/rel/LimitNode.java          |   16 +-
 .../query/calcite/exec/rel/SortNode.java           |   14 +-
 .../calcite/prepare/IgniteRelFieldTrimmer.java     |   74 +
 .../calcite/prepare/IgniteSqlToRelConvertor.java   |    6 +
 .../query/calcite/prepare/IgniteSqlValidator.java  |  127 +-
 .../query/calcite/prepare/PlannerPhase.java        |    5 +-
 .../calcite/sql/generated/IgniteSqlParserImpl.java | 2333 ++++++++++----------
 .../query/calcite/util/RelNodeUtils.java           |   68 +
 .../integration/LimitOffsetIntegrationTest.java    |  364 ++-
 13 files changed, 1851 insertions(+), 1204 deletions(-)

diff --git a/modules/calcite/pom.xml b/modules/calcite/pom.xml
index fb42c00c240..a2d331c8013 100644
--- a/modules/calcite/pom.xml
+++ b/modules/calcite/pom.xml
@@ -341,6 +341,10 @@
                                     
outputRoot="${project.build.directory}/generated-sources/fmpp"
                                     
data="tdd(${project.build.directory}/codegen/config.fmpp), default: 
tdd(${project.build.directory}/codegen/default_config.fmpp)"
                                 />
+                                <patch
+                                    
dir="${project.build.directory}/generated-sources/fmpp"
+                                    
patchfile="${project.build.directory}/codegen/patches/select-fetch-expression.patch"
+                                />
                             </target>
                         </configuration>
                     </execution>
diff --git a/modules/calcite/src/main/codegen/includes/parserImpls.ftl 
b/modules/calcite/src/main/codegen/includes/parserImpls.ftl
index 8c5c964b609..855527f8fd4 100644
--- a/modules/calcite/src/main/codegen/includes/parserImpls.ftl
+++ b/modules/calcite/src/main/codegen/includes/parserImpls.ftl
@@ -816,3 +816,17 @@ SqlDrop SqlDropView(Span s, boolean replace) :
         return SqlDdlNodes.dropView(s.end(this), ifExists, id);
     }
 }
+
+JAVACODE
+SqlNode FetchCount() {
+    SqlNode e;
+    if (getToken(1).kind == LPAREN) {
+        jj_consume_token(LPAREN);
+        e = Expression(ExprContext.ACCEPT_NON_QUERY);
+        jj_consume_token(RPAREN);
+    }
+    else
+        e = UnsignedNumericLiteralOrParam();
+
+    return e;
+}
diff --git 
a/modules/calcite/src/main/codegen/patches/select-fetch-expression.patch 
b/modules/calcite/src/main/codegen/patches/select-fetch-expression.patch
new file mode 100644
index 00000000000..70b024b00f8
--- /dev/null
+++ b/modules/calcite/src/main/codegen/patches/select-fetch-expression.patch
@@ -0,0 +1,26 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+--- javacc/Parser.jj
++++ javacc/Parser.jj
+@@ -754,7 +754,7 @@
+ {
+     // SQL:2008-style syntax. "OFFSET ... FETCH ...".
+     // If you specify both LIMIT and FETCH, FETCH wins.
+-    <FETCH> ( <FIRST> | <NEXT> ) offsetFetch[1] = 
UnsignedNumericLiteralOrParam()
++    <FETCH> ( <FIRST> | <NEXT> ) offsetFetch[1] = FetchCount()
+     ( <ROW> | <ROWS> ) <ONLY>
+ }
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java
index 3ff4bc54450..20bf0894894 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java
@@ -627,7 +627,7 @@ public class LogicalRelImplementor<Row> implements 
IgniteRelVisitor<Node<Row>> {
     /** {@inheritDoc} */
     @Override public Node<Row> visit(IgniteLimit rel) {
         Supplier<Integer> offset = (rel.offset() == null) ? null : 
expressionFactory.execute(rel.offset());
-        Supplier<Integer> fetch = (rel.fetch() == null) ? null : 
expressionFactory.execute(rel.fetch());
+        Supplier<Number> fetch = (rel.fetch() == null) ? null : 
expressionFactory.execute(rel.fetch());
 
         LimitNode<Row> node = new LimitNode<>(ctx, rel.getRowType(), offset, 
fetch);
 
@@ -643,7 +643,7 @@ public class LogicalRelImplementor<Row> implements 
IgniteRelVisitor<Node<Row>> {
         RelCollation collation = rel.getCollation();
 
         Supplier<Integer> offset = (rel.offset == null) ? null : 
expressionFactory.execute(rel.offset);
-        Supplier<Integer> fetch = (rel.fetch == null) ? null : 
expressionFactory.execute(rel.fetch);
+        Supplier<Number> fetch = (rel.fetch == null) ? null : 
expressionFactory.execute(rel.fetch);
 
         SortNode<Row> node = new SortNode<>(ctx, rel.getRowType(), 
expressionFactory.comparator(collation), offset,
             fetch);
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java
index 9fa9d14090c..44671769ebb 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java
@@ -20,6 +20,7 @@ package 
org.apache.ignite.internal.processors.query.calcite.exec.rel;
 import java.util.function.Supplier;
 import org.apache.calcite.rel.type.RelDataType;
 import 
org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext;
+import org.apache.ignite.internal.processors.query.calcite.util.RelNodeUtils;
 import org.apache.ignite.internal.util.typedef.F;
 import org.jetbrains.annotations.Nullable;
 
@@ -35,27 +36,22 @@ public class LimitNode<Row> extends AbstractNode<Row> 
implements SingleNode<Row>
     private int rowsProcessed;
 
     /** Fetch can be unset, in this case we need all rows. */
-    private @Nullable Supplier<Integer> fetchNode;
+    private final @Nullable Supplier<Number> fetchNode;
 
     /** Waiting results counter. */
     private int waiting;
 
-    /**
-     * Constructor.
-     *
-     * @param ctx Execution context.
-     * @param rowType Row type.
-     */
+    /** */
     public LimitNode(
         ExecutionContext<Row> ctx,
         RelDataType rowType,
-        Supplier<Integer> offsetNode,
-        Supplier<Integer> fetchNode
+        @Nullable Supplier<Integer> offsetNode,
+        @Nullable Supplier<Number> fetchNode
     ) {
         super(ctx, rowType);
 
         offset = offsetNode == null ? 0 : offsetNode.get();
-        fetch = fetchNode == null ? 0 : fetchNode.get();
+        fetch = RelNodeUtils.resolveFetch(fetchNode, "FETCH");
         this.fetchNode = fetchNode;
     }
 
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortNode.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortNode.java
index 09376b210f6..28133e43ca3 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortNode.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortNode.java
@@ -23,6 +23,7 @@ import java.util.PriorityQueue;
 import java.util.function.Supplier;
 import org.apache.calcite.rel.type.RelDataType;
 import 
org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext;
+import org.apache.ignite.internal.processors.query.calcite.util.RelNodeUtils;
 import org.apache.ignite.internal.util.GridBoundedPriorityQueue;
 import org.apache.ignite.internal.util.typedef.F;
 import org.jetbrains.annotations.Nullable;
@@ -49,24 +50,19 @@ public class SortNode<Row> extends MemoryTrackingNode<Row> 
implements SingleNode
     /** Reverse-ordered rows in case of limited sort. */
     private List<Row> reversed;
 
-    /**
-     * @param ctx Execution context.
-     * @param comp Rows comparator.
-     * @param offset Offset.
-     * @param fetch Limit.
-     */
+    /** */
     public SortNode(
         ExecutionContext<Row> ctx, RelDataType rowType,
         Comparator<Row> comp,
         @Nullable Supplier<Integer> offset,
-        @Nullable Supplier<Integer> fetch
+        @Nullable Supplier<Number> fetch
     ) {
         super(ctx, rowType);
 
-        assert fetch == null || fetch.get() >= 0;
         assert offset == null || offset.get() >= 0;
 
-        limit = fetch == null ? -1 : fetch.get() + (offset == null ? 0 : 
offset.get());
+        limit = fetch == null ?
+            -1 : RelNodeUtils.resolveFetch(fetch, "FETCH") + (offset == null ? 
0 : offset.get());
 
         if (limit < 0)
             rows = new PriorityQueue<>(comp);
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelFieldTrimmer.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelFieldTrimmer.java
new file mode 100644
index 00000000000..abb19a42f6f
--- /dev/null
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelFieldTrimmer.java
@@ -0,0 +1,74 @@
+package org.apache.ignite.internal.processors.query.calcite.prepare;
+
+import java.util.Set;
+import org.apache.calcite.rel.RelCollation;
+import org.apache.calcite.rel.RelFieldCollation;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Sort;
+import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.rex.RexDynamicParam;
+import org.apache.calcite.rex.RexLiteral;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.sql.validate.SqlValidator;
+import org.apache.calcite.sql2rel.RelFieldTrimmer;
+import org.apache.calcite.tools.RelBuilder;
+import org.apache.calcite.util.ImmutableBitSet;
+import org.apache.calcite.util.mapping.Mapping;
+import org.apache.calcite.util.mapping.Mappings;
+import org.jetbrains.annotations.Nullable;
+
+import static java.util.Collections.emptySet;
+
+/** Field trimmer that preserves expression-based FETCH nodes. */
+public class IgniteRelFieldTrimmer extends RelFieldTrimmer {
+    /**  */
+    IgniteRelFieldTrimmer(@Nullable SqlValidator validator, RelBuilder 
relBuilder) {
+        super(validator, relBuilder);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public TrimResult trimFields(
+        Sort sort,
+        ImmutableBitSet fieldsUsed,
+        Set<RelDataTypeField> extraFields
+    ) {
+        if (supportedByRelBuilder(sort.fetch))
+            return super.trimFields(sort, fieldsUsed, extraFields);
+
+        RelCollation collation = sort.getCollation();
+        RelNode input = sort.getInput();
+        int fieldCnt = sort.getRowType().getFieldCount();
+
+        ImmutableBitSet.Builder inputFieldsUsed = fieldsUsed.rebuild();
+
+        for (RelFieldCollation field : collation.getFieldCollations())
+            inputFieldsUsed.set(field.getFieldIndex());
+
+        TrimResult trimRes = trimChild(sort, input, inputFieldsUsed.build(), 
emptySet());
+        RelNode newInput = trimRes.left;
+        Mapping inputMapping = trimRes.right;
+
+        if (newInput == input && inputMapping.isIdentity() && 
fieldsUsed.cardinality() == fieldCnt)
+            return result(sort, Mappings.createIdentity(fieldCnt));
+
+        RelNode newSort = sort.copy(
+            sort.getTraitSet(),
+            newInput,
+            RexUtil.apply(inputMapping, collation),
+            sort.offset,
+            sort.fetch
+        );
+
+        return result(newSort, inputMapping, sort);
+    }
+
+    /**
+     * @param node Rex node.
+     * @return {@code true} if Calcite RelBuilder accepts the node for FETCH.
+     */
+    private static boolean supportedByRelBuilder(@Nullable RexNode node) {
+        return node == null || node instanceof RexLiteral || node instanceof 
RexDynamicParam;
+    }
+}
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java
index fa8b31d7eee..61ea5ba35bf 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java
@@ -46,6 +46,7 @@ import org.apache.calcite.sql.util.SqlShuttle;
 import org.apache.calcite.sql.validate.SqlValidator;
 import org.apache.calcite.sql.validate.SqlValidatorScope;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
+import org.apache.calcite.sql2rel.RelFieldTrimmer;
 import org.apache.calcite.sql2rel.SqlRexConvertletTable;
 import org.apache.calcite.sql2rel.SqlToRelConverter;
 import org.apache.calcite.tools.RelBuilder;
@@ -87,6 +88,11 @@ public class IgniteSqlToRelConvertor extends 
SqlToRelConverter {
             return super.convertQueryRecursive(qry, top, targetRowType);
     }
 
+    /** {@inheritDoc} */
+    @Override protected RelFieldTrimmer newFieldTrimmer() {
+        return new IgniteRelFieldTrimmer(validator, relBuilder);
+    }
+
     /** {@inheritDoc} */
     @Override protected RelNode convertInsert(SqlInsert call) {
         datasetStack.push(call);
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java
index 8d25cf1c249..f2aad803b2f 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java
@@ -18,9 +18,11 @@
 package org.apache.ignite.internal.processors.query.calcite.prepare;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumSet;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -74,6 +76,7 @@ import 
org.apache.ignite.internal.processors.query.calcite.sql.IgniteSqlDecimalL
 import 
org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory;
 import org.apache.ignite.internal.processors.query.calcite.type.OtherType;
 import org.apache.ignite.internal.processors.query.calcite.util.IgniteResource;
+import org.apache.ignite.internal.processors.query.calcite.util.RelNodeUtils;
 import org.apache.ignite.internal.util.typedef.F;
 import org.immutables.value.Value;
 import org.jetbrains.annotations.Nullable;
@@ -83,9 +86,6 @@ import static org.apache.calcite.util.Static.RESOURCE;
 /** Validator. */
 @Value.Enclosing
 public class IgniteSqlValidator extends SqlValidatorImpl {
-    /** Decimal of Integer.MAX_VALUE for fetch/offset bounding. */
-    private static final BigDecimal DEC_INT_MAX = 
BigDecimal.valueOf(Integer.MAX_VALUE);
-
     /** **/
     private static final int MAX_LENGTH_OF_ALIASES = 256;
 
@@ -112,6 +112,9 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
     /** */
     private final RelDataType nullType;
 
+    /** Dynamic parameter types by parameter index. */
+    private final Map<Integer, RelDataType> dynamicParamTypeByIdx = new 
HashMap<>();
+
     /**
      * Creates a validator.
      *
@@ -240,7 +243,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
 
     /** {@inheritDoc} */
     @Override protected void validateSelect(SqlSelect select, RelDataType 
targetRowType) {
-        checkIntegerLimit(select.getFetch(), "fetch / limit");
+        checkFetch(select.getFetch(), "fetch / limit");
         checkIntegerLimit(select.getOffset(), "offset");
 
         super.validateSelect(select, targetRowType);
@@ -268,7 +271,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
         if (n instanceof SqlLiteral) {
             BigDecimal offFetchLimit = ((SqlLiteral)n).bigDecimalValue();
 
-            if (offFetchLimit.compareTo(DEC_INT_MAX) > 0 || 
offFetchLimit.compareTo(BigDecimal.ZERO) < 0)
+            if (offFetchLimit.compareTo(RelNodeUtils.DECIMAL_INT_MAX) > 0 || 
offFetchLimit.compareTo(BigDecimal.ZERO) < 0)
                 throw newValidationError(n, 
IgniteResource.INSTANCE.correctIntegerLimit(nodeName));
         }
         else if (n instanceof SqlDynamicParam) {
@@ -571,7 +574,10 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
 
     /** @return A derived type or {@code null} if unable to determine. */
     @Nullable private RelDataType deriveDynamicParameterType(SqlDynamicParam 
node, RelDataType nullValType) {
-        RelDataType type = getValidatedNodeTypeIfKnown(node);
+        RelDataType type = super.getValidatedNodeTypeIfKnown(node);
+
+        if (type == null)
+            type = dynamicParamTypeByIdx.get(node.getIndex());
 
         // Do not clarify the widest type for any value.
         if (type instanceof OtherType)
@@ -585,9 +591,10 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
         if (val == null && type != null)
             return type;
 
-        type = val == null
-            ? typeFactory().createTypeWithNullability(nullValType, true)
-            : 
typeFactory().createTypeWithNullability(typeFactory().toSql(typeFactory().createType(val.getClass())),
 true);
+        type = dynamicParameterType(node, nullValType);
+
+        if (type == null)
+            return null;
 
         setValidatedNodeType(node, type);
 
@@ -693,4 +700,106 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
         /** Ovverride due to lost @Nullable annotation from the super-class by 
immutables generator. */
         @Override Config withTypeCoercionRules(@Nullable SqlTypeCoercionRule 
rules);
     }
+
+    /** */
+    private void checkFetch(@Nullable SqlNode n, String nodeName) {
+        if (n == null)
+            return;
+
+        deriveDynamicParameterTypes(n);
+
+        BigDecimal fetch = resolveFetch(n, nodeName);
+
+        if (fetch != null) {
+            fetch = fetch.setScale(0, RoundingMode.DOWN);
+
+            if (fetch.compareTo(RelNodeUtils.DECIMAL_INT_MAX) > 0 || 
fetch.compareTo(BigDecimal.ZERO) < 0)
+                throw newValidationError(n, 
IgniteResource.INSTANCE.correctIntegerLimit(nodeName));
+        }
+    }
+
+    /** */
+    private @Nullable BigDecimal resolveFetch(SqlNode n, String nodeName) {
+        if (n instanceof SqlLiteral) {
+            if (((SqlLiteral)n).getTypeName().getFamily() != 
SqlTypeFamily.NUMERIC)
+                throw newValidationError(n, 
IgniteResource.INSTANCE.correctIntegerLimit(nodeName));
+
+            return ((SqlLiteral)n).bigDecimalValue();
+        }
+
+        if (n instanceof SqlDynamicParam) {
+            // Will fail in params check.
+            if (F.isEmpty(parameters))
+                return null;
+
+            int idx = ((SqlDynamicParam)n).getIndex();
+
+            if (idx >= parameters.length)
+                return null;
+
+            Object param = parameters[idx];
+
+            if (!(param instanceof Number))
+                return null;
+            else if (param instanceof Double || param instanceof Float) {
+                if (!Double.isFinite(((Number)param).doubleValue()))
+                    throw newValidationError(n, 
IgniteResource.INSTANCE.correctIntegerLimit(nodeName));
+            }
+
+            return new BigDecimal(param.toString());
+        }
+
+        return null;
+    }
+
+    /** */
+    private void deriveDynamicParameterTypes(SqlNode n) {
+        if (n instanceof SqlDynamicParam) {
+            SqlDynamicParam paramNode = (SqlDynamicParam)n;
+
+            RelDataType type = 
typeFactory().createSqlType(SqlTypeName.DECIMAL);
+            RelDataType dataType = 
typeFactory().createTypeWithNullability(type, true);
+
+            if (deriveDynamicParameterType(paramNode, dataType) == null) {
+                setValidatedNodeType(paramNode, dataType);
+                dynamicParamTypeByIdx.put(paramNode.getIndex(), dataType);
+            }
+        }
+        else if (n instanceof SqlCall) {
+            for (SqlNode operand : ((SqlCall)n).getOperandList())
+                deriveDynamicParameterTypes(operand);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public @Nullable RelDataType getValidatedNodeTypeIfKnown(SqlNode 
node) {
+        RelDataType type = super.getValidatedNodeTypeIfKnown(node);
+
+        if (type == null && node instanceof SqlDynamicParam) {
+            SqlDynamicParam param = (SqlDynamicParam)node;
+
+            type = dynamicParamTypeByIdx.get(param.getIndex());
+
+            if (type == null)
+                type = dynamicParameterType(param, nullType);
+        }
+
+        return type;
+    }
+
+    /** @return Dynamic parameter type derived from parameter value, or {@code 
null} if unable to determine. */
+    private @Nullable RelDataType dynamicParameterType(SqlDynamicParam node, 
RelDataType nullValType) {
+        if (parameters == null || node.getIndex() >= parameters.length)
+            return null;
+
+        Object val = parameters[node.getIndex()];
+
+        RelDataType type = val == null
+            ? typeFactory().createTypeWithNullability(nullValType, true)
+            : 
typeFactory().createTypeWithNullability(typeFactory().toSql(typeFactory().createType(val.getClass())),
 true);
+
+        dynamicParamTypeByIdx.put(node.getIndex(), type);
+
+        return type;
+    }
 }
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java
index b8333a54166..d731697c41f 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java
@@ -43,6 +43,7 @@ import org.apache.calcite.rel.rules.ProjectRemoveRule;
 import org.apache.calcite.rel.rules.PruneEmptyRules;
 import org.apache.calcite.rel.rules.SetOpToFilterRule;
 import org.apache.calcite.rel.rules.SortRemoveRule;
+import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.tools.Program;
 import org.apache.calcite.tools.RuleSet;
 import org.apache.calcite.tools.RuleSets;
@@ -259,7 +260,9 @@ public enum PlannerPhase {
 
                     
((RelRule<?>)PruneEmptyRules.SORT_FETCH_ZERO_INSTANCE).config
                         .withOperandSupplier(b ->
-                            b.operand(LogicalSort.class).anyInputs())
+                            b.operand(LogicalSort.class)
+                                .predicate(sort -> sort.fetch instanceof 
RexLiteral)
+                                .anyInputs())
                         .toRule(),
 
                     ExposeIndexRule.INSTANCE,
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java
index 05d733e0232..f7e2f6a9093 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java
@@ -675,7 +675,7 @@ public class IgniteSqlParserImpl extends 
SqlAbstractParserImpl implements Ignite
       jj_consume_token(-1);
       throw new ParseException();
     }
-    offsetFetch[1] = UnsignedNumericLiteralOrParam();
+    offsetFetch[1] = FetchCount();
     if (jj_2_19(2)) {
       jj_consume_token(ROW);
     } else if (jj_2_20(2)) {
@@ -2023,6 +2023,19 @@ public class IgniteSqlParserImpl extends 
SqlAbstractParserImpl implements Ignite
     throw new Error("Missing return statement in function");
   }
 
+  SqlNode FetchCount() throws ParseException {
+    SqlNode e;
+    if (getToken(1).kind == LPAREN) {
+        jj_consume_token(LPAREN);
+        e = Expression(ExprContext.ACCEPT_NON_QUERY);
+        jj_consume_token(RPAREN);
+    }
+    else
+        e = UnsignedNumericLiteralOrParam();
+
+    return e;
+  }
+
   final public SqlNodeList ParenthesizedKeyValueOptionCommaList() throws 
ParseException {
     final Span s;
     final List<SqlNode> list = new ArrayList<SqlNode>();
@@ -24191,128 +24204,6 @@ final String p;
     finally { jj_save(1804, xla); }
   }
 
-  final private boolean jj_3_642() {
-    if (jj_scan_token(HOUR)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_641() {
-    if (jj_scan_token(MINUTE)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_264() {
-    if (jj_scan_token(WITH)) return true;
-    if (jj_scan_token(ORDINALITY)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_640() {
-    if (jj_scan_token(SECOND)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_639() {
-    if (jj_scan_token(MILLISECOND)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_638() {
-    if (jj_scan_token(MICROSECOND)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_270() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_637()) {
-    jj_scanpos = xsp;
-    if (jj_3_638()) {
-    jj_scanpos = xsp;
-    if (jj_3_639()) {
-    jj_scanpos = xsp;
-    if (jj_3_640()) {
-    jj_scanpos = xsp;
-    if (jj_3_641()) {
-    jj_scanpos = xsp;
-    if (jj_3_642()) {
-    jj_scanpos = xsp;
-    if (jj_3_643()) {
-    jj_scanpos = xsp;
-    if (jj_3_644()) {
-    jj_scanpos = xsp;
-    if (jj_3_645()) {
-    jj_scanpos = xsp;
-    if (jj_3_646()) {
-    jj_scanpos = xsp;
-    if (jj_3_647()) {
-    jj_scanpos = xsp;
-    if (jj_3_648()) {
-    jj_scanpos = xsp;
-    if (jj_3_649()) {
-    jj_scanpos = xsp;
-    if (jj_3_650()) {
-    jj_scanpos = xsp;
-    if (jj_3_651()) {
-    jj_scanpos = xsp;
-    if (jj_3_652()) {
-    jj_scanpos = xsp;
-    if (jj_3_653()) {
-    jj_scanpos = xsp;
-    if (jj_3_654()) {
-    jj_scanpos = xsp;
-    if (jj_3_655()) {
-    jj_scanpos = xsp;
-    if (jj_3_656()) {
-    jj_scanpos = xsp;
-    if (jj_3_657()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3_637() {
-    if (jj_scan_token(NANOSECOND)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_263() {
-    if (jj_scan_token(LATERAL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_262() {
-    if (jj_3R_168()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_268() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_263()) jj_scanpos = xsp;
-    if (jj_scan_token(UNNEST)) return true;
-    if (jj_3R_173()) return true;
-    return false;
-  }
-
   final private boolean jj_3_259() {
     if (jj_3R_168()) return true;
     return false;
@@ -28570,13 +28461,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_242() {
-    if (jj_scan_token(VIEW)) return true;
-    if (jj_3R_133()) return true;
-    if (jj_3R_152()) return true;
-    return false;
-  }
-
   final private boolean jj_3_484() {
     if (jj_3R_152()) return true;
     return false;
@@ -28603,8 +28487,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_238() {
+  final private boolean jj_3R_242() {
     if (jj_scan_token(VIEW)) return true;
+    if (jj_3R_133()) return true;
     if (jj_3R_152()) return true;
     return false;
   }
@@ -28645,9 +28530,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_104() {
-    if (jj_scan_token(ANALYZE)) return true;
-    if (jj_3R_354()) return true;
+  final private boolean jj_3R_238() {
+    if (jj_scan_token(VIEW)) return true;
+    if (jj_3R_152()) return true;
     return false;
   }
 
@@ -28718,9 +28603,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_105() {
-    if (jj_scan_token(REFRESH)) return true;
-    if (jj_scan_token(STATISTICS)) return true;
+  final private boolean jj_3R_104() {
+    if (jj_scan_token(ANALYZE)) return true;
+    if (jj_3R_354()) return true;
     return false;
   }
 
@@ -28735,8 +28620,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_106() {
-    if (jj_scan_token(DROP)) return true;
+  final private boolean jj_3R_105() {
+    if (jj_scan_token(REFRESH)) return true;
     if (jj_scan_token(STATISTICS)) return true;
     return false;
   }
@@ -28746,11 +28631,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_147() {
-    if (jj_3R_84()) return true;
-    return false;
-  }
-
   final private boolean jj_3_473() {
     if (jj_scan_token(COMMA)) return true;
     if (jj_3R_139()) return true;
@@ -28763,24 +28643,19 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_146() {
-    if (jj_3R_119()) return true;
-    return false;
-  }
-
   final private boolean jj_3_472() {
     if (jj_scan_token(RPAREN)) return true;
     return false;
   }
 
-  final private boolean jj_3_939() {
-    if (jj_scan_token(LAST)) return true;
+  final private boolean jj_3R_106() {
+    if (jj_scan_token(DROP)) return true;
+    if (jj_scan_token(STATISTICS)) return true;
     return false;
   }
 
-  final private boolean jj_3R_136() {
-    if (jj_3R_364()) return true;
-    if (jj_scan_token(EQ)) return true;
+  final private boolean jj_3_939() {
+    if (jj_scan_token(LAST)) return true;
     return false;
   }
 
@@ -28808,6 +28683,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_147() {
+    if (jj_3R_84()) return true;
+    return false;
+  }
+
   final private boolean jj_3_936() {
     if (jj_scan_token(RUNNING)) return true;
     return false;
@@ -28824,8 +28704,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_145() {
-    if (jj_scan_token(MAX_CHANGED_PARTITION_ROWS_PERCENT)) return true;
+  final private boolean jj_3_146() {
+    if (jj_3R_119()) return true;
     return false;
   }
 
@@ -28848,11 +28728,32 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_136() {
+    if (jj_3R_364()) return true;
+    if (jj_scan_token(EQ)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_145() {
+    if (jj_scan_token(MAX_CHANGED_PARTITION_ROWS_PERCENT)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_935() {
+    if (jj_scan_token(FINAL)) return true;
+    return false;
+  }
+
   final private boolean jj_3_144() {
     if (jj_scan_token(NULLS)) return true;
     return false;
   }
 
+  final private boolean jj_3_934() {
+    if (jj_scan_token(RUNNING)) return true;
+    return false;
+  }
+
   final private boolean jj_3_143() {
     if (jj_scan_token(SIZE)) return true;
     return false;
@@ -28882,32 +28783,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_141() {
-    if (jj_scan_token(DISTINCT)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_935() {
-    if (jj_scan_token(FINAL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_139() {
-    if (jj_scan_token(QUOTED_IDENTIFIER)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_934() {
-    if (jj_scan_token(RUNNING)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_137() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_136()) return true;
-    return false;
-  }
-
   final private boolean jj_3R_326() {
     Token xsp;
     xsp = jj_scanpos;
@@ -28919,8 +28794,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_138() {
-    if (jj_3R_136()) return true;
+  final private boolean jj_3_141() {
+    if (jj_scan_token(DISTINCT)) return true;
     return false;
   }
 
@@ -28930,14 +28805,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_140() {
-    if (jj_scan_token(WITH)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_138()) {
-    jj_scanpos = xsp;
-    if (jj_3_139()) return true;
-    }
+  final private boolean jj_3_139() {
+    if (jj_scan_token(QUOTED_IDENTIFIER)) return true;
     return false;
   }
 
@@ -28951,6 +28820,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_137() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_136()) return true;
+    return false;
+  }
+
   final private boolean jj_3_932() {
     if (jj_3R_325()) return true;
     return false;
@@ -28966,6 +28841,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_138() {
+    if (jj_3R_136()) return true;
+    return false;
+  }
+
   final private boolean jj_3_930() {
     if (jj_scan_token(MATCH_NUMBER)) return true;
     if (jj_scan_token(LPAREN)) return true;
@@ -28978,9 +28858,14 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_136() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_135()) return true;
+  final private boolean jj_3_140() {
+    if (jj_scan_token(WITH)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_138()) {
+    jj_scanpos = xsp;
+    if (jj_3_139()) return true;
+    }
     return false;
   }
 
@@ -29014,11 +28899,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_354() {
-    if (jj_3R_135()) return true;
-    return false;
-  }
-
   final private boolean jj_3_463() {
     if (jj_scan_token(STRING_AGG)) return true;
     return false;
@@ -29039,6 +28919,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_136() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_135()) return true;
+    return false;
+  }
+
   final private boolean jj_3R_327() {
     Token xsp;
     xsp = jj_scanpos;
@@ -29066,13 +28952,13 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_135() {
-    if (jj_3R_124()) return true;
+  final private boolean jj_3_926() {
+    if (jj_scan_token(TUMBLE)) return true;
     return false;
   }
 
-  final private boolean jj_3_926() {
-    if (jj_scan_token(TUMBLE)) return true;
+  final private boolean jj_3R_354() {
+    if (jj_3R_135()) return true;
     return false;
   }
 
@@ -29090,13 +28976,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_135() {
-    if (jj_3R_152()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_134() {
-    if (jj_scan_token(TRANSACTION)) return true;
+  final private boolean jj_3_135() {
+    if (jj_3R_124()) return true;
     return false;
   }
 
@@ -29105,9 +28986,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_101() {
-    if (jj_scan_token(ROLLBACK)) return true;
-    if (jj_scan_token(TO)) return true;
+  final private boolean jj_3R_135() {
+    if (jj_3R_152()) return true;
     return false;
   }
 
@@ -29122,7 +29002,7 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_133() {
+  final private boolean jj_3_134() {
     if (jj_scan_token(TRANSACTION)) return true;
     return false;
   }
@@ -29139,9 +29019,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_100() {
-    if (jj_scan_token(SAVEPOINT)) return true;
-    if (jj_3R_84()) return true;
+  final private boolean jj_3R_101() {
+    if (jj_scan_token(ROLLBACK)) return true;
+    if (jj_scan_token(TO)) return true;
     return false;
   }
 
@@ -29150,11 +29030,14 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_103() {
-    if (jj_scan_token(ROLLBACK)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_134()) jj_scanpos = xsp;
+  final private boolean jj_3_133() {
+    if (jj_scan_token(TRANSACTION)) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_100() {
+    if (jj_scan_token(SAVEPOINT)) return true;
+    if (jj_3R_84()) return true;
     return false;
   }
 
@@ -29164,16 +29047,16 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_102() {
-    if (jj_scan_token(COMMIT)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_133()) jj_scanpos = xsp;
+  final private boolean jj_3_455() {
+    if (jj_3R_219()) return true;
     return false;
   }
 
-  final private boolean jj_3_455() {
-    if (jj_3R_219()) return true;
+  final private boolean jj_3R_103() {
+    if (jj_scan_token(ROLLBACK)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_134()) jj_scanpos = xsp;
     return false;
   }
 
@@ -29192,9 +29075,11 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_99() {
-    if (jj_scan_token(KILL)) return true;
-    if (jj_scan_token(QUERY)) return true;
+  final private boolean jj_3R_102() {
+    if (jj_scan_token(COMMIT)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_133()) jj_scanpos = xsp;
     return false;
   }
 
@@ -29204,8 +29089,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_132() {
-    if (jj_scan_token(ASYNC)) return true;
+  final private boolean jj_3R_99() {
+    if (jj_scan_token(KILL)) return true;
+    if (jj_scan_token(QUERY)) return true;
     return false;
   }
 
@@ -29219,12 +29105,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_98() {
-    if (jj_scan_token(KILL)) return true;
-    if (jj_scan_token(COMPUTE)) return true;
-    return false;
-  }
-
   final private boolean jj_3_451() {
     if (jj_scan_token(IMMEDIATELY)) return true;
     if (jj_scan_token(SUCCEEDS)) return true;
@@ -29242,6 +29122,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_132() {
+    if (jj_scan_token(ASYNC)) return true;
+    return false;
+  }
+
   final private boolean jj_3_449() {
     if (jj_scan_token(IMMEDIATELY)) return true;
     if (jj_scan_token(PRECEDES)) return true;
@@ -29253,9 +29138,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_96() {
+  final private boolean jj_3R_98() {
     if (jj_scan_token(KILL)) return true;
-    if (jj_scan_token(SERVICE)) return true;
+    if (jj_scan_token(COMPUTE)) return true;
     return false;
   }
 
@@ -29290,9 +29175,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_97() {
+  final private boolean jj_3R_96() {
     if (jj_scan_token(KILL)) return true;
-    if (jj_scan_token(TRANSACTION)) return true;
+    if (jj_scan_token(SERVICE)) return true;
     return false;
   }
 
@@ -29302,15 +29187,21 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_95() {
+  final private boolean jj_3R_408() {
+    if (jj_3R_415()) return true;
+    if (jj_scan_token(LAMBDA)) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_97() {
     if (jj_scan_token(KILL)) return true;
-    if (jj_scan_token(CONTINUOUS)) return true;
+    if (jj_scan_token(TRANSACTION)) return true;
     return false;
   }
 
-  final private boolean jj_3R_408() {
-    if (jj_3R_415()) return true;
-    if (jj_scan_token(LAMBDA)) return true;
+  final private boolean jj_3R_95() {
+    if (jj_scan_token(KILL)) return true;
+    if (jj_scan_token(CONTINUOUS)) return true;
     return false;
   }
 
@@ -29344,32 +29235,15 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_131() {
-    if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true;
-    return false;
-  }
-
   final private boolean jj_3R_218() {
     return false;
   }
 
-  final private boolean jj_3_130() {
-    if (jj_scan_token(MINUS)) return true;
-    if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true;
-    return false;
-  }
-
   final private boolean jj_3_440() {
     if (jj_scan_token(ROW)) return true;
     return false;
   }
 
-  final private boolean jj_3_129() {
-    if (jj_scan_token(PLUS)) return true;
-    if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true;
-    return false;
-  }
-
   final private boolean jj_3_445() {
     Token xsp;
     xsp = jj_scanpos;
@@ -29381,15 +29255,26 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_131() {
+    if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_130() {
+    if (jj_scan_token(MINUS)) return true;
+    if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true;
+    return false;
+  }
+
   final private boolean jj_3R_297() {
     if (jj_scan_token(TIMESTAMPADD)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  final private boolean jj_3R_241() {
-    if (jj_scan_token(USER)) return true;
-    if (jj_3R_84()) return true;
+  final private boolean jj_3_129() {
+    if (jj_scan_token(PLUS)) return true;
+    if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true;
     return false;
   }
 
@@ -29425,9 +29310,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_93() {
-    if (jj_scan_token(ALTER)) return true;
+  final private boolean jj_3R_241() {
     if (jj_scan_token(USER)) return true;
+    if (jj_3R_84()) return true;
     return false;
   }
 
@@ -29437,14 +29322,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_237() {
+  final private boolean jj_3R_93() {
+    if (jj_scan_token(ALTER)) return true;
     if (jj_scan_token(USER)) return true;
-    if (jj_3R_84()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_124() {
-    if (jj_scan_token(COLUMN)) return true;
     return false;
   }
 
@@ -29464,11 +29344,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_123() {
-    if (jj_scan_token(COLUMN)) return true;
-    return false;
-  }
-
   final private boolean jj_3_437() {
     if (jj_scan_token(EQ)) return true;
     return false;
@@ -29479,16 +29354,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_128() {
-    if (jj_scan_token(DROP)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_124()) jj_scanpos = xsp;
-    if (jj_3R_133()) return true;
-    if (jj_3R_134()) return true;
-    return false;
-  }
-
   final private boolean jj_3_436() {
     if (jj_scan_token(GE)) return true;
     return false;
@@ -29499,18 +29364,14 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_127() {
-    if (jj_scan_token(ADD)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_123()) jj_scanpos = xsp;
-    if (jj_3R_131()) return true;
-    if (jj_3R_132()) return true;
+  final private boolean jj_3_434() {
+    if (jj_scan_token(LE)) return true;
     return false;
   }
 
-  final private boolean jj_3_434() {
-    if (jj_scan_token(LE)) return true;
+  final private boolean jj_3R_237() {
+    if (jj_scan_token(USER)) return true;
+    if (jj_3R_84()) return true;
     return false;
   }
 
@@ -29539,8 +29400,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_126() {
-    if (jj_scan_token(NOLOGGING)) return true;
+  final private boolean jj_3_124() {
+    if (jj_scan_token(COLUMN)) return true;
     return false;
   }
 
@@ -29555,8 +29416,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_125() {
-    if (jj_scan_token(LOGGING)) return true;
+  final private boolean jj_3_123() {
+    if (jj_scan_token(COLUMN)) return true;
     return false;
   }
 
@@ -29564,9 +29425,13 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_92() {
-    if (jj_scan_token(ALTER)) return true;
-    if (jj_scan_token(TABLE)) return true;
+  final private boolean jj_3_128() {
+    if (jj_scan_token(DROP)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_124()) jj_scanpos = xsp;
+    if (jj_3R_133()) return true;
+    if (jj_3R_134()) return true;
     return false;
   }
 
@@ -29575,29 +29440,35 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_423() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_84()) return true;
+  final private boolean jj_3_127() {
+    if (jj_scan_token(ADD)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_123()) jj_scanpos = xsp;
+    if (jj_3R_131()) return true;
+    if (jj_3R_132()) return true;
     return false;
   }
 
-  final private boolean jj_3_122() {
-    if (jj_3R_130()) return true;
+  final private boolean jj_3_126() {
+    if (jj_scan_token(NOLOGGING)) return true;
     return false;
   }
 
-  final private boolean jj_3R_132() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_121()) {
-    jj_scanpos = xsp;
-    if (jj_3_122()) return true;
-    }
+  final private boolean jj_3_125() {
+    if (jj_scan_token(LOGGING)) return true;
     return false;
   }
 
-  final private boolean jj_3_121() {
-    if (jj_3R_129()) return true;
+  final private boolean jj_3_423() {
+    if (jj_scan_token(DOT)) return true;
+    if (jj_3R_84()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_92() {
+    if (jj_scan_token(ALTER)) return true;
+    if (jj_scan_token(TABLE)) return true;
     return false;
   }
 
@@ -29655,9 +29526,23 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_120() {
-    if (jj_scan_token(NOT)) return true;
-    if (jj_scan_token(NULL)) return true;
+  final private boolean jj_3_122() {
+    if (jj_3R_130()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_132() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_121()) {
+    jj_scanpos = xsp;
+    if (jj_3_122()) return true;
+    }
+    return false;
+  }
+
+  final private boolean jj_3_121() {
+    if (jj_3R_129()) return true;
     return false;
   }
 
@@ -29672,12 +29557,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_129() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_122()) return true;
-    return false;
-  }
-
   final private boolean jj_3_427() {
     if (jj_3R_212()) return true;
     return false;
@@ -29700,9 +29579,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_119() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_129()) return true;
+  final private boolean jj_3_120() {
+    if (jj_scan_token(NOT)) return true;
+    if (jj_scan_token(NULL)) return true;
     return false;
   }
 
@@ -29711,6 +29590,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_129() {
+    if (jj_3R_84()) return true;
+    if (jj_3R_122()) return true;
+    return false;
+  }
+
   final private boolean jj_3_416() {
     if (jj_scan_token(TILDE)) return true;
     Token xsp;
@@ -29736,12 +29621,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_130() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_129()) return true;
-    return false;
-  }
-
   final private boolean jj_3_410() {
     if (jj_scan_token(RLIKE)) return true;
     return false;
@@ -29773,6 +29652,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_119() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_129()) return true;
+    return false;
+  }
+
   final private boolean jj_3_404() {
     if (jj_scan_token(ILIKE)) return true;
     return false;
@@ -29783,6 +29668,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_130() {
+    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_129()) return true;
+    return false;
+  }
+
   final private boolean jj_3_407() {
     if (jj_scan_token(NOT)) return true;
     Token xsp;
@@ -29811,12 +29702,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_212() {
-    if (jj_scan_token(INFIX_CAST)) return true;
-    if (jj_3R_122()) return true;
-    return false;
-  }
-
   final private boolean jj_3_414() {
     Token xsp;
     xsp = jj_scanpos;
@@ -29852,13 +29737,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_240() {
-    if (jj_scan_token(INDEX)) return true;
-    if (jj_3R_133()) return true;
-    if (jj_3R_152()) return true;
-    return false;
-  }
-
   final private boolean jj_3_426() {
     Token xsp;
     xsp = jj_scanpos;
@@ -29878,6 +29756,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_212() {
+    if (jj_scan_token(INFIX_CAST)) return true;
+    if (jj_3R_122()) return true;
+    return false;
+  }
+
   final private boolean jj_3_400() {
     Token xsp;
     xsp = jj_scanpos;
@@ -29893,13 +29777,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_239() {
-    if (jj_scan_token(TABLE)) return true;
-    if (jj_3R_133()) return true;
-    if (jj_3R_152()) return true;
-    return false;
-  }
-
   final private boolean jj_3_915() {
     if (jj_3R_321()) return true;
     return false;
@@ -29910,6 +29787,13 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_240() {
+    if (jj_scan_token(INDEX)) return true;
+    if (jj_3R_133()) return true;
+    if (jj_3R_152()) return true;
+    return false;
+  }
+
   final private boolean jj_3_402() {
     if (jj_scan_token(BETWEEN)) return true;
     Token xsp;
@@ -29933,38 +29817,25 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_363() {
-    return false;
-  }
-
   final private boolean jj_3R_309() {
     if (jj_scan_token(JSON_OBJECTAGG)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  final private boolean jj_3R_133() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_118()) {
-    jj_scanpos = xsp;
-    if (jj_3R_363()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3_118() {
-    if (jj_scan_token(IF)) return true;
-    if (jj_scan_token(EXISTS)) return true;
-    return false;
-  }
-
   final private boolean jj_3_401() {
     if (jj_scan_token(NOT)) return true;
     if (jj_scan_token(BETWEEN)) return true;
     return false;
   }
 
+  final private boolean jj_3R_239() {
+    if (jj_scan_token(TABLE)) return true;
+    if (jj_3R_133()) return true;
+    if (jj_3R_152()) return true;
+    return false;
+  }
+
   final private boolean jj_3_425() {
     Token xsp;
     xsp = jj_scanpos;
@@ -29976,30 +29847,28 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_117() {
-    if (jj_scan_token(INLINE_SIZE)) return true;
-    if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true;
+  final private boolean jj_3R_363() {
     return false;
   }
 
-  final private boolean jj_3_914() {
-    if (jj_3R_321()) return true;
+  final private boolean jj_3R_133() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_118()) {
+    jj_scanpos = xsp;
+    if (jj_3R_363()) return true;
+    }
     return false;
   }
 
-  final private boolean jj_3_116() {
-    if (jj_scan_token(PARALLEL)) return true;
-    if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true;
+  final private boolean jj_3_118() {
+    if (jj_scan_token(IF)) return true;
+    if (jj_scan_token(EXISTS)) return true;
     return false;
   }
 
-  final private boolean jj_3_115() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_116()) {
-    jj_scanpos = xsp;
-    if (jj_3_117()) return true;
-    }
+  final private boolean jj_3_914() {
+    if (jj_3R_321()) return true;
     return false;
   }
 
@@ -30019,8 +29888,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_114() {
-    if (jj_3R_84()) return true;
+  final private boolean jj_3_117() {
+    if (jj_scan_token(INLINE_SIZE)) return true;
+    if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true;
     return false;
   }
 
@@ -30034,6 +29904,22 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_116() {
+    if (jj_scan_token(PARALLEL)) return true;
+    if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_115() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_116()) {
+    jj_scanpos = xsp;
+    if (jj_3_117()) return true;
+    }
+    return false;
+  }
+
   final private boolean jj_3_394() {
     if (jj_3R_208()) return true;
     Token xsp;
@@ -30048,16 +29934,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_236() {
-    if (jj_scan_token(INDEX)) return true;
-    if (jj_3R_131()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_114()) jj_scanpos = xsp;
-    if (jj_scan_token(ON)) return true;
-    return false;
-  }
-
   final private boolean jj_3R_308() {
     if (jj_scan_token(JSON_OBJECT)) return true;
     if (jj_scan_token(LPAREN)) return true;
@@ -30075,6 +29951,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_114() {
+    if (jj_3R_84()) return true;
+    return false;
+  }
+
   final private boolean jj_3_424() {
     Token xsp;
     xsp = jj_scanpos;
@@ -30089,9 +29970,13 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_113() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_128()) return true;
+  final private boolean jj_3R_236() {
+    if (jj_scan_token(INDEX)) return true;
+    if (jj_3R_131()) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_114()) jj_scanpos = xsp;
+    if (jj_scan_token(ON)) return true;
     return false;
   }
 
@@ -30152,6 +30037,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_113() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_128()) return true;
+    return false;
+  }
+
   final private boolean jj_3R_211() {
     if (jj_3R_210()) return true;
     Token xsp;
@@ -30168,26 +30059,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_111() {
-    if (jj_scan_token(DESC)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_112() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_110()) {
-    jj_scanpos = xsp;
-    if (jj_3_111()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3_110() {
-    if (jj_scan_token(ASC)) return true;
-    return false;
-  }
-
   final private boolean jj_3_906() {
     if (jj_scan_token(KEY)) return true;
     if (jj_3R_319()) return true;
@@ -30199,11 +30070,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_128() {
-    if (jj_3R_84()) return true;
-    return false;
-  }
-
   final private boolean jj_3_907() {
     if (jj_scan_token(VALUE)) return true;
     return false;
@@ -30214,12 +30080,23 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_126() {
+  final private boolean jj_3_111() {
+    if (jj_scan_token(DESC)) return true;
     return false;
   }
 
-  final private boolean jj_3_107() {
-    if (jj_3R_124()) return true;
+  final private boolean jj_3_112() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_110()) {
+    jj_scanpos = xsp;
+    if (jj_3_111()) return true;
+    }
+    return false;
+  }
+
+  final private boolean jj_3_110() {
+    if (jj_scan_token(ASC)) return true;
     return false;
   }
 
@@ -30243,21 +30120,12 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_109() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_107()) {
-    jj_scanpos = xsp;
-    if (jj_3R_126()) return true;
-    }
-    if (jj_3R_127()) return true;
-    if (jj_scan_token(AS)) return true;
-    if (jj_3R_79()) return true;
+  final private boolean jj_3R_128() {
+    if (jj_3R_84()) return true;
     return false;
   }
 
-  final private boolean jj_3_108() {
-    if (jj_3R_125()) return true;
+  final private boolean jj_3R_126() {
     return false;
   }
 
@@ -30266,6 +30134,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_107() {
+    if (jj_3R_124()) return true;
+    return false;
+  }
+
   final private boolean jj_3_388() {
     if (jj_scan_token(DOT)) return true;
     if (jj_3R_207()) return true;
@@ -30283,10 +30156,21 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_235() {
-    if (jj_scan_token(TABLE)) return true;
-    if (jj_3R_131()) return true;
-    if (jj_3R_152()) return true;
+  final private boolean jj_3_109() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_107()) {
+    jj_scanpos = xsp;
+    if (jj_3R_126()) return true;
+    }
+    if (jj_3R_127()) return true;
+    if (jj_scan_token(AS)) return true;
+    if (jj_3R_79()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_108() {
+    if (jj_3R_125()) return true;
     return false;
   }
 
@@ -30314,9 +30198,10 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_106() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_123()) return true;
+  final private boolean jj_3R_235() {
+    if (jj_scan_token(TABLE)) return true;
+    if (jj_3R_131()) return true;
+    if (jj_3R_152()) return true;
     return false;
   }
 
@@ -30336,14 +30221,14 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_125() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_123()) return true;
+  final private boolean jj_3_903() {
+    if (jj_3R_315()) return true;
     return false;
   }
 
-  final private boolean jj_3_903() {
-    if (jj_3R_315()) return true;
+  final private boolean jj_3_106() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_123()) return true;
     return false;
   }
 
@@ -30363,18 +30248,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_103() {
-    if (jj_scan_token(CONSTRAINT)) return true;
-    if (jj_3R_84()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_105() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_103()) jj_scanpos = xsp;
-    if (jj_scan_token(PRIMARY)) return true;
-    if (jj_scan_token(KEY)) return true;
+  final private boolean jj_3R_125() {
+    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_123()) return true;
     return false;
   }
 
@@ -30398,12 +30274,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_102() {
-    if (jj_scan_token(PRIMARY)) return true;
-    if (jj_scan_token(KEY)) return true;
-    return false;
-  }
-
   final private boolean jj_3_386() {
     if (jj_3R_206()) return true;
     return false;
@@ -30414,6 +30284,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_103() {
+    if (jj_scan_token(CONSTRAINT)) return true;
+    if (jj_3R_84()) return true;
+    return false;
+  }
+
   final private boolean jj_3_902() {
     if (jj_scan_token(WITH)) return true;
     Token xsp;
@@ -30424,15 +30300,18 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_901() {
-    if (jj_scan_token(WITH)) return true;
-    if (jj_scan_token(CONDITIONAL)) return true;
+  final private boolean jj_3_105() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_103()) jj_scanpos = xsp;
+    if (jj_scan_token(PRIMARY)) return true;
+    if (jj_scan_token(KEY)) return true;
     return false;
   }
 
-  final private boolean jj_3_101() {
-    if (jj_scan_token(DEFAULT_)) return true;
-    if (jj_3R_119()) return true;
+  final private boolean jj_3_901() {
+    if (jj_scan_token(WITH)) return true;
+    if (jj_scan_token(CONDITIONAL)) return true;
     return false;
   }
 
@@ -30454,6 +30333,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_102() {
+    if (jj_scan_token(PRIMARY)) return true;
+    if (jj_scan_token(KEY)) return true;
+    return false;
+  }
+
   final private boolean jj_3_900() {
     if (jj_scan_token(WITHOUT)) return true;
     Token xsp;
@@ -30467,22 +30352,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_123() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_104()) {
-    jj_scanpos = xsp;
-    if (jj_3_105()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3_104() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_122()) return true;
-    return false;
-  }
-
   final private boolean jj_3_383() {
     if (jj_scan_token(RECURSIVE)) return true;
     return false;
@@ -30493,6 +30362,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_101() {
+    if (jj_scan_token(DEFAULT_)) return true;
+    if (jj_3R_119()) return true;
+    return false;
+  }
+
   final private boolean jj_3_384() {
     if (jj_scan_token(COMMA)) return true;
     if (jj_3R_205()) return true;
@@ -30513,15 +30388,25 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_893() {
-    if (jj_scan_token(EMPTY)) return true;
-    if (jj_scan_token(OBJECT)) return true;
+  final private boolean jj_3R_123() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_104()) {
+    jj_scanpos = xsp;
+    if (jj_3_105()) return true;
+    }
     return false;
   }
 
-  final private boolean jj_3R_121() {
-    if (jj_scan_token(INTERVAL)) return true;
-    if (jj_3R_215()) return true;
+  final private boolean jj_3_104() {
+    if (jj_3R_84()) return true;
+    if (jj_3R_122()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_893() {
+    if (jj_scan_token(EMPTY)) return true;
+    if (jj_scan_token(OBJECT)) return true;
     return false;
   }
 
@@ -30536,18 +30421,14 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_100() {
-    if (jj_3R_121()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_99() {
-    if (jj_3R_120()) return true;
+  final private boolean jj_3_890() {
+    if (jj_scan_token(ERROR)) return true;
     return false;
   }
 
-  final private boolean jj_3_890() {
-    if (jj_scan_token(ERROR)) return true;
+  final private boolean jj_3R_121() {
+    if (jj_scan_token(INTERVAL)) return true;
+    if (jj_3R_215()) return true;
     return false;
   }
 
@@ -30568,6 +30449,26 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_67() {
+    if (jj_3R_344()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_100() {
+    if (jj_3R_121()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_99() {
+    if (jj_3R_120()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_889() {
+    if (jj_3R_316()) return true;
+    return false;
+  }
+
   final private boolean jj_3R_122() {
     Token xsp;
     xsp = jj_scanpos;
@@ -30578,8 +30479,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_67() {
-    if (jj_3R_344()) return true;
+  final private boolean jj_3_888() {
+    if (jj_3R_315()) return true;
     return false;
   }
 
@@ -30593,8 +30494,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_889() {
-    if (jj_3R_316()) return true;
+  final private boolean jj_3R_306() {
+    if (jj_scan_token(JSON_VALUE)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
@@ -30604,19 +30506,18 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_888() {
-    if (jj_3R_315()) return true;
+  final private boolean jj_3_887() {
+    if (jj_scan_token(ERROR)) return true;
     return false;
   }
 
-  final private boolean jj_3R_306() {
-    if (jj_scan_token(JSON_VALUE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+  final private boolean jj_3_96() {
+    if (jj_scan_token(WRAP_VALUE)) return true;
     return false;
   }
 
-  final private boolean jj_3_96() {
-    if (jj_scan_token(WRAP_VALUE)) return true;
+  final private boolean jj_3_886() {
+    if (jj_scan_token(EMPTY)) return true;
     return false;
   }
 
@@ -30640,13 +30541,14 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_91() {
-    if (jj_scan_token(DATA_REGION)) return true;
+  final private boolean jj_3_885() {
+    if (jj_scan_token(DEFAULT_)) return true;
+    if (jj_3R_78()) return true;
     return false;
   }
 
-  final private boolean jj_3_887() {
-    if (jj_scan_token(ERROR)) return true;
+  final private boolean jj_3_91() {
+    if (jj_scan_token(DATA_REGION)) return true;
     return false;
   }
 
@@ -30655,13 +30557,23 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_884() {
+    if (jj_scan_token(NULL)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_382() {
+    if (jj_3R_67()) return true;
+    return false;
+  }
+
   final private boolean jj_3_89() {
     if (jj_scan_token(CACHE_GROUP)) return true;
     return false;
   }
 
-  final private boolean jj_3_886() {
-    if (jj_scan_token(EMPTY)) return true;
+  final private boolean jj_3_381() {
+    if (jj_3R_204()) return true;
     return false;
   }
 
@@ -30670,6 +30582,19 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_883() {
+    if (jj_scan_token(ERROR)) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_68() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_381()) jj_scanpos = xsp;
+    if (jj_3R_206()) return true;
+    return false;
+  }
+
   final private boolean jj_3_87() {
     if (jj_scan_token(ATOMICITY)) return true;
     return false;
@@ -30680,14 +30605,22 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_85() {
-    if (jj_scan_token(BACKUPS)) return true;
+  final private boolean jj_3R_316() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_883()) {
+    jj_scanpos = xsp;
+    if (jj_3_884()) {
+    jj_scanpos = xsp;
+    if (jj_3_885()) return true;
+    }
+    }
+    if (jj_scan_token(ON)) return true;
     return false;
   }
 
-  final private boolean jj_3_885() {
-    if (jj_scan_token(DEFAULT_)) return true;
-    if (jj_3R_78()) return true;
+  final private boolean jj_3_85() {
+    if (jj_scan_token(BACKUPS)) return true;
     return false;
   }
 
@@ -30745,58 +30678,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_884() {
-    if (jj_scan_token(NULL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_382() {
-    if (jj_3R_67()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_381() {
-    if (jj_3R_204()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_883() {
-    if (jj_scan_token(ERROR)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_68() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_381()) jj_scanpos = xsp;
-    if (jj_3R_206()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_82() {
-    if (jj_3R_118()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_316() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_883()) {
-    jj_scanpos = xsp;
-    if (jj_3_884()) {
-    jj_scanpos = xsp;
-    if (jj_3_885()) return true;
-    }
-    }
-    if (jj_scan_token(ON)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_81() {
-    if (jj_scan_token(QUOTED_IDENTIFIER)) return true;
-    return false;
-  }
-
   final private boolean jj_3_380() {
     if (jj_3R_67()) return true;
     return false;
@@ -30825,21 +30706,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_83() {
-    if (jj_scan_token(WITH)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_81()) {
-    jj_scanpos = xsp;
-    if (jj_3_82()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_127() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_83()) jj_scanpos = xsp;
+  final private boolean jj_3_82() {
+    if (jj_3R_118()) return true;
     return false;
   }
 
@@ -30849,28 +30717,31 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_362() {
+  final private boolean jj_3_81() {
+    if (jj_scan_token(QUOTED_IDENTIFIER)) return true;
     return false;
   }
 
-  final private boolean jj_3R_131() {
+  final private boolean jj_3_83() {
+    if (jj_scan_token(WITH)) return true;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3_79()) {
+    if (jj_3_81()) {
     jj_scanpos = xsp;
-    if (jj_3R_362()) return true;
+    if (jj_3_82()) return true;
     }
     return false;
   }
 
-  final private boolean jj_3_79() {
-    if (jj_scan_token(IF)) return true;
-    if (jj_scan_token(NOT)) return true;
+  final private boolean jj_3_881() {
+    if (jj_scan_token(ERROR)) return true;
     return false;
   }
 
-  final private boolean jj_3_881() {
-    if (jj_scan_token(ERROR)) return true;
+  final private boolean jj_3R_127() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_83()) jj_scanpos = xsp;
     return false;
   }
 
@@ -30905,12 +30776,43 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_362() {
+    return false;
+  }
+
+  final private boolean jj_3R_131() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_79()) {
+    jj_scanpos = xsp;
+    if (jj_3R_362()) return true;
+    }
+    return false;
+  }
+
+  final private boolean jj_3_79() {
+    if (jj_scan_token(IF)) return true;
+    if (jj_scan_token(NOT)) return true;
+    return false;
+  }
+
   final private boolean jj_3_876() {
     if (jj_scan_token(COMMA)) return true;
     if (jj_3R_81()) return true;
     return false;
   }
 
+  final private boolean jj_3_877() {
+    if (jj_scan_token(PASSING)) return true;
+    if (jj_3R_81()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_203() {
+    if (jj_3R_84()) return true;
+    return false;
+  }
+
   final private boolean jj_3_78() {
     if (jj_3R_117()) return true;
     return false;
@@ -30936,19 +30838,14 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_877() {
-    if (jj_scan_token(PASSING)) return true;
-    if (jj_3R_81()) return true;
-    return false;
-  }
-
   final private boolean jj_3_73() {
     if (jj_3R_112()) return true;
     return false;
   }
 
-  final private boolean jj_3R_203() {
-    if (jj_3R_84()) return true;
+  final private boolean jj_3_378() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_203()) return true;
     return false;
   }
 
@@ -30982,14 +30879,14 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_66() {
-    if (jj_3R_106()) return true;
+  final private boolean jj_3_875() {
+    if (jj_scan_token(FORMAT)) return true;
+    if (jj_3R_313()) return true;
     return false;
   }
 
-  final private boolean jj_3_378() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_203()) return true;
+  final private boolean jj_3_66() {
+    if (jj_3R_106()) return true;
     return false;
   }
 
@@ -31018,14 +30915,19 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_60() {
-    if (jj_3R_100()) return true;
+  final private boolean jj_3R_202() {
+    if (jj_3R_84()) return true;
     return false;
   }
 
-  final private boolean jj_3_875() {
-    if (jj_scan_token(FORMAT)) return true;
-    if (jj_3R_313()) return true;
+  final private boolean jj_3R_315() {
+    if (jj_scan_token(RETURNING)) return true;
+    if (jj_3R_120()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_60() {
+    if (jj_3R_100()) return true;
     return false;
   }
 
@@ -31044,11 +30946,22 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_377() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_202()) return true;
+    return false;
+  }
+
   final private boolean jj_3_56() {
     if (jj_3R_96()) return true;
     return false;
   }
 
+  final private boolean jj_3R_194() {
+    if (jj_3R_202()) return true;
+    return false;
+  }
+
   final private boolean jj_3_55() {
     if (jj_3R_95()) return true;
     return false;
@@ -31059,19 +30972,18 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_202() {
-    if (jj_3R_84()) return true;
+  final private boolean jj_3_873() {
+    if (jj_scan_token(UTF32)) return true;
     return false;
   }
 
-  final private boolean jj_3R_315() {
-    if (jj_scan_token(RETURNING)) return true;
-    if (jj_3R_120()) return true;
+  final private boolean jj_3_53() {
+    if (jj_3R_93()) return true;
     return false;
   }
 
-  final private boolean jj_3_53() {
-    if (jj_3R_93()) return true;
+  final private boolean jj_3_872() {
+    if (jj_scan_token(UTF16)) return true;
     return false;
   }
 
@@ -31080,6 +30992,17 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_871() {
+    if (jj_scan_token(UTF8)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_372() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_201()) return true;
+    return false;
+  }
+
   final private boolean jj_3R_91() {
     Token xsp;
     xsp = jj_scanpos;
@@ -31165,51 +31088,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_377() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_202()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_194() {
-    if (jj_3R_202()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_873() {
-    if (jj_scan_token(UTF32)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_872() {
-    if (jj_scan_token(UTF16)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_50() {
-    if (jj_3R_91()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_871() {
-    if (jj_scan_token(UTF8)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_372() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_201()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_49() {
-    if (jj_scan_token(SEMICOLON)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_50()) jj_scanpos = xsp;
-    return false;
-  }
-
   final private boolean jj_3_874() {
     if (jj_scan_token(ENCODING)) return true;
     Token xsp;
@@ -31235,13 +31113,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_51() {
+  final private boolean jj_3_50() {
     if (jj_3R_91()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_49()) { jj_scanpos = xsp; break; }
-    }
     return false;
   }
 
@@ -31256,6 +31129,14 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_49() {
+    if (jj_scan_token(SEMICOLON)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_50()) jj_scanpos = xsp;
+    return false;
+  }
+
   final private boolean jj_3_374() {
     if (jj_scan_token(LPAREN)) return true;
     if (jj_3R_201()) return true;
@@ -31298,14 +31179,18 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_90() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_scan_token(RPAREN)) return true;
+  final private boolean jj_3_866() {
+    if (jj_3R_308()) return true;
     return false;
   }
 
-  final private boolean jj_3_866() {
-    if (jj_3R_308()) return true;
+  final private boolean jj_3_51() {
+    if (jj_3R_91()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3_49()) { jj_scanpos = xsp; break; }
+    }
     return false;
   }
 
@@ -31348,6 +31233,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_90() {
+    if (jj_scan_token(LPAREN)) return true;
+    if (jj_scan_token(RPAREN)) return true;
+    return false;
+  }
+
   final private boolean jj_3_859() {
     if (jj_3R_301()) return true;
     return false;
@@ -31393,11 +31284,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_80() {
-    if (jj_scan_token(DEFAULT_)) return true;
-    return false;
-  }
-
   final private boolean jj_3_362() {
     if (jj_3R_198()) return true;
     return false;
@@ -31408,38 +31294,16 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_89() {
-    if (jj_3R_134()) return true;
-    return false;
-  }
-
   final private boolean jj_3_853() {
     if (jj_3R_295()) return true;
     return false;
   }
 
-  final private boolean jj_3_46() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_89()) {
-    jj_scanpos = xsp;
-    if (jj_3R_90()) return true;
-    }
-    if (jj_scan_token(LAMBDA)) return true;
-    return false;
-  }
-
   final private boolean jj_3_852() {
     if (jj_3R_294()) return true;
     return false;
   }
 
-  final private boolean jj_3R_86() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
   final private boolean jj_3_363() {
     if (jj_scan_token(COMMA)) return true;
     Token xsp;
@@ -31456,21 +31320,11 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_48() {
-    if (jj_3R_87()) return true;
-    return false;
-  }
-
   final private boolean jj_3_850() {
     if (jj_3R_292()) return true;
     return false;
   }
 
-  final private boolean jj_3_47() {
-    if (jj_3R_81()) return true;
-    return false;
-  }
-
   final private boolean jj_3_364() {
     if (jj_3R_198()) return true;
     Token xsp;
@@ -31489,13 +31343,24 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_350() {
-    if (jj_3R_408()) return true;
+  final private boolean jj_3R_80() {
+    if (jj_scan_token(DEFAULT_)) return true;
     return false;
   }
 
-  final private boolean jj_3_45() {
-    if (jj_3R_80()) return true;
+  final private boolean jj_3R_89() {
+    if (jj_3R_134()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_46() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_89()) {
+    jj_scanpos = xsp;
+    if (jj_3R_90()) return true;
+    }
+    if (jj_scan_token(LAMBDA)) return true;
     return false;
   }
 
@@ -31513,13 +31378,14 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_349() {
+  final private boolean jj_3R_86() {
+    if (jj_scan_token(LPAREN)) return true;
+    if (jj_scan_token(RPAREN)) return true;
     return false;
   }
 
-  final private boolean jj_3_44() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true;
+  final private boolean jj_3_48() {
+    if (jj_3R_87()) return true;
     return false;
   }
 
@@ -31541,24 +31407,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_83() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_44()) {
-    jj_scanpos = xsp;
-    if (jj_3R_349()) return true;
-    }
-    xsp = jj_scanpos;
-    if (jj_3_45()) {
-    jj_scanpos = xsp;
-    if (jj_3R_350()) {
-    jj_scanpos = xsp;
-    if (jj_3_47()) {
-    jj_scanpos = xsp;
-    if (jj_3_48()) return true;
-    }
-    }
-    }
+  final private boolean jj_3_47() {
+    if (jj_3R_81()) return true;
     return false;
   }
 
@@ -31567,18 +31417,27 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_350() {
+    if (jj_3R_408()) return true;
+    return false;
+  }
+
   final private boolean jj_3_368() {
     if (jj_scan_token(PLUS)) return true;
     return false;
   }
 
+  final private boolean jj_3_45() {
+    if (jj_3R_80()) return true;
+    return false;
+  }
+
   final private boolean jj_3_834() {
     if (jj_scan_token(TRAILING)) return true;
     return false;
   }
 
-  final private boolean jj_3R_85() {
-    if (jj_3R_134()) return true;
+  final private boolean jj_3R_349() {
     return false;
   }
 
@@ -31587,14 +31446,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_41() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_85()) {
-    jj_scanpos = xsp;
-    if (jj_3R_86()) return true;
-    }
-    if (jj_scan_token(LAMBDA)) return true;
+  final private boolean jj_3_44() {
+    if (jj_3R_84()) return true;
+    if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true;
     return false;
   }
 
@@ -31603,11 +31457,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_43() {
-    if (jj_3R_88()) return true;
-    return false;
-  }
-
   final private boolean jj_3R_381() {
     Token xsp;
     xsp = jj_scanpos;
@@ -31624,13 +31473,24 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_42() {
-    if (jj_3R_87()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_367() {
-    if (jj_3R_408()) return true;
+  final private boolean jj_3R_83() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_44()) {
+    jj_scanpos = xsp;
+    if (jj_3R_349()) return true;
+    }
+    xsp = jj_scanpos;
+    if (jj_3_45()) {
+    jj_scanpos = xsp;
+    if (jj_3R_350()) {
+    jj_scanpos = xsp;
+    if (jj_3_47()) {
+    jj_scanpos = xsp;
+    if (jj_3_48()) return true;
+    }
+    }
+    }
     return false;
   }
 
@@ -31645,11 +31505,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_40() {
-    if (jj_3R_80()) return true;
-    return false;
-  }
-
   final private boolean jj_3_838() {
     Token xsp;
     xsp = jj_scanpos;
@@ -31666,13 +31521,24 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_366() {
+  final private boolean jj_3R_85() {
+    if (jj_3R_134()) return true;
     return false;
   }
 
-  final private boolean jj_3_39() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true;
+  final private boolean jj_3_41() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_85()) {
+    jj_scanpos = xsp;
+    if (jj_3R_86()) return true;
+    }
+    if (jj_scan_token(LAMBDA)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_43() {
+    if (jj_3R_88()) return true;
     return false;
   }
 
@@ -31686,29 +31552,13 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_154() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_39()) {
-    jj_scanpos = xsp;
-    if (jj_3R_366()) return true;
-    }
-    xsp = jj_scanpos;
-    if (jj_3_40()) {
-    jj_scanpos = xsp;
-    if (jj_3R_367()) {
-    jj_scanpos = xsp;
-    if (jj_3_42()) {
-    jj_scanpos = xsp;
-    if (jj_3_43()) return true;
-    }
-    }
-    }
+  final private boolean jj_3_1804() {
+    if (jj_scan_token(WEDNESDAY)) return true;
     return false;
   }
 
-  final private boolean jj_3_1804() {
-    if (jj_scan_token(WEDNESDAY)) return true;
+  final private boolean jj_3_42() {
+    if (jj_3R_87()) return true;
     return false;
   }
 
@@ -31722,6 +31572,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_367() {
+    if (jj_3R_408()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1801() {
     if (jj_scan_token(VERSIONING)) return true;
     return false;
@@ -31748,6 +31603,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_40() {
+    if (jj_3R_80()) return true;
+    return false;
+  }
+
   final private boolean jj_3_361() {
     if (jj_3R_197()) return true;
     return false;
@@ -31779,6 +31639,10 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_366() {
+    return false;
+  }
+
   final private boolean jj_3_1796() {
     if (jj_scan_token(TRY_CAST)) return true;
     return false;
@@ -31789,6 +31653,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_39() {
+    if (jj_3R_84()) return true;
+    if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true;
+    return false;
+  }
+
   final private boolean jj_3_1794() {
     if (jj_scan_token(TRANSLATION)) return true;
     return false;
@@ -31824,6 +31694,27 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_154() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_39()) {
+    jj_scanpos = xsp;
+    if (jj_3R_366()) return true;
+    }
+    xsp = jj_scanpos;
+    if (jj_3_40()) {
+    jj_scanpos = xsp;
+    if (jj_3R_367()) {
+    jj_scanpos = xsp;
+    if (jj_3_42()) {
+    jj_scanpos = xsp;
+    if (jj_3_43()) return true;
+    }
+    }
+    }
+    return false;
+  }
+
   final private boolean jj_3_1790() {
     if (jj_scan_token(SUM)) return true;
     return false;
@@ -31912,36 +31803,16 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_38() {
-    if (jj_scan_token(ALL)) return true;
-    return false;
-  }
-
   final private boolean jj_3_1778() {
     if (jj_scan_token(ROLLUP)) return true;
     return false;
   }
 
-  final private boolean jj_3R_82() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_37()) {
-    jj_scanpos = xsp;
-    if (jj_3_38()) return true;
-    }
-    return false;
-  }
-
   final private boolean jj_3_1777() {
     if (jj_scan_token(RETURNS)) return true;
     return false;
   }
 
-  final private boolean jj_3_37() {
-    if (jj_scan_token(DISTINCT)) return true;
-    return false;
-  }
-
   final private boolean jj_3_846() {
     if (jj_scan_token(FLOOR)) return true;
     if (jj_3R_291()) return true;
@@ -32031,9 +31902,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_36() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_83()) return true;
+  final private boolean jj_3_38() {
+    if (jj_scan_token(ALL)) return true;
     return false;
   }
 
@@ -32052,17 +31922,28 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_82() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_37()) {
+    jj_scanpos = xsp;
+    if (jj_3_38()) return true;
+    }
+    return false;
+  }
+
   final private boolean jj_3_1763() {
     if (jj_scan_token(OVERLAPS)) return true;
     return false;
   }
 
-  final private boolean jj_3_1762() {
-    if (jj_scan_token(ORDINAL)) return true;
+  final private boolean jj_3_37() {
+    if (jj_scan_token(DISTINCT)) return true;
     return false;
   }
 
-  final private boolean jj_3R_385() {
+  final private boolean jj_3_1762() {
+    if (jj_scan_token(ORDINAL)) return true;
     return false;
   }
 
@@ -32086,11 +31967,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_35() {
-    if (jj_3R_82()) return true;
-    return false;
-  }
-
   final private boolean jj_3_823() {
     if (jj_scan_token(USING)) return true;
     if (jj_3R_84()) return true;
@@ -32127,17 +32003,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_220() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_35()) {
-    jj_scanpos = xsp;
-    if (jj_3R_385()) return true;
-    }
-    return false;
-  }
-
   final private boolean jj_3_1753() {
     if (jj_scan_token(MIN)) return true;
     return false;
@@ -32164,6 +32029,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_36() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_83()) return true;
+    return false;
+  }
+
   final private boolean jj_3_844() {
     if (jj_scan_token(TRANSLATE)) return true;
     if (jj_scan_token(LPAREN)) return true;
@@ -32190,6 +32061,10 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_385() {
+    return false;
+  }
+
   final private boolean jj_3_1747() {
     if (jj_scan_token(LARGE)) return true;
     return false;
@@ -32216,6 +32091,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_35() {
+    if (jj_3R_82()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1744() {
     if (jj_scan_token(JSON_ARRAYAGG)) return true;
     return false;
@@ -32252,6 +32132,17 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_220() {
+    if (jj_scan_token(LPAREN)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_35()) {
+    jj_scanpos = xsp;
+    if (jj_3R_385()) return true;
+    }
+    return false;
+  }
+
   final private boolean jj_3_1739() {
     if (jj_scan_token(GRANT)) return true;
     return false;
@@ -32262,11 +32153,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_401() {
-    if (jj_3R_220()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1737() {
     if (jj_scan_token(FRAME_ROW)) return true;
     return false;
@@ -32367,11 +32253,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_34() {
-    if (jj_3R_80()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1726() {
     if (jj_scan_token(DEC)) return true;
     return false;
@@ -32382,11 +32263,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_33() {
-    if (jj_3R_81()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1724() {
     if (jj_scan_token(CURSOR)) return true;
     return false;
@@ -32398,6 +32274,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_401() {
+    if (jj_3R_220()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1723() {
     if (jj_scan_token(CURRENT_ROLE)) return true;
     return false;
@@ -32460,17 +32341,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_32() {
-    if (jj_scan_token(COMMA)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_33()) {
-    jj_scanpos = xsp;
-    if (jj_3_34()) return true;
-    }
-    return false;
-  }
-
   final private boolean jj_3R_192() {
     Token xsp;
     xsp = jj_scanpos;
@@ -32489,13 +32359,13 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_1712() {
-    if (jj_scan_token(CALL)) return true;
+  final private boolean jj_3_34() {
+    if (jj_3R_80()) return true;
     return false;
   }
 
-  final private boolean jj_3_31() {
-    if (jj_3R_80()) return true;
+  final private boolean jj_3_1712() {
+    if (jj_scan_token(CALL)) return true;
     return false;
   }
 
@@ -32515,13 +32385,13 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_1710() {
-    if (jj_scan_token(BEGIN_PARTITION)) return true;
+  final private boolean jj_3_33() {
+    if (jj_3R_81()) return true;
     return false;
   }
 
-  final private boolean jj_3_30() {
-    if (jj_3R_79()) return true;
+  final private boolean jj_3_1710() {
+    if (jj_scan_token(BEGIN_PARTITION)) return true;
     return false;
   }
 
@@ -32570,6 +32440,17 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_32() {
+    if (jj_scan_token(COMMA)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_33()) {
+    jj_scanpos = xsp;
+    if (jj_3_34()) return true;
+    }
+    return false;
+  }
+
   final private boolean jj_3_1700() {
     if (jj_scan_token(PARALLEL)) return true;
     return false;
@@ -32597,6 +32478,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_31() {
+    if (jj_3R_80()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1697() {
     if (jj_scan_token(ATOMICITY)) return true;
     return false;
@@ -32613,6 +32499,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_30() {
+    if (jj_3R_79()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1695() {
     if (jj_scan_token(XML)) return true;
     return false;
@@ -32639,17 +32530,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_183() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_30()) {
-    jj_scanpos = xsp;
-    if (jj_3_31()) return true;
-    }
-    return false;
-  }
-
   final private boolean jj_3_1691() {
     if (jj_scan_token(USER_DEFINED_TYPE_NAME)) return true;
     return false;
@@ -32749,6 +32629,17 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_183() {
+    if (jj_scan_token(LPAREN)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_30()) {
+    jj_scanpos = xsp;
+    if (jj_3_31()) return true;
+    }
+    return false;
+  }
+
   final private boolean jj_3_1677() {
     if (jj_scan_token(SQL_TSI_SECOND)) return true;
     return false;
@@ -32824,12 +32715,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_29() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_78()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1669() {
     if (jj_scan_token(SQL_INTERVAL_MINUTE_TO_SECOND)) return true;
     return false;
@@ -32940,6 +32825,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_29() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_78()) return true;
+    return false;
+  }
+
   final private boolean jj_3R_223() {
     Token xsp;
     xsp = jj_scanpos;
@@ -33068,12 +32959,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_173() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_79()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1650() {
     if (jj_scan_token(RESTART)) return true;
     return false;
@@ -33150,6 +33035,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_173() {
+    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_79()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1636() {
     if (jj_scan_token(NORMALIZED)) return true;
     return false;
@@ -33415,12 +33306,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_172() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_374()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1596() {
     if (jj_scan_token(COLLATION_NAME)) return true;
     return false;
@@ -33528,13 +33413,9 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_28() {
-    if (jj_3R_77()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_27() {
-    if (jj_3R_76()) return true;
+  final private boolean jj_3R_172() {
+    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_374()) return true;
     return false;
   }
 
@@ -34209,24 +34090,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_206() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_26()) {
-    jj_scanpos = xsp;
-    if (jj_3_27()) {
-    jj_scanpos = xsp;
-    if (jj_3_28()) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3_26() {
-    if (jj_3R_75()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1584() {
     if (jj_scan_token(FRIDAY)) return true;
     return false;
@@ -34277,6 +34140,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_28() {
+    if (jj_3R_77()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1578() {
     if (jj_scan_token(VALUE_OF)) return true;
     return false;
@@ -34287,8 +34155,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_25() {
-    if (jj_scan_token(ALL)) return true;
+  final private boolean jj_3_27() {
+    if (jj_3R_76()) return true;
     return false;
   }
 
@@ -34302,11 +34170,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_24() {
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
   final private boolean jj_3R_189() {
     if (jj_3R_162()) return true;
     Token xsp;
@@ -34340,11 +34203,29 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_206() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_26()) {
+    jj_scanpos = xsp;
+    if (jj_3_27()) {
+    jj_scanpos = xsp;
+    if (jj_3_28()) return true;
+    }
+    }
+    return false;
+  }
+
   final private boolean jj_3_1571() {
     if (jj_scan_token(TIME)) return true;
     return false;
   }
 
+  final private boolean jj_3_26() {
+    if (jj_3R_75()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1570() {
     if (jj_scan_token(SYSTEM_TIME)) return true;
     return false;
@@ -34355,11 +34236,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_22() {
-    if (jj_scan_token(ALL)) return true;
-    return false;
-  }
-
   final private boolean jj_3_1568() {
     if (jj_scan_token(SUBSET)) return true;
     return false;
@@ -34398,11 +34274,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_21() {
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1564() {
     if (jj_scan_token(SPECIFICTYPE)) return true;
     return false;
@@ -34419,6 +34290,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_25() {
+    if (jj_scan_token(ALL)) return true;
+    return false;
+  }
+
   final private boolean jj_3_337() {
     if (jj_scan_token(AS)) return true;
     return false;
@@ -34434,6 +34310,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_24() {
+    if (jj_3R_74()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1560() {
     if (jj_scan_token(SCOPE)) return true;
     return false;
@@ -34454,17 +34335,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_23() {
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(COMMA)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_18() {
-    if (jj_scan_token(NEXT)) return true;
-    return false;
-  }
-
   final private boolean jj_3_792() {
     if (jj_scan_token(CHAR)) return true;
     return false;
@@ -34480,6 +34350,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_22() {
+    if (jj_scan_token(ALL)) return true;
+    return false;
+  }
+
   final private boolean jj_3_334() {
     if (jj_scan_token(COMMA)) return true;
     if (jj_3R_188()) return true;
@@ -34517,21 +34392,12 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_289() {
+  final private boolean jj_3_21() {
+    if (jj_3R_74()) return true;
     return false;
   }
 
-  final private boolean jj_3R_72() {
-    if (jj_scan_token(LIMIT)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_23()) {
-    jj_scanpos = xsp;
-    if (jj_3_24()) {
-    jj_scanpos = xsp;
-    if (jj_3_25()) return true;
-    }
-    }
+  final private boolean jj_3R_289() {
     return false;
   }
 
@@ -34555,11 +34421,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_20() {
-    if (jj_scan_token(ROWS)) return true;
-    return false;
-  }
-
   final private boolean jj_3_793() {
     if (jj_scan_token(VARYING)) return true;
     return false;
@@ -34570,11 +34431,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_17() {
-    if (jj_scan_token(FIRST)) return true;
-    return false;
-  }
-
   final private boolean jj_3_1546() {
     if (jj_scan_token(PORTION)) return true;
     return false;
@@ -34595,6 +34451,17 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_23() {
+    if (jj_3R_74()) return true;
+    if (jj_scan_token(COMMA)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_18() {
+    if (jj_scan_token(NEXT)) return true;
+    return false;
+  }
+
   final private boolean jj_3_791() {
     if (jj_scan_token(CHARACTER)) return true;
     return false;
@@ -34630,11 +34497,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_19() {
-    if (jj_scan_token(ROW)) return true;
-    return false;
-  }
-
   final private boolean jj_3_1539() {
     if (jj_scan_token(OCTET_LENGTH)) return true;
     return false;
@@ -34658,17 +34520,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_73() {
-    if (jj_scan_token(FETCH)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_17()) {
-    jj_scanpos = xsp;
-    if (jj_3_18()) return true;
-    }
-    return false;
-  }
-
   final private boolean jj_3_1537() {
     if (jj_scan_token(NORMALIZE)) return true;
     return false;
@@ -34679,6 +34530,20 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_72() {
+    if (jj_scan_token(LIMIT)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_23()) {
+    jj_scanpos = xsp;
+    if (jj_3_24()) {
+    jj_scanpos = xsp;
+    if (jj_3_25()) return true;
+    }
+    }
+    return false;
+  }
+
   final private boolean jj_3_1536() {
     if (jj_scan_token(NEXT)) return true;
     return false;
@@ -34689,13 +34554,13 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_15() {
-    if (jj_scan_token(ROWS)) return true;
+  final private boolean jj_3_1534() {
+    if (jj_scan_token(MONTH)) return true;
     return false;
   }
 
-  final private boolean jj_3_1534() {
-    if (jj_scan_token(MONTH)) return true;
+  final private boolean jj_3_20() {
+    if (jj_scan_token(ROWS)) return true;
     return false;
   }
 
@@ -34704,6 +34569,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_17() {
+    if (jj_scan_token(FIRST)) return true;
+    return false;
+  }
+
   final private boolean jj_3_1532() {
     if (jj_scan_token(METHOD)) return true;
     return false;
@@ -34740,23 +34610,13 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_14() {
-    if (jj_scan_token(ROW)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_16() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_14()) {
-    jj_scanpos = xsp;
-    if (jj_3_15()) return true;
-    }
+  final private boolean jj_3_1526() {
+    if (jj_scan_token(LANGUAGE)) return true;
     return false;
   }
 
-  final private boolean jj_3_1526() {
-    if (jj_scan_token(LANGUAGE)) return true;
+  final private boolean jj_3_19() {
+    if (jj_scan_token(ROW)) return true;
     return false;
   }
 
@@ -34770,9 +34630,14 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_71() {
-    if (jj_scan_token(OFFSET)) return true;
-    if (jj_3R_74()) return true;
+  final private boolean jj_3R_73() {
+    if (jj_scan_token(FETCH)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_17()) {
+    jj_scanpos = xsp;
+    if (jj_3_18()) return true;
+    }
     return false;
   }
 
@@ -34791,6 +34656,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_15() {
+    if (jj_scan_token(ROWS)) return true;
+    return false;
+  }
+
   final private boolean jj_3_1520() {
     if (jj_scan_token(IDENTITY)) return true;
     return false;
@@ -34838,6 +34708,21 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_14() {
+    if (jj_scan_token(ROW)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_16() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_14()) {
+    jj_scanpos = xsp;
+    if (jj_3_15()) return true;
+    }
+    return false;
+  }
+
   final private boolean jj_3_1512() {
     if (jj_scan_token(ESCAPE)) return true;
     return false;
@@ -34853,6 +34738,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_71() {
+    if (jj_scan_token(OFFSET)) return true;
+    if (jj_3R_74()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1509() {
     if (jj_scan_token(DYNAMIC)) return true;
     return false;
@@ -34868,21 +34759,11 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_8() {
-    if (jj_3R_73()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1506() {
     if (jj_scan_token(DECLARE)) return true;
     return false;
   }
 
-  final private boolean jj_3_12() {
-    if (jj_3R_73()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1505() {
     if (jj_scan_token(DEALLOCATE)) return true;
     return false;
@@ -34926,21 +34807,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_7() {
-    if (jj_3R_72()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_9() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_7()) {
-    jj_scanpos = xsp;
-    if (jj_3_8()) return true;
-    }
-    return false;
-  }
-
   final private boolean jj_3_1499() {
     if (jj_scan_token(CORRESPONDING)) return true;
     return false;
@@ -34971,46 +34837,28 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_6() {
-    if (jj_3R_71()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_11() {
-    if (jj_3R_71()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1493() {
     if (jj_scan_token(CEILING)) return true;
     return false;
   }
 
-  final private boolean jj_3_1492() {
-    if (jj_scan_token(CARDINALITY)) return true;
+  final private boolean jj_3_8() {
+    if (jj_3R_73()) return true;
     return false;
   }
 
-  final private boolean jj_3_1491() {
-    if (jj_scan_token(BOOLEAN)) return true;
+  final private boolean jj_3_1492() {
+    if (jj_scan_token(CARDINALITY)) return true;
     return false;
   }
 
-  final private boolean jj_3_10() {
-    if (jj_3R_72()) return true;
+  final private boolean jj_3_12() {
+    if (jj_3R_73()) return true;
     return false;
   }
 
-  final private boolean jj_3_13() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_10()) {
-    jj_scanpos = xsp;
-    if (jj_3_11()) {
-    jj_scanpos = xsp;
-    if (jj_3_12()) return true;
-    }
-    }
+  final private boolean jj_3_1491() {
+    if (jj_scan_token(BOOLEAN)) return true;
     return false;
   }
 
@@ -35024,10 +34872,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_406() {
-    return false;
-  }
-
   final private boolean jj_3_1488() {
     if (jj_scan_token(AUTHORIZATION)) return true;
     return false;
@@ -35038,13 +34882,23 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_5() {
-    if (jj_3R_70()) return true;
+  final private boolean jj_3_1486() {
+    if (jj_scan_token(ARE)) return true;
     return false;
   }
 
-  final private boolean jj_3_1486() {
-    if (jj_scan_token(ARE)) return true;
+  final private boolean jj_3_7() {
+    if (jj_3R_72()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_9() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_7()) {
+    jj_scanpos = xsp;
+    if (jj_3_8()) return true;
+    }
     return false;
   }
 
@@ -35078,20 +34932,18 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_348() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_5()) {
-    jj_scanpos = xsp;
-    if (jj_3R_406()) return true;
-    }
-    xsp = jj_scanpos;
-    if (jj_3_13()) jj_scanpos = xsp;
+  final private boolean jj_3_1480() {
+    if (jj_scan_token(LOGGING)) return true;
     return false;
   }
 
-  final private boolean jj_3_1480() {
-    if (jj_scan_token(LOGGING)) return true;
+  final private boolean jj_3_6() {
+    if (jj_3R_71()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_11() {
+    if (jj_3R_71()) return true;
     return false;
   }
 
@@ -35115,6 +34967,24 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_10() {
+    if (jj_3R_72()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_13() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_10()) {
+    jj_scanpos = xsp;
+    if (jj_3_11()) {
+    jj_scanpos = xsp;
+    if (jj_3_12()) return true;
+    }
+    }
+    return false;
+  }
+
   final private boolean jj_3_1476() {
     if (jj_scan_token(AFFINITY_KEY)) return true;
     return false;
@@ -35125,6 +34995,10 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_406() {
+    return false;
+  }
+
   final private boolean jj_3_1474() {
     if (jj_scan_token(WRITE)) return true;
     return false;
@@ -35141,6 +35015,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_5() {
+    if (jj_3R_70()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1472() {
     if (jj_scan_token(VERSION)) return true;
     return false;
@@ -35176,6 +35055,18 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_348() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_5()) {
+    jj_scanpos = xsp;
+    if (jj_3R_406()) return true;
+    }
+    xsp = jj_scanpos;
+    if (jj_3_13()) jj_scanpos = xsp;
+    return false;
+  }
+
   final private boolean jj_3_1466() {
     if (jj_scan_token(TRIGGER_NAME)) return true;
     return false;
@@ -35192,12 +35083,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_79() {
-    if (jj_3R_347()) return true;
-    if (jj_3R_348()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1464() {
     if (jj_scan_token(TRANSACTIONS_ACTIVE)) return true;
     return false;
@@ -35324,6 +35209,12 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_79() {
+    if (jj_3R_347()) return true;
+    if (jj_3R_348()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1450() {
     if (jj_scan_token(SQL_LONGVARBINARY)) return true;
     return false;
@@ -35472,11 +35363,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_2() {
-    if (jj_3R_67()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1428() {
     if (jj_scan_token(RELATIVE)) return true;
     return false;
@@ -35487,11 +35373,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_1() {
-    if (jj_3R_66()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1426() {
     if (jj_scan_token(PRIOR)) return true;
     return false;
@@ -35507,20 +35388,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_4() {
-    if (jj_3R_69()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_1()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_2()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
   final private boolean jj_3_1423() {
     if (jj_scan_token(PASSTHROUGH)) return true;
     return false;
@@ -35557,11 +35424,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_3() {
-    if (jj_3R_68()) return true;
-    return false;
-  }
-
   final private boolean jj_3_1418() {
     if (jj_scan_token(ORDERING)) return true;
     return false;
@@ -35587,13 +35449,8 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_374() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_3()) {
-    jj_scanpos = xsp;
-    if (jj_3_4()) return true;
-    }
+  final private boolean jj_3_2() {
+    if (jj_3R_67()) return true;
     return false;
   }
 
@@ -35617,6 +35474,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_1() {
+    if (jj_3R_66()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1412() {
     if (jj_scan_token(MILLISECOND)) return true;
     return false;
@@ -35632,6 +35494,20 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_4() {
+    if (jj_3R_69()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3_1()) { jj_scanpos = xsp; break; }
+    }
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3_2()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
   final private boolean jj_3_1409() {
     if (jj_scan_token(M)) return true;
     return false;
@@ -35663,6 +35539,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_3() {
+    if (jj_3R_68()) return true;
+    return false;
+  }
+
   final private boolean jj_3_1404() {
     if (jj_scan_token(ISODOW)) return true;
     return false;
@@ -35693,6 +35574,16 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_374() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_3()) {
+    jj_scanpos = xsp;
+    if (jj_3_4()) return true;
+    }
+    return false;
+  }
+
   final private boolean jj_3_1400() {
     if (jj_scan_token(ILIKE)) return true;
     return false;
@@ -38700,11 +38591,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_291() {
-    if (jj_3R_400()) return true;
-    return false;
-  }
-
   final private boolean jj_3R_341() {
     Token xsp;
     xsp = jj_scanpos;
@@ -39391,13 +39277,13 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_357() {
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
+  final private boolean jj_3_1139() {
+    if (jj_3R_341()) return true;
     return false;
   }
 
-  final private boolean jj_3_1139() {
-    if (jj_3R_341()) return true;
+  final private boolean jj_3R_291() {
+    if (jj_3R_400()) return true;
     return false;
   }
 
@@ -39434,13 +39320,13 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_346() {
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
+  final private boolean jj_3_291() {
+    if (jj_scan_token(ROW)) return true;
     return false;
   }
 
-  final private boolean jj_3_291() {
-    if (jj_scan_token(ROW)) return true;
+  final private boolean jj_3R_357() {
+    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
     return false;
   }
 
@@ -39461,10 +39347,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_411() {
-    return false;
-  }
-
   final private boolean jj_3_292() {
     if (jj_scan_token(LPAREN)) return true;
     if (jj_scan_token(ROW)) return true;
@@ -39472,6 +39354,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_346() {
+    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
+    return false;
+  }
+
   final private boolean jj_3R_170() {
     if (jj_3R_275()) return true;
     Token xsp;
@@ -39495,8 +39382,7 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3R_175() {
-    if (jj_3R_375()) return true;
+  final private boolean jj_3R_411() {
     return false;
   }
 
@@ -39511,6 +39397,11 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3R_175() {
+    if (jj_3R_375()) return true;
+    return false;
+  }
+
   final private boolean jj_3_677() {
     if (jj_scan_token(DOT)) return true;
     if (jj_3R_274()) return true;
@@ -40051,6 +39942,128 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_642() {
+    if (jj_scan_token(HOUR)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_264() {
+    if (jj_scan_token(WITH)) return true;
+    if (jj_scan_token(ORDINALITY)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_641() {
+    if (jj_scan_token(MINUTE)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_640() {
+    if (jj_scan_token(SECOND)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_639() {
+    if (jj_scan_token(MILLISECOND)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_638() {
+    if (jj_scan_token(MICROSECOND)) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_270() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_637()) {
+    jj_scanpos = xsp;
+    if (jj_3_638()) {
+    jj_scanpos = xsp;
+    if (jj_3_639()) {
+    jj_scanpos = xsp;
+    if (jj_3_640()) {
+    jj_scanpos = xsp;
+    if (jj_3_641()) {
+    jj_scanpos = xsp;
+    if (jj_3_642()) {
+    jj_scanpos = xsp;
+    if (jj_3_643()) {
+    jj_scanpos = xsp;
+    if (jj_3_644()) {
+    jj_scanpos = xsp;
+    if (jj_3_645()) {
+    jj_scanpos = xsp;
+    if (jj_3_646()) {
+    jj_scanpos = xsp;
+    if (jj_3_647()) {
+    jj_scanpos = xsp;
+    if (jj_3_648()) {
+    jj_scanpos = xsp;
+    if (jj_3_649()) {
+    jj_scanpos = xsp;
+    if (jj_3_650()) {
+    jj_scanpos = xsp;
+    if (jj_3_651()) {
+    jj_scanpos = xsp;
+    if (jj_3_652()) {
+    jj_scanpos = xsp;
+    if (jj_3_653()) {
+    jj_scanpos = xsp;
+    if (jj_3_654()) {
+    jj_scanpos = xsp;
+    if (jj_3_655()) {
+    jj_scanpos = xsp;
+    if (jj_3_656()) {
+    jj_scanpos = xsp;
+    if (jj_3_657()) return true;
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    return false;
+  }
+
+  final private boolean jj_3_637() {
+    if (jj_scan_token(NANOSECOND)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_263() {
+    if (jj_scan_token(LATERAL)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_262() {
+    if (jj_3R_168()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_268() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_263()) jj_scanpos = xsp;
+    if (jj_scan_token(UNNEST)) return true;
+    if (jj_3R_173()) return true;
+    return false;
+  }
+
   public IgniteSqlParserImplTokenManager token_source;
   SimpleCharStream jj_input_stream;
   public Token token, jj_nt;
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/util/RelNodeUtils.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/util/RelNodeUtils.java
new file mode 100644
index 00000000000..95e58c0445e
--- /dev/null
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/util/RelNodeUtils.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.calcite.util;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.function.Supplier;
+import org.apache.ignite.internal.processors.query.IgniteSQLException;
+import org.jetbrains.annotations.Nullable;
+
+/** Utility class for rel nodes containing useful methods and constants. */
+public class RelNodeUtils {
+    /** Decimal of {@link Integer#MAX_VALUE} for FETCH/OFFSET bounding. */
+    public static final BigDecimal DECIMAL_INT_MAX = 
BigDecimal.valueOf(Integer.MAX_VALUE);
+
+    /**
+     * Returns the value for FETCH with checks on that value:
+     * <ul>
+     *     <li>Value must not be null.</li>
+     *     <li>Value must be a finite number if it's a floating point.</li>
+     *     <li>Value must be non-negative.</li>
+     *     <li>Value must be less than or equal to {@link 
Integer#MAX_VALUE}.</li>
+     * </ul>
+     * @param s Supplier of the value. If it is {@code null}, it will return 
{@code 0}.
+     * @param name Name of the value.
+     * @return Value for FETCH.
+     * @throws IgniteSQLException If any of the checks fails.
+     */
+    public static int resolveFetch(@Nullable Supplier<Number> s, String name) {
+        if (s == null)
+            return 0;
+
+        Number n = s.get();
+
+        if (n == null)
+            throw new IgniteSQLException(name + " must not be null");
+        else if (n instanceof Double || n instanceof Float) {
+            double v = n.doubleValue();
+
+            if (!Double.isFinite(v))
+                throw new IgniteSQLException(name + " must be an finite 
number");
+        }
+
+        BigDecimal v = new BigDecimal(n.toString()).setScale(0, 
RoundingMode.DOWN);
+
+        if (v.compareTo(BigDecimal.ZERO) < 0)
+            throw new IgniteSQLException(name + " must not be negative");
+        else if (v.compareTo(DECIMAL_INT_MAX) > 0)
+            throw new IgniteSQLException(name + " must not be greater than " + 
DECIMAL_INT_MAX);
+
+        return v.intValue();
+    }
+}
diff --git 
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java
 
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java
index 428d4d273d9..14a971a1794 100644
--- 
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java
+++ 
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java
@@ -93,26 +93,21 @@ public class LimitOffsetIntegrationTest extends 
AbstractBasicIntegrationTransact
 
     /** */
     @Test
-    public void testNestedLimitOffsetWithUnion() {
-        sql("INSERT into TEST_REPL VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 
'd')");
+    public void testNestedLimitOffsetWithUnion() throws Exception {
+        fillCache(cacheRepl, 4);
 
         assertQuery("(SELECT id FROM TEST_REPL WHERE id = 2) UNION ALL " +
             "SELECT id FROM (select id from (SELECT id FROM TEST_REPL OFFSET 
2) order by id OFFSET 1)"
-        ).returns(2).returns(4).check();
+        ).returns(2).returns(3).check();
     }
 
     /** Tests correctness of fetch / offset params. */
     @Test
     public void testInvalidLimitOffset() {
-        String bigInt = BigDecimal.valueOf(10000000000L).toString();
-
-        assertThrows("SELECT * FROM TEST_REPL OFFSET " + bigInt + " ROWS",
+        assertThrows("SELECT * FROM TEST_REPL OFFSET " + bigInt() + " ROWS",
             SqlValidatorException.class, "Illegal value of offset");
 
-        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST " + bigInt + " ROWS 
ONLY",
-            SqlValidatorException.class, "Illegal value of fetch / limit");
-
-        assertThrows("SELECT * FROM TEST_REPL LIMIT " + bigInt,
+        assertThrows("SELECT * FROM TEST_REPL LIMIT " + bigInt(),
             SqlValidatorException.class, "Illegal value of fetch / limit");
 
         assertThrows("SELECT * FROM TEST_REPL OFFSET -1 ROWS FETCH FIRST -1 
ROWS ONLY",
@@ -130,9 +125,6 @@ public class LimitOffsetIntegrationTest extends 
AbstractBasicIntegrationTransact
 
         assertThrows("SELECT * FROM TEST_REPL OFFSET ? ROWS",
             SqlValidatorException.class, "Illegal value of offset", -1);
-
-        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST ? ROWS ONLY",
-            SqlValidatorException.class, "Illegal value of fetch / limit", -1);
     }
 
     /**
@@ -186,6 +178,347 @@ public class LimitOffsetIntegrationTest extends 
AbstractBasicIntegrationTransact
         assertQuery("SELECT (SELECT id FROM TEST_PART ORDER BY id LIMIT 1 
OFFSET 10)").returns(NULL_RESULT).check();
     }
 
+    /** */
+    @Test
+    public void testInvalidFetch() {
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST " + bigInt() + " 
ROWS ONLY",
+            SqlValidatorException.class, "Illegal value of fetch / limit");
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST -1 ROWS ONLY",
+            IgniteSQLException.class, null);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (-2) ROWS ONLY",
+            SqlValidatorException.class, "Illegal value of fetch / limit");
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (2 - 3) ROWS ONLY",
+            IgniteSQLException.class, null);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (1 + 2 - 4) ROWS 
ONLY",
+            IgniteSQLException.class, null);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (10 - (50 - 20)) 
ROWS ONLY",
+            IgniteSQLException.class, null);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST ('abc') ROWS ONLY",
+            SqlValidatorException.class, "Illegal value of fetch / limit");
+
+        // Check with parameters.
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST ? ROWS ONLY",
+            SqlValidatorException.class, "Illegal value of fetch / limit", 
bigInt());
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST ? ROWS ONLY",
+            SqlValidatorException.class, "Illegal value of fetch / limit", -4);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY",
+            SqlValidatorException.class, "Illegal value of fetch / limit", -5);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY",
+            IgniteSQLException.class, null, NULL_RESULT);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY",
+            IgniteSQLException.class, null, "abc");
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY",
+            SqlValidatorException.class, "Illegal value of fetch / limit", 
Double.NaN);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY",
+            SqlValidatorException.class, "Illegal value of fetch / limit", 
Double.POSITIVE_INFINITY);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (1 + ? - 4) ROWS 
ONLY",
+            IgniteSQLException.class, null, 1);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (? - (50 - 20)) ROWS 
ONLY",
+            IgniteSQLException.class, null, 2);
+    }
+
+    /** */
+    @Test
+    public void testInvalidFetchWithScalarFunctionExpression() {
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST SQRT(4) ROWS ONLY",
+            IgniteSQLException.class, null);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) 
ROWS ONLY",
+            IgniteSQLException.class, null, NULL_RESULT);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) 
ROWS ONLY",
+            IgniteSQLException.class, null, Double.NaN);
+
+        assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) 
ROWS ONLY",
+            IgniteSQLException.class, null, Double.NEGATIVE_INFINITY);
+    }
+
+    /** */
+    @Test
+    public void testFetchExpression() throws Exception {
+        fillCache(cacheRepl, 5);
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1) ROWS 
ONLY")
+            .returns(0)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + 2) 
ROWS ONLY")
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + 5 - 
2) ROWS ONLY")
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .returns(3)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + (2 
- 1) + 1) ROWS ONLY")
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + (2 
- 1) + 1) ROWS ONLY")
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+
+        // With parameters.
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (?) ROWS 
ONLY")
+            .withParams(1)
+            .returns(0)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (?) ROWS 
ONLY")
+            .withParams(2)
+            .returns(0)
+            .returns(1)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + ?) 
ROWS ONLY")
+            .withParams(1)
+            .returns(0)
+            .returns(1)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + 1) 
ROWS ONLY")
+            .withParams(1)
+            .returns(0)
+            .returns(1)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + 1) 
ROWS ONLY")
+            .withParams(3)
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .returns(3)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + (3 
- 1)) ROWS ONLY")
+            .withParams(2)
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .returns(3)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + (2 
- ?) + 1) ROWS ONLY")
+            .withParams(1)
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+    }
+
+    /** */
+    @Test
+    public void testFetchExpressionAnotherSortOrder() throws Exception {
+        fillCache(cacheRepl, 5);
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (1 
+ (2 - 1) + 1) ROWS ONLY")
+            .returns(4)
+            .returns(3)
+            .returns(2)
+            .check();
+
+        // With parameters.
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (1 
+ (2 - 1) + ?) ROWS ONLY")
+            .withParams(2)
+            .returns(4)
+            .returns(3)
+            .returns(2)
+            .returns(1)
+            .check();
+    }
+
+    /** */
+    @Test
+    public void testFetchExpressionWithoutSortOrder() throws Exception {
+        fillCache(cacheRepl, 5);
+
+        assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + (2 - 1) + 1) 
ROWS ONLY")
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+
+        // With parameters.
+        assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + (2 - 1) + ?) 
ROWS ONLY")
+            .withParams(2)
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .returns(3)
+            .check();
+    }
+
+    /** */
+    @Test
+    public void testFetchExpressionCachedQuery() throws Exception {
+        fillCache(cacheRepl, 5);
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + 1) 
ROWS ONLY")
+            .withParams(1)
+            .returns(0)
+            .returns(1)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + 1) 
ROWS ONLY")
+            .withParams(2)
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+
+        // Check negative param.
+        assertThrows("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + 1) 
ROWS ONLY",
+            IgniteSQLException.class, "FETCH must not be negative", -2);
+    }
+
+    /** */
+    @Test
+    public void testFetchExpressionCachedQueryAndAnotherSortOrder() throws 
Exception {
+        fillCache(cacheRepl, 5);
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (? 
+ 1) ROWS ONLY")
+            .withParams(1)
+            .returns(4)
+            .returns(3)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (? 
+ 1) ROWS ONLY")
+            .withParams(2)
+            .returns(4)
+            .returns(3)
+            .returns(2)
+            .check();
+
+        // Check negative param.
+        assertThrows("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (? 
+ 1) ROWS ONLY",
+            IgniteSQLException.class, "FETCH must not be negative", -2);
+    }
+
+    /** */
+    @Test
+    public void testFetchExpressionCachedQueryAndWithoutSortOrder() throws 
Exception {
+        fillCache(cacheRepl, 5);
+
+        assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (? + 1) ROWS ONLY")
+            .withParams(1)
+            .returns(0)
+            .returns(1)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (? + 1) ROWS ONLY")
+            .withParams(2)
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+
+        // Check negative param.
+        assertThrows("SELECT id FROM TEST_REPL FETCH FIRST (? + 1) ROWS ONLY",
+            IgniteSQLException.class, "FETCH must not be negative", -2);
+    }
+
+    /** */
+    @Test
+    public void testFetchExpressionNested() throws Exception {
+        fillCache(cacheRepl, 5);
+
+        assertQuery("SELECT id FROM (SELECT id from TEST_REPL FETCH FIRST (? + 
3) ROWS ONLY) " +
+            "FETCH NEXT (1 + ?) ROWS ONLY")
+            .withParams(2, 1)
+            .returns(0)
+            .returns(1)
+            .check();
+    }
+
+    /** */
+    @Test
+    public void testFetchScalarFunctionExpression() throws Exception {
+        fillCache(cacheRepl, 5);
+
+        assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + ABS(?)) ROWS 
ONLY")
+            .withParams(-2)
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + ABS(?)) ROWS 
ONLY")
+            .withParams(1)
+            .returns(0)
+            .returns(1)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) 
ROWS ONLY")
+            .withParams(4)
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) 
ROWS ONLY")
+            .withParams(5)
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (SQRT(?) 
+ 1 + 0) ROWS ONLY")
+            .withParams(5)
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST 
(SQRT(?) + 1 + 0) ROWS ONLY")
+            .withParams(5)
+            .returns(4)
+            .returns(3)
+            .returns(2)
+            .check();
+    }
+
+    /** */
+    @Test
+    public void testFetchExpressionWithRewrite() throws Exception {
+        fillCache(cacheRepl, 5);
+
+        assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + NVL(?, 10000)) 
ROWS ONLY")
+            .withParams(1)
+            .returns(0)
+            .returns(1)
+            .check();
+
+        assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + NVL(?, 10000)) 
ROWS ONLY")
+            .withParams(2)
+            .returns(0)
+            .returns(1)
+            .returns(2)
+            .check();
+    }
+
     /**
      * @param c Cache.
      * @param rows Rows count.
@@ -270,4 +603,9 @@ public class LimitOffsetIntegrationTest extends 
AbstractBasicIntegrationTransact
 
         return sb.toString();
     }
+
+    /** */
+    private static BigDecimal bigInt() {
+        return BigDecimal.valueOf(Integer.MAX_VALUE).add(BigDecimal.ONE);
+    }
 }

Reply via email to