You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by al...@apache.org on 2025/05/19 14:42:00 UTC

(ignite) branch master updated: IGNITE-24043 SQL Calcite: Support UNNEST operator - Fixes #12069.

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

alexpl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new db8c8cc35f8 IGNITE-24043 SQL Calcite: Support UNNEST operator - Fixes #12069.
db8c8cc35f8 is described below

commit db8c8cc35f8f6afbc5d7f72b208e7fef1359e2d6
Author: Aleksey Plekhanov <pl...@gmail.com>
AuthorDate: Mon May 19 17:34:16 2025 +0300

    IGNITE-24043 SQL Calcite: Support UNNEST operator - Fixes #12069.
    
    Signed-off-by: Aleksey Plekhanov <pl...@gmail.com>
---
 modules/calcite/src/main/codegen/config.fmpp       |    1 -
 .../query/calcite/exec/LogicalRelImplementor.java  |   16 +
 .../query/calcite/exec/rel/UncollectNode.java      |  245 +++
 .../processors/query/calcite/prepare/Cloner.java   |    6 +
 .../query/calcite/prepare/IgniteRelShuttle.java    |    6 +
 .../query/calcite/prepare/IgniteSqlValidator.java  |    8 +
 .../query/calcite/prepare/PlannerPhase.java        |    6 +-
 .../query/calcite/rel/IgniteRelVisitor.java        |    5 +
 .../query/calcite/rel/IgniteUncollect.java         |  121 ++
 ...{CollectRule.java => CollectConverterRule.java} |    8 +-
 ...ollectRule.java => UncollectConverterRule.java} |   24 +-
 .../calcite/sql/generated/IgniteSqlParserImpl.java | 1860 ++++++++++----------
 .../calcite/exec/rel/AbstractExecutionTest.java    |   20 +-
 .../query/calcite/exec/rel/BaseAggregateTest.java  |   11 +-
 .../query/calcite/exec/rel/ExecutionTest.java      |    9 +-
 .../exec/rel/HashIndexSpoolExecutionTest.java      |    7 +-
 .../query/calcite/exec/rel/LimitExecutionTest.java |   25 +-
 .../exec/rel/SortedIndexSpoolExecutionTest.java    |    8 +-
 .../calcite/exec/rel/TableSpoolExecutionTest.java  |   18 +-
 .../calcite/exec/rel/UncollectExecutionTest.java   |  160 ++
 .../calcite/integration/StdSqlOperatorsTest.java   |    2 +
 .../calcite/integration/UnnestIntegrationTest.java |  145 ++
 .../query/calcite/planner/AbstractPlannerTest.java |    7 +
 .../calcite/planner/UncollectPlannerTest.java      |  141 ++
 .../query/calcite/sql/SqlReservedWordsTest.java    |    1 +
 .../ignite/testsuites/ExecutionTestSuite.java      |    2 +
 .../ignite/testsuites/IntegrationTestSuite.java    |    2 +
 .../apache/ignite/testsuites/PlannerTestSuite.java |    4 +-
 28 files changed, 1854 insertions(+), 1014 deletions(-)

diff --git a/modules/calcite/src/main/codegen/config.fmpp b/modules/calcite/src/main/codegen/config.fmpp
index 545dc21e816..0678659d5a8 100644
--- a/modules/calcite/src/main/codegen/config.fmpp
+++ b/modules/calcite/src/main/codegen/config.fmpp
@@ -380,7 +380,6 @@ data: {
       "UESCAPE"
       "UNIQUE"
       "UNKNOWN"
-      "UNNEST"
       "UPPER"
       "UPSERT"
       "VALUE"
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 e93c73c2c0d..100f9cb0996 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
@@ -65,6 +65,7 @@ import org.apache.ignite.internal.processors.query.calcite.exec.rel.ScanStorageN
 import org.apache.ignite.internal.processors.query.calcite.exec.rel.SortAggregateNode;
 import org.apache.ignite.internal.processors.query.calcite.exec.rel.SortNode;
 import org.apache.ignite.internal.processors.query.calcite.exec.rel.TableSpoolNode;
+import org.apache.ignite.internal.processors.query.calcite.exec.rel.UncollectNode;
 import org.apache.ignite.internal.processors.query.calcite.exec.rel.UnionAllNode;
 import org.apache.ignite.internal.processors.query.calcite.metadata.AffinityService;
 import org.apache.ignite.internal.processors.query.calcite.metadata.ColocationGroup;
@@ -92,6 +93,7 @@ import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableModify
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableScan;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableSpool;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTrimExchange;
+import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUncollect;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUnionAll;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteValues;
 import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteColocatedHashAggregate;
@@ -880,6 +882,20 @@ public class LogicalRelImplementor<Row> implements IgniteRelVisitor<Node<Row>> {
         return node;
     }
 
+    /** {@inheritDoc} */
+    @Override public Node<Row> visit(IgniteUncollect rel) {
+        UncollectNode<Row> node = new UncollectNode<>(
+            ctx,
+            rel.getInput().getRowType(),
+            rel.getRowType(),
+            rel.withOrdinality
+        );
+
+        node.register(visit(rel.getInput()));
+
+        return node;
+    }
+
     /** {@inheritDoc} */
     @Override public Node<Row> visit(IgniteRel rel) {
         return rel.accept(this);
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/UncollectNode.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/UncollectNode.java
new file mode 100644
index 00000000000..add11cd2a96
--- /dev/null
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/UncollectNode.java
@@ -0,0 +1,245 @@
+/*
+ * 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.exec.rel;
+
+import java.util.ArrayDeque;
+import java.util.Collections;
+import java.util.Deque;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.sql.type.MapSqlType;
+import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext;
+import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler;
+import org.apache.ignite.internal.util.typedef.F;
+
+/**
+ * Uncollect node produces rows for items in input row collection.
+ */
+public class UncollectNode<Row> extends AbstractNode<Row> implements SingleNode<Row>, Downstream<Row> {
+    /** */
+    private int requested;
+
+    /** */
+    private int waiting;
+
+    /** */
+    private final Deque<Row> buf = new ArrayDeque<>(IN_BUFFER_SIZE);
+
+    /** */
+    private final Function<Row, Iterator<Row>> iterFactory;
+
+    /** */
+    private Iterator<Row> iter;
+
+    /**
+     * Creates uncollect node with the rows supplier depending on {@code inType}.
+     *
+     * @param ctx Execution context.
+     * @param inType Input row type.
+     * @param outType Output row type.
+     * @param withOrdinality With ordinality flag.
+     */
+    public UncollectNode(
+        ExecutionContext<Row> ctx,
+        RelDataType inType,
+        RelDataType outType,
+        boolean withOrdinality
+    ) {
+        super(ctx, outType);
+
+        iterFactory = iteratorFactory(inType, withOrdinality);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void rewindInternal() {
+        requested = 0;
+        waiting = 0;
+        buf.clear();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected Downstream<Row> requestDownstream(int idx) {
+        if (idx != 0)
+            throw new IndexOutOfBoundsException();
+
+        return this;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void request(int rowsCnt) throws Exception {
+        assert !F.isEmpty(sources()) && sources().size() == 1;
+        assert rowsCnt > 0 && requested == 0;
+
+        checkState();
+
+        requested = rowsCnt;
+
+        context().execute(this::flush, this::onError);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void push(Row row) throws Exception {
+        assert downstream() != null;
+        assert waiting > 0;
+
+        checkState();
+
+        waiting--;
+
+        buf.push(row);
+
+        flush();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void end() throws Exception {
+        assert downstream() != null;
+        assert waiting > 0;
+
+        checkState();
+
+        waiting = -1;
+
+        if (isClosed())
+            return;
+
+        flush();
+    }
+
+    /** */
+    private void flush() throws Exception {
+        while (requested > 0 && hasNext()) {
+            requested--;
+
+            downstream().push(iter.next());
+        }
+
+        if (!hasNext()) {
+            if (waiting == 0)
+                source().request(waiting = IN_BUFFER_SIZE);
+            else if (waiting == -1 && requested > 0) {
+                requested = 0;
+
+                downstream().end();
+            }
+        }
+    }
+
+    /** */
+    private boolean hasNext() {
+        while (!buf.isEmpty() && (iter == null || !iter.hasNext()))
+            iter = iterFactory.apply(buf.poll());
+
+        return iter != null && iter.hasNext();
+    }
+
+    /** */
+    private Function<Row, Iterator<Row>> iteratorFactory(RelDataType inType, boolean withOrdinality) {
+        return new IteratorFactory(inType, withOrdinality);
+    }
+
+    /** */
+    private class IteratorFactory implements Function<Row, Iterator<Row>> {
+        /** */
+        private final Function<Object, Row> rowFactory;
+
+        /**
+         * We use only one iterator at time, so following objects below can be shared between different iterators to
+         * reduce objects allocation.
+         */
+        private final AtomicInteger ordinality = new AtomicInteger();
+
+        /** */
+        public IteratorFactory(RelDataType inType, boolean withOrdinality) {
+            RowHandler<Row> rowHnd = context().rowHandler();
+
+            int outFldCnt = rowType().getFieldCount();
+            int inFldCnt = inType.getFieldCount();
+
+            assert inFldCnt == 1;
+
+            Function<Object, Object>[] fldFactories = (Function<Object, Object>[])new Function[outFldCnt];
+
+            int outFldIdx = 0;
+
+            RelDataType inFieldType = inType.getFieldList().get(0).getType();
+
+            if (inFieldType instanceof MapSqlType) {
+                fldFactories[outFldIdx++] = row -> ((Map.Entry<Object, Object>)row).getKey();
+                fldFactories[outFldIdx++] = row -> ((Map.Entry<Object, Object>)row).getValue();
+            }
+            else {
+                RelDataType elementType = inFieldType.getComponentType();
+
+                if (elementType.isStruct()) {
+                    for (int elementFldIdx = 0; elementFldIdx < elementType.getFieldCount(); elementFldIdx++) {
+                        final int elementFldIdx0 = elementFldIdx;
+
+                        fldFactories[outFldIdx++] = row -> rowHnd.get(elementFldIdx0, (Row)(row));
+                    }
+                }
+                else
+                    fldFactories[outFldIdx++] = row -> row;
+            }
+
+            if (withOrdinality)
+                fldFactories[outFldIdx++] = row -> ordinality.incrementAndGet();
+
+            assert outFldIdx == outFldCnt :
+                "Unexpected fields count [outFldIdx=" + outFldIdx + ", outFldCnt = " + outFldCnt;
+
+            RowHandler.RowFactory<Row> outRowFactory = rowHnd.factory(context().getTypeFactory(), rowType());
+
+            rowFactory = inVal -> {
+                Object[] outRow = new Object[outFldCnt];
+
+                for (int fldIdx = 0; fldIdx < outFldCnt; fldIdx++)
+                    outRow[fldIdx] = fldFactories[fldIdx].apply(inVal);
+
+                return outRowFactory.create(outRow);
+            };
+        }
+
+        /** {@inheritDoc} */
+        @Override public Iterator<Row> apply(Row row) {
+            ordinality.set(0);
+
+            RowHandler<Row> rowHnd = context().rowHandler();
+
+            Iterator<Object> it = iterator(rowHnd.get(0, row));
+
+            return F.iterator(it, rowFactory::apply, true);
+        }
+
+        /** */
+        private Iterator<Object> iterator(Object iterable) {
+            if (iterable == null)
+                return Collections.emptyIterator();
+
+            assert iterable instanceof Map || iterable instanceof Iterable :
+                "Unexpected iterable class: " + iterable.getClass();
+
+            if (iterable instanceof Map)
+                iterable = ((Map<Object, Object>)iterable).entrySet();
+
+            return ((Iterable<Object>)iterable).iterator();
+        }
+    }
+}
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/Cloner.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/Cloner.java
index 149645d0c4b..82023d9bc09 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/Cloner.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/Cloner.java
@@ -42,6 +42,7 @@ import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableModify
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableScan;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableSpool;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTrimExchange;
+import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUncollect;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUnionAll;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteValues;
 import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteColocatedHashAggregate;
@@ -260,6 +261,11 @@ public class Cloner implements IgniteRelVisitor<IgniteRel> {
         return rel.clone(cluster, F.asList(visit((IgniteRel)rel.getInput())));
     }
 
+    /** {@inheritDoc} */
+    @Override public IgniteRel visit(IgniteUncollect rel) {
+        return rel.clone(cluster, F.asList(visit((IgniteRel)rel.getInput())));
+    }
+
     /** {@inheritDoc} */
     @Override public IgniteRel visit(IgniteRel rel) {
         return rel.accept(this);
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelShuttle.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelShuttle.java
index a01198dcd93..a489e9f8616 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelShuttle.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelShuttle.java
@@ -41,6 +41,7 @@ import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableModify
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableScan;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableSpool;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTrimExchange;
+import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUncollect;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUnionAll;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteValues;
 import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteColocatedHashAggregate;
@@ -204,6 +205,11 @@ public class IgniteRelShuttle implements IgniteRelVisitor<IgniteRel> {
         return processNode(rel);
     }
 
+    /** {@inheritDoc} */
+    @Override public IgniteRel visit(IgniteUncollect rel) {
+        return processNode(rel);
+    }
+
     /** {@inheritDoc} */
     @Override public IgniteRel visit(IgniteRel rel) {
         return rel.accept(this);
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 bff504653c4..e60f9a80248 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
@@ -649,4 +649,12 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
 
         return super.resolveLiteral(literal);
     }
+
+    /** {@inheritDoc} */
+    @Override protected void validateUnnest(SqlCall call, SqlValidatorScope scope, RelDataType targetRowType) {
+        if (call.operandCount() > 1)
+            throw newValidationError(call, RESOURCE.invalidArgCount(call.getOperator().getName(), 1));
+
+        super.validateUnnest(call, scope, targetRowType);
+    }
 }
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 a268f92fc6e..14bff5af6d8 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
@@ -45,7 +45,7 @@ import org.apache.calcite.tools.Program;
 import org.apache.calcite.tools.RuleSet;
 import org.apache.calcite.tools.RuleSets;
 import org.apache.calcite.util.Optionality;
-import org.apache.ignite.internal.processors.query.calcite.rule.CollectRule;
+import org.apache.ignite.internal.processors.query.calcite.rule.CollectConverterRule;
 import org.apache.ignite.internal.processors.query.calcite.rule.CorrelateToNestedLoopRule;
 import org.apache.ignite.internal.processors.query.calcite.rule.CorrelatedNestedLoopJoinRule;
 import org.apache.ignite.internal.processors.query.calcite.rule.FilterConverterRule;
@@ -63,6 +63,7 @@ import org.apache.ignite.internal.processors.query.calcite.rule.SortAggregateCon
 import org.apache.ignite.internal.processors.query.calcite.rule.SortConverterRule;
 import org.apache.ignite.internal.processors.query.calcite.rule.TableFunctionScanConverterRule;
 import org.apache.ignite.internal.processors.query.calcite.rule.TableModifyConverterRule;
+import org.apache.ignite.internal.processors.query.calcite.rule.UncollectConverterRule;
 import org.apache.ignite.internal.processors.query.calcite.rule.UnionConverterRule;
 import org.apache.ignite.internal.processors.query.calcite.rule.ValuesConverterRule;
 import org.apache.ignite.internal.processors.query.calcite.rule.logical.ExposeIndexRule;
@@ -266,7 +267,8 @@ public enum PlannerPhase {
                     LogicalScanConverterRule.TABLE_SCAN,
                     IndexCountRule.INSTANCE,
                     IndexMinMaxRule.INSTANCE,
-                    CollectRule.INSTANCE,
+                    CollectConverterRule.INSTANCE,
+                    UncollectConverterRule.INSTANCE,
                     HashAggregateConverterRule.COLOCATED,
                     HashAggregateConverterRule.MAP_REDUCE,
                     SortAggregateConverterRule.COLOCATED,
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteRelVisitor.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteRelVisitor.java
index ca9456e0b0b..0dc93f1cbb3 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteRelVisitor.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteRelVisitor.java
@@ -180,6 +180,11 @@ public interface IgniteRelVisitor<T> {
      */
     T visit(IgniteCollect rel);
 
+    /**
+     * See {@link IgniteRelVisitor#visit(IgniteRel)}
+     */
+    T visit(IgniteUncollect rel);
+
     /**
      * Visits a relational node and calculates a result on the basis of node meta information.
      * @param rel Relational node.
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteUncollect.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteUncollect.java
new file mode 100644
index 00000000000..583eacba388
--- /dev/null
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteUncollect.java
@@ -0,0 +1,121 @@
+/*
+ * 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.rel;
+
+import java.util.Collections;
+import java.util.List;
+import com.google.common.collect.ImmutableList;
+import org.apache.calcite.plan.RelOptCluster;
+import org.apache.calcite.plan.RelTraitSet;
+import org.apache.calcite.rel.RelCollations;
+import org.apache.calcite.rel.RelDistribution;
+import org.apache.calcite.rel.RelInput;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Uncollect;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.util.Pair;
+import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions;
+import org.apache.ignite.internal.processors.query.calcite.trait.TraitUtils;
+
+import static org.apache.ignite.internal.processors.query.calcite.trait.TraitUtils.changeTraits;
+
+/**
+ * Implementation of {@link org.apache.calcite.rel.core.Uncollect} in {@link IgniteConvention Ignite calling convention}.
+ */
+public class IgniteUncollect extends Uncollect implements IgniteRel {
+    /**
+     * Creates an Uncollect relational operator.
+     */
+    private IgniteUncollect(RelOptCluster cluster, RelTraitSet traitSet, RelNode child, boolean withOrdinality) {
+        super(cluster, traitSet, child, withOrdinality, Collections.emptyList());
+    }
+
+    /** */
+    public IgniteUncollect(RelInput input) {
+        super(changeTraits(input, IgniteConvention.INSTANCE));
+    }
+
+    /**
+     * Creates an IgniteUncollect.
+     *
+     * <p>Each field of the input relational expression must be an array or multiset.
+     *
+     * @param traitSet Trait set
+     * @param input    Input relational expression
+     * @param withOrdinality Whether output should contain an ORDINALITY column
+     */
+    public static IgniteUncollect create(RelTraitSet traitSet, RelNode input, boolean withOrdinality) {
+        RelOptCluster cluster = input.getCluster();
+
+        return new IgniteUncollect(cluster, traitSet, input, withOrdinality);
+    }
+
+    /** {@inheritDoc} */
+    @Override public RelNode copy(RelTraitSet traitSet, RelNode input) {
+        return new IgniteUncollect(getCluster(), traitSet, input, withOrdinality);
+    }
+
+    /** {@inheritDoc} */
+    @Override public <T> T accept(IgniteRelVisitor<T> visitor) {
+        return visitor.visit(this);
+    }
+
+    /** {@inheritDoc} */
+    @Override public IgniteRel clone(RelOptCluster cluster, List<IgniteRel> inputs) {
+        return new IgniteUncollect(cluster, getTraitSet(), sole(inputs), withOrdinality);
+    }
+
+    /** {@inheritDoc} */
+    @Override public double estimateRowCount(RelMetadataQuery mq) {
+        int fieldCnt = getInput().getRowType().getFieldCount();
+
+        // Assume every field contains collection of 4 elements (to simplify calculation).
+        long rowsMultiplier = fieldCnt > 15 ? Integer.MAX_VALUE : (1L << (fieldCnt * 2));
+
+        return rowsMultiplier * mq.getRowCount(getInput());
+    }
+
+    /** {@inheritDoc} */
+    @Override public Pair<RelTraitSet, List<RelTraitSet>> passThroughTraits(RelTraitSet required) {
+        if (required.getConvention() != IgniteConvention.INSTANCE)
+            return null;
+
+        if (TraitUtils.collation(required) != RelCollations.EMPTY)
+            return null;
+
+        if (TraitUtils.distribution(required).getType() == RelDistribution.Type.HASH_DISTRIBUTED)
+            return null;
+
+        return Pair.of(required, ImmutableList.of(required));
+    }
+
+    /** {@inheritDoc} */
+    @Override public Pair<RelTraitSet, List<RelTraitSet>> deriveTraits(RelTraitSet childTraits, int childId) {
+        assert childId == 0;
+
+        if (childTraits.getConvention() != IgniteConvention.INSTANCE)
+            return null;
+
+        RelTraitSet traits = childTraits.replace(RelCollations.EMPTY);
+
+        if (TraitUtils.distribution(traits).getType() == RelDistribution.Type.HASH_DISTRIBUTED)
+            traits = traits.replace(IgniteDistributions.random());
+
+        return Pair.of(traits, ImmutableList.of(childTraits));
+    }
+}
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/CollectRule.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/CollectConverterRule.java
similarity index 88%
copy from modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/CollectRule.java
copy to modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/CollectConverterRule.java
index e24509d89f0..fca665d14fb 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/CollectRule.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/CollectConverterRule.java
@@ -28,13 +28,13 @@ import org.apache.ignite.internal.processors.query.calcite.rel.IgniteConvention;
 import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions;
 
 /** */
-public class CollectRule extends AbstractIgniteConverterRule<Collect> {
+public class CollectConverterRule extends AbstractIgniteConverterRule<Collect> {
     /** */
-    public static final RelOptRule INSTANCE = new CollectRule();
+    public static final RelOptRule INSTANCE = new CollectConverterRule();
 
     /** */
-    protected CollectRule() {
-        super(Collect.class, "CollectRule");
+    protected CollectConverterRule() {
+        super(Collect.class, "CollectConverterRule");
     }
 
     /** {@inheritDoc} */
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/CollectRule.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/UncollectConverterRule.java
similarity index 64%
rename from modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/CollectRule.java
rename to modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/UncollectConverterRule.java
index e24509d89f0..a771c5725f9 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/CollectRule.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/UncollectConverterRule.java
@@ -16,33 +16,33 @@
  */
 package org.apache.ignite.internal.processors.query.calcite.rule;
 
-import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.PhysicalNode;
-import org.apache.calcite.rel.core.Collect;
+import org.apache.calcite.rel.RelCollations;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Uncollect;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
-import org.apache.ignite.internal.processors.query.calcite.rel.IgniteCollect;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteConvention;
-import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions;
+import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUncollect;
 
 /** */
-public class CollectRule extends AbstractIgniteConverterRule<Collect> {
+public class UncollectConverterRule extends AbstractIgniteConverterRule<Uncollect> {
     /** */
-    public static final RelOptRule INSTANCE = new CollectRule();
+    public static final RelOptRule INSTANCE = new UncollectConverterRule();
 
     /** */
-    protected CollectRule() {
-        super(Collect.class, "CollectRule");
+    protected UncollectConverterRule() {
+        super(Uncollect.class, "UncollectConverterRule");
     }
 
     /** {@inheritDoc} */
-    @Override protected PhysicalNode convert(RelOptPlanner planner, RelMetadataQuery mq, Collect rel) {
-        RelOptCluster cluster = rel.getCluster();
+    @Override protected PhysicalNode convert(RelOptPlanner planner, RelMetadataQuery mq, Uncollect rel) {
+        RelTraitSet traits = rel.getTraitSet().replace(IgniteConvention.INSTANCE).replace(RelCollations.EMPTY);
 
-        RelTraitSet traits = cluster.traitSetOf(IgniteConvention.INSTANCE).replace(IgniteDistributions.single());
+        RelNode input = convert(rel.getInput(), rel.getInput().getTraitSet().replace(IgniteConvention.INSTANCE));
 
-        return new IgniteCollect(cluster, traits, convert(rel.getInput(), traits), rel.getRowType());
+        return IgniteUncollect.create(traits, input, rel.withOrdinality);
     }
 }
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 7f09044dab2..7d6d94f2d25 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
@@ -10465,21 +10465,19 @@ final String p;
     } else if (jj_2_1330(2)) {
       jj_consume_token(UNKNOWN);
     } else if (jj_2_1331(2)) {
-      jj_consume_token(UPSERT);
+      jj_consume_token(VALUE);
     } else if (jj_2_1332(2)) {
-      jj_consume_token(VARBINARY);
+      jj_consume_token(VARCHAR);
     } else if (jj_2_1333(2)) {
-      jj_consume_token(VAR_POP);
+      jj_consume_token(VAR_SAMP);
     } else if (jj_2_1334(2)) {
-      jj_consume_token(WHENEVER);
+      jj_consume_token(WIDTH_BUCKET);
     } else if (jj_2_1335(2)) {
-      jj_consume_token(WITHIN);
+      jj_consume_token(WITHOUT);
     } else if (jj_2_1336(2)) {
-      jj_consume_token(MONDAY);
+      jj_consume_token(TUESDAY);
     } else if (jj_2_1337(2)) {
-      jj_consume_token(THURSDAY);
-    } else if (jj_2_1338(2)) {
-      jj_consume_token(SUNDAY);
+      jj_consume_token(FRIDAY);
     } else {
       jj_consume_token(-1);
       throw new ParseException();
@@ -10488,444 +10486,444 @@ final String p;
 
 /** @see #NonReservedKeyWord */
   final public void NonReservedKeyWord1of3() throws ParseException {
-    if (jj_2_1339(2)) {
+    if (jj_2_1338(2)) {
       jj_consume_token(ABSENT);
-    } else if (jj_2_1340(2)) {
+    } else if (jj_2_1339(2)) {
       jj_consume_token(ADA);
-    } else if (jj_2_1341(2)) {
+    } else if (jj_2_1340(2)) {
       jj_consume_token(AFTER);
-    } else if (jj_2_1342(2)) {
+    } else if (jj_2_1341(2)) {
       jj_consume_token(ARRAY_AGG);
-    } else if (jj_2_1343(2)) {
+    } else if (jj_2_1342(2)) {
       jj_consume_token(ASSERTION);
-    } else if (jj_2_1344(2)) {
+    } else if (jj_2_1343(2)) {
       jj_consume_token(ATTRIBUTES);
-    } else if (jj_2_1345(2)) {
+    } else if (jj_2_1344(2)) {
       jj_consume_token(BREADTH);
-    } else if (jj_2_1346(2)) {
+    } else if (jj_2_1345(2)) {
       jj_consume_token(CATALOG);
-    } else if (jj_2_1347(2)) {
+    } else if (jj_2_1346(2)) {
       jj_consume_token(CHAIN);
-    } else if (jj_2_1348(2)) {
+    } else if (jj_2_1347(2)) {
       jj_consume_token(CHARACTER_SET_CATALOG);
-    } else if (jj_2_1349(2)) {
+    } else if (jj_2_1348(2)) {
       jj_consume_token(CLASS_ORIGIN);
-    } else if (jj_2_1350(2)) {
+    } else if (jj_2_1349(2)) {
       jj_consume_token(COLLATION_CATALOG);
-    } else if (jj_2_1351(2)) {
+    } else if (jj_2_1350(2)) {
       jj_consume_token(COLUMN_NAME);
-    } else if (jj_2_1352(2)) {
+    } else if (jj_2_1351(2)) {
       jj_consume_token(COMMITTED);
-    } else if (jj_2_1353(2)) {
+    } else if (jj_2_1352(2)) {
       jj_consume_token(CONNECTION);
-    } else if (jj_2_1354(2)) {
+    } else if (jj_2_1353(2)) {
       jj_consume_token(CONSTRAINT_NAME);
-    } else if (jj_2_1355(2)) {
+    } else if (jj_2_1354(2)) {
       jj_consume_token(CONSTRUCTOR);
-    } else if (jj_2_1356(2)) {
+    } else if (jj_2_1355(2)) {
       jj_consume_token(CURSOR_NAME);
-    } else if (jj_2_1357(2)) {
+    } else if (jj_2_1356(2)) {
       jj_consume_token(DATE_DIFF);
-    } else if (jj_2_1358(2)) {
+    } else if (jj_2_1357(2)) {
       jj_consume_token(DATETIME_INTERVAL_CODE);
-    } else if (jj_2_1359(2)) {
+    } else if (jj_2_1358(2)) {
       jj_consume_token(DAYOFWEEK);
-    } else if (jj_2_1360(2)) {
+    } else if (jj_2_1359(2)) {
       jj_consume_token(DECADE);
-    } else if (jj_2_1361(2)) {
+    } else if (jj_2_1360(2)) {
       jj_consume_token(DEFERRED);
-    } else if (jj_2_1362(2)) {
+    } else if (jj_2_1361(2)) {
       jj_consume_token(DEGREE);
-    } else if (jj_2_1363(2)) {
+    } else if (jj_2_1362(2)) {
       jj_consume_token(DESC);
-    } else if (jj_2_1364(2)) {
+    } else if (jj_2_1363(2)) {
       jj_consume_token(DIAGNOSTICS);
-    } else if (jj_2_1365(2)) {
+    } else if (jj_2_1364(2)) {
       jj_consume_token(DOW);
-    } else if (jj_2_1366(2)) {
+    } else if (jj_2_1365(2)) {
       jj_consume_token(DYNAMIC_FUNCTION);
-    } else if (jj_2_1367(2)) {
+    } else if (jj_2_1366(2)) {
       jj_consume_token(EPOCH);
-    } else if (jj_2_1368(2)) {
+    } else if (jj_2_1367(2)) {
       jj_consume_token(EXCLUDE);
-    } else if (jj_2_1369(2)) {
+    } else if (jj_2_1368(2)) {
       jj_consume_token(FIRST);
-    } else if (jj_2_1370(2)) {
+    } else if (jj_2_1369(2)) {
       jj_consume_token(FORTRAN);
-    } else if (jj_2_1371(2)) {
+    } else if (jj_2_1370(2)) {
       jj_consume_token(G);
-    } else if (jj_2_1372(2)) {
+    } else if (jj_2_1371(2)) {
       jj_consume_token(GEOMETRY);
-    } else if (jj_2_1373(2)) {
+    } else if (jj_2_1372(2)) {
       jj_consume_token(GRANTED);
-    } else if (jj_2_1374(2)) {
+    } else if (jj_2_1373(2)) {
       jj_consume_token(HOP);
-    } else if (jj_2_1375(2)) {
+    } else if (jj_2_1374(2)) {
       jj_consume_token(ILIKE);
-    } else if (jj_2_1376(2)) {
+    } else if (jj_2_1375(2)) {
       jj_consume_token(IMPLEMENTATION);
-    } else if (jj_2_1377(2)) {
+    } else if (jj_2_1376(2)) {
       jj_consume_token(INCREMENT);
-    } else if (jj_2_1378(2)) {
+    } else if (jj_2_1377(2)) {
       jj_consume_token(INSTANCE);
-    } else if (jj_2_1379(2)) {
+    } else if (jj_2_1378(2)) {
       jj_consume_token(ISODOW);
-    } else if (jj_2_1380(2)) {
+    } else if (jj_2_1379(2)) {
       jj_consume_token(JAVA);
-    } else if (jj_2_1381(2)) {
+    } else if (jj_2_1380(2)) {
       jj_consume_token(KEY);
-    } else if (jj_2_1382(2)) {
+    } else if (jj_2_1381(2)) {
       jj_consume_token(LABEL);
-    } else if (jj_2_1383(2)) {
+    } else if (jj_2_1382(2)) {
       jj_consume_token(LEVEL);
-    } else if (jj_2_1384(2)) {
+    } else if (jj_2_1383(2)) {
       jj_consume_token(M);
-    } else if (jj_2_1385(2)) {
+    } else if (jj_2_1384(2)) {
       jj_consume_token(MAXVALUE);
-    } else if (jj_2_1386(2)) {
+    } else if (jj_2_1385(2)) {
       jj_consume_token(MESSAGE_TEXT);
-    } else if (jj_2_1387(2)) {
+    } else if (jj_2_1386(2)) {
       jj_consume_token(MILLISECOND);
-    } else if (jj_2_1388(2)) {
+    } else if (jj_2_1387(2)) {
       jj_consume_token(MONTHS);
-    } else if (jj_2_1389(2)) {
+    } else if (jj_2_1388(2)) {
       jj_consume_token(NAME);
-    } else if (jj_2_1390(2)) {
+    } else if (jj_2_1389(2)) {
       jj_consume_token(NESTING);
-    } else if (jj_2_1391(2)) {
+    } else if (jj_2_1390(2)) {
       jj_consume_token(NULLS);
-    } else if (jj_2_1392(2)) {
+    } else if (jj_2_1391(2)) {
       jj_consume_token(OCTETS);
-    } else if (jj_2_1393(2)) {
+    } else if (jj_2_1392(2)) {
       jj_consume_token(ORDERING);
-    } else if (jj_2_1394(2)) {
+    } else if (jj_2_1393(2)) {
       jj_consume_token(OUTPUT);
-    } else if (jj_2_1395(2)) {
+    } else if (jj_2_1394(2)) {
       jj_consume_token(PARAMETER_MODE);
-    } else if (jj_2_1396(2)) {
+    } else if (jj_2_1395(2)) {
       jj_consume_token(PARAMETER_SPECIFIC_CATALOG);
-    } else if (jj_2_1397(2)) {
+    } else if (jj_2_1396(2)) {
       jj_consume_token(PARTIAL);
-    } else if (jj_2_1398(2)) {
+    } else if (jj_2_1397(2)) {
       jj_consume_token(PASSTHROUGH);
-    } else if (jj_2_1399(2)) {
+    } else if (jj_2_1398(2)) {
       jj_consume_token(PIVOT);
-    } else if (jj_2_1400(2)) {
+    } else if (jj_2_1399(2)) {
       jj_consume_token(PLI);
-    } else if (jj_2_1401(2)) {
+    } else if (jj_2_1400(2)) {
       jj_consume_token(PRIOR);
-    } else if (jj_2_1402(2)) {
+    } else if (jj_2_1401(2)) {
       jj_consume_token(QUARTER);
-    } else if (jj_2_1403(2)) {
+    } else if (jj_2_1402(2)) {
       jj_consume_token(RELATIVE);
-    } else if (jj_2_1404(2)) {
+    } else if (jj_2_1403(2)) {
       jj_consume_token(RESPECT);
-    } else if (jj_2_1405(2)) {
+    } else if (jj_2_1404(2)) {
       jj_consume_token(RETURNED_CARDINALITY);
-    } else if (jj_2_1406(2)) {
+    } else if (jj_2_1405(2)) {
       jj_consume_token(RETURNED_SQLSTATE);
-    } else if (jj_2_1407(2)) {
+    } else if (jj_2_1406(2)) {
       jj_consume_token(ROLE);
-    } else if (jj_2_1408(2)) {
+    } else if (jj_2_1407(2)) {
       jj_consume_token(ROUTINE_NAME);
-    } else if (jj_2_1409(2)) {
+    } else if (jj_2_1408(2)) {
       jj_consume_token(SCALAR);
-    } else if (jj_2_1410(2)) {
+    } else if (jj_2_1409(2)) {
       jj_consume_token(SCHEMA_NAME);
-    } else if (jj_2_1411(2)) {
+    } else if (jj_2_1410(2)) {
       jj_consume_token(SCOPE_SCHEMA);
-    } else if (jj_2_1412(2)) {
+    } else if (jj_2_1411(2)) {
       jj_consume_token(SECURITY);
-    } else if (jj_2_1413(2)) {
+    } else if (jj_2_1412(2)) {
       jj_consume_token(SEQUENCE);
-    } else if (jj_2_1414(2)) {
+    } else if (jj_2_1413(2)) {
       jj_consume_token(SERVER_NAME);
-    } else if (jj_2_1415(2)) {
+    } else if (jj_2_1414(2)) {
       jj_consume_token(SIMPLE);
-    } else if (jj_2_1416(2)) {
+    } else if (jj_2_1415(2)) {
       jj_consume_token(SPACE);
-    } else if (jj_2_1417(2)) {
+    } else if (jj_2_1416(2)) {
       jj_consume_token(SQL_BINARY);
-    } else if (jj_2_1418(2)) {
+    } else if (jj_2_1417(2)) {
       jj_consume_token(SQL_BOOLEAN);
-    } else if (jj_2_1419(2)) {
+    } else if (jj_2_1418(2)) {
       jj_consume_token(SQL_DATE);
-    } else if (jj_2_1420(2)) {
+    } else if (jj_2_1419(2)) {
       jj_consume_token(SQL_FLOAT);
-    } else if (jj_2_1421(2)) {
+    } else if (jj_2_1420(2)) {
       jj_consume_token(SQL_INTERVAL_DAY_TO_HOUR);
-    } else if (jj_2_1422(2)) {
+    } else if (jj_2_1421(2)) {
       jj_consume_token(SQL_INTERVAL_HOUR);
-    } else if (jj_2_1423(2)) {
+    } else if (jj_2_1422(2)) {
       jj_consume_token(SQL_INTERVAL_MINUTE);
-    } else if (jj_2_1424(2)) {
+    } else if (jj_2_1423(2)) {
       jj_consume_token(SQL_INTERVAL_SECOND);
-    } else if (jj_2_1425(2)) {
+    } else if (jj_2_1424(2)) {
       jj_consume_token(SQL_LONGVARBINARY);
-    } else if (jj_2_1426(2)) {
+    } else if (jj_2_1425(2)) {
       jj_consume_token(SQL_NCHAR);
-    } else if (jj_2_1427(2)) {
+    } else if (jj_2_1426(2)) {
       jj_consume_token(SQL_NVARCHAR);
-    } else if (jj_2_1428(2)) {
+    } else if (jj_2_1427(2)) {
       jj_consume_token(SQL_TIME);
-    } else if (jj_2_1429(2)) {
+    } else if (jj_2_1428(2)) {
       jj_consume_token(SQL_TSI_DAY);
-    } else if (jj_2_1430(2)) {
+    } else if (jj_2_1429(2)) {
       jj_consume_token(SQL_TSI_MICROSECOND);
-    } else if (jj_2_1431(2)) {
+    } else if (jj_2_1430(2)) {
       jj_consume_token(SQL_TSI_QUARTER);
-    } else if (jj_2_1432(2)) {
+    } else if (jj_2_1431(2)) {
       jj_consume_token(SQL_TSI_YEAR);
-    } else if (jj_2_1433(2)) {
+    } else if (jj_2_1432(2)) {
       jj_consume_token(STATE);
-    } else if (jj_2_1434(2)) {
+    } else if (jj_2_1433(2)) {
       jj_consume_token(STRUCTURE);
-    } else if (jj_2_1435(2)) {
+    } else if (jj_2_1434(2)) {
       jj_consume_token(SUBSTITUTE);
-    } else if (jj_2_1436(2)) {
+    } else if (jj_2_1435(2)) {
       jj_consume_token(TIES);
-    } else if (jj_2_1437(2)) {
+    } else if (jj_2_1436(2)) {
       jj_consume_token(TIMESTAMPADD);
-    } else if (jj_2_1438(2)) {
+    } else if (jj_2_1437(2)) {
       jj_consume_token(TIMESTAMP_TRUNC);
-    } else if (jj_2_1439(2)) {
+    } else if (jj_2_1438(2)) {
       jj_consume_token(TRANSACTIONS_ACTIVE);
-    } else if (jj_2_1440(2)) {
+    } else if (jj_2_1439(2)) {
       jj_consume_token(TRANSFORM);
-    } else if (jj_2_1441(2)) {
+    } else if (jj_2_1440(2)) {
       jj_consume_token(TRIGGER_NAME);
-    } else if (jj_2_1442(2)) {
+    } else if (jj_2_1441(2)) {
       jj_consume_token(TYPE);
-    } else if (jj_2_1443(2)) {
+    } else if (jj_2_1442(2)) {
       jj_consume_token(UNCONDITIONAL);
-    } else if (jj_2_1444(2)) {
+    } else if (jj_2_1443(2)) {
       jj_consume_token(UNNAMED);
-    } else if (jj_2_1445(2)) {
+    } else if (jj_2_1444(2)) {
       jj_consume_token(USER_DEFINED_TYPE_CODE);
-    } else if (jj_2_1446(2)) {
+    } else if (jj_2_1445(2)) {
       jj_consume_token(UTF16);
-    } else if (jj_2_1447(2)) {
+    } else if (jj_2_1446(2)) {
       jj_consume_token(VERSION);
-    } else if (jj_2_1448(2)) {
+    } else if (jj_2_1447(2)) {
       jj_consume_token(WEEKS);
-    } else if (jj_2_1449(2)) {
+    } else if (jj_2_1448(2)) {
       jj_consume_token(WRITE);
-    } else if (jj_2_1450(2)) {
+    } else if (jj_2_1449(2)) {
       jj_consume_token(ZONE);
-    } else if (jj_2_1451(2)) {
+    } else if (jj_2_1450(2)) {
       jj_consume_token(AFFINITY_KEY);
-    } else if (jj_2_1452(2)) {
+    } else if (jj_2_1451(2)) {
       jj_consume_token(CACHE_GROUP);
-    } else if (jj_2_1453(2)) {
+    } else if (jj_2_1452(2)) {
       jj_consume_token(VALUE_TYPE);
-    } else if (jj_2_1454(2)) {
+    } else if (jj_2_1453(2)) {
       jj_consume_token(INLINE_SIZE);
-    } else if (jj_2_1455(2)) {
+    } else if (jj_2_1454(2)) {
       jj_consume_token(PASSWORD);
-    } else if (jj_2_1456(2)) {
+    } else if (jj_2_1455(2)) {
       jj_consume_token(CONTINUOUS);
-    } else if (jj_2_1457(2)) {
+    } else if (jj_2_1456(2)) {
       jj_consume_token(ASYNC);
-    } else if (jj_2_1458(2)) {
+    } else if (jj_2_1457(2)) {
       jj_consume_token(REFRESH);
-    } else if (jj_2_1459(2)) {
+    } else if (jj_2_1458(2)) {
       jj_consume_token(TOTAL);
-    } else if (jj_2_1460(2)) {
+    } else if (jj_2_1459(2)) {
       jj_consume_token(ALLOW);
-    } else if (jj_2_1461(2)) {
+    } else if (jj_2_1460(2)) {
       jj_consume_token(ASENSITIVE);
-    } else if (jj_2_1462(2)) {
+    } else if (jj_2_1461(2)) {
       jj_consume_token(AUTHORIZATION);
-    } else if (jj_2_1463(2)) {
+    } else if (jj_2_1462(2)) {
       jj_consume_token(BEGIN_FRAME);
-    } else if (jj_2_1464(2)) {
+    } else if (jj_2_1463(2)) {
       jj_consume_token(BINARY);
-    } else if (jj_2_1465(2)) {
+    } else if (jj_2_1464(2)) {
       jj_consume_token(BOOLEAN);
-    } else if (jj_2_1466(2)) {
+    } else if (jj_2_1465(2)) {
       jj_consume_token(CARDINALITY);
-    } else if (jj_2_1467(2)) {
+    } else if (jj_2_1466(2)) {
       jj_consume_token(CEILING);
-    } else if (jj_2_1468(2)) {
+    } else if (jj_2_1467(2)) {
       jj_consume_token(CHARACTER_LENGTH);
-    } else if (jj_2_1469(2)) {
+    } else if (jj_2_1468(2)) {
       jj_consume_token(CLASSIFIER);
-    } else if (jj_2_1470(2)) {
+    } else if (jj_2_1469(2)) {
       jj_consume_token(COALESCE);
-    } else if (jj_2_1471(2)) {
+    } else if (jj_2_1470(2)) {
       jj_consume_token(COMMIT);
-    } else if (jj_2_1472(2)) {
+    } else if (jj_2_1471(2)) {
       jj_consume_token(CONTAINS);
-    } else if (jj_2_1473(2)) {
+    } else if (jj_2_1472(2)) {
       jj_consume_token(CORRESPONDING);
-    } else if (jj_2_1474(2)) {
+    } else if (jj_2_1473(2)) {
       jj_consume_token(COVAR_SAMP);
-    } else if (jj_2_1475(2)) {
+    } else if (jj_2_1474(2)) {
       jj_consume_token(CURRENT);
-    } else if (jj_2_1476(2)) {
+    } else if (jj_2_1475(2)) {
       jj_consume_token(CURRENT_PATH);
-    } else if (jj_2_1477(2)) {
+    } else if (jj_2_1476(2)) {
       jj_consume_token(CURRENT_TRANSFORM_GROUP_FOR_TYPE);
-    } else if (jj_2_1478(2)) {
+    } else if (jj_2_1477(2)) {
       jj_consume_token(DATE);
-    } else if (jj_2_1479(2)) {
+    } else if (jj_2_1478(2)) {
       jj_consume_token(DEALLOCATE);
-    } else if (jj_2_1480(2)) {
+    } else if (jj_2_1479(2)) {
       jj_consume_token(DECLARE);
-    } else if (jj_2_1481(2)) {
+    } else if (jj_2_1480(2)) {
       jj_consume_token(DEREF);
-    } else if (jj_2_1482(2)) {
+    } else if (jj_2_1481(2)) {
       jj_consume_token(DISALLOW);
-    } else if (jj_2_1483(2)) {
+    } else if (jj_2_1482(2)) {
       jj_consume_token(DYNAMIC);
-    } else if (jj_2_1484(2)) {
+    } else if (jj_2_1483(2)) {
       jj_consume_token(EMPTY);
-    } else if (jj_2_1485(2)) {
+    } else if (jj_2_1484(2)) {
       jj_consume_token(END_FRAME);
-    } else if (jj_2_1486(2)) {
+    } else if (jj_2_1485(2)) {
       jj_consume_token(ESCAPE);
-    } else if (jj_2_1487(2)) {
+    } else if (jj_2_1486(2)) {
       jj_consume_token(EXECUTE);
-    } else if (jj_2_1488(2)) {
+    } else if (jj_2_1487(2)) {
       jj_consume_token(EXTERNAL);
-    } else if (jj_2_1489(2)) {
+    } else if (jj_2_1488(2)) {
       jj_consume_token(FIRST_VALUE);
-    } else if (jj_2_1490(2)) {
+    } else if (jj_2_1489(2)) {
       jj_consume_token(FOREIGN);
-    } else if (jj_2_1491(2)) {
+    } else if (jj_2_1490(2)) {
       jj_consume_token(FUNCTION);
-    } else if (jj_2_1492(2)) {
+    } else if (jj_2_1491(2)) {
       jj_consume_token(GLOBAL);
-    } else if (jj_2_1493(2)) {
+    } else if (jj_2_1492(2)) {
       jj_consume_token(GROUPS);
-    } else if (jj_2_1494(2)) {
+    } else if (jj_2_1493(2)) {
       jj_consume_token(IDENTITY);
-    } else if (jj_2_1495(2)) {
+    } else if (jj_2_1494(2)) {
       jj_consume_token(INITIAL);
-    } else if (jj_2_1496(2)) {
+    } else if (jj_2_1495(2)) {
       jj_consume_token(INT);
-    } else if (jj_2_1497(2)) {
+    } else if (jj_2_1496(2)) {
       jj_consume_token(JSON_ARRAY);
-    } else if (jj_2_1498(2)) {
+    } else if (jj_2_1497(2)) {
       jj_consume_token(JSON_OBJECT);
-    } else if (jj_2_1499(2)) {
+    } else if (jj_2_1498(2)) {
       jj_consume_token(JSON_SCOPE);
-    } else if (jj_2_1500(2)) {
+    } else if (jj_2_1499(2)) {
       jj_consume_token(LANGUAGE);
-    } else if (jj_2_1501(2)) {
+    } else if (jj_2_1500(2)) {
       jj_consume_token(LATERAL);
-    } else if (jj_2_1502(2)) {
+    } else if (jj_2_1501(2)) {
       jj_consume_token(LN);
-    } else if (jj_2_1503(2)) {
+    } else if (jj_2_1502(2)) {
       jj_consume_token(MATCH);
-    } else if (jj_2_1504(2)) {
+    } else if (jj_2_1503(2)) {
       jj_consume_token(MATCH_RECOGNIZE);
-    } else if (jj_2_1505(2)) {
+    } else if (jj_2_1504(2)) {
       jj_consume_token(MEMBER);
-    } else if (jj_2_1506(2)) {
+    } else if (jj_2_1505(2)) {
       jj_consume_token(MINUTE);
-    } else if (jj_2_1507(2)) {
+    } else if (jj_2_1506(2)) {
       jj_consume_token(MODULE);
-    } else if (jj_2_1508(2)) {
+    } else if (jj_2_1507(2)) {
       jj_consume_token(NATIONAL);
-    } else if (jj_2_1509(2)) {
+    } else if (jj_2_1508(2)) {
       jj_consume_token(NEW);
-    } else if (jj_2_1510(2)) {
+    } else if (jj_2_1509(2)) {
       jj_consume_token(NONE);
-    } else if (jj_2_1511(2)) {
+    } else if (jj_2_1510(2)) {
       jj_consume_token(NTILE);
-    } else if (jj_2_1512(2)) {
+    } else if (jj_2_1511(2)) {
       jj_consume_token(OCCURRENCES_REGEX);
-    } else if (jj_2_1513(2)) {
+    } else if (jj_2_1512(2)) {
       jj_consume_token(OLD);
-    } else if (jj_2_1514(2)) {
+    } else if (jj_2_1513(2)) {
       jj_consume_token(ONLY);
-    } else if (jj_2_1515(2)) {
+    } else if (jj_2_1514(2)) {
       jj_consume_token(OUT);
-    } else if (jj_2_1516(2)) {
+    } else if (jj_2_1515(2)) {
       jj_consume_token(OVERLAY);
-    } else if (jj_2_1517(2)) {
+    } else if (jj_2_1516(2)) {
       jj_consume_token(PER);
-    } else if (jj_2_1518(2)) {
+    } else if (jj_2_1517(2)) {
       jj_consume_token(PERCENTILE_DISC);
-    } else if (jj_2_1519(2)) {
+    } else if (jj_2_1518(2)) {
       jj_consume_token(PERMUTE);
-    } else if (jj_2_1520(2)) {
+    } else if (jj_2_1519(2)) {
       jj_consume_token(POSITION_REGEX);
-    } else if (jj_2_1521(2)) {
+    } else if (jj_2_1520(2)) {
       jj_consume_token(PRECISION);
-    } else if (jj_2_1522(2)) {
+    } else if (jj_2_1521(2)) {
       jj_consume_token(PROCEDURE);
-    } else if (jj_2_1523(2)) {
+    } else if (jj_2_1522(2)) {
       jj_consume_token(RANK);
-    } else if (jj_2_1524(2)) {
+    } else if (jj_2_1523(2)) {
       jj_consume_token(RECURSIVE);
-    } else if (jj_2_1525(2)) {
+    } else if (jj_2_1524(2)) {
       jj_consume_token(REFERENCING);
-    } else if (jj_2_1526(2)) {
+    } else if (jj_2_1525(2)) {
       jj_consume_token(REGR_COUNT);
-    } else if (jj_2_1527(2)) {
+    } else if (jj_2_1526(2)) {
       jj_consume_token(REGR_SLOPE);
-    } else if (jj_2_1528(2)) {
+    } else if (jj_2_1527(2)) {
       jj_consume_token(REGR_SYY);
-    } else if (jj_2_1529(2)) {
+    } else if (jj_2_1528(2)) {
       jj_consume_token(RESULT);
-    } else if (jj_2_1530(2)) {
+    } else if (jj_2_1529(2)) {
       jj_consume_token(REVOKE);
-    } else if (jj_2_1531(2)) {
+    } else if (jj_2_1530(2)) {
       jj_consume_token(ROWS);
-    } else if (jj_2_1532(2)) {
+    } else if (jj_2_1531(2)) {
       jj_consume_token(SAFE_CAST);
-    } else if (jj_2_1533(2)) {
+    } else if (jj_2_1532(2)) {
       jj_consume_token(SAVEPOINT);
-    } else if (jj_2_1534(2)) {
+    } else if (jj_2_1533(2)) {
       jj_consume_token(SEARCH);
-    } else if (jj_2_1535(2)) {
+    } else if (jj_2_1534(2)) {
       jj_consume_token(SENSITIVE);
-    } else if (jj_2_1536(2)) {
+    } else if (jj_2_1535(2)) {
       jj_consume_token(SIMILAR);
-    } else if (jj_2_1537(2)) {
+    } else if (jj_2_1536(2)) {
       jj_consume_token(SPECIFIC);
-    } else if (jj_2_1538(2)) {
+    } else if (jj_2_1537(2)) {
       jj_consume_token(SQLEXCEPTION);
-    } else if (jj_2_1539(2)) {
+    } else if (jj_2_1538(2)) {
       jj_consume_token(SQRT);
-    } else if (jj_2_1540(2)) {
+    } else if (jj_2_1539(2)) {
       jj_consume_token(STDDEV_POP);
-    } else if (jj_2_1541(2)) {
+    } else if (jj_2_1540(2)) {
       jj_consume_token(SUBMULTISET);
-    } else if (jj_2_1542(2)) {
+    } else if (jj_2_1541(2)) {
       jj_consume_token(SUBSTRING_REGEX);
-    } else if (jj_2_1543(2)) {
+    } else if (jj_2_1542(2)) {
       jj_consume_token(SYSTEM);
-    } else if (jj_2_1544(2)) {
+    } else if (jj_2_1543(2)) {
       jj_consume_token(TABLESAMPLE);
-    } else if (jj_2_1545(2)) {
+    } else if (jj_2_1544(2)) {
       jj_consume_token(TIMEZONE_HOUR);
-    } else if (jj_2_1546(2)) {
+    } else if (jj_2_1545(2)) {
       jj_consume_token(TRANSLATE);
-    } else if (jj_2_1547(2)) {
+    } else if (jj_2_1546(2)) {
       jj_consume_token(TREAT);
-    } else if (jj_2_1548(2)) {
+    } else if (jj_2_1547(2)) {
       jj_consume_token(TRIM_ARRAY);
-    } else if (jj_2_1549(2)) {
+    } else if (jj_2_1548(2)) {
       jj_consume_token(UESCAPE);
+    } else if (jj_2_1549(2)) {
+      jj_consume_token(UPPER);
     } else if (jj_2_1550(2)) {
-      jj_consume_token(UNNEST);
+      jj_consume_token(VALUE_OF);
     } else if (jj_2_1551(2)) {
-      jj_consume_token(VALUE);
+      jj_consume_token(VARYING);
     } else if (jj_2_1552(2)) {
-      jj_consume_token(VARCHAR);
+      jj_consume_token(VERSIONING);
     } else if (jj_2_1553(2)) {
-      jj_consume_token(VAR_SAMP);
+      jj_consume_token(WINDOW);
     } else if (jj_2_1554(2)) {
-      jj_consume_token(WIDTH_BUCKET);
+      jj_consume_token(YEAR);
     } else if (jj_2_1555(2)) {
-      jj_consume_token(WITHOUT);
+      jj_consume_token(WEDNESDAY);
     } else if (jj_2_1556(2)) {
-      jj_consume_token(TUESDAY);
-    } else if (jj_2_1557(2)) {
-      jj_consume_token(FRIDAY);
+      jj_consume_token(SATURDAY);
     } else {
       jj_consume_token(-1);
       throw new ParseException();
@@ -10934,444 +10932,444 @@ final String p;
 
 /** @see #NonReservedKeyWord */
   final public void NonReservedKeyWord2of3() throws ParseException {
-    if (jj_2_1558(2)) {
+    if (jj_2_1557(2)) {
       jj_consume_token(ABSOLUTE);
-    } else if (jj_2_1559(2)) {
+    } else if (jj_2_1558(2)) {
       jj_consume_token(ADD);
-    } else if (jj_2_1560(2)) {
+    } else if (jj_2_1559(2)) {
       jj_consume_token(ALWAYS);
-    } else if (jj_2_1561(2)) {
+    } else if (jj_2_1560(2)) {
       jj_consume_token(ARRAY_CONCAT_AGG);
-    } else if (jj_2_1562(2)) {
+    } else if (jj_2_1561(2)) {
       jj_consume_token(ASSIGNMENT);
-    } else if (jj_2_1563(2)) {
+    } else if (jj_2_1562(2)) {
       jj_consume_token(BEFORE);
-    } else if (jj_2_1564(2)) {
+    } else if (jj_2_1563(2)) {
       jj_consume_token(C);
-    } else if (jj_2_1565(2)) {
+    } else if (jj_2_1564(2)) {
       jj_consume_token(CATALOG_NAME);
-    } else if (jj_2_1566(2)) {
+    } else if (jj_2_1565(2)) {
       jj_consume_token(CHARACTERISTICS);
-    } else if (jj_2_1567(2)) {
+    } else if (jj_2_1566(2)) {
       jj_consume_token(CHARACTER_SET_NAME);
-    } else if (jj_2_1568(2)) {
+    } else if (jj_2_1567(2)) {
       jj_consume_token(COBOL);
-    } else if (jj_2_1569(2)) {
+    } else if (jj_2_1568(2)) {
       jj_consume_token(COLLATION_NAME);
-    } else if (jj_2_1570(2)) {
+    } else if (jj_2_1569(2)) {
       jj_consume_token(COMMAND_FUNCTION);
-    } else if (jj_2_1571(2)) {
+    } else if (jj_2_1570(2)) {
       jj_consume_token(CONDITIONAL);
-    } else if (jj_2_1572(2)) {
+    } else if (jj_2_1571(2)) {
       jj_consume_token(CONNECTION_NAME);
-    } else if (jj_2_1573(2)) {
+    } else if (jj_2_1572(2)) {
       jj_consume_token(CONSTRAINTS);
-    } else if (jj_2_1574(2)) {
+    } else if (jj_2_1573(2)) {
       jj_consume_token(CONTAINS_SUBSTR);
-    } else if (jj_2_1575(2)) {
+    } else if (jj_2_1574(2)) {
       jj_consume_token(DATA);
-    } else if (jj_2_1576(2)) {
+    } else if (jj_2_1575(2)) {
       jj_consume_token(DATE_TRUNC);
-    } else if (jj_2_1577(2)) {
+    } else if (jj_2_1576(2)) {
       jj_consume_token(DATETIME_INTERVAL_PRECISION);
-    } else if (jj_2_1578(2)) {
+    } else if (jj_2_1577(2)) {
       jj_consume_token(DAYOFYEAR);
-    } else if (jj_2_1579(2)) {
+    } else if (jj_2_1578(2)) {
       jj_consume_token(DEFAULTS);
-    } else if (jj_2_1580(2)) {
+    } else if (jj_2_1579(2)) {
       jj_consume_token(DEFINED);
-    } else if (jj_2_1581(2)) {
+    } else if (jj_2_1580(2)) {
       jj_consume_token(DEPTH);
-    } else if (jj_2_1582(2)) {
+    } else if (jj_2_1581(2)) {
       jj_consume_token(DESCRIPTION);
-    } else if (jj_2_1583(2)) {
+    } else if (jj_2_1582(2)) {
       jj_consume_token(DISPATCH);
-    } else if (jj_2_1584(2)) {
+    } else if (jj_2_1583(2)) {
       jj_consume_token(DOY);
-    } else if (jj_2_1585(2)) {
+    } else if (jj_2_1584(2)) {
       jj_consume_token(DYNAMIC_FUNCTION_CODE);
-    } else if (jj_2_1586(2)) {
+    } else if (jj_2_1585(2)) {
       jj_consume_token(ERROR);
-    } else if (jj_2_1587(2)) {
+    } else if (jj_2_1586(2)) {
       jj_consume_token(EXCLUDING);
-    } else if (jj_2_1588(2)) {
+    } else if (jj_2_1587(2)) {
       jj_consume_token(FOLLOWING);
-    } else if (jj_2_1589(2)) {
+    } else if (jj_2_1588(2)) {
       jj_consume_token(FOUND);
-    } else if (jj_2_1590(2)) {
+    } else if (jj_2_1589(2)) {
       jj_consume_token(GENERAL);
-    } else if (jj_2_1591(2)) {
+    } else if (jj_2_1590(2)) {
       jj_consume_token(GO);
-    } else if (jj_2_1592(2)) {
+    } else if (jj_2_1591(2)) {
       jj_consume_token(GROUP_CONCAT);
-    } else if (jj_2_1593(2)) {
+    } else if (jj_2_1592(2)) {
       jj_consume_token(HOURS);
-    } else if (jj_2_1594(2)) {
+    } else if (jj_2_1593(2)) {
       jj_consume_token(IMMEDIATE);
-    } else if (jj_2_1595(2)) {
+    } else if (jj_2_1594(2)) {
       jj_consume_token(INCLUDE);
-    } else if (jj_2_1596(2)) {
+    } else if (jj_2_1595(2)) {
       jj_consume_token(INITIALLY);
-    } else if (jj_2_1597(2)) {
+    } else if (jj_2_1596(2)) {
       jj_consume_token(INSTANTIABLE);
-    } else if (jj_2_1598(2)) {
+    } else if (jj_2_1597(2)) {
       jj_consume_token(ISOLATION);
-    } else if (jj_2_1599(2)) {
+    } else if (jj_2_1598(2)) {
       jj_consume_token(JSON);
-    } else if (jj_2_1600(2)) {
+    } else if (jj_2_1599(2)) {
       jj_consume_token(KEY_MEMBER);
-    } else if (jj_2_1601(2)) {
+    } else if (jj_2_1600(2)) {
       jj_consume_token(LAST);
-    } else if (jj_2_1602(2)) {
+    } else if (jj_2_1601(2)) {
       jj_consume_token(LIBRARY);
-    } else if (jj_2_1603(2)) {
+    } else if (jj_2_1602(2)) {
       jj_consume_token(MAP);
-    } else if (jj_2_1604(2)) {
+    } else if (jj_2_1603(2)) {
       jj_consume_token(MESSAGE_LENGTH);
-    } else if (jj_2_1605(2)) {
+    } else if (jj_2_1604(2)) {
       jj_consume_token(MICROSECOND);
-    } else if (jj_2_1606(2)) {
+    } else if (jj_2_1605(2)) {
       jj_consume_token(MINUTES);
-    } else if (jj_2_1607(2)) {
+    } else if (jj_2_1606(2)) {
       jj_consume_token(MORE_);
-    } else if (jj_2_1608(2)) {
+    } else if (jj_2_1607(2)) {
       jj_consume_token(NAMES);
-    } else if (jj_2_1609(2)) {
+    } else if (jj_2_1608(2)) {
       jj_consume_token(NORMALIZED);
-    } else if (jj_2_1610(2)) {
+    } else if (jj_2_1609(2)) {
       jj_consume_token(NUMBER);
-    } else if (jj_2_1611(2)) {
+    } else if (jj_2_1610(2)) {
       jj_consume_token(OPTION);
-    } else if (jj_2_1612(2)) {
+    } else if (jj_2_1611(2)) {
       jj_consume_token(ORDINALITY);
-    } else if (jj_2_1613(2)) {
+    } else if (jj_2_1612(2)) {
       jj_consume_token(OVERRIDING);
-    } else if (jj_2_1614(2)) {
+    } else if (jj_2_1613(2)) {
       jj_consume_token(PARAMETER_NAME);
-    } else if (jj_2_1615(2)) {
+    } else if (jj_2_1614(2)) {
       jj_consume_token(PARAMETER_SPECIFIC_NAME);
-    } else if (jj_2_1616(2)) {
+    } else if (jj_2_1615(2)) {
       jj_consume_token(PASCAL);
-    } else if (jj_2_1617(2)) {
+    } else if (jj_2_1616(2)) {
       jj_consume_token(PAST);
-    } else if (jj_2_1618(2)) {
+    } else if (jj_2_1617(2)) {
       jj_consume_token(PLACING);
-    } else if (jj_2_1619(2)) {
+    } else if (jj_2_1618(2)) {
       jj_consume_token(PRECEDING);
-    } else if (jj_2_1620(2)) {
+    } else if (jj_2_1619(2)) {
       jj_consume_token(PRIVILEGES);
-    } else if (jj_2_1621(2)) {
+    } else if (jj_2_1620(2)) {
       jj_consume_token(QUARTERS);
-    } else if (jj_2_1622(2)) {
+    } else if (jj_2_1621(2)) {
       jj_consume_token(REPEATABLE);
-    } else if (jj_2_1623(2)) {
+    } else if (jj_2_1622(2)) {
       jj_consume_token(RESTART);
-    } else if (jj_2_1624(2)) {
+    } else if (jj_2_1623(2)) {
       jj_consume_token(RETURNED_LENGTH);
-    } else if (jj_2_1625(2)) {
+    } else if (jj_2_1624(2)) {
       jj_consume_token(RETURNING);
-    } else if (jj_2_1626(2)) {
+    } else if (jj_2_1625(2)) {
       jj_consume_token(ROUTINE);
-    } else if (jj_2_1627(2)) {
+    } else if (jj_2_1626(2)) {
       jj_consume_token(ROUTINE_SCHEMA);
-    } else if (jj_2_1628(2)) {
+    } else if (jj_2_1627(2)) {
       jj_consume_token(SCALE);
-    } else if (jj_2_1629(2)) {
+    } else if (jj_2_1628(2)) {
       jj_consume_token(SCOPE_CATALOGS);
-    } else if (jj_2_1630(2)) {
+    } else if (jj_2_1629(2)) {
       jj_consume_token(SECONDS);
-    } else if (jj_2_1631(2)) {
+    } else if (jj_2_1630(2)) {
       jj_consume_token(SELF);
-    } else if (jj_2_1632(2)) {
+    } else if (jj_2_1631(2)) {
       jj_consume_token(SERIALIZABLE);
-    } else if (jj_2_1633(2)) {
+    } else if (jj_2_1632(2)) {
       jj_consume_token(SESSION);
-    } else if (jj_2_1634(2)) {
+    } else if (jj_2_1633(2)) {
       jj_consume_token(SIZE);
-    } else if (jj_2_1635(2)) {
+    } else if (jj_2_1634(2)) {
       jj_consume_token(SPECIFIC_NAME);
-    } else if (jj_2_1636(2)) {
+    } else if (jj_2_1635(2)) {
       jj_consume_token(SQL_BIT);
-    } else if (jj_2_1637(2)) {
+    } else if (jj_2_1636(2)) {
       jj_consume_token(SQL_CHAR);
-    } else if (jj_2_1638(2)) {
+    } else if (jj_2_1637(2)) {
       jj_consume_token(SQL_DECIMAL);
-    } else if (jj_2_1639(2)) {
+    } else if (jj_2_1638(2)) {
       jj_consume_token(SQL_INTEGER);
-    } else if (jj_2_1640(2)) {
+    } else if (jj_2_1639(2)) {
       jj_consume_token(SQL_INTERVAL_DAY_TO_MINUTE);
-    } else if (jj_2_1641(2)) {
+    } else if (jj_2_1640(2)) {
       jj_consume_token(SQL_INTERVAL_HOUR_TO_MINUTE);
-    } else if (jj_2_1642(2)) {
+    } else if (jj_2_1641(2)) {
       jj_consume_token(SQL_INTERVAL_MINUTE_TO_SECOND);
-    } else if (jj_2_1643(2)) {
+    } else if (jj_2_1642(2)) {
       jj_consume_token(SQL_INTERVAL_YEAR);
-    } else if (jj_2_1644(2)) {
+    } else if (jj_2_1643(2)) {
       jj_consume_token(SQL_LONGVARCHAR);
-    } else if (jj_2_1645(2)) {
+    } else if (jj_2_1644(2)) {
       jj_consume_token(SQL_NCLOB);
-    } else if (jj_2_1646(2)) {
+    } else if (jj_2_1645(2)) {
       jj_consume_token(SQL_REAL);
-    } else if (jj_2_1647(2)) {
+    } else if (jj_2_1646(2)) {
       jj_consume_token(SQL_TIMESTAMP);
-    } else if (jj_2_1648(2)) {
+    } else if (jj_2_1647(2)) {
       jj_consume_token(SQL_TSI_FRAC_SECOND);
-    } else if (jj_2_1649(2)) {
+    } else if (jj_2_1648(2)) {
       jj_consume_token(SQL_TSI_MINUTE);
-    } else if (jj_2_1650(2)) {
+    } else if (jj_2_1649(2)) {
       jj_consume_token(SQL_TSI_SECOND);
-    } else if (jj_2_1651(2)) {
+    } else if (jj_2_1650(2)) {
       jj_consume_token(SQL_VARBINARY);
-    } else if (jj_2_1652(2)) {
+    } else if (jj_2_1651(2)) {
       jj_consume_token(STATEMENT);
-    } else if (jj_2_1653(2)) {
+    } else if (jj_2_1652(2)) {
       jj_consume_token(STYLE);
-    } else if (jj_2_1654(2)) {
+    } else if (jj_2_1653(2)) {
       jj_consume_token(TABLE_NAME);
-    } else if (jj_2_1655(2)) {
+    } else if (jj_2_1654(2)) {
       jj_consume_token(TIME_DIFF);
-    } else if (jj_2_1656(2)) {
+    } else if (jj_2_1655(2)) {
       jj_consume_token(TIMESTAMPDIFF);
-    } else if (jj_2_1657(2)) {
+    } else if (jj_2_1656(2)) {
       jj_consume_token(TOP_LEVEL_COUNT);
-    } else if (jj_2_1658(2)) {
+    } else if (jj_2_1657(2)) {
       jj_consume_token(TRANSACTIONS_COMMITTED);
-    } else if (jj_2_1659(2)) {
+    } else if (jj_2_1658(2)) {
       jj_consume_token(TRANSFORMS);
-    } else if (jj_2_1660(2)) {
+    } else if (jj_2_1659(2)) {
       jj_consume_token(TRIGGER_SCHEMA);
-    } else if (jj_2_1661(2)) {
+    } else if (jj_2_1660(2)) {
       jj_consume_token(UNBOUNDED);
-    } else if (jj_2_1662(2)) {
+    } else if (jj_2_1661(2)) {
       jj_consume_token(UNDER);
-    } else if (jj_2_1663(2)) {
+    } else if (jj_2_1662(2)) {
       jj_consume_token(USAGE);
-    } else if (jj_2_1664(2)) {
+    } else if (jj_2_1663(2)) {
       jj_consume_token(USER_DEFINED_TYPE_NAME);
-    } else if (jj_2_1665(2)) {
+    } else if (jj_2_1664(2)) {
       jj_consume_token(UTF32);
-    } else if (jj_2_1666(2)) {
+    } else if (jj_2_1665(2)) {
       jj_consume_token(VIEW);
-    } else if (jj_2_1667(2)) {
+    } else if (jj_2_1666(2)) {
       jj_consume_token(WORK);
-    } else if (jj_2_1668(2)) {
+    } else if (jj_2_1667(2)) {
       jj_consume_token(XML);
-    } else if (jj_2_1669(2)) {
+    } else if (jj_2_1668(2)) {
       jj_consume_token(TEMPLATE);
-    } else if (jj_2_1670(2)) {
+    } else if (jj_2_1669(2)) {
       jj_consume_token(ATOMICITY);
-    } else if (jj_2_1671(2)) {
+    } else if (jj_2_1670(2)) {
       jj_consume_token(CACHE_NAME);
-    } else if (jj_2_1672(2)) {
+    } else if (jj_2_1671(2)) {
       jj_consume_token(ENCRYPTED);
-    } else if (jj_2_1673(2)) {
+    } else if (jj_2_1672(2)) {
       jj_consume_token(LOGGING);
-    } else if (jj_2_1674(2)) {
+    } else if (jj_2_1673(2)) {
       jj_consume_token(KILL);
-    } else if (jj_2_1675(2)) {
+    } else if (jj_2_1674(2)) {
       jj_consume_token(SERVICE);
-    } else if (jj_2_1676(2)) {
+    } else if (jj_2_1675(2)) {
       jj_consume_token(QUERY);
-    } else if (jj_2_1677(2)) {
+    } else if (jj_2_1676(2)) {
       jj_consume_token(ANALYZE);
-    } else if (jj_2_1678(2)) {
+    } else if (jj_2_1677(2)) {
       jj_consume_token(ABS);
-    } else if (jj_2_1679(2)) {
+    } else if (jj_2_1678(2)) {
       jj_consume_token(ARE);
-    } else if (jj_2_1680(2)) {
+    } else if (jj_2_1679(2)) {
       jj_consume_token(AT);
-    } else if (jj_2_1681(2)) {
+    } else if (jj_2_1680(2)) {
       jj_consume_token(AVG);
-    } else if (jj_2_1682(2)) {
+    } else if (jj_2_1681(2)) {
       jj_consume_token(BEGIN_PARTITION);
-    } else if (jj_2_1683(2)) {
+    } else if (jj_2_1682(2)) {
       jj_consume_token(BIT);
-    } else if (jj_2_1684(2)) {
+    } else if (jj_2_1683(2)) {
       jj_consume_token(CALL);
-    } else if (jj_2_1685(2)) {
+    } else if (jj_2_1684(2)) {
       jj_consume_token(CASCADED);
-    } else if (jj_2_1686(2)) {
+    } else if (jj_2_1685(2)) {
       jj_consume_token(CHAR);
-    } else if (jj_2_1687(2)) {
+    } else if (jj_2_1686(2)) {
       jj_consume_token(CHAR_LENGTH);
-    } else if (jj_2_1688(2)) {
+    } else if (jj_2_1687(2)) {
       jj_consume_token(CLOB);
-    } else if (jj_2_1689(2)) {
+    } else if (jj_2_1688(2)) {
       jj_consume_token(COLLATE);
-    } else if (jj_2_1690(2)) {
+    } else if (jj_2_1689(2)) {
       jj_consume_token(CONDITION);
-    } else if (jj_2_1691(2)) {
+    } else if (jj_2_1690(2)) {
       jj_consume_token(CONVERT);
-    } else if (jj_2_1692(2)) {
+    } else if (jj_2_1691(2)) {
       jj_consume_token(COUNT);
-    } else if (jj_2_1693(2)) {
+    } else if (jj_2_1692(2)) {
       jj_consume_token(CUBE);
-    } else if (jj_2_1694(2)) {
+    } else if (jj_2_1693(2)) {
       jj_consume_token(CURRENT_CATALOG);
-    } else if (jj_2_1695(2)) {
+    } else if (jj_2_1694(2)) {
       jj_consume_token(CURRENT_ROLE);
-    } else if (jj_2_1696(2)) {
+    } else if (jj_2_1695(2)) {
       jj_consume_token(CURSOR);
-    } else if (jj_2_1697(2)) {
+    } else if (jj_2_1696(2)) {
       jj_consume_token(DATETIME);
-    } else if (jj_2_1698(2)) {
+    } else if (jj_2_1697(2)) {
       jj_consume_token(DEC);
-    } else if (jj_2_1699(2)) {
+    } else if (jj_2_1698(2)) {
       jj_consume_token(DEFINE);
-    } else if (jj_2_1700(2)) {
+    } else if (jj_2_1699(2)) {
       jj_consume_token(DESCRIBE);
-    } else if (jj_2_1701(2)) {
+    } else if (jj_2_1700(2)) {
       jj_consume_token(DISCONNECT);
-    } else if (jj_2_1702(2)) {
+    } else if (jj_2_1701(2)) {
       jj_consume_token(EACH);
-    } else if (jj_2_1703(2)) {
+    } else if (jj_2_1702(2)) {
       jj_consume_token(END);
-    } else if (jj_2_1704(2)) {
+    } else if (jj_2_1703(2)) {
       jj_consume_token(END_PARTITION);
-    } else if (jj_2_1705(2)) {
+    } else if (jj_2_1704(2)) {
       jj_consume_token(EVERY);
-    } else if (jj_2_1706(2)) {
+    } else if (jj_2_1705(2)) {
       jj_consume_token(EXP);
-    } else if (jj_2_1707(2)) {
+    } else if (jj_2_1706(2)) {
       jj_consume_token(EXTRACT);
-    } else if (jj_2_1708(2)) {
+    } else if (jj_2_1707(2)) {
       jj_consume_token(FLOAT);
-    } else if (jj_2_1709(2)) {
+    } else if (jj_2_1708(2)) {
       jj_consume_token(FRAME_ROW);
-    } else if (jj_2_1710(2)) {
+    } else if (jj_2_1709(2)) {
       jj_consume_token(FUSION);
-    } else if (jj_2_1711(2)) {
+    } else if (jj_2_1710(2)) {
       jj_consume_token(GRANT);
-    } else if (jj_2_1712(2)) {
+    } else if (jj_2_1711(2)) {
       jj_consume_token(HOLD);
-    } else if (jj_2_1713(2)) {
+    } else if (jj_2_1712(2)) {
       jj_consume_token(IMPORT);
-    } else if (jj_2_1714(2)) {
+    } else if (jj_2_1713(2)) {
       jj_consume_token(INOUT);
-    } else if (jj_2_1715(2)) {
+    } else if (jj_2_1714(2)) {
       jj_consume_token(INTEGER);
-    } else if (jj_2_1716(2)) {
+    } else if (jj_2_1715(2)) {
       jj_consume_token(JSON_ARRAYAGG);
-    } else if (jj_2_1717(2)) {
+    } else if (jj_2_1716(2)) {
       jj_consume_token(JSON_OBJECTAGG);
-    } else if (jj_2_1718(2)) {
+    } else if (jj_2_1717(2)) {
       jj_consume_token(JSON_VALUE);
-    } else if (jj_2_1719(2)) {
+    } else if (jj_2_1718(2)) {
       jj_consume_token(LARGE);
-    } else if (jj_2_1720(2)) {
+    } else if (jj_2_1719(2)) {
       jj_consume_token(LEAD);
-    } else if (jj_2_1721(2)) {
+    } else if (jj_2_1720(2)) {
       jj_consume_token(LOCAL);
-    } else if (jj_2_1722(2)) {
+    } else if (jj_2_1721(2)) {
       jj_consume_token(MATCHES);
-    } else if (jj_2_1723(2)) {
+    } else if (jj_2_1722(2)) {
       jj_consume_token(MAX);
-    } else if (jj_2_1724(2)) {
+    } else if (jj_2_1723(2)) {
       jj_consume_token(METHOD);
-    } else if (jj_2_1725(2)) {
+    } else if (jj_2_1724(2)) {
       jj_consume_token(MOD);
-    } else if (jj_2_1726(2)) {
+    } else if (jj_2_1725(2)) {
       jj_consume_token(MONTH);
-    } else if (jj_2_1727(2)) {
+    } else if (jj_2_1726(2)) {
       jj_consume_token(NCHAR);
-    } else if (jj_2_1728(2)) {
+    } else if (jj_2_1727(2)) {
       jj_consume_token(NEXT);
-    } else if (jj_2_1729(2)) {
+    } else if (jj_2_1728(2)) {
       jj_consume_token(NORMALIZE);
-    } else if (jj_2_1730(2)) {
+    } else if (jj_2_1729(2)) {
       jj_consume_token(NULLIF);
-    } else if (jj_2_1731(2)) {
+    } else if (jj_2_1730(2)) {
       jj_consume_token(OCTET_LENGTH);
-    } else if (jj_2_1732(2)) {
+    } else if (jj_2_1731(2)) {
       jj_consume_token(OMIT);
-    } else if (jj_2_1733(2)) {
+    } else if (jj_2_1732(2)) {
       jj_consume_token(OPEN);
-    } else if (jj_2_1734(2)) {
+    } else if (jj_2_1733(2)) {
       jj_consume_token(OVER);
-    } else if (jj_2_1735(2)) {
+    } else if (jj_2_1734(2)) {
       jj_consume_token(PARAMETER);
-    } else if (jj_2_1736(2)) {
+    } else if (jj_2_1735(2)) {
       jj_consume_token(PERCENT);
-    } else if (jj_2_1737(2)) {
+    } else if (jj_2_1736(2)) {
       jj_consume_token(PERCENT_RANK);
-    } else if (jj_2_1738(2)) {
+    } else if (jj_2_1737(2)) {
       jj_consume_token(PORTION);
-    } else if (jj_2_1739(2)) {
+    } else if (jj_2_1738(2)) {
       jj_consume_token(POWER);
-    } else if (jj_2_1740(2)) {
+    } else if (jj_2_1739(2)) {
       jj_consume_token(PREPARE);
-    } else if (jj_2_1741(2)) {
+    } else if (jj_2_1740(2)) {
       jj_consume_token(QUALIFY);
-    } else if (jj_2_1742(2)) {
+    } else if (jj_2_1741(2)) {
       jj_consume_token(READS);
-    } else if (jj_2_1743(2)) {
+    } else if (jj_2_1742(2)) {
       jj_consume_token(REF);
-    } else if (jj_2_1744(2)) {
+    } else if (jj_2_1743(2)) {
       jj_consume_token(REGR_AVGX);
-    } else if (jj_2_1745(2)) {
+    } else if (jj_2_1744(2)) {
       jj_consume_token(REGR_INTERCEPT);
-    } else if (jj_2_1746(2)) {
+    } else if (jj_2_1745(2)) {
       jj_consume_token(REGR_SXX);
-    } else if (jj_2_1747(2)) {
+    } else if (jj_2_1746(2)) {
       jj_consume_token(RELEASE);
-    } else if (jj_2_1748(2)) {
+    } else if (jj_2_1747(2)) {
       jj_consume_token(RETURN);
-    } else if (jj_2_1749(2)) {
+    } else if (jj_2_1748(2)) {
       jj_consume_token(ROLLBACK);
-    } else if (jj_2_1750(2)) {
+    } else if (jj_2_1749(2)) {
       jj_consume_token(ROW_NUMBER);
-    } else if (jj_2_1751(2)) {
+    } else if (jj_2_1750(2)) {
       jj_consume_token(SAFE_OFFSET);
-    } else if (jj_2_1752(2)) {
+    } else if (jj_2_1751(2)) {
       jj_consume_token(SCOPE);
-    } else if (jj_2_1753(2)) {
+    } else if (jj_2_1752(2)) {
       jj_consume_token(SECOND);
-    } else if (jj_2_1754(2)) {
+    } else if (jj_2_1753(2)) {
       jj_consume_token(SESSION_USER);
-    } else if (jj_2_1755(2)) {
+    } else if (jj_2_1754(2)) {
       jj_consume_token(SKIP_);
-    } else if (jj_2_1756(2)) {
+    } else if (jj_2_1755(2)) {
       jj_consume_token(SPECIFICTYPE);
-    } else if (jj_2_1757(2)) {
+    } else if (jj_2_1756(2)) {
       jj_consume_token(SQLSTATE);
-    } else if (jj_2_1758(2)) {
+    } else if (jj_2_1757(2)) {
       jj_consume_token(START);
-    } else if (jj_2_1759(2)) {
+    } else if (jj_2_1758(2)) {
       jj_consume_token(STDDEV_SAMP);
-    } else if (jj_2_1760(2)) {
+    } else if (jj_2_1759(2)) {
       jj_consume_token(SUBSET);
-    } else if (jj_2_1761(2)) {
+    } else if (jj_2_1760(2)) {
       jj_consume_token(SUCCEEDS);
-    } else if (jj_2_1762(2)) {
+    } else if (jj_2_1761(2)) {
       jj_consume_token(SYSTEM_TIME);
-    } else if (jj_2_1763(2)) {
+    } else if (jj_2_1762(2)) {
       jj_consume_token(TIME);
-    } else if (jj_2_1764(2)) {
+    } else if (jj_2_1763(2)) {
       jj_consume_token(TIMEZONE_MINUTE);
-    } else if (jj_2_1765(2)) {
+    } else if (jj_2_1764(2)) {
       jj_consume_token(TRANSLATE_REGEX);
-    } else if (jj_2_1766(2)) {
+    } else if (jj_2_1765(2)) {
       jj_consume_token(TRIGGER);
-    } else if (jj_2_1767(2)) {
+    } else if (jj_2_1766(2)) {
       jj_consume_token(TRUNCATE);
-    } else if (jj_2_1768(2)) {
+    } else if (jj_2_1767(2)) {
       jj_consume_token(UNIQUE);
+    } else if (jj_2_1768(2)) {
+      jj_consume_token(UPSERT);
     } else if (jj_2_1769(2)) {
-      jj_consume_token(UPPER);
+      jj_consume_token(VARBINARY);
     } else if (jj_2_1770(2)) {
-      jj_consume_token(VALUE_OF);
+      jj_consume_token(VAR_POP);
     } else if (jj_2_1771(2)) {
-      jj_consume_token(VARYING);
+      jj_consume_token(WHENEVER);
     } else if (jj_2_1772(2)) {
-      jj_consume_token(VERSIONING);
+      jj_consume_token(WITHIN);
     } else if (jj_2_1773(2)) {
-      jj_consume_token(WINDOW);
+      jj_consume_token(MONDAY);
     } else if (jj_2_1774(2)) {
-      jj_consume_token(YEAR);
+      jj_consume_token(THURSDAY);
     } else if (jj_2_1775(2)) {
-      jj_consume_token(WEDNESDAY);
-    } else if (jj_2_1776(2)) {
-      jj_consume_token(SATURDAY);
+      jj_consume_token(SUNDAY);
     } else {
       jj_consume_token(-1);
       throw new ParseException();
@@ -23820,13 +23818,6 @@ final String p;
     finally { jj_save(1774, xla); }
   }
 
-  final private boolean jj_2_1776(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_1776(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(1775, xla); }
-  }
-
   final private boolean jj_3_268() {
     if (jj_scan_token(SUBSTITUTE)) return true;
     if (jj_scan_token(LPAREN)) return true;
@@ -31582,11 +31573,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_1776() {
-    if (jj_scan_token(SATURDAY)) return true;
-    return false;
-  }
-
   final private boolean jj_3_809() {
     Token xsp;
     xsp = jj_scanpos;
@@ -31604,7 +31590,7 @@ final String p;
   }
 
   final private boolean jj_3_1775() {
-    if (jj_scan_token(WEDNESDAY)) return true;
+    if (jj_scan_token(SUNDAY)) return true;
     return false;
   }
 
@@ -31614,17 +31600,17 @@ final String p;
   }
 
   final private boolean jj_3_1774() {
-    if (jj_scan_token(YEAR)) return true;
+    if (jj_scan_token(THURSDAY)) return true;
     return false;
   }
 
   final private boolean jj_3_1773() {
-    if (jj_scan_token(WINDOW)) return true;
+    if (jj_scan_token(MONDAY)) return true;
     return false;
   }
 
   final private boolean jj_3_1772() {
-    if (jj_scan_token(VERSIONING)) return true;
+    if (jj_scan_token(WITHIN)) return true;
     return false;
   }
 
@@ -31634,7 +31620,7 @@ final String p;
   }
 
   final private boolean jj_3_1771() {
-    if (jj_scan_token(VARYING)) return true;
+    if (jj_scan_token(WHENEVER)) return true;
     return false;
   }
 
@@ -31644,27 +31630,27 @@ final String p;
   }
 
   final private boolean jj_3_1770() {
-    if (jj_scan_token(VALUE_OF)) return true;
+    if (jj_scan_token(VAR_POP)) return true;
     return false;
   }
 
   final private boolean jj_3_1769() {
-    if (jj_scan_token(UPPER)) return true;
+    if (jj_scan_token(VARBINARY)) return true;
     return false;
   }
 
   final private boolean jj_3_1768() {
-    if (jj_scan_token(UNIQUE)) return true;
+    if (jj_scan_token(UPSERT)) return true;
     return false;
   }
 
   final private boolean jj_3_1767() {
-    if (jj_scan_token(TRUNCATE)) return true;
+    if (jj_scan_token(UNIQUE)) return true;
     return false;
   }
 
   final private boolean jj_3_1766() {
-    if (jj_scan_token(TRIGGER)) return true;
+    if (jj_scan_token(TRUNCATE)) return true;
     return false;
   }
 
@@ -31675,17 +31661,17 @@ final String p;
   }
 
   final private boolean jj_3_1765() {
-    if (jj_scan_token(TRANSLATE_REGEX)) return true;
+    if (jj_scan_token(TRIGGER)) return true;
     return false;
   }
 
   final private boolean jj_3_1764() {
-    if (jj_scan_token(TIMEZONE_MINUTE)) return true;
+    if (jj_scan_token(TRANSLATE_REGEX)) return true;
     return false;
   }
 
   final private boolean jj_3_1763() {
-    if (jj_scan_token(TIME)) return true;
+    if (jj_scan_token(TIMEZONE_MINUTE)) return true;
     return false;
   }
 
@@ -31695,7 +31681,7 @@ final String p;
   }
 
   final private boolean jj_3_1762() {
-    if (jj_scan_token(SYSTEM_TIME)) return true;
+    if (jj_scan_token(TIME)) return true;
     return false;
   }
 
@@ -31706,7 +31692,7 @@ final String p;
   }
 
   final private boolean jj_3_1761() {
-    if (jj_scan_token(SUCCEEDS)) return true;
+    if (jj_scan_token(SYSTEM_TIME)) return true;
     return false;
   }
 
@@ -31722,22 +31708,22 @@ final String p;
   }
 
   final private boolean jj_3_1760() {
-    if (jj_scan_token(SUBSET)) return true;
+    if (jj_scan_token(SUCCEEDS)) return true;
     return false;
   }
 
   final private boolean jj_3_1759() {
-    if (jj_scan_token(STDDEV_SAMP)) return true;
+    if (jj_scan_token(SUBSET)) return true;
     return false;
   }
 
   final private boolean jj_3_1758() {
-    if (jj_scan_token(START)) return true;
+    if (jj_scan_token(STDDEV_SAMP)) return true;
     return false;
   }
 
   final private boolean jj_3_1757() {
-    if (jj_scan_token(SQLSTATE)) return true;
+    if (jj_scan_token(START)) return true;
     return false;
   }
 
@@ -31758,7 +31744,7 @@ final String p;
   }
 
   final private boolean jj_3_1756() {
-    if (jj_scan_token(SPECIFICTYPE)) return true;
+    if (jj_scan_token(SQLSTATE)) return true;
     return false;
   }
 
@@ -31769,17 +31755,17 @@ final String p;
   }
 
   final private boolean jj_3_1755() {
-    if (jj_scan_token(SKIP_)) return true;
+    if (jj_scan_token(SPECIFICTYPE)) return true;
     return false;
   }
 
   final private boolean jj_3_1754() {
-    if (jj_scan_token(SESSION_USER)) return true;
+    if (jj_scan_token(SKIP_)) return true;
     return false;
   }
 
   final private boolean jj_3_1753() {
-    if (jj_scan_token(SECOND)) return true;
+    if (jj_scan_token(SESSION_USER)) return true;
     return false;
   }
 
@@ -31790,32 +31776,32 @@ final String p;
   }
 
   final private boolean jj_3_1752() {
-    if (jj_scan_token(SCOPE)) return true;
+    if (jj_scan_token(SECOND)) return true;
     return false;
   }
 
   final private boolean jj_3_1751() {
-    if (jj_scan_token(SAFE_OFFSET)) return true;
+    if (jj_scan_token(SCOPE)) return true;
     return false;
   }
 
   final private boolean jj_3_1750() {
-    if (jj_scan_token(ROW_NUMBER)) return true;
+    if (jj_scan_token(SAFE_OFFSET)) return true;
     return false;
   }
 
   final private boolean jj_3_1749() {
-    if (jj_scan_token(ROLLBACK)) return true;
+    if (jj_scan_token(ROW_NUMBER)) return true;
     return false;
   }
 
   final private boolean jj_3_1748() {
-    if (jj_scan_token(RETURN)) return true;
+    if (jj_scan_token(ROLLBACK)) return true;
     return false;
   }
 
   final private boolean jj_3_1747() {
-    if (jj_scan_token(RELEASE)) return true;
+    if (jj_scan_token(RETURN)) return true;
     return false;
   }
 
@@ -31826,7 +31812,7 @@ final String p;
   }
 
   final private boolean jj_3_1746() {
-    if (jj_scan_token(REGR_SXX)) return true;
+    if (jj_scan_token(RELEASE)) return true;
     return false;
   }
 
@@ -31837,12 +31823,12 @@ final String p;
   }
 
   final private boolean jj_3_1745() {
-    if (jj_scan_token(REGR_INTERCEPT)) return true;
+    if (jj_scan_token(REGR_SXX)) return true;
     return false;
   }
 
   final private boolean jj_3_1744() {
-    if (jj_scan_token(REGR_AVGX)) return true;
+    if (jj_scan_token(REGR_INTERCEPT)) return true;
     return false;
   }
 
@@ -31862,32 +31848,32 @@ final String p;
   }
 
   final private boolean jj_3_1743() {
-    if (jj_scan_token(REF)) return true;
+    if (jj_scan_token(REGR_AVGX)) return true;
     return false;
   }
 
   final private boolean jj_3_1742() {
-    if (jj_scan_token(READS)) return true;
+    if (jj_scan_token(REF)) return true;
     return false;
   }
 
   final private boolean jj_3_1741() {
-    if (jj_scan_token(QUALIFY)) return true;
+    if (jj_scan_token(READS)) return true;
     return false;
   }
 
   final private boolean jj_3_1740() {
-    if (jj_scan_token(PREPARE)) return true;
+    if (jj_scan_token(QUALIFY)) return true;
     return false;
   }
 
   final private boolean jj_3_1739() {
-    if (jj_scan_token(POWER)) return true;
+    if (jj_scan_token(PREPARE)) return true;
     return false;
   }
 
   final private boolean jj_3_1738() {
-    if (jj_scan_token(PORTION)) return true;
+    if (jj_scan_token(POWER)) return true;
     return false;
   }
 
@@ -31898,17 +31884,17 @@ final String p;
   }
 
   final private boolean jj_3_1737() {
-    if (jj_scan_token(PERCENT_RANK)) return true;
+    if (jj_scan_token(PORTION)) return true;
     return false;
   }
 
   final private boolean jj_3_1736() {
-    if (jj_scan_token(PERCENT)) return true;
+    if (jj_scan_token(PERCENT_RANK)) return true;
     return false;
   }
 
   final private boolean jj_3_1735() {
-    if (jj_scan_token(PARAMETER)) return true;
+    if (jj_scan_token(PERCENT)) return true;
     return false;
   }
 
@@ -31925,7 +31911,7 @@ final String p;
   }
 
   final private boolean jj_3_1734() {
-    if (jj_scan_token(OVER)) return true;
+    if (jj_scan_token(PARAMETER)) return true;
     return false;
   }
 
@@ -31935,7 +31921,7 @@ final String p;
   }
 
   final private boolean jj_3_1733() {
-    if (jj_scan_token(OPEN)) return true;
+    if (jj_scan_token(OVER)) return true;
     return false;
   }
 
@@ -31945,7 +31931,7 @@ final String p;
   }
 
   final private boolean jj_3_1732() {
-    if (jj_scan_token(OMIT)) return true;
+    if (jj_scan_token(OPEN)) return true;
     return false;
   }
 
@@ -31955,12 +31941,12 @@ final String p;
   }
 
   final private boolean jj_3_1731() {
-    if (jj_scan_token(OCTET_LENGTH)) return true;
+    if (jj_scan_token(OMIT)) return true;
     return false;
   }
 
   final private boolean jj_3_1730() {
-    if (jj_scan_token(NULLIF)) return true;
+    if (jj_scan_token(OCTET_LENGTH)) return true;
     return false;
   }
 
@@ -31971,22 +31957,22 @@ final String p;
   }
 
   final private boolean jj_3_1729() {
-    if (jj_scan_token(NORMALIZE)) return true;
+    if (jj_scan_token(NULLIF)) return true;
     return false;
   }
 
   final private boolean jj_3_1728() {
-    if (jj_scan_token(NEXT)) return true;
+    if (jj_scan_token(NORMALIZE)) return true;
     return false;
   }
 
   final private boolean jj_3_1727() {
-    if (jj_scan_token(NCHAR)) return true;
+    if (jj_scan_token(NEXT)) return true;
     return false;
   }
 
   final private boolean jj_3_1726() {
-    if (jj_scan_token(MONTH)) return true;
+    if (jj_scan_token(NCHAR)) return true;
     return false;
   }
 
@@ -32002,27 +31988,27 @@ final String p;
   }
 
   final private boolean jj_3_1725() {
-    if (jj_scan_token(MOD)) return true;
+    if (jj_scan_token(MONTH)) return true;
     return false;
   }
 
   final private boolean jj_3_1724() {
-    if (jj_scan_token(METHOD)) return true;
+    if (jj_scan_token(MOD)) return true;
     return false;
   }
 
   final private boolean jj_3_1723() {
-    if (jj_scan_token(MAX)) return true;
+    if (jj_scan_token(METHOD)) return true;
     return false;
   }
 
   final private boolean jj_3_1722() {
-    if (jj_scan_token(MATCHES)) return true;
+    if (jj_scan_token(MAX)) return true;
     return false;
   }
 
   final private boolean jj_3_1721() {
-    if (jj_scan_token(LOCAL)) return true;
+    if (jj_scan_token(MATCHES)) return true;
     return false;
   }
 
@@ -32033,12 +32019,12 @@ final String p;
   }
 
   final private boolean jj_3_1720() {
-    if (jj_scan_token(LEAD)) return true;
+    if (jj_scan_token(LOCAL)) return true;
     return false;
   }
 
   final private boolean jj_3_1719() {
-    if (jj_scan_token(LARGE)) return true;
+    if (jj_scan_token(LEAD)) return true;
     return false;
   }
 
@@ -32054,17 +32040,17 @@ final String p;
   }
 
   final private boolean jj_3_1718() {
-    if (jj_scan_token(JSON_VALUE)) return true;
+    if (jj_scan_token(LARGE)) return true;
     return false;
   }
 
   final private boolean jj_3_1717() {
-    if (jj_scan_token(JSON_OBJECTAGG)) return true;
+    if (jj_scan_token(JSON_VALUE)) return true;
     return false;
   }
 
   final private boolean jj_3_1716() {
-    if (jj_scan_token(JSON_ARRAYAGG)) return true;
+    if (jj_scan_token(JSON_OBJECTAGG)) return true;
     return false;
   }
 
@@ -32075,7 +32061,7 @@ final String p;
   }
 
   final private boolean jj_3_1715() {
-    if (jj_scan_token(INTEGER)) return true;
+    if (jj_scan_token(JSON_ARRAYAGG)) return true;
     return false;
   }
 
@@ -32086,7 +32072,7 @@ final String p;
   }
 
   final private boolean jj_3_1714() {
-    if (jj_scan_token(INOUT)) return true;
+    if (jj_scan_token(INTEGER)) return true;
     return false;
   }
 
@@ -32102,12 +32088,12 @@ final String p;
   }
 
   final private boolean jj_3_1713() {
-    if (jj_scan_token(IMPORT)) return true;
+    if (jj_scan_token(INOUT)) return true;
     return false;
   }
 
   final private boolean jj_3_1712() {
-    if (jj_scan_token(HOLD)) return true;
+    if (jj_scan_token(IMPORT)) return true;
     return false;
   }
 
@@ -32118,12 +32104,12 @@ final String p;
   }
 
   final private boolean jj_3_1711() {
-    if (jj_scan_token(GRANT)) return true;
+    if (jj_scan_token(HOLD)) return true;
     return false;
   }
 
   final private boolean jj_3_1710() {
-    if (jj_scan_token(FUSION)) return true;
+    if (jj_scan_token(GRANT)) return true;
     return false;
   }
 
@@ -32139,27 +32125,27 @@ final String p;
   }
 
   final private boolean jj_3_1709() {
-    if (jj_scan_token(FRAME_ROW)) return true;
+    if (jj_scan_token(FUSION)) return true;
     return false;
   }
 
   final private boolean jj_3_1708() {
-    if (jj_scan_token(FLOAT)) return true;
+    if (jj_scan_token(FRAME_ROW)) return true;
     return false;
   }
 
   final private boolean jj_3_1707() {
-    if (jj_scan_token(EXTRACT)) return true;
+    if (jj_scan_token(FLOAT)) return true;
     return false;
   }
 
   final private boolean jj_3_1706() {
-    if (jj_scan_token(EXP)) return true;
+    if (jj_scan_token(EXTRACT)) return true;
     return false;
   }
 
   final private boolean jj_3_1705() {
-    if (jj_scan_token(EVERY)) return true;
+    if (jj_scan_token(EXP)) return true;
     return false;
   }
 
@@ -32175,32 +32161,32 @@ final String p;
   }
 
   final private boolean jj_3_1704() {
-    if (jj_scan_token(END_PARTITION)) return true;
+    if (jj_scan_token(EVERY)) return true;
     return false;
   }
 
   final private boolean jj_3_1703() {
-    if (jj_scan_token(END)) return true;
+    if (jj_scan_token(END_PARTITION)) return true;
     return false;
   }
 
   final private boolean jj_3_1702() {
-    if (jj_scan_token(EACH)) return true;
+    if (jj_scan_token(END)) return true;
     return false;
   }
 
   final private boolean jj_3_1701() {
-    if (jj_scan_token(DISCONNECT)) return true;
+    if (jj_scan_token(EACH)) return true;
     return false;
   }
 
   final private boolean jj_3_1700() {
-    if (jj_scan_token(DESCRIBE)) return true;
+    if (jj_scan_token(DISCONNECT)) return true;
     return false;
   }
 
   final private boolean jj_3_1699() {
-    if (jj_scan_token(DEFINE)) return true;
+    if (jj_scan_token(DESCRIBE)) return true;
     return false;
   }
 
@@ -32211,7 +32197,7 @@ final String p;
   }
 
   final private boolean jj_3_1698() {
-    if (jj_scan_token(DEC)) return true;
+    if (jj_scan_token(DEFINE)) return true;
     return false;
   }
 
@@ -32227,7 +32213,7 @@ final String p;
   }
 
   final private boolean jj_3_1697() {
-    if (jj_scan_token(DATETIME)) return true;
+    if (jj_scan_token(DEC)) return true;
     return false;
   }
 
@@ -32240,57 +32226,57 @@ final String p;
   }
 
   final private boolean jj_3_1696() {
-    if (jj_scan_token(CURSOR)) return true;
+    if (jj_scan_token(DATETIME)) return true;
     return false;
   }
 
   final private boolean jj_3_1695() {
-    if (jj_scan_token(CURRENT_ROLE)) return true;
+    if (jj_scan_token(CURSOR)) return true;
     return false;
   }
 
   final private boolean jj_3_1694() {
-    if (jj_scan_token(CURRENT_CATALOG)) return true;
+    if (jj_scan_token(CURRENT_ROLE)) return true;
     return false;
   }
 
   final private boolean jj_3_1693() {
-    if (jj_scan_token(CUBE)) return true;
+    if (jj_scan_token(CURRENT_CATALOG)) return true;
     return false;
   }
 
   final private boolean jj_3_1692() {
-    if (jj_scan_token(COUNT)) return true;
+    if (jj_scan_token(CUBE)) return true;
     return false;
   }
 
   final private boolean jj_3_1691() {
-    if (jj_scan_token(CONVERT)) return true;
+    if (jj_scan_token(COUNT)) return true;
     return false;
   }
 
   final private boolean jj_3_1690() {
-    if (jj_scan_token(CONDITION)) return true;
+    if (jj_scan_token(CONVERT)) return true;
     return false;
   }
 
   final private boolean jj_3_1689() {
-    if (jj_scan_token(COLLATE)) return true;
+    if (jj_scan_token(CONDITION)) return true;
     return false;
   }
 
   final private boolean jj_3_1688() {
-    if (jj_scan_token(CLOB)) return true;
+    if (jj_scan_token(COLLATE)) return true;
     return false;
   }
 
   final private boolean jj_3_1687() {
-    if (jj_scan_token(CHAR_LENGTH)) return true;
+    if (jj_scan_token(CLOB)) return true;
     return false;
   }
 
   final private boolean jj_3_1686() {
-    if (jj_scan_token(CHAR)) return true;
+    if (jj_scan_token(CHAR_LENGTH)) return true;
     return false;
   }
 
@@ -32301,17 +32287,17 @@ final String p;
   }
 
   final private boolean jj_3_1685() {
-    if (jj_scan_token(CASCADED)) return true;
+    if (jj_scan_token(CHAR)) return true;
     return false;
   }
 
   final private boolean jj_3_1684() {
-    if (jj_scan_token(CALL)) return true;
+    if (jj_scan_token(CASCADED)) return true;
     return false;
   }
 
   final private boolean jj_3_1683() {
-    if (jj_scan_token(BIT)) return true;
+    if (jj_scan_token(CALL)) return true;
     return false;
   }
 
@@ -32322,12 +32308,12 @@ final String p;
   }
 
   final private boolean jj_3_1682() {
-    if (jj_scan_token(BEGIN_PARTITION)) return true;
+    if (jj_scan_token(BIT)) return true;
     return false;
   }
 
   final private boolean jj_3_1681() {
-    if (jj_scan_token(AVG)) return true;
+    if (jj_scan_token(BEGIN_PARTITION)) return true;
     return false;
   }
 
@@ -32338,32 +32324,32 @@ final String p;
   }
 
   final private boolean jj_3_1680() {
-    if (jj_scan_token(AT)) return true;
+    if (jj_scan_token(AVG)) return true;
     return false;
   }
 
   final private boolean jj_3_1679() {
-    if (jj_scan_token(ARE)) return true;
+    if (jj_scan_token(AT)) return true;
     return false;
   }
 
   final private boolean jj_3_1678() {
-    if (jj_scan_token(ABS)) return true;
+    if (jj_scan_token(ARE)) return true;
     return false;
   }
 
   final private boolean jj_3_1677() {
-    if (jj_scan_token(ANALYZE)) return true;
+    if (jj_scan_token(ABS)) return true;
     return false;
   }
 
   final private boolean jj_3_1676() {
-    if (jj_scan_token(QUERY)) return true;
+    if (jj_scan_token(ANALYZE)) return true;
     return false;
   }
 
   final private boolean jj_3_1675() {
-    if (jj_scan_token(SERVICE)) return true;
+    if (jj_scan_token(QUERY)) return true;
     return false;
   }
 
@@ -32374,12 +32360,12 @@ final String p;
   }
 
   final private boolean jj_3_1674() {
-    if (jj_scan_token(KILL)) return true;
+    if (jj_scan_token(SERVICE)) return true;
     return false;
   }
 
   final private boolean jj_3_1673() {
-    if (jj_scan_token(LOGGING)) return true;
+    if (jj_scan_token(KILL)) return true;
     return false;
   }
 
@@ -32390,22 +32376,22 @@ final String p;
   }
 
   final private boolean jj_3_1672() {
-    if (jj_scan_token(ENCRYPTED)) return true;
+    if (jj_scan_token(LOGGING)) return true;
     return false;
   }
 
   final private boolean jj_3_1671() {
-    if (jj_scan_token(CACHE_NAME)) return true;
+    if (jj_scan_token(ENCRYPTED)) return true;
     return false;
   }
 
   final private boolean jj_3_1670() {
-    if (jj_scan_token(ATOMICITY)) return true;
+    if (jj_scan_token(CACHE_NAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1669() {
-    if (jj_scan_token(TEMPLATE)) return true;
+    if (jj_scan_token(ATOMICITY)) return true;
     return false;
   }
 
@@ -32427,32 +32413,32 @@ final String p;
   }
 
   final private boolean jj_3_1668() {
-    if (jj_scan_token(XML)) return true;
+    if (jj_scan_token(TEMPLATE)) return true;
     return false;
   }
 
   final private boolean jj_3_1667() {
-    if (jj_scan_token(WORK)) return true;
+    if (jj_scan_token(XML)) return true;
     return false;
   }
 
   final private boolean jj_3_1666() {
-    if (jj_scan_token(VIEW)) return true;
+    if (jj_scan_token(WORK)) return true;
     return false;
   }
 
   final private boolean jj_3_1665() {
-    if (jj_scan_token(UTF32)) return true;
+    if (jj_scan_token(VIEW)) return true;
     return false;
   }
 
   final private boolean jj_3_1664() {
-    if (jj_scan_token(USER_DEFINED_TYPE_NAME)) return true;
+    if (jj_scan_token(UTF32)) return true;
     return false;
   }
 
   final private boolean jj_3_1663() {
-    if (jj_scan_token(USAGE)) return true;
+    if (jj_scan_token(USER_DEFINED_TYPE_NAME)) return true;
     return false;
   }
 
@@ -32469,7 +32455,7 @@ final String p;
   }
 
   final private boolean jj_3_1662() {
-    if (jj_scan_token(UNDER)) return true;
+    if (jj_scan_token(USAGE)) return true;
     return false;
   }
 
@@ -32480,12 +32466,12 @@ final String p;
   }
 
   final private boolean jj_3_1661() {
-    if (jj_scan_token(UNBOUNDED)) return true;
+    if (jj_scan_token(UNDER)) return true;
     return false;
   }
 
   final private boolean jj_3_1660() {
-    if (jj_scan_token(TRIGGER_SCHEMA)) return true;
+    if (jj_scan_token(UNBOUNDED)) return true;
     return false;
   }
 
@@ -32502,12 +32488,12 @@ final String p;
   }
 
   final private boolean jj_3_1659() {
-    if (jj_scan_token(TRANSFORMS)) return true;
+    if (jj_scan_token(TRIGGER_SCHEMA)) return true;
     return false;
   }
 
   final private boolean jj_3_1658() {
-    if (jj_scan_token(TRANSACTIONS_COMMITTED)) return true;
+    if (jj_scan_token(TRANSFORMS)) return true;
     return false;
   }
 
@@ -32517,7 +32503,7 @@ final String p;
   }
 
   final private boolean jj_3_1657() {
-    if (jj_scan_token(TOP_LEVEL_COUNT)) return true;
+    if (jj_scan_token(TRANSACTIONS_COMMITTED)) return true;
     return false;
   }
 
@@ -32528,22 +32514,22 @@ final String p;
   }
 
   final private boolean jj_3_1656() {
-    if (jj_scan_token(TIMESTAMPDIFF)) return true;
+    if (jj_scan_token(TOP_LEVEL_COUNT)) return true;
     return false;
   }
 
   final private boolean jj_3_1655() {
-    if (jj_scan_token(TIME_DIFF)) return true;
+    if (jj_scan_token(TIMESTAMPDIFF)) return true;
     return false;
   }
 
   final private boolean jj_3_1654() {
-    if (jj_scan_token(TABLE_NAME)) return true;
+    if (jj_scan_token(TIME_DIFF)) return true;
     return false;
   }
 
   final private boolean jj_3_1653() {
-    if (jj_scan_token(STYLE)) return true;
+    if (jj_scan_token(TABLE_NAME)) return true;
     return false;
   }
 
@@ -32554,17 +32540,17 @@ final String p;
   }
 
   final private boolean jj_3_1652() {
-    if (jj_scan_token(STATEMENT)) return true;
+    if (jj_scan_token(STYLE)) return true;
     return false;
   }
 
   final private boolean jj_3_1651() {
-    if (jj_scan_token(SQL_VARBINARY)) return true;
+    if (jj_scan_token(STATEMENT)) return true;
     return false;
   }
 
   final private boolean jj_3_1650() {
-    if (jj_scan_token(SQL_TSI_SECOND)) return true;
+    if (jj_scan_token(SQL_VARBINARY)) return true;
     return false;
   }
 
@@ -32574,7 +32560,7 @@ final String p;
   }
 
   final private boolean jj_3_1649() {
-    if (jj_scan_token(SQL_TSI_MINUTE)) return true;
+    if (jj_scan_token(SQL_TSI_SECOND)) return true;
     return false;
   }
 
@@ -32594,12 +32580,12 @@ final String p;
   }
 
   final private boolean jj_3_1648() {
-    if (jj_scan_token(SQL_TSI_FRAC_SECOND)) return true;
+    if (jj_scan_token(SQL_TSI_MINUTE)) return true;
     return false;
   }
 
   final private boolean jj_3_1647() {
-    if (jj_scan_token(SQL_TIMESTAMP)) return true;
+    if (jj_scan_token(SQL_TSI_FRAC_SECOND)) return true;
     return false;
   }
 
@@ -32615,7 +32601,7 @@ final String p;
   }
 
   final private boolean jj_3_1646() {
-    if (jj_scan_token(SQL_REAL)) return true;
+    if (jj_scan_token(SQL_TIMESTAMP)) return true;
     return false;
   }
 
@@ -32634,22 +32620,22 @@ final String p;
   }
 
   final private boolean jj_3_1645() {
-    if (jj_scan_token(SQL_NCLOB)) return true;
+    if (jj_scan_token(SQL_REAL)) return true;
     return false;
   }
 
   final private boolean jj_3_1644() {
-    if (jj_scan_token(SQL_LONGVARCHAR)) return true;
+    if (jj_scan_token(SQL_NCLOB)) return true;
     return false;
   }
 
   final private boolean jj_3_1643() {
-    if (jj_scan_token(SQL_INTERVAL_YEAR)) return true;
+    if (jj_scan_token(SQL_LONGVARCHAR)) return true;
     return false;
   }
 
   final private boolean jj_3_1642() {
-    if (jj_scan_token(SQL_INTERVAL_MINUTE_TO_SECOND)) return true;
+    if (jj_scan_token(SQL_INTERVAL_YEAR)) return true;
     return false;
   }
 
@@ -32769,7 +32755,7 @@ final String p;
   }
 
   final private boolean jj_3_1641() {
-    if (jj_scan_token(SQL_INTERVAL_HOUR_TO_MINUTE)) return true;
+    if (jj_scan_token(SQL_INTERVAL_MINUTE_TO_SECOND)) return true;
     return false;
   }
 
@@ -32779,27 +32765,27 @@ final String p;
   }
 
   final private boolean jj_3_1640() {
-    if (jj_scan_token(SQL_INTERVAL_DAY_TO_MINUTE)) return true;
+    if (jj_scan_token(SQL_INTERVAL_HOUR_TO_MINUTE)) return true;
     return false;
   }
 
   final private boolean jj_3_1639() {
-    if (jj_scan_token(SQL_INTEGER)) return true;
+    if (jj_scan_token(SQL_INTERVAL_DAY_TO_MINUTE)) return true;
     return false;
   }
 
   final private boolean jj_3_1638() {
-    if (jj_scan_token(SQL_DECIMAL)) return true;
+    if (jj_scan_token(SQL_INTEGER)) return true;
     return false;
   }
 
   final private boolean jj_3_1637() {
-    if (jj_scan_token(SQL_CHAR)) return true;
+    if (jj_scan_token(SQL_DECIMAL)) return true;
     return false;
   }
 
   final private boolean jj_3_1636() {
-    if (jj_scan_token(SQL_BIT)) return true;
+    if (jj_scan_token(SQL_CHAR)) return true;
     return false;
   }
 
@@ -32810,17 +32796,17 @@ final String p;
   }
 
   final private boolean jj_3_1635() {
-    if (jj_scan_token(SPECIFIC_NAME)) return true;
+    if (jj_scan_token(SQL_BIT)) return true;
     return false;
   }
 
   final private boolean jj_3_1634() {
-    if (jj_scan_token(SIZE)) return true;
+    if (jj_scan_token(SPECIFIC_NAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1633() {
-    if (jj_scan_token(SESSION)) return true;
+    if (jj_scan_token(SIZE)) return true;
     return false;
   }
 
@@ -32830,12 +32816,12 @@ final String p;
   }
 
   final private boolean jj_3_1632() {
-    if (jj_scan_token(SERIALIZABLE)) return true;
+    if (jj_scan_token(SESSION)) return true;
     return false;
   }
 
   final private boolean jj_3_1631() {
-    if (jj_scan_token(SELF)) return true;
+    if (jj_scan_token(SERIALIZABLE)) return true;
     return false;
   }
 
@@ -32851,32 +32837,32 @@ final String p;
   }
 
   final private boolean jj_3_1630() {
-    if (jj_scan_token(SECONDS)) return true;
+    if (jj_scan_token(SELF)) return true;
     return false;
   }
 
   final private boolean jj_3_1629() {
-    if (jj_scan_token(SCOPE_CATALOGS)) return true;
+    if (jj_scan_token(SECONDS)) return true;
     return false;
   }
 
   final private boolean jj_3_1628() {
-    if (jj_scan_token(SCALE)) return true;
+    if (jj_scan_token(SCOPE_CATALOGS)) return true;
     return false;
   }
 
   final private boolean jj_3_1627() {
-    if (jj_scan_token(ROUTINE_SCHEMA)) return true;
+    if (jj_scan_token(SCALE)) return true;
     return false;
   }
 
   final private boolean jj_3_1626() {
-    if (jj_scan_token(ROUTINE)) return true;
+    if (jj_scan_token(ROUTINE_SCHEMA)) return true;
     return false;
   }
 
   final private boolean jj_3_1625() {
-    if (jj_scan_token(RETURNING)) return true;
+    if (jj_scan_token(ROUTINE)) return true;
     return false;
   }
 
@@ -32886,22 +32872,22 @@ final String p;
   }
 
   final private boolean jj_3_1624() {
-    if (jj_scan_token(RETURNED_LENGTH)) return true;
+    if (jj_scan_token(RETURNING)) return true;
     return false;
   }
 
   final private boolean jj_3_1623() {
-    if (jj_scan_token(RESTART)) return true;
+    if (jj_scan_token(RETURNED_LENGTH)) return true;
     return false;
   }
 
   final private boolean jj_3_1622() {
-    if (jj_scan_token(REPEATABLE)) return true;
+    if (jj_scan_token(RESTART)) return true;
     return false;
   }
 
   final private boolean jj_3_1621() {
-    if (jj_scan_token(QUARTERS)) return true;
+    if (jj_scan_token(REPEATABLE)) return true;
     return false;
   }
 
@@ -32911,42 +32897,42 @@ final String p;
   }
 
   final private boolean jj_3_1620() {
-    if (jj_scan_token(PRIVILEGES)) return true;
+    if (jj_scan_token(QUARTERS)) return true;
     return false;
   }
 
   final private boolean jj_3_1619() {
-    if (jj_scan_token(PRECEDING)) return true;
+    if (jj_scan_token(PRIVILEGES)) return true;
     return false;
   }
 
   final private boolean jj_3_1618() {
-    if (jj_scan_token(PLACING)) return true;
+    if (jj_scan_token(PRECEDING)) return true;
     return false;
   }
 
   final private boolean jj_3_1617() {
-    if (jj_scan_token(PAST)) return true;
+    if (jj_scan_token(PLACING)) return true;
     return false;
   }
 
   final private boolean jj_3_1616() {
-    if (jj_scan_token(PASCAL)) return true;
+    if (jj_scan_token(PAST)) return true;
     return false;
   }
 
   final private boolean jj_3_1615() {
-    if (jj_scan_token(PARAMETER_SPECIFIC_NAME)) return true;
+    if (jj_scan_token(PASCAL)) return true;
     return false;
   }
 
   final private boolean jj_3_1614() {
-    if (jj_scan_token(PARAMETER_NAME)) return true;
+    if (jj_scan_token(PARAMETER_SPECIFIC_NAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1613() {
-    if (jj_scan_token(OVERRIDING)) return true;
+    if (jj_scan_token(PARAMETER_NAME)) return true;
     return false;
   }
 
@@ -32962,12 +32948,12 @@ final String p;
   }
 
   final private boolean jj_3_1612() {
-    if (jj_scan_token(ORDINALITY)) return true;
+    if (jj_scan_token(OVERRIDING)) return true;
     return false;
   }
 
   final private boolean jj_3_1611() {
-    if (jj_scan_token(OPTION)) return true;
+    if (jj_scan_token(ORDINALITY)) return true;
     return false;
   }
 
@@ -32978,17 +32964,17 @@ final String p;
   }
 
   final private boolean jj_3_1610() {
-    if (jj_scan_token(NUMBER)) return true;
+    if (jj_scan_token(OPTION)) return true;
     return false;
   }
 
   final private boolean jj_3_1609() {
-    if (jj_scan_token(NORMALIZED)) return true;
+    if (jj_scan_token(NUMBER)) return true;
     return false;
   }
 
   final private boolean jj_3_1608() {
-    if (jj_scan_token(NAMES)) return true;
+    if (jj_scan_token(NORMALIZED)) return true;
     return false;
   }
 
@@ -32999,7 +32985,7 @@ final String p;
   }
 
   final private boolean jj_3_1607() {
-    if (jj_scan_token(MORE_)) return true;
+    if (jj_scan_token(NAMES)) return true;
     return false;
   }
 
@@ -33018,17 +33004,17 @@ final String p;
   }
 
   final private boolean jj_3_1606() {
-    if (jj_scan_token(MINUTES)) return true;
+    if (jj_scan_token(MORE_)) return true;
     return false;
   }
 
   final private boolean jj_3_1605() {
-    if (jj_scan_token(MICROSECOND)) return true;
+    if (jj_scan_token(MINUTES)) return true;
     return false;
   }
 
   final private boolean jj_3_1604() {
-    if (jj_scan_token(MESSAGE_LENGTH)) return true;
+    if (jj_scan_token(MICROSECOND)) return true;
     return false;
   }
 
@@ -33038,7 +33024,7 @@ final String p;
   }
 
   final private boolean jj_3_1603() {
-    if (jj_scan_token(MAP)) return true;
+    if (jj_scan_token(MESSAGE_LENGTH)) return true;
     return false;
   }
 
@@ -33054,12 +33040,12 @@ final String p;
   }
 
   final private boolean jj_3_1602() {
-    if (jj_scan_token(LIBRARY)) return true;
+    if (jj_scan_token(MAP)) return true;
     return false;
   }
 
   final private boolean jj_3_1601() {
-    if (jj_scan_token(LAST)) return true;
+    if (jj_scan_token(LIBRARY)) return true;
     return false;
   }
 
@@ -33069,17 +33055,17 @@ final String p;
   }
 
   final private boolean jj_3_1600() {
-    if (jj_scan_token(KEY_MEMBER)) return true;
+    if (jj_scan_token(LAST)) return true;
     return false;
   }
 
   final private boolean jj_3_1599() {
-    if (jj_scan_token(JSON)) return true;
+    if (jj_scan_token(KEY_MEMBER)) return true;
     return false;
   }
 
   final private boolean jj_3_1598() {
-    if (jj_scan_token(ISOLATION)) return true;
+    if (jj_scan_token(JSON)) return true;
     return false;
   }
 
@@ -33089,7 +33075,7 @@ final String p;
   }
 
   final private boolean jj_3_1597() {
-    if (jj_scan_token(INSTANTIABLE)) return true;
+    if (jj_scan_token(ISOLATION)) return true;
     return false;
   }
 
@@ -33098,7 +33084,7 @@ final String p;
   }
 
   final private boolean jj_3_1596() {
-    if (jj_scan_token(INITIALLY)) return true;
+    if (jj_scan_token(INSTANTIABLE)) return true;
     return false;
   }
 
@@ -33108,12 +33094,12 @@ final String p;
   }
 
   final private boolean jj_3_1595() {
-    if (jj_scan_token(INCLUDE)) return true;
+    if (jj_scan_token(INITIALLY)) return true;
     return false;
   }
 
   final private boolean jj_3_1594() {
-    if (jj_scan_token(IMMEDIATE)) return true;
+    if (jj_scan_token(INCLUDE)) return true;
     return false;
   }
 
@@ -33129,12 +33115,12 @@ final String p;
   }
 
   final private boolean jj_3_1593() {
-    if (jj_scan_token(HOURS)) return true;
+    if (jj_scan_token(IMMEDIATE)) return true;
     return false;
   }
 
   final private boolean jj_3_1592() {
-    if (jj_scan_token(GROUP_CONCAT)) return true;
+    if (jj_scan_token(HOURS)) return true;
     return false;
   }
 
@@ -33148,7 +33134,7 @@ final String p;
   }
 
   final private boolean jj_3_1591() {
-    if (jj_scan_token(GO)) return true;
+    if (jj_scan_token(GROUP_CONCAT)) return true;
     return false;
   }
 
@@ -33158,7 +33144,7 @@ final String p;
   }
 
   final private boolean jj_3_1590() {
-    if (jj_scan_token(GENERAL)) return true;
+    if (jj_scan_token(GO)) return true;
     return false;
   }
 
@@ -33176,7 +33162,7 @@ final String p;
   }
 
   final private boolean jj_3_1589() {
-    if (jj_scan_token(FOUND)) return true;
+    if (jj_scan_token(GENERAL)) return true;
     return false;
   }
 
@@ -33188,32 +33174,32 @@ final String p;
   }
 
   final private boolean jj_3_1588() {
-    if (jj_scan_token(FOLLOWING)) return true;
+    if (jj_scan_token(FOUND)) return true;
     return false;
   }
 
   final private boolean jj_3_1587() {
-    if (jj_scan_token(EXCLUDING)) return true;
+    if (jj_scan_token(FOLLOWING)) return true;
     return false;
   }
 
   final private boolean jj_3_1586() {
-    if (jj_scan_token(ERROR)) return true;
+    if (jj_scan_token(EXCLUDING)) return true;
     return false;
   }
 
   final private boolean jj_3_1585() {
-    if (jj_scan_token(DYNAMIC_FUNCTION_CODE)) return true;
+    if (jj_scan_token(ERROR)) return true;
     return false;
   }
 
   final private boolean jj_3_1584() {
-    if (jj_scan_token(DOY)) return true;
+    if (jj_scan_token(DYNAMIC_FUNCTION_CODE)) return true;
     return false;
   }
 
   final private boolean jj_3_1583() {
-    if (jj_scan_token(DISPATCH)) return true;
+    if (jj_scan_token(DOY)) return true;
     return false;
   }
 
@@ -33233,17 +33219,17 @@ final String p;
   }
 
   final private boolean jj_3_1582() {
-    if (jj_scan_token(DESCRIPTION)) return true;
+    if (jj_scan_token(DISPATCH)) return true;
     return false;
   }
 
   final private boolean jj_3_1581() {
-    if (jj_scan_token(DEPTH)) return true;
+    if (jj_scan_token(DESCRIPTION)) return true;
     return false;
   }
 
   final private boolean jj_3_1580() {
-    if (jj_scan_token(DEFINED)) return true;
+    if (jj_scan_token(DEPTH)) return true;
     return false;
   }
 
@@ -33258,12 +33244,12 @@ final String p;
   }
 
   final private boolean jj_3_1579() {
-    if (jj_scan_token(DEFAULTS)) return true;
+    if (jj_scan_token(DEFINED)) return true;
     return false;
   }
 
   final private boolean jj_3_1578() {
-    if (jj_scan_token(DAYOFYEAR)) return true;
+    if (jj_scan_token(DEFAULTS)) return true;
     return false;
   }
 
@@ -33274,7 +33260,7 @@ final String p;
   }
 
   final private boolean jj_3_1577() {
-    if (jj_scan_token(DATETIME_INTERVAL_PRECISION)) return true;
+    if (jj_scan_token(DAYOFYEAR)) return true;
     return false;
   }
 
@@ -33289,27 +33275,27 @@ final String p;
   }
 
   final private boolean jj_3_1576() {
-    if (jj_scan_token(DATE_TRUNC)) return true;
+    if (jj_scan_token(DATETIME_INTERVAL_PRECISION)) return true;
     return false;
   }
 
   final private boolean jj_3_1575() {
-    if (jj_scan_token(DATA)) return true;
+    if (jj_scan_token(DATE_TRUNC)) return true;
     return false;
   }
 
   final private boolean jj_3_1574() {
-    if (jj_scan_token(CONTAINS_SUBSTR)) return true;
+    if (jj_scan_token(DATA)) return true;
     return false;
   }
 
   final private boolean jj_3_1573() {
-    if (jj_scan_token(CONSTRAINTS)) return true;
+    if (jj_scan_token(CONTAINS_SUBSTR)) return true;
     return false;
   }
 
   final private boolean jj_3_1572() {
-    if (jj_scan_token(CONNECTION_NAME)) return true;
+    if (jj_scan_token(CONSTRAINTS)) return true;
     return false;
   }
 
@@ -33339,7 +33325,7 @@ final String p;
   }
 
   final private boolean jj_3_1571() {
-    if (jj_scan_token(CONDITIONAL)) return true;
+    if (jj_scan_token(CONNECTION_NAME)) return true;
     return false;
   }
 
@@ -33350,42 +33336,42 @@ final String p;
   }
 
   final private boolean jj_3_1570() {
-    if (jj_scan_token(COMMAND_FUNCTION)) return true;
+    if (jj_scan_token(CONDITIONAL)) return true;
     return false;
   }
 
   final private boolean jj_3_1569() {
-    if (jj_scan_token(COLLATION_NAME)) return true;
+    if (jj_scan_token(COMMAND_FUNCTION)) return true;
     return false;
   }
 
   final private boolean jj_3_1568() {
-    if (jj_scan_token(COBOL)) return true;
+    if (jj_scan_token(COLLATION_NAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1567() {
-    if (jj_scan_token(CHARACTER_SET_NAME)) return true;
+    if (jj_scan_token(COBOL)) return true;
     return false;
   }
 
   final private boolean jj_3_1566() {
-    if (jj_scan_token(CHARACTERISTICS)) return true;
+    if (jj_scan_token(CHARACTER_SET_NAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1565() {
-    if (jj_scan_token(CATALOG_NAME)) return true;
+    if (jj_scan_token(CHARACTERISTICS)) return true;
     return false;
   }
 
   final private boolean jj_3_1564() {
-    if (jj_scan_token(C)) return true;
+    if (jj_scan_token(CATALOG_NAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1563() {
-    if (jj_scan_token(BEFORE)) return true;
+    if (jj_scan_token(C)) return true;
     return false;
   }
 
@@ -33395,7 +33381,7 @@ final String p;
   }
 
   final private boolean jj_3_1562() {
-    if (jj_scan_token(ASSIGNMENT)) return true;
+    if (jj_scan_token(BEFORE)) return true;
     return false;
   }
 
@@ -33405,12 +33391,12 @@ final String p;
   }
 
   final private boolean jj_3_1561() {
-    if (jj_scan_token(ARRAY_CONCAT_AGG)) return true;
+    if (jj_scan_token(ASSIGNMENT)) return true;
     return false;
   }
 
   final private boolean jj_3_1560() {
-    if (jj_scan_token(ALWAYS)) return true;
+    if (jj_scan_token(ARRAY_CONCAT_AGG)) return true;
     return false;
   }
 
@@ -33419,11 +33405,16 @@ final String p;
   }
 
   final private boolean jj_3_1559() {
-    if (jj_scan_token(ADD)) return true;
+    if (jj_scan_token(ALWAYS)) return true;
     return false;
   }
 
   final private boolean jj_3_1558() {
+    if (jj_scan_token(ADD)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_1557() {
     if (jj_scan_token(ABSOLUTE)) return true;
     return false;
   }
@@ -33455,9 +33446,19 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_322() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_321()) jj_scanpos = xsp;
+    if (jj_3R_85()) return true;
+    return false;
+  }
+
   final private boolean jj_3R_341() {
     Token xsp;
     xsp = jj_scanpos;
+    if (jj_3_1557()) {
+    jj_scanpos = xsp;
     if (jj_3_1558()) {
     jj_scanpos = xsp;
     if (jj_3_1559()) {
@@ -33892,9 +33893,7 @@ final String p;
     jj_scanpos = xsp;
     if (jj_3_1774()) {
     jj_scanpos = xsp;
-    if (jj_3_1775()) {
-    jj_scanpos = xsp;
-    if (jj_3_1776()) return true;
+    if (jj_3_1775()) return true;
     }
     }
     }
@@ -34116,14 +34115,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_322() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_321()) jj_scanpos = xsp;
-    if (jj_3R_85()) return true;
-    return false;
-  }
-
   final private boolean jj_3_6() {
     if (jj_3R_72()) return true;
     return false;
@@ -34141,11 +34132,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_1557() {
-    if (jj_scan_token(FRIDAY)) return true;
-    return false;
-  }
-
   final private boolean jj_3R_187() {
     if (jj_3R_161()) return true;
     Token xsp;
@@ -34158,7 +34144,7 @@ final String p;
   }
 
   final private boolean jj_3_1556() {
-    if (jj_scan_token(TUESDAY)) return true;
+    if (jj_scan_token(SATURDAY)) return true;
     return false;
   }
 
@@ -34181,12 +34167,12 @@ final String p;
   }
 
   final private boolean jj_3_1555() {
-    if (jj_scan_token(WITHOUT)) return true;
+    if (jj_scan_token(WEDNESDAY)) return true;
     return false;
   }
 
   final private boolean jj_3_1554() {
-    if (jj_scan_token(WIDTH_BUCKET)) return true;
+    if (jj_scan_token(YEAR)) return true;
     return false;
   }
 
@@ -34208,7 +34194,7 @@ final String p;
   }
 
   final private boolean jj_3_1553() {
-    if (jj_scan_token(VAR_SAMP)) return true;
+    if (jj_scan_token(WINDOW)) return true;
     return false;
   }
 
@@ -34218,7 +34204,7 @@ final String p;
   }
 
   final private boolean jj_3_1552() {
-    if (jj_scan_token(VARCHAR)) return true;
+    if (jj_scan_token(VERSIONING)) return true;
     return false;
   }
 
@@ -34228,32 +34214,32 @@ final String p;
   }
 
   final private boolean jj_3_1551() {
-    if (jj_scan_token(VALUE)) return true;
+    if (jj_scan_token(VARYING)) return true;
     return false;
   }
 
   final private boolean jj_3_1550() {
-    if (jj_scan_token(UNNEST)) return true;
+    if (jj_scan_token(VALUE_OF)) return true;
     return false;
   }
 
   final private boolean jj_3_1549() {
-    if (jj_scan_token(UESCAPE)) return true;
+    if (jj_scan_token(UPPER)) return true;
     return false;
   }
 
   final private boolean jj_3_1548() {
-    if (jj_scan_token(TRIM_ARRAY)) return true;
+    if (jj_scan_token(UESCAPE)) return true;
     return false;
   }
 
   final private boolean jj_3_1547() {
-    if (jj_scan_token(TREAT)) return true;
+    if (jj_scan_token(TRIM_ARRAY)) return true;
     return false;
   }
 
   final private boolean jj_3_1546() {
-    if (jj_scan_token(TRANSLATE)) return true;
+    if (jj_scan_token(TREAT)) return true;
     return false;
   }
 
@@ -34276,7 +34262,7 @@ final String p;
   }
 
   final private boolean jj_3_1545() {
-    if (jj_scan_token(TIMEZONE_HOUR)) return true;
+    if (jj_scan_token(TRANSLATE)) return true;
     return false;
   }
 
@@ -34286,12 +34272,12 @@ final String p;
   }
 
   final private boolean jj_3_1544() {
-    if (jj_scan_token(TABLESAMPLE)) return true;
+    if (jj_scan_token(TIMEZONE_HOUR)) return true;
     return false;
   }
 
   final private boolean jj_3_1543() {
-    if (jj_scan_token(SYSTEM)) return true;
+    if (jj_scan_token(TABLESAMPLE)) return true;
     return false;
   }
 
@@ -34301,22 +34287,22 @@ final String p;
   }
 
   final private boolean jj_3_1542() {
-    if (jj_scan_token(SUBSTRING_REGEX)) return true;
+    if (jj_scan_token(SYSTEM)) return true;
     return false;
   }
 
   final private boolean jj_3_1541() {
-    if (jj_scan_token(SUBMULTISET)) return true;
+    if (jj_scan_token(SUBSTRING_REGEX)) return true;
     return false;
   }
 
   final private boolean jj_3_1540() {
-    if (jj_scan_token(STDDEV_POP)) return true;
+    if (jj_scan_token(SUBMULTISET)) return true;
     return false;
   }
 
   final private boolean jj_3_1539() {
-    if (jj_scan_token(SQRT)) return true;
+    if (jj_scan_token(STDDEV_POP)) return true;
     return false;
   }
 
@@ -34327,12 +34313,12 @@ final String p;
   }
 
   final private boolean jj_3_1538() {
-    if (jj_scan_token(SQLEXCEPTION)) return true;
+    if (jj_scan_token(SQRT)) return true;
     return false;
   }
 
   final private boolean jj_3_1537() {
-    if (jj_scan_token(SPECIFIC)) return true;
+    if (jj_scan_token(SQLEXCEPTION)) return true;
     return false;
   }
 
@@ -34347,7 +34333,7 @@ final String p;
   }
 
   final private boolean jj_3_1536() {
-    if (jj_scan_token(SIMILAR)) return true;
+    if (jj_scan_token(SPECIFIC)) return true;
     return false;
   }
 
@@ -34357,7 +34343,7 @@ final String p;
   }
 
   final private boolean jj_3_1535() {
-    if (jj_scan_token(SENSITIVE)) return true;
+    if (jj_scan_token(SIMILAR)) return true;
     return false;
   }
 
@@ -34367,7 +34353,7 @@ final String p;
   }
 
   final private boolean jj_3_1534() {
-    if (jj_scan_token(SEARCH)) return true;
+    if (jj_scan_token(SENSITIVE)) return true;
     return false;
   }
 
@@ -34377,22 +34363,22 @@ final String p;
   }
 
   final private boolean jj_3_1533() {
-    if (jj_scan_token(SAVEPOINT)) return true;
+    if (jj_scan_token(SEARCH)) return true;
     return false;
   }
 
   final private boolean jj_3_1532() {
-    if (jj_scan_token(SAFE_CAST)) return true;
+    if (jj_scan_token(SAVEPOINT)) return true;
     return false;
   }
 
   final private boolean jj_3_1531() {
-    if (jj_scan_token(ROWS)) return true;
+    if (jj_scan_token(SAFE_CAST)) return true;
     return false;
   }
 
   final private boolean jj_3_1530() {
-    if (jj_scan_token(REVOKE)) return true;
+    if (jj_scan_token(ROWS)) return true;
     return false;
   }
 
@@ -34403,7 +34389,7 @@ final String p;
   }
 
   final private boolean jj_3_1529() {
-    if (jj_scan_token(RESULT)) return true;
+    if (jj_scan_token(REVOKE)) return true;
     return false;
   }
 
@@ -34413,7 +34399,7 @@ final String p;
   }
 
   final private boolean jj_3_1528() {
-    if (jj_scan_token(REGR_SYY)) return true;
+    if (jj_scan_token(RESULT)) return true;
     return false;
   }
 
@@ -34433,22 +34419,22 @@ final String p;
   }
 
   final private boolean jj_3_1527() {
-    if (jj_scan_token(REGR_SLOPE)) return true;
+    if (jj_scan_token(REGR_SYY)) return true;
     return false;
   }
 
   final private boolean jj_3_1526() {
-    if (jj_scan_token(REGR_COUNT)) return true;
+    if (jj_scan_token(REGR_SLOPE)) return true;
     return false;
   }
 
   final private boolean jj_3_1525() {
-    if (jj_scan_token(REFERENCING)) return true;
+    if (jj_scan_token(REGR_COUNT)) return true;
     return false;
   }
 
   final private boolean jj_3_1524() {
-    if (jj_scan_token(RECURSIVE)) return true;
+    if (jj_scan_token(REFERENCING)) return true;
     return false;
   }
 
@@ -34466,27 +34452,27 @@ final String p;
   }
 
   final private boolean jj_3_1523() {
-    if (jj_scan_token(RANK)) return true;
+    if (jj_scan_token(RECURSIVE)) return true;
     return false;
   }
 
   final private boolean jj_3_1522() {
-    if (jj_scan_token(PROCEDURE)) return true;
+    if (jj_scan_token(RANK)) return true;
     return false;
   }
 
   final private boolean jj_3_1521() {
-    if (jj_scan_token(PRECISION)) return true;
+    if (jj_scan_token(PROCEDURE)) return true;
     return false;
   }
 
   final private boolean jj_3_1520() {
-    if (jj_scan_token(POSITION_REGEX)) return true;
+    if (jj_scan_token(PRECISION)) return true;
     return false;
   }
 
   final private boolean jj_3_1519() {
-    if (jj_scan_token(PERMUTE)) return true;
+    if (jj_scan_token(POSITION_REGEX)) return true;
     return false;
   }
 
@@ -34496,32 +34482,32 @@ final String p;
   }
 
   final private boolean jj_3_1518() {
-    if (jj_scan_token(PERCENTILE_DISC)) return true;
+    if (jj_scan_token(PERMUTE)) return true;
     return false;
   }
 
   final private boolean jj_3_1517() {
-    if (jj_scan_token(PER)) return true;
+    if (jj_scan_token(PERCENTILE_DISC)) return true;
     return false;
   }
 
   final private boolean jj_3_1516() {
-    if (jj_scan_token(OVERLAY)) return true;
+    if (jj_scan_token(PER)) return true;
     return false;
   }
 
   final private boolean jj_3_1515() {
-    if (jj_scan_token(OUT)) return true;
+    if (jj_scan_token(OVERLAY)) return true;
     return false;
   }
 
   final private boolean jj_3_1514() {
-    if (jj_scan_token(ONLY)) return true;
+    if (jj_scan_token(OUT)) return true;
     return false;
   }
 
   final private boolean jj_3_1513() {
-    if (jj_scan_token(OLD)) return true;
+    if (jj_scan_token(ONLY)) return true;
     return false;
   }
 
@@ -34532,52 +34518,52 @@ final String p;
   }
 
   final private boolean jj_3_1512() {
-    if (jj_scan_token(OCCURRENCES_REGEX)) return true;
+    if (jj_scan_token(OLD)) return true;
     return false;
   }
 
   final private boolean jj_3_1511() {
-    if (jj_scan_token(NTILE)) return true;
+    if (jj_scan_token(OCCURRENCES_REGEX)) return true;
     return false;
   }
 
   final private boolean jj_3_1510() {
-    if (jj_scan_token(NONE)) return true;
+    if (jj_scan_token(NTILE)) return true;
     return false;
   }
 
   final private boolean jj_3_1509() {
-    if (jj_scan_token(NEW)) return true;
+    if (jj_scan_token(NONE)) return true;
     return false;
   }
 
   final private boolean jj_3_1508() {
-    if (jj_scan_token(NATIONAL)) return true;
+    if (jj_scan_token(NEW)) return true;
     return false;
   }
 
   final private boolean jj_3_1507() {
-    if (jj_scan_token(MODULE)) return true;
+    if (jj_scan_token(NATIONAL)) return true;
     return false;
   }
 
   final private boolean jj_3_1506() {
-    if (jj_scan_token(MINUTE)) return true;
+    if (jj_scan_token(MODULE)) return true;
     return false;
   }
 
   final private boolean jj_3_1505() {
-    if (jj_scan_token(MEMBER)) return true;
+    if (jj_scan_token(MINUTE)) return true;
     return false;
   }
 
   final private boolean jj_3_1504() {
-    if (jj_scan_token(MATCH_RECOGNIZE)) return true;
+    if (jj_scan_token(MEMBER)) return true;
     return false;
   }
 
   final private boolean jj_3_1503() {
-    if (jj_scan_token(MATCH)) return true;
+    if (jj_scan_token(MATCH_RECOGNIZE)) return true;
     return false;
   }
 
@@ -34589,47 +34575,47 @@ final String p;
   }
 
   final private boolean jj_3_1502() {
-    if (jj_scan_token(LN)) return true;
+    if (jj_scan_token(MATCH)) return true;
     return false;
   }
 
   final private boolean jj_3_1501() {
-    if (jj_scan_token(LATERAL)) return true;
+    if (jj_scan_token(LN)) return true;
     return false;
   }
 
   final private boolean jj_3_1500() {
-    if (jj_scan_token(LANGUAGE)) return true;
+    if (jj_scan_token(LATERAL)) return true;
     return false;
   }
 
   final private boolean jj_3_1499() {
-    if (jj_scan_token(JSON_SCOPE)) return true;
+    if (jj_scan_token(LANGUAGE)) return true;
     return false;
   }
 
   final private boolean jj_3_1498() {
-    if (jj_scan_token(JSON_OBJECT)) return true;
+    if (jj_scan_token(JSON_SCOPE)) return true;
     return false;
   }
 
   final private boolean jj_3_1497() {
-    if (jj_scan_token(JSON_ARRAY)) return true;
+    if (jj_scan_token(JSON_OBJECT)) return true;
     return false;
   }
 
   final private boolean jj_3_1496() {
-    if (jj_scan_token(INT)) return true;
+    if (jj_scan_token(JSON_ARRAY)) return true;
     return false;
   }
 
   final private boolean jj_3_1495() {
-    if (jj_scan_token(INITIAL)) return true;
+    if (jj_scan_token(INT)) return true;
     return false;
   }
 
   final private boolean jj_3_1494() {
-    if (jj_scan_token(IDENTITY)) return true;
+    if (jj_scan_token(INITIAL)) return true;
     return false;
   }
 
@@ -34639,12 +34625,12 @@ final String p;
   }
 
   final private boolean jj_3_1493() {
-    if (jj_scan_token(GROUPS)) return true;
+    if (jj_scan_token(IDENTITY)) return true;
     return false;
   }
 
   final private boolean jj_3_1492() {
-    if (jj_scan_token(GLOBAL)) return true;
+    if (jj_scan_token(GROUPS)) return true;
     return false;
   }
 
@@ -34654,12 +34640,12 @@ final String p;
   }
 
   final private boolean jj_3_1491() {
-    if (jj_scan_token(FUNCTION)) return true;
+    if (jj_scan_token(GLOBAL)) return true;
     return false;
   }
 
   final private boolean jj_3_1490() {
-    if (jj_scan_token(FOREIGN)) return true;
+    if (jj_scan_token(FUNCTION)) return true;
     return false;
   }
 
@@ -34671,7 +34657,7 @@ final String p;
   }
 
   final private boolean jj_3_1489() {
-    if (jj_scan_token(FIRST_VALUE)) return true;
+    if (jj_scan_token(FOREIGN)) return true;
     return false;
   }
 
@@ -34690,12 +34676,12 @@ final String p;
   }
 
   final private boolean jj_3_1488() {
-    if (jj_scan_token(EXTERNAL)) return true;
+    if (jj_scan_token(FIRST_VALUE)) return true;
     return false;
   }
 
   final private boolean jj_3_1487() {
-    if (jj_scan_token(EXECUTE)) return true;
+    if (jj_scan_token(EXTERNAL)) return true;
     return false;
   }
 
@@ -34706,17 +34692,17 @@ final String p;
   }
 
   final private boolean jj_3_1486() {
-    if (jj_scan_token(ESCAPE)) return true;
+    if (jj_scan_token(EXECUTE)) return true;
     return false;
   }
 
   final private boolean jj_3_1485() {
-    if (jj_scan_token(END_FRAME)) return true;
+    if (jj_scan_token(ESCAPE)) return true;
     return false;
   }
 
   final private boolean jj_3_1484() {
-    if (jj_scan_token(EMPTY)) return true;
+    if (jj_scan_token(END_FRAME)) return true;
     return false;
   }
 
@@ -34726,22 +34712,22 @@ final String p;
   }
 
   final private boolean jj_3_1483() {
-    if (jj_scan_token(DYNAMIC)) return true;
+    if (jj_scan_token(EMPTY)) return true;
     return false;
   }
 
   final private boolean jj_3_1482() {
-    if (jj_scan_token(DISALLOW)) return true;
+    if (jj_scan_token(DYNAMIC)) return true;
     return false;
   }
 
   final private boolean jj_3_1481() {
-    if (jj_scan_token(DEREF)) return true;
+    if (jj_scan_token(DISALLOW)) return true;
     return false;
   }
 
   final private boolean jj_3_1480() {
-    if (jj_scan_token(DECLARE)) return true;
+    if (jj_scan_token(DEREF)) return true;
     return false;
   }
 
@@ -34756,52 +34742,52 @@ final String p;
   }
 
   final private boolean jj_3_1479() {
-    if (jj_scan_token(DEALLOCATE)) return true;
+    if (jj_scan_token(DECLARE)) return true;
     return false;
   }
 
   final private boolean jj_3_1478() {
-    if (jj_scan_token(DATE)) return true;
+    if (jj_scan_token(DEALLOCATE)) return true;
     return false;
   }
 
   final private boolean jj_3_1477() {
-    if (jj_scan_token(CURRENT_TRANSFORM_GROUP_FOR_TYPE)) return true;
+    if (jj_scan_token(DATE)) return true;
     return false;
   }
 
   final private boolean jj_3_1476() {
-    if (jj_scan_token(CURRENT_PATH)) return true;
+    if (jj_scan_token(CURRENT_TRANSFORM_GROUP_FOR_TYPE)) return true;
     return false;
   }
 
   final private boolean jj_3_1475() {
-    if (jj_scan_token(CURRENT)) return true;
+    if (jj_scan_token(CURRENT_PATH)) return true;
     return false;
   }
 
   final private boolean jj_3_1474() {
-    if (jj_scan_token(COVAR_SAMP)) return true;
+    if (jj_scan_token(CURRENT)) return true;
     return false;
   }
 
   final private boolean jj_3_1473() {
-    if (jj_scan_token(CORRESPONDING)) return true;
+    if (jj_scan_token(COVAR_SAMP)) return true;
     return false;
   }
 
   final private boolean jj_3_1472() {
-    if (jj_scan_token(CONTAINS)) return true;
+    if (jj_scan_token(CORRESPONDING)) return true;
     return false;
   }
 
   final private boolean jj_3_1471() {
-    if (jj_scan_token(COMMIT)) return true;
+    if (jj_scan_token(CONTAINS)) return true;
     return false;
   }
 
   final private boolean jj_3_1470() {
-    if (jj_scan_token(COALESCE)) return true;
+    if (jj_scan_token(COMMIT)) return true;
     return false;
   }
 
@@ -34811,52 +34797,52 @@ final String p;
   }
 
   final private boolean jj_3_1469() {
-    if (jj_scan_token(CLASSIFIER)) return true;
+    if (jj_scan_token(COALESCE)) return true;
     return false;
   }
 
   final private boolean jj_3_1468() {
-    if (jj_scan_token(CHARACTER_LENGTH)) return true;
+    if (jj_scan_token(CLASSIFIER)) return true;
     return false;
   }
 
   final private boolean jj_3_1467() {
-    if (jj_scan_token(CEILING)) return true;
+    if (jj_scan_token(CHARACTER_LENGTH)) return true;
     return false;
   }
 
   final private boolean jj_3_1466() {
-    if (jj_scan_token(CARDINALITY)) return true;
+    if (jj_scan_token(CEILING)) return true;
     return false;
   }
 
   final private boolean jj_3_1465() {
-    if (jj_scan_token(BOOLEAN)) return true;
+    if (jj_scan_token(CARDINALITY)) return true;
     return false;
   }
 
   final private boolean jj_3_1464() {
-    if (jj_scan_token(BINARY)) return true;
+    if (jj_scan_token(BOOLEAN)) return true;
     return false;
   }
 
   final private boolean jj_3_1463() {
-    if (jj_scan_token(BEGIN_FRAME)) return true;
+    if (jj_scan_token(BINARY)) return true;
     return false;
   }
 
   final private boolean jj_3_1462() {
-    if (jj_scan_token(AUTHORIZATION)) return true;
+    if (jj_scan_token(BEGIN_FRAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1461() {
-    if (jj_scan_token(ASENSITIVE)) return true;
+    if (jj_scan_token(AUTHORIZATION)) return true;
     return false;
   }
 
   final private boolean jj_3_1460() {
-    if (jj_scan_token(ALLOW)) return true;
+    if (jj_scan_token(ASENSITIVE)) return true;
     return false;
   }
 
@@ -34872,12 +34858,12 @@ final String p;
   }
 
   final private boolean jj_3_1459() {
-    if (jj_scan_token(TOTAL)) return true;
+    if (jj_scan_token(ALLOW)) return true;
     return false;
   }
 
   final private boolean jj_3_1458() {
-    if (jj_scan_token(REFRESH)) return true;
+    if (jj_scan_token(TOTAL)) return true;
     return false;
   }
 
@@ -34887,57 +34873,57 @@ final String p;
   }
 
   final private boolean jj_3_1457() {
-    if (jj_scan_token(ASYNC)) return true;
+    if (jj_scan_token(REFRESH)) return true;
     return false;
   }
 
   final private boolean jj_3_1456() {
-    if (jj_scan_token(CONTINUOUS)) return true;
+    if (jj_scan_token(ASYNC)) return true;
     return false;
   }
 
   final private boolean jj_3_1455() {
-    if (jj_scan_token(PASSWORD)) return true;
+    if (jj_scan_token(CONTINUOUS)) return true;
     return false;
   }
 
   final private boolean jj_3_1454() {
-    if (jj_scan_token(INLINE_SIZE)) return true;
+    if (jj_scan_token(PASSWORD)) return true;
     return false;
   }
 
   final private boolean jj_3_1453() {
-    if (jj_scan_token(VALUE_TYPE)) return true;
+    if (jj_scan_token(INLINE_SIZE)) return true;
     return false;
   }
 
   final private boolean jj_3_1452() {
-    if (jj_scan_token(CACHE_GROUP)) return true;
+    if (jj_scan_token(VALUE_TYPE)) return true;
     return false;
   }
 
   final private boolean jj_3_1451() {
-    if (jj_scan_token(AFFINITY_KEY)) return true;
+    if (jj_scan_token(CACHE_GROUP)) return true;
     return false;
   }
 
   final private boolean jj_3_1450() {
-    if (jj_scan_token(ZONE)) return true;
+    if (jj_scan_token(AFFINITY_KEY)) return true;
     return false;
   }
 
   final private boolean jj_3_1449() {
-    if (jj_scan_token(WRITE)) return true;
+    if (jj_scan_token(ZONE)) return true;
     return false;
   }
 
   final private boolean jj_3_1448() {
-    if (jj_scan_token(WEEKS)) return true;
+    if (jj_scan_token(WRITE)) return true;
     return false;
   }
 
   final private boolean jj_3_1447() {
-    if (jj_scan_token(VERSION)) return true;
+    if (jj_scan_token(WEEKS)) return true;
     return false;
   }
 
@@ -34948,7 +34934,7 @@ final String p;
   }
 
   final private boolean jj_3_1446() {
-    if (jj_scan_token(UTF16)) return true;
+    if (jj_scan_token(VERSION)) return true;
     return false;
   }
 
@@ -34957,12 +34943,12 @@ final String p;
   }
 
   final private boolean jj_3_1445() {
-    if (jj_scan_token(USER_DEFINED_TYPE_CODE)) return true;
+    if (jj_scan_token(UTF16)) return true;
     return false;
   }
 
   final private boolean jj_3_1444() {
-    if (jj_scan_token(UNNAMED)) return true;
+    if (jj_scan_token(USER_DEFINED_TYPE_CODE)) return true;
     return false;
   }
 
@@ -34977,7 +34963,7 @@ final String p;
   }
 
   final private boolean jj_3_1443() {
-    if (jj_scan_token(UNCONDITIONAL)) return true;
+    if (jj_scan_token(UNNAMED)) return true;
     return false;
   }
 
@@ -34988,7 +34974,7 @@ final String p;
   }
 
   final private boolean jj_3_1442() {
-    if (jj_scan_token(TYPE)) return true;
+    if (jj_scan_token(UNCONDITIONAL)) return true;
     return false;
   }
 
@@ -35009,27 +34995,27 @@ final String p;
   }
 
   final private boolean jj_3_1441() {
-    if (jj_scan_token(TRIGGER_NAME)) return true;
+    if (jj_scan_token(TYPE)) return true;
     return false;
   }
 
   final private boolean jj_3_1440() {
-    if (jj_scan_token(TRANSFORM)) return true;
+    if (jj_scan_token(TRIGGER_NAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1439() {
-    if (jj_scan_token(TRANSACTIONS_ACTIVE)) return true;
+    if (jj_scan_token(TRANSFORM)) return true;
     return false;
   }
 
   final private boolean jj_3_1438() {
-    if (jj_scan_token(TIMESTAMP_TRUNC)) return true;
+    if (jj_scan_token(TRANSACTIONS_ACTIVE)) return true;
     return false;
   }
 
   final private boolean jj_3_1437() {
-    if (jj_scan_token(TIMESTAMPADD)) return true;
+    if (jj_scan_token(TIMESTAMP_TRUNC)) return true;
     return false;
   }
 
@@ -35039,7 +35025,7 @@ final String p;
   }
 
   final private boolean jj_3_1436() {
-    if (jj_scan_token(TIES)) return true;
+    if (jj_scan_token(TIMESTAMPADD)) return true;
     return false;
   }
 
@@ -35059,17 +35045,17 @@ final String p;
   }
 
   final private boolean jj_3_1435() {
-    if (jj_scan_token(SUBSTITUTE)) return true;
+    if (jj_scan_token(TIES)) return true;
     return false;
   }
 
   final private boolean jj_3_1434() {
-    if (jj_scan_token(STRUCTURE)) return true;
+    if (jj_scan_token(SUBSTITUTE)) return true;
     return false;
   }
 
   final private boolean jj_3_1433() {
-    if (jj_scan_token(STATE)) return true;
+    if (jj_scan_token(STRUCTURE)) return true;
     return false;
   }
 
@@ -35080,12 +35066,12 @@ final String p;
   }
 
   final private boolean jj_3_1432() {
-    if (jj_scan_token(SQL_TSI_YEAR)) return true;
+    if (jj_scan_token(STATE)) return true;
     return false;
   }
 
   final private boolean jj_3_1431() {
-    if (jj_scan_token(SQL_TSI_QUARTER)) return true;
+    if (jj_scan_token(SQL_TSI_YEAR)) return true;
     return false;
   }
 
@@ -35105,62 +35091,62 @@ final String p;
   }
 
   final private boolean jj_3_1430() {
-    if (jj_scan_token(SQL_TSI_MICROSECOND)) return true;
+    if (jj_scan_token(SQL_TSI_QUARTER)) return true;
     return false;
   }
 
   final private boolean jj_3_1429() {
-    if (jj_scan_token(SQL_TSI_DAY)) return true;
+    if (jj_scan_token(SQL_TSI_MICROSECOND)) return true;
     return false;
   }
 
   final private boolean jj_3_1428() {
-    if (jj_scan_token(SQL_TIME)) return true;
+    if (jj_scan_token(SQL_TSI_DAY)) return true;
     return false;
   }
 
   final private boolean jj_3_1427() {
-    if (jj_scan_token(SQL_NVARCHAR)) return true;
+    if (jj_scan_token(SQL_TIME)) return true;
     return false;
   }
 
   final private boolean jj_3_1426() {
-    if (jj_scan_token(SQL_NCHAR)) return true;
+    if (jj_scan_token(SQL_NVARCHAR)) return true;
     return false;
   }
 
   final private boolean jj_3_1425() {
-    if (jj_scan_token(SQL_LONGVARBINARY)) return true;
+    if (jj_scan_token(SQL_NCHAR)) return true;
     return false;
   }
 
   final private boolean jj_3_1424() {
-    if (jj_scan_token(SQL_INTERVAL_SECOND)) return true;
+    if (jj_scan_token(SQL_LONGVARBINARY)) return true;
     return false;
   }
 
   final private boolean jj_3_1423() {
-    if (jj_scan_token(SQL_INTERVAL_MINUTE)) return true;
+    if (jj_scan_token(SQL_INTERVAL_SECOND)) return true;
     return false;
   }
 
   final private boolean jj_3_1422() {
-    if (jj_scan_token(SQL_INTERVAL_HOUR)) return true;
+    if (jj_scan_token(SQL_INTERVAL_MINUTE)) return true;
     return false;
   }
 
   final private boolean jj_3_1421() {
-    if (jj_scan_token(SQL_INTERVAL_DAY_TO_HOUR)) return true;
+    if (jj_scan_token(SQL_INTERVAL_HOUR)) return true;
     return false;
   }
 
   final private boolean jj_3_1420() {
-    if (jj_scan_token(SQL_FLOAT)) return true;
+    if (jj_scan_token(SQL_INTERVAL_DAY_TO_HOUR)) return true;
     return false;
   }
 
   final private boolean jj_3_1419() {
-    if (jj_scan_token(SQL_DATE)) return true;
+    if (jj_scan_token(SQL_FLOAT)) return true;
     return false;
   }
 
@@ -35177,12 +35163,12 @@ final String p;
   }
 
   final private boolean jj_3_1418() {
-    if (jj_scan_token(SQL_BOOLEAN)) return true;
+    if (jj_scan_token(SQL_DATE)) return true;
     return false;
   }
 
   final private boolean jj_3_1417() {
-    if (jj_scan_token(SQL_BINARY)) return true;
+    if (jj_scan_token(SQL_BOOLEAN)) return true;
     return false;
   }
 
@@ -35192,57 +35178,57 @@ final String p;
   }
 
   final private boolean jj_3_1416() {
-    if (jj_scan_token(SPACE)) return true;
+    if (jj_scan_token(SQL_BINARY)) return true;
     return false;
   }
 
   final private boolean jj_3_1415() {
-    if (jj_scan_token(SIMPLE)) return true;
+    if (jj_scan_token(SPACE)) return true;
     return false;
   }
 
   final private boolean jj_3_1414() {
-    if (jj_scan_token(SERVER_NAME)) return true;
+    if (jj_scan_token(SIMPLE)) return true;
     return false;
   }
 
   final private boolean jj_3_1413() {
-    if (jj_scan_token(SEQUENCE)) return true;
+    if (jj_scan_token(SERVER_NAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1412() {
-    if (jj_scan_token(SECURITY)) return true;
+    if (jj_scan_token(SEQUENCE)) return true;
     return false;
   }
 
   final private boolean jj_3_1411() {
-    if (jj_scan_token(SCOPE_SCHEMA)) return true;
+    if (jj_scan_token(SECURITY)) return true;
     return false;
   }
 
   final private boolean jj_3_1410() {
-    if (jj_scan_token(SCHEMA_NAME)) return true;
+    if (jj_scan_token(SCOPE_SCHEMA)) return true;
     return false;
   }
 
   final private boolean jj_3_1409() {
-    if (jj_scan_token(SCALAR)) return true;
+    if (jj_scan_token(SCHEMA_NAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1408() {
-    if (jj_scan_token(ROUTINE_NAME)) return true;
+    if (jj_scan_token(SCALAR)) return true;
     return false;
   }
 
   final private boolean jj_3_1407() {
-    if (jj_scan_token(ROLE)) return true;
+    if (jj_scan_token(ROUTINE_NAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1406() {
-    if (jj_scan_token(RETURNED_SQLSTATE)) return true;
+    if (jj_scan_token(ROLE)) return true;
     return false;
   }
 
@@ -35252,12 +35238,12 @@ final String p;
   }
 
   final private boolean jj_3_1405() {
-    if (jj_scan_token(RETURNED_CARDINALITY)) return true;
+    if (jj_scan_token(RETURNED_SQLSTATE)) return true;
     return false;
   }
 
   final private boolean jj_3_1404() {
-    if (jj_scan_token(RESPECT)) return true;
+    if (jj_scan_token(RETURNED_CARDINALITY)) return true;
     return false;
   }
 
@@ -35267,7 +35253,7 @@ final String p;
   }
 
   final private boolean jj_3_1403() {
-    if (jj_scan_token(RELATIVE)) return true;
+    if (jj_scan_token(RESPECT)) return true;
     return false;
   }
 
@@ -35278,17 +35264,17 @@ final String p;
   }
 
   final private boolean jj_3_1402() {
-    if (jj_scan_token(QUARTER)) return true;
+    if (jj_scan_token(RELATIVE)) return true;
     return false;
   }
 
   final private boolean jj_3_1401() {
-    if (jj_scan_token(PRIOR)) return true;
+    if (jj_scan_token(QUARTER)) return true;
     return false;
   }
 
   final private boolean jj_3_1400() {
-    if (jj_scan_token(PLI)) return true;
+    if (jj_scan_token(PRIOR)) return true;
     return false;
   }
 
@@ -35303,47 +35289,47 @@ final String p;
   }
 
   final private boolean jj_3_1399() {
-    if (jj_scan_token(PIVOT)) return true;
+    if (jj_scan_token(PLI)) return true;
     return false;
   }
 
   final private boolean jj_3_1398() {
-    if (jj_scan_token(PASSTHROUGH)) return true;
+    if (jj_scan_token(PIVOT)) return true;
     return false;
   }
 
   final private boolean jj_3_1397() {
-    if (jj_scan_token(PARTIAL)) return true;
+    if (jj_scan_token(PASSTHROUGH)) return true;
     return false;
   }
 
   final private boolean jj_3_1396() {
-    if (jj_scan_token(PARAMETER_SPECIFIC_CATALOG)) return true;
+    if (jj_scan_token(PARTIAL)) return true;
     return false;
   }
 
   final private boolean jj_3_1395() {
-    if (jj_scan_token(PARAMETER_MODE)) return true;
+    if (jj_scan_token(PARAMETER_SPECIFIC_CATALOG)) return true;
     return false;
   }
 
   final private boolean jj_3_1394() {
-    if (jj_scan_token(OUTPUT)) return true;
+    if (jj_scan_token(PARAMETER_MODE)) return true;
     return false;
   }
 
   final private boolean jj_3_1393() {
-    if (jj_scan_token(ORDERING)) return true;
+    if (jj_scan_token(OUTPUT)) return true;
     return false;
   }
 
   final private boolean jj_3_1392() {
-    if (jj_scan_token(OCTETS)) return true;
+    if (jj_scan_token(ORDERING)) return true;
     return false;
   }
 
   final private boolean jj_3_1391() {
-    if (jj_scan_token(NULLS)) return true;
+    if (jj_scan_token(OCTETS)) return true;
     return false;
   }
 
@@ -35354,47 +35340,47 @@ final String p;
   }
 
   final private boolean jj_3_1390() {
-    if (jj_scan_token(NESTING)) return true;
+    if (jj_scan_token(NULLS)) return true;
     return false;
   }
 
   final private boolean jj_3_1389() {
-    if (jj_scan_token(NAME)) return true;
+    if (jj_scan_token(NESTING)) return true;
     return false;
   }
 
   final private boolean jj_3_1388() {
-    if (jj_scan_token(MONTHS)) return true;
+    if (jj_scan_token(NAME)) return true;
     return false;
   }
 
   final private boolean jj_3_1387() {
-    if (jj_scan_token(MILLISECOND)) return true;
+    if (jj_scan_token(MONTHS)) return true;
     return false;
   }
 
   final private boolean jj_3_1386() {
-    if (jj_scan_token(MESSAGE_TEXT)) return true;
+    if (jj_scan_token(MILLISECOND)) return true;
     return false;
   }
 
   final private boolean jj_3_1385() {
-    if (jj_scan_token(MAXVALUE)) return true;
+    if (jj_scan_token(MESSAGE_TEXT)) return true;
     return false;
   }
 
   final private boolean jj_3_1384() {
-    if (jj_scan_token(M)) return true;
+    if (jj_scan_token(MAXVALUE)) return true;
     return false;
   }
 
   final private boolean jj_3_1383() {
-    if (jj_scan_token(LEVEL)) return true;
+    if (jj_scan_token(M)) return true;
     return false;
   }
 
   final private boolean jj_3_1382() {
-    if (jj_scan_token(LABEL)) return true;
+    if (jj_scan_token(LEVEL)) return true;
     return false;
   }
 
@@ -35404,17 +35390,17 @@ final String p;
   }
 
   final private boolean jj_3_1381() {
-    if (jj_scan_token(KEY)) return true;
+    if (jj_scan_token(LABEL)) return true;
     return false;
   }
 
   final private boolean jj_3_1380() {
-    if (jj_scan_token(JAVA)) return true;
+    if (jj_scan_token(KEY)) return true;
     return false;
   }
 
   final private boolean jj_3_1379() {
-    if (jj_scan_token(ISODOW)) return true;
+    if (jj_scan_token(JAVA)) return true;
     return false;
   }
 
@@ -35429,7 +35415,7 @@ final String p;
   }
 
   final private boolean jj_3_1378() {
-    if (jj_scan_token(INSTANCE)) return true;
+    if (jj_scan_token(ISODOW)) return true;
     return false;
   }
 
@@ -35444,7 +35430,7 @@ final String p;
   }
 
   final private boolean jj_3_1377() {
-    if (jj_scan_token(INCREMENT)) return true;
+    if (jj_scan_token(INSTANCE)) return true;
     return false;
   }
 
@@ -35464,7 +35450,7 @@ final String p;
   }
 
   final private boolean jj_3_1376() {
-    if (jj_scan_token(IMPLEMENTATION)) return true;
+    if (jj_scan_token(INCREMENT)) return true;
     return false;
   }
 
@@ -35479,7 +35465,7 @@ final String p;
   }
 
   final private boolean jj_3_1375() {
-    if (jj_scan_token(ILIKE)) return true;
+    if (jj_scan_token(IMPLEMENTATION)) return true;
     return false;
   }
 
@@ -35494,7 +35480,7 @@ final String p;
   }
 
   final private boolean jj_3_1374() {
-    if (jj_scan_token(HOP)) return true;
+    if (jj_scan_token(ILIKE)) return true;
     return false;
   }
 
@@ -35504,7 +35490,7 @@ final String p;
   }
 
   final private boolean jj_3_1373() {
-    if (jj_scan_token(GRANTED)) return true;
+    if (jj_scan_token(HOP)) return true;
     return false;
   }
 
@@ -35524,7 +35510,7 @@ final String p;
   }
 
   final private boolean jj_3_1372() {
-    if (jj_scan_token(GEOMETRY)) return true;
+    if (jj_scan_token(GRANTED)) return true;
     return false;
   }
 
@@ -35550,7 +35536,7 @@ final String p;
   }
 
   final private boolean jj_3_1371() {
-    if (jj_scan_token(G)) return true;
+    if (jj_scan_token(GEOMETRY)) return true;
     return false;
   }
 
@@ -35575,7 +35561,7 @@ final String p;
   }
 
   final private boolean jj_3_1370() {
-    if (jj_scan_token(FORTRAN)) return true;
+    if (jj_scan_token(G)) return true;
     return false;
   }
 
@@ -35590,7 +35576,7 @@ final String p;
   }
 
   final private boolean jj_3_1369() {
-    if (jj_scan_token(FIRST)) return true;
+    if (jj_scan_token(FORTRAN)) return true;
     return false;
   }
 
@@ -35600,7 +35586,7 @@ final String p;
   }
 
   final private boolean jj_3_1368() {
-    if (jj_scan_token(EXCLUDE)) return true;
+    if (jj_scan_token(FIRST)) return true;
     return false;
   }
 
@@ -35610,7 +35596,7 @@ final String p;
   }
 
   final private boolean jj_3_1367() {
-    if (jj_scan_token(EPOCH)) return true;
+    if (jj_scan_token(EXCLUDE)) return true;
     return false;
   }
 
@@ -35625,7 +35611,7 @@ final String p;
   }
 
   final private boolean jj_3_1366() {
-    if (jj_scan_token(DYNAMIC_FUNCTION)) return true;
+    if (jj_scan_token(EPOCH)) return true;
     return false;
   }
 
@@ -35640,7 +35626,7 @@ final String p;
   }
 
   final private boolean jj_3_1365() {
-    if (jj_scan_token(DOW)) return true;
+    if (jj_scan_token(DYNAMIC_FUNCTION)) return true;
     return false;
   }
 
@@ -35660,7 +35646,7 @@ final String p;
   }
 
   final private boolean jj_3_1364() {
-    if (jj_scan_token(DIAGNOSTICS)) return true;
+    if (jj_scan_token(DOW)) return true;
     return false;
   }
 
@@ -35685,7 +35671,7 @@ final String p;
   }
 
   final private boolean jj_3_1363() {
-    if (jj_scan_token(DESC)) return true;
+    if (jj_scan_token(DIAGNOSTICS)) return true;
     return false;
   }
 
@@ -35705,7 +35691,7 @@ final String p;
   }
 
   final private boolean jj_3_1362() {
-    if (jj_scan_token(DEGREE)) return true;
+    if (jj_scan_token(DESC)) return true;
     return false;
   }
 
@@ -35730,7 +35716,7 @@ final String p;
   }
 
   final private boolean jj_3_1361() {
-    if (jj_scan_token(DEFERRED)) return true;
+    if (jj_scan_token(DEGREE)) return true;
     return false;
   }
 
@@ -35750,7 +35736,7 @@ final String p;
   }
 
   final private boolean jj_3_1360() {
-    if (jj_scan_token(DECADE)) return true;
+    if (jj_scan_token(DEFERRED)) return true;
     return false;
   }
 
@@ -35781,7 +35767,7 @@ final String p;
   }
 
   final private boolean jj_3_1359() {
-    if (jj_scan_token(DAYOFWEEK)) return true;
+    if (jj_scan_token(DECADE)) return true;
     return false;
   }
 
@@ -35801,7 +35787,7 @@ final String p;
   }
 
   final private boolean jj_3_1358() {
-    if (jj_scan_token(DATETIME_INTERVAL_CODE)) return true;
+    if (jj_scan_token(DAYOFWEEK)) return true;
     return false;
   }
 
@@ -35821,7 +35807,7 @@ final String p;
   }
 
   final private boolean jj_3_1357() {
-    if (jj_scan_token(DATE_DIFF)) return true;
+    if (jj_scan_token(DATETIME_INTERVAL_CODE)) return true;
     return false;
   }
 
@@ -35841,7 +35827,7 @@ final String p;
   }
 
   final private boolean jj_3_1356() {
-    if (jj_scan_token(CURSOR_NAME)) return true;
+    if (jj_scan_token(DATE_DIFF)) return true;
     return false;
   }
 
@@ -35874,7 +35860,7 @@ final String p;
   }
 
   final private boolean jj_3_1355() {
-    if (jj_scan_token(CONSTRUCTOR)) return true;
+    if (jj_scan_token(CURSOR_NAME)) return true;
     return false;
   }
 
@@ -35900,7 +35886,7 @@ final String p;
   }
 
   final private boolean jj_3_1354() {
-    if (jj_scan_token(CONSTRAINT_NAME)) return true;
+    if (jj_scan_token(CONSTRUCTOR)) return true;
     return false;
   }
 
@@ -35920,7 +35906,7 @@ final String p;
   }
 
   final private boolean jj_3_1353() {
-    if (jj_scan_token(CONNECTION)) return true;
+    if (jj_scan_token(CONSTRAINT_NAME)) return true;
     return false;
   }
 
@@ -35940,7 +35926,7 @@ final String p;
   }
 
   final private boolean jj_3_1352() {
-    if (jj_scan_token(COMMITTED)) return true;
+    if (jj_scan_token(CONNECTION)) return true;
     return false;
   }
 
@@ -35960,7 +35946,7 @@ final String p;
   }
 
   final private boolean jj_3_1351() {
-    if (jj_scan_token(COLUMN_NAME)) return true;
+    if (jj_scan_token(COMMITTED)) return true;
     return false;
   }
 
@@ -35980,7 +35966,7 @@ final String p;
   }
 
   final private boolean jj_3_1350() {
-    if (jj_scan_token(COLLATION_CATALOG)) return true;
+    if (jj_scan_token(COLUMN_NAME)) return true;
     return false;
   }
 
@@ -36005,7 +35991,7 @@ final String p;
   }
 
   final private boolean jj_3_1349() {
-    if (jj_scan_token(CLASS_ORIGIN)) return true;
+    if (jj_scan_token(COLLATION_CATALOG)) return true;
     return false;
   }
 
@@ -36025,7 +36011,7 @@ final String p;
   }
 
   final private boolean jj_3_1348() {
-    if (jj_scan_token(CHARACTER_SET_CATALOG)) return true;
+    if (jj_scan_token(CLASS_ORIGIN)) return true;
     return false;
   }
 
@@ -36040,32 +36026,32 @@ final String p;
   }
 
   final private boolean jj_3_1347() {
-    if (jj_scan_token(CHAIN)) return true;
+    if (jj_scan_token(CHARACTER_SET_CATALOG)) return true;
     return false;
   }
 
   final private boolean jj_3_1346() {
-    if (jj_scan_token(CATALOG)) return true;
+    if (jj_scan_token(CHAIN)) return true;
     return false;
   }
 
   final private boolean jj_3_1345() {
-    if (jj_scan_token(BREADTH)) return true;
+    if (jj_scan_token(CATALOG)) return true;
     return false;
   }
 
   final private boolean jj_3_1344() {
-    if (jj_scan_token(ATTRIBUTES)) return true;
+    if (jj_scan_token(BREADTH)) return true;
     return false;
   }
 
   final private boolean jj_3_1343() {
-    if (jj_scan_token(ASSERTION)) return true;
+    if (jj_scan_token(ATTRIBUTES)) return true;
     return false;
   }
 
   final private boolean jj_3_1342() {
-    if (jj_scan_token(ARRAY_AGG)) return true;
+    if (jj_scan_token(ASSERTION)) return true;
     return false;
   }
 
@@ -36075,7 +36061,7 @@ final String p;
   }
 
   final private boolean jj_3_1341() {
-    if (jj_scan_token(AFTER)) return true;
+    if (jj_scan_token(ARRAY_AGG)) return true;
     return false;
   }
 
@@ -36092,11 +36078,16 @@ final String p;
   }
 
   final private boolean jj_3_1340() {
-    if (jj_scan_token(ADA)) return true;
+    if (jj_scan_token(AFTER)) return true;
     return false;
   }
 
   final private boolean jj_3_1339() {
+    if (jj_scan_token(ADA)) return true;
+    return false;
+  }
+
+  final private boolean jj_3_1338() {
     if (jj_scan_token(ABSENT)) return true;
     return false;
   }
@@ -36107,9 +36098,17 @@ final String p;
     return false;
   }
 
+  final private boolean jj_3_697() {
+    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_259()) return true;
+    return false;
+  }
+
   final private boolean jj_3R_340() {
     Token xsp;
     xsp = jj_scanpos;
+    if (jj_3_1338()) {
+    jj_scanpos = xsp;
     if (jj_3_1339()) {
     jj_scanpos = xsp;
     if (jj_3_1340()) {
@@ -36544,9 +36543,7 @@ final String p;
     jj_scanpos = xsp;
     if (jj_3_1555()) {
     jj_scanpos = xsp;
-    if (jj_3_1556()) {
-    jj_scanpos = xsp;
-    if (jj_3_1557()) return true;
+    if (jj_3_1556()) return true;
     }
     }
     }
@@ -36768,12 +36765,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_697() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_259()) return true;
-    return false;
-  }
-
   final private boolean jj_3_299() {
     if (jj_3R_185()) return true;
     return false;
@@ -36789,11 +36780,6 @@ final String p;
     return false;
   }
 
-  final private boolean jj_3_1338() {
-    if (jj_scan_token(SUNDAY)) return true;
-    return false;
-  }
-
   final private boolean jj_3_694() {
     Token xsp;
     xsp = jj_scanpos;
@@ -36808,7 +36794,7 @@ final String p;
   }
 
   final private boolean jj_3_1337() {
-    if (jj_scan_token(THURSDAY)) return true;
+    if (jj_scan_token(FRIDAY)) return true;
     return false;
   }
 
@@ -36819,17 +36805,17 @@ final String p;
   }
 
   final private boolean jj_3_1336() {
-    if (jj_scan_token(MONDAY)) return true;
+    if (jj_scan_token(TUESDAY)) return true;
     return false;
   }
 
   final private boolean jj_3_1335() {
-    if (jj_scan_token(WITHIN)) return true;
+    if (jj_scan_token(WITHOUT)) return true;
     return false;
   }
 
   final private boolean jj_3_1334() {
-    if (jj_scan_token(WHENEVER)) return true;
+    if (jj_scan_token(WIDTH_BUCKET)) return true;
     return false;
   }
 
@@ -36851,12 +36837,12 @@ final String p;
   }
 
   final private boolean jj_3_1333() {
-    if (jj_scan_token(VAR_POP)) return true;
+    if (jj_scan_token(VAR_SAMP)) return true;
     return false;
   }
 
   final private boolean jj_3_1332() {
-    if (jj_scan_token(VARBINARY)) return true;
+    if (jj_scan_token(VARCHAR)) return true;
     return false;
   }
 
@@ -36866,7 +36852,7 @@ final String p;
   }
 
   final private boolean jj_3_1331() {
-    if (jj_scan_token(UPSERT)) return true;
+    if (jj_scan_token(VALUE)) return true;
     return false;
   }
 
@@ -38858,10 +38844,7 @@ final String p;
     jj_scanpos = xsp;
     if (jj_3_1336()) {
     jj_scanpos = xsp;
-    if (jj_3_1337()) {
-    jj_scanpos = xsp;
-    if (jj_3_1338()) return true;
-    }
+    if (jj_3_1337()) return true;
     }
     }
     }
@@ -39581,7 +39564,7 @@ final String p;
    private static void jj_la1_25() {
       jj_la1_25 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
    }
-  final private JJCalls[] jj_2_rtns = new JJCalls[1776];
+  final private JJCalls[] jj_2_rtns = new JJCalls[1775];
   private boolean jj_rescan = false;
   private int jj_gc = 0;
 
@@ -39873,7 +39856,7 @@ final String p;
 
   final private void jj_rescan_token() {
     jj_rescan = true;
-    for (int i = 0; i < 1776; i++) {
+    for (int i = 0; i < 1775; i++) {
     try {
       JJCalls p = jj_2_rtns[i];
       do {
@@ -41655,7 +41638,6 @@ final String p;
             case 1772: jj_3_1773(); break;
             case 1773: jj_3_1774(); break;
             case 1774: jj_3_1775(); break;
-            case 1775: jj_3_1776(); break;
           }
         }
         p = p.next;
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/AbstractExecutionTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/AbstractExecutionTest.java
index 46e4992816a..de24b8de4d0 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/AbstractExecutionTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/AbstractExecutionTest.java
@@ -85,6 +85,9 @@ public class AbstractExecutionTest extends GridCommonAbstractTest {
     /** Params string. */
     protected static final String PARAMS_STRING = "Task executor = {0}, Execution strategy = {1}";
 
+    /** */
+    protected static final int IN_BUFFER_SIZE = AbstractNode.IN_BUFFER_SIZE;
+
     /** */
     private Throwable lastE;
 
@@ -396,13 +399,13 @@ public class AbstractExecutionTest extends GridCommonAbstractTest {
      */
     public static class TestTable implements Iterable<Object[]> {
         /** */
-        private int rowsCnt;
+        private final int rowsCnt;
 
         /** */
-        private RelDataType rowType;
+        private final int colsCnt;
 
         /** */
-        private Function<Integer, Object>[] fieldCreators;
+        private final Function<Integer, Object>[] fieldCreators;
 
         /** */
         TestTable(int rowsCnt, RelDataType rowType) {
@@ -430,7 +433,14 @@ public class AbstractExecutionTest extends GridCommonAbstractTest {
         /** */
         TestTable(int rowsCnt, RelDataType rowType, Function<Integer, Object>... fieldCreators) {
             this.rowsCnt = rowsCnt;
-            this.rowType = rowType;
+            colsCnt = rowType.getFieldCount();
+            this.fieldCreators = fieldCreators;
+        }
+
+        /** */
+        TestTable(int rowsCnt, int colsCnt, Function<Integer, Object>... fieldCreators) {
+            this.rowsCnt = rowsCnt;
+            this.colsCnt = colsCnt;
             this.fieldCreators = fieldCreators;
         }
 
@@ -451,7 +461,7 @@ public class AbstractExecutionTest extends GridCommonAbstractTest {
 
         /** */
         private Object[] createRow(int rowNum) {
-            Object[] row = new Object[rowType.getFieldCount()];
+            Object[] row = new Object[colsCnt];
 
             for (int i = 0; i < fieldCreators.length; ++i)
                 row[i] = fieldCreators[i].apply(rowNum);
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/BaseAggregateTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/BaseAggregateTest.java
index 0fbc41423b3..1552708e2cc 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/BaseAggregateTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/BaseAggregateTest.java
@@ -27,7 +27,6 @@ import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
-
 import com.google.common.collect.ImmutableList;
 import org.apache.calcite.rel.RelCollations;
 import org.apache.calcite.rel.core.AggregateCall;
@@ -35,7 +34,6 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.ImmutableIntList;
-import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.processors.query.calcite.exec.ArrayRowHandler;
 import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext;
 import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler;
@@ -45,7 +43,6 @@ import org.apache.ignite.internal.processors.query.calcite.exec.exp.agg.Aggregat
 import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory;
 import org.apache.ignite.internal.processors.query.calcite.util.TypeUtils;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.WithSystemProperty;
 import org.junit.Assert;
@@ -445,11 +442,9 @@ public abstract class BaseAggregateTest extends AbstractExecutionTest {
 
     /** */
     @Test
-    public void sumOnDifferentRowsCount() throws IgniteCheckedException {
-        int bufSize = U.field(AbstractNode.class, "IN_BUFFER_SIZE");
-
-        int[] grpsCnt = {1, bufSize / 2, bufSize, bufSize + 1, bufSize * 4};
-        int[] rowsInGrps = {1, 5, bufSize};
+    public void sumOnDifferentRowsCount() {
+        int[] grpsCnt = {1, IN_BUFFER_SIZE / 2, IN_BUFFER_SIZE, IN_BUFFER_SIZE + 1, IN_BUFFER_SIZE * 4};
+        int[] rowsInGrps = {1, 5, IN_BUFFER_SIZE};
 
         for (int grps : grpsCnt) {
             for (int rowsInGrp : rowsInGrps) {
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/ExecutionTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/ExecutionTest.java
index 6ca45427497..6ab1ea04565 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/ExecutionTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/ExecutionTest.java
@@ -25,7 +25,6 @@ import com.google.common.collect.ImmutableSet;
 import org.apache.calcite.rel.core.CorrelationId;
 import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.type.RelDataType;
-import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext;
 import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler;
@@ -540,15 +539,13 @@ public class ExecutionTest extends AbstractExecutionTest {
 
     /** */
     @Test
-    public void testMergeJoin() throws IgniteCheckedException {
+    public void testMergeJoin() {
         ExecutionContext<Object[]> ctx = executionContext(F.first(nodes()), UUID.randomUUID(), 0);
         IgniteTypeFactory tf = ctx.getTypeFactory();
         RelDataType rowType = TypeUtils.createRowType(tf, int.class, String.class, int.class);
 
-        int inBufSize = U.field(AbstractNode.class, "IN_BUFFER_SIZE");
-
-        int[] sizes = {1, max(inBufSize / 3, 1), max(inBufSize / 2, 1), max(inBufSize - 1, 1), inBufSize,
-            inBufSize + 1, 2 * inBufSize - 1, 2 * inBufSize, 2 * inBufSize + 1};
+        int[] sizes = {1, max(IN_BUFFER_SIZE / 3, 1), max(IN_BUFFER_SIZE / 2, 1), max(IN_BUFFER_SIZE - 1, 1),
+            IN_BUFFER_SIZE, IN_BUFFER_SIZE + 1, 2 * IN_BUFFER_SIZE - 1, 2 * IN_BUFFER_SIZE, 2 * IN_BUFFER_SIZE + 1};
 
         for (int leftSize : sizes) {
             for (int rightSize : sizes) {
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashIndexSpoolExecutionTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashIndexSpoolExecutionTest.java
index 68e522b4f9f..5536e48439f 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashIndexSpoolExecutionTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashIndexSpoolExecutionTest.java
@@ -30,7 +30,6 @@ import org.apache.ignite.internal.processors.query.calcite.util.TypeUtils;
 import org.apache.ignite.internal.util.lang.GridTuple3;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.T2;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.junits.WithSystemProperty;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Before;
@@ -54,14 +53,14 @@ public class HashIndexSpoolExecutionTest extends AbstractExecutionTest {
      *
      */
     @Test
-    public void testIndexSpool() throws Exception {
+    public void testIndexSpool() {
         ExecutionContext<Object[]> ctx = executionContext(F.first(nodes()), UUID.randomUUID(), 0);
         IgniteTypeFactory tf = ctx.getTypeFactory();
         RelDataType rowType = TypeUtils.createRowType(tf, int.class, String.class, int.class);
 
-        int inBufSize = U.field(AbstractNode.class, "IN_BUFFER_SIZE");
+        int[] sizes = {1, IN_BUFFER_SIZE / 2 - 1, IN_BUFFER_SIZE / 2, IN_BUFFER_SIZE / 2 + 1, IN_BUFFER_SIZE,
+            IN_BUFFER_SIZE + 1, IN_BUFFER_SIZE * 4};
 
-        int[] sizes = {1, inBufSize / 2 - 1, inBufSize / 2, inBufSize / 2 + 1, inBufSize, inBufSize + 1, inBufSize * 4};
         int[] eqCnts = {1, 10};
 
         for (int size : sizes) {
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitExecutionTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitExecutionTest.java
index 5c927d113b3..6dd3c7b36cf 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitExecutionTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitExecutionTest.java
@@ -28,7 +28,6 @@ import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext
 import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory;
 import org.apache.ignite.internal.processors.query.calcite.util.TypeUtils;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.junit.Test;
 
 /**
@@ -37,16 +36,14 @@ import org.junit.Test;
 public class LimitExecutionTest extends AbstractExecutionTest {
     /** */
     @Test
-    public void testLimit() throws Exception {
-        int bufSize = U.field(AbstractNode.class, "IN_BUFFER_SIZE");
-
+    public void testLimit() {
         checkLimit(0, 1);
         checkLimit(1, 0);
         checkLimit(1, 1);
-        checkLimit(0, bufSize);
-        checkLimit(bufSize, 0);
-        checkLimit(bufSize, bufSize);
-        checkLimit(bufSize - 1, 1);
+        checkLimit(0, IN_BUFFER_SIZE);
+        checkLimit(IN_BUFFER_SIZE, 0);
+        checkLimit(IN_BUFFER_SIZE, IN_BUFFER_SIZE);
+        checkLimit(IN_BUFFER_SIZE - 1, 1);
         checkLimit(2000, 0);
         checkLimit(0, 3000);
         checkLimit(2000, 3000);
@@ -54,16 +51,14 @@ public class LimitExecutionTest extends AbstractExecutionTest {
 
     /** Tests Sort node can limit its output when fetch param is set. */
     @Test
-    public void testSortLimit() throws Exception {
-        int bufSize = U.field(AbstractNode.class, "IN_BUFFER_SIZE");
-
+    public void testSortLimit() {
         checkLimitSort(0, 1);
         checkLimitSort(1, 0);
         checkLimitSort(1, 1);
-        checkLimitSort(0, bufSize);
-        checkLimitSort(bufSize, 0);
-        checkLimitSort(bufSize, bufSize);
-        checkLimitSort(bufSize - 1, 1);
+        checkLimitSort(0, IN_BUFFER_SIZE);
+        checkLimitSort(IN_BUFFER_SIZE, 0);
+        checkLimitSort(IN_BUFFER_SIZE, IN_BUFFER_SIZE);
+        checkLimitSort(IN_BUFFER_SIZE - 1, 1);
         checkLimitSort(2000, 0);
         checkLimitSort(0, 3000);
         checkLimitSort(2000, 3000);
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortedIndexSpoolExecutionTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortedIndexSpoolExecutionTest.java
index 3d733a47096..706ddcfc5b2 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortedIndexSpoolExecutionTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortedIndexSpoolExecutionTest.java
@@ -35,7 +35,6 @@ import org.apache.ignite.internal.processors.query.calcite.util.TypeUtils;
 import org.apache.ignite.internal.util.lang.GridTuple4;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.T3;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.junits.WithSystemProperty;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Before;
@@ -60,14 +59,13 @@ public class SortedIndexSpoolExecutionTest extends AbstractExecutionTest {
      *
      */
     @Test
-    public void testIndexSpool() throws Exception {
+    public void testIndexSpool() {
         ExecutionContext<Object[]> ctx = executionContext(F.first(nodes()), UUID.randomUUID(), 0);
         IgniteTypeFactory tf = ctx.getTypeFactory();
         RelDataType rowType = TypeUtils.createRowType(tf, int.class, String.class, int.class);
 
-        int inBufSize = U.field(AbstractNode.class, "IN_BUFFER_SIZE");
-
-        int[] sizes = {1, inBufSize / 2 - 1, inBufSize / 2, inBufSize / 2 + 1, inBufSize, inBufSize + 1, inBufSize * 4};
+        int[] sizes = {1, IN_BUFFER_SIZE / 2 - 1, IN_BUFFER_SIZE / 2, IN_BUFFER_SIZE / 2 + 1, IN_BUFFER_SIZE,
+            IN_BUFFER_SIZE + 1, IN_BUFFER_SIZE * 4};
 
         for (int size : sizes) {
             // (filter, lower, upper, expected result size)
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/TableSpoolExecutionTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/TableSpoolExecutionTest.java
index a4df1e3f83f..6db0c94d4b2 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/TableSpoolExecutionTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/TableSpoolExecutionTest.java
@@ -22,14 +22,12 @@ import java.util.UUID;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BiFunction;
 import java.util.stream.IntStream;
-
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext;
 import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory;
 import org.apache.ignite.internal.processors.query.calcite.util.TypeUtils;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.junits.WithSystemProperty;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Before;
@@ -54,7 +52,7 @@ public class TableSpoolExecutionTest extends AbstractExecutionTest {
 
     /** */
     @Test
-    public void testLazyTableSpool() throws Exception {
+    public void testLazyTableSpool() {
         checkTableSpool(
             (ctx, rowType) -> new TableSpoolNode<>(ctx, rowType, true)
         );
@@ -62,7 +60,7 @@ public class TableSpoolExecutionTest extends AbstractExecutionTest {
 
     /** */
     @Test
-    public void testEagerTableSpool() throws Exception {
+    public void testEagerTableSpool() {
         checkTableSpool(
             (ctx, rowType) -> new TableSpoolNode<>(ctx, rowType, false)
         );
@@ -80,9 +78,7 @@ public class TableSpoolExecutionTest extends AbstractExecutionTest {
         IgniteTypeFactory tf = ctx.getTypeFactory();
         RelDataType rowType = TypeUtils.createRowType(tf, int.class, String.class, int.class);
 
-        int inBufSize = U.field(AbstractNode.class, "IN_BUFFER_SIZE");
-
-        int[] sizes = {inBufSize / 2, inBufSize, inBufSize + 1, inBufSize * 2};
+        int[] sizes = {IN_BUFFER_SIZE / 2, IN_BUFFER_SIZE, IN_BUFFER_SIZE + 1, IN_BUFFER_SIZE * 2};
 
         for (int size : sizes) {
             log.info("Check: size=" + size);
@@ -116,16 +112,14 @@ public class TableSpoolExecutionTest extends AbstractExecutionTest {
     }
 
     /** */
-    public void checkTableSpool(BiFunction<ExecutionContext<Object[]>, RelDataType, TableSpoolNode<Object[]>> spoolFactory)
-        throws Exception {
+    public void checkTableSpool(BiFunction<ExecutionContext<Object[]>, RelDataType, TableSpoolNode<Object[]>> spoolFactory) {
         ExecutionContext<Object[]> ctx = executionContext(F.first(nodes()), UUID.randomUUID(), 0);
         IgniteTypeFactory tf = ctx.getTypeFactory();
         RelDataType rowType = TypeUtils.createRowType(tf, int.class, String.class, int.class);
 
-        int inBufSize = U.field(AbstractNode.class, "IN_BUFFER_SIZE");
+        int[] sizes = {1, IN_BUFFER_SIZE / 2 - 1, IN_BUFFER_SIZE / 2, IN_BUFFER_SIZE / 2 + 1, IN_BUFFER_SIZE,
+            IN_BUFFER_SIZE + 1, IN_BUFFER_SIZE * 4};
 
-        int[] sizes = {1, inBufSize / 2 - 1, inBufSize / 2, inBufSize / 2 + 1, inBufSize, inBufSize + 1, inBufSize * 4};
-//        int[] sizes = {inBufSize * 4};
         int rewindCnts = 32;
 
         for (int size : sizes) {
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/UncollectExecutionTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/UncollectExecutionTest.java
new file mode 100644
index 00000000000..a5835a82005
--- /dev/null
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/UncollectExecutionTest.java
@@ -0,0 +1,160 @@
+/*
+ * 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.exec.rel;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext;
+import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory;
+import org.apache.ignite.internal.processors.query.calcite.util.TypeUtils;
+import org.apache.ignite.internal.util.typedef.F;
+import org.junit.Test;
+
+/**
+ * Test for UNCOLLECT node execution.
+ */
+public class UncollectExecutionTest extends AbstractExecutionTest {
+    /** */
+    @Test
+    public void testCollectionSizes() {
+        for (boolean withOrdinality : new boolean[] {false, true}) {
+            int rows = 100;
+
+            int[] sizes = {1, 10, IN_BUFFER_SIZE / 2 - 1, IN_BUFFER_SIZE / 2, IN_BUFFER_SIZE / 2 + 1, IN_BUFFER_SIZE,
+                IN_BUFFER_SIZE + 1, IN_BUFFER_SIZE * 4};
+
+            for (int size : sizes) {
+                log.info("Check: size=" + size + ", withOrdinality=" + withOrdinality);
+
+                Function<Integer, Object> func = row -> IntStream.range(0, size).boxed().collect(Collectors.toList());
+
+                RootRewindable<Object[]> root = createNodes(withOrdinality, new TestTable(rows, 1, func));
+
+                long[] colsSum = new long[withOrdinality ? 2 : 1];
+                int cnt = 0;
+
+                while (root.hasNext()) {
+                    cnt++;
+                    Object[] row = root.next();
+
+                    for (int i = 0; i < row.length; i++)
+                        colsSum[i] += (int)row[i];
+                }
+
+                assertEquals(size * rows, cnt);
+
+                // Expected value of unnested column = rows * sum(0 .. size - 1)
+                assertEquals("Unexpected sum: size=" + size, (long)size * (size - 1) / 2 * rows, colsSum[0]);
+
+                if (withOrdinality) // Expected value of ordinality column = rows * sum(1 .. size)
+                    assertEquals("Unexpected ordinality: size=" + size, (long)size * (size + 1) / 2 * rows, colsSum[1]);
+
+                root.closeRewindableRoot();
+            }
+        }
+    }
+
+    /** */
+    @Test
+    public void testExactResult() {
+        checkExactResult(
+            false,
+            F.asList(
+                row(F.asList(1, 2)),
+                row(F.asList(1))
+            ),
+            F.asList(
+                row(1), row(2), row(1)
+            )
+        );
+
+        checkExactResult(
+            true,
+            F.asList(
+                row(F.asList(1, 2)),
+                row(F.asList(3, 4, 5)),
+                row(F.asList(6, 7))
+            ),
+            F.asList(
+                row(1, 1), row(2, 2),
+                row(3, 1), row(4, 2), row(5, 3),
+                row(6, 1), row(7, 2)
+            )
+        );
+
+        checkExactResult(
+            true,
+            F.asList(
+                row(F.asList(1, 2)),
+                row(Collections.emptyList())
+            ),
+            F.asList(
+                row(1, 1), row(2, 2)
+            )
+        );
+    }
+
+    /** */
+    private void checkExactResult(boolean withOrdinality, List<Object[]> dataSrc, List<Object[]> expRes) {
+        RootRewindable<Object[]> root = createNodes(withOrdinality, dataSrc);
+
+        List<Object[]> res = new ArrayList<>();
+
+        while (root.hasNext())
+            res.add(root.next());
+
+        assertEquals(expRes.size(), res.size());
+
+        for (int i = 0; i < expRes.size(); i++)
+            assertEqualsArraysAware(expRes.get(i), res.get(i));
+
+        root.closeRewindableRoot();
+    }
+
+    /** */
+    private RootRewindable<Object[]> createNodes(boolean withOrdinality, Iterable<Object[]> dataSrc) {
+        ExecutionContext<Object[]> ctx = executionContext(F.first(nodes()), UUID.randomUUID(), 0);
+        IgniteTypeFactory tf = ctx.getTypeFactory();
+
+        RelDataType[] inCols = new RelDataType[] {tf.createArrayType(tf.createSqlType(SqlTypeName.INTEGER), -1)};
+        RelDataType[] outCols = new RelDataType[withOrdinality ? 2 : 1];
+
+        Arrays.fill(outCols, tf.createSqlType(SqlTypeName.INTEGER));
+
+        RelDataType inType = TypeUtils.createRowType(tf, inCols);
+        RelDataType outType = TypeUtils.createRowType(tf, outCols);
+
+        ScanNode<Object[]> scan = new ScanNode<>(ctx, inType, dataSrc);
+
+        UncollectNode<Object[]> uncollect = new UncollectNode<>(ctx, inType, outType, withOrdinality);
+        uncollect.register(scan);
+
+        RootRewindable<Object[]> root = new RootRewindable<>(ctx, outType);
+        root.register(uncollect);
+
+        return root;
+    }
+}
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/StdSqlOperatorsTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/StdSqlOperatorsTest.java
index 9df6eba2db6..e2c92d6d680 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/StdSqlOperatorsTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/StdSqlOperatorsTest.java
@@ -285,6 +285,8 @@ public class StdSqlOperatorsTest extends AbstractBasicIntegrationTest {
         assertExpression("CARDINALITY(ARRAY[1, 2, 3])").returns(3).check();
         assertExpression("ARRAY[1, 2, 3] IS EMPTY").returns(false).check();
         assertExpression("ARRAY[1, 2, 3] IS NOT EMPTY").returns(true).check();
+        assertQuery("SELECT * FROM UNNEST(ARRAY[1, 2]) WITH ORDINALITY").returns(1, 1).returns(2, 2)
+            .check();
     }
 
     /** */
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/UnnestIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/UnnestIntegrationTest.java
new file mode 100644
index 00000000000..bec275f95bb
--- /dev/null
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/UnnestIntegrationTest.java
@@ -0,0 +1,145 @@
+/*
+ * 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.integration;
+
+import java.util.Collections;
+import org.apache.ignite.internal.processors.query.IgniteSQLException;
+import org.apache.ignite.internal.util.typedef.F;
+import org.junit.Test;
+
+/**
+ * Integration test for UNNEST operator.
+ */
+public class UnnestIntegrationTest extends AbstractBasicIntegrationTest {
+    /** */
+    @Test
+    public void testUnnestSingleCollection() {
+        assertQuery("SELECT * FROM UNNEST(ARRAY[1, 2, 3])").returns(1).returns(2).returns(3).check();
+        assertQuery("SELECT * FROM UNNEST(MAP['a', 1, 'b', 2])").returns("a", 1).returns("b", 2).check();
+        assertQuery("SELECT * FROM UNNEST(ARRAY[ROW(1, 2), ROW(3, 4)])").returns(1, 2).returns(3, 4).check();
+
+        // Dynamic parameters.
+        assertQuery("SELECT * FROM UNNEST(?)").withParams(F.asList(1, 2)).returns(1).returns(2).check();
+        assertQuery("SELECT * FROM UNNEST(?)").withParams(F.asMap("a", 1, "b", 2))
+            .returns("a", 1).returns("b", 2).check();
+        // Can't check dynamic parameters with ROW, since generic type of List can't be obtained in runtime.
+        // SQL type of parameter F.asList(new Object[] {1, 2}) will be derived as array of scalars
+        // (instead of array of rows) and UNNEST can only produce rows based on type derived on planner phase.
+
+        // Subquery.
+        assertQuery("SELECT * FROM UNNEST(SELECT ARRAY_AGG(a) FROM (VALUES (1), (2)) t(a))")
+            .returns(1).returns(2).check();
+
+        assertQuery("SELECT * FROM UNNEST(SELECT ARRAY_AGG(ROW(t.a, t.b)) FROM (VALUES (1, 2), (3, 4)) t(a, b))")
+            .returns(1, 2).returns(3, 4).check();
+
+        assertQuery("SELECT * FROM UNNEST(SELECT * FROM (VALUES (ARRAY[1, 2, 3]), (ARRAY[4, 5])))")
+            .returns(1).returns(2).returns(3).returns(4).returns(5).check();
+
+        assertQuery("SELECT * FROM UNNEST(SELECT * FROM (VALUES (MAP[1, 2, 3, 4]), (MAP[5, 6])))")
+            .returns(1, 2).returns(3, 4).returns(5, 6).check();
+
+        assertQuery("SELECT * FROM UNNEST(SELECT * FROM (VALUES (ARRAY[ROW(1, 2), ROW(3, 4)]), (ARRAY[ROW(5, 6)])))")
+            .returns(1, 2).returns(3, 4).returns(5, 6).check();
+    }
+
+    /** */
+    @Test
+    public void testUnnestMultiCollection() {
+        String errMsg = "Invalid number of arguments to function 'UNNEST'. Was expecting 1 arguments";
+
+        assertThrows("SELECT * FROM UNNEST(ARRAY[1], ARRAY[2])", IgniteSQLException.class, errMsg);
+
+        assertThrows("SELECT * FROM UNNEST(ARRAY[1, 2], ?)", IgniteSQLException.class, errMsg, F.asList(3));
+
+        assertThrows("SELECT * FROM UNNEST(MAP[4, 5], ARRAY[1, 2, 3])", IgniteSQLException.class, errMsg);
+    }
+
+    /** */
+    @Test
+    public void testUnnestWrongArgumentType() {
+        String errMsg = "Cannot apply 'UNNEST' to arguments of type 'UNNEST(<INTEGER>)'";
+
+        assertThrows("SELECT * FROM UNNEST(1)", IgniteSQLException.class, errMsg);
+
+        assertThrows("SELECT * FROM UNNEST(?)", IgniteSQLException.class, errMsg, 1);
+    }
+
+    /** */
+    @Test
+    public void testUnnestMultiLine() {
+        assertQuery("SELECT b FROM (VALUES (ARRAY[1, 2]), (ARRAY[3, 4])) v(a), UNNEST(v.a) u(b)")
+            .returns(1).returns(2).returns(3).returns(4)
+            .check();
+
+        assertQuery("SELECT b, c FROM (VALUES (MAP[1, 2, 3, 4]), (MAP[5, 6, 7, 8])) v(a), UNNEST(v.a) u(b, c)")
+            .returns(1, 2).returns(3, 4).returns(5, 6).returns(7, 8)
+            .check();
+    }
+
+    /** */
+    @Test
+    public void testUnnestEmptyCollection() {
+        assertQuery("SELECT * FROM UNNEST(SELECT ARRAY_AGG(a) FROM (VALUES (1)) t(a) WHERE a = 0)")
+            .resultSize(0).check();
+
+        assertQuery("SELECT * FROM UNNEST(?)")
+            .withParams(Collections.emptyList()).resultSize(0).check();
+    }
+
+    /** */
+    @Test
+    public void testUnnestWithOrdinality() {
+        assertQuery("SELECT * FROM UNNEST(ARRAY[1, 2, 3]) WITH ORDINALITY")
+            .returns(1, 1).returns(2, 2).returns(3, 3)
+            .check();
+
+        assertQuery("SELECT * FROM UNNEST(MAP[1, 2, 3, 4]) WITH ORDINALITY")
+            .returns(1, 2, 1).returns(3, 4, 2)
+            .check();
+
+        assertQuery("SELECT b, c FROM (VALUES (ARRAY[1, 2]), (ARRAY[3, 4, 5])) v(a), " +
+            "UNNEST(v.a) WITH ORDINALITY u(b, c)")
+            .returns(1, 1).returns(2, 2)
+            .returns(3, 1).returns(4, 2).returns(5, 3)
+            .check();
+    }
+
+    /** */
+    @Test
+    public void testTableJoin() {
+        sql("CREATE TABLE t(id INT, val VARCHAR, PRIMARY KEY(id))");
+
+        for (int i = 0; i < 1000; i++)
+            sql("INSERT INTO t VALUES (?, ?)", i, "val" + i);
+
+        assertQuery("SELECT * FROM t WHERE id IN (SELECT * FROM UNNEST(ARRAY[10, 20, 30]))")
+            .returns(10, "val10").returns(20, "val20").returns(30, "val30")
+            .check();
+
+        assertQuery("SELECT * FROM t WHERE id IN (SELECT * FROM UNNEST(?))")
+            .withParams(F.asList(10, 20, 30))
+            .returns(10, "val10").returns(20, "val20").returns(30, "val30")
+            .check();
+
+        assertQuery("SELECT t.* FROM UNNEST(?) u(a) JOIN t ON t.id = u.a")
+            .withParams(F.asList(10, 20, 30))
+            .returns(10, "val10").returns(20, "val20").returns(30, "val30")
+            .check();
+    }
+}
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java
index a7b569d2ca4..850e50ac3f1 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java
@@ -601,6 +601,13 @@ public abstract class AbstractPlannerTest extends GridCommonAbstractTest {
         };
     }
 
+    /**
+     * Predicate builder for "Operator satisfies distribution" condition.
+     */
+    protected <T extends IgniteRel> Predicate<IgniteRel> distributionSatisfies(IgniteDistribution distribution) {
+        return node -> node.distribution().satisfies(distribution);
+    }
+
     /**
      * Predicate builder for "Current node or any child satisfy predicate" condition.
      */
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/UncollectPlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/UncollectPlannerTest.java
new file mode 100644
index 00000000000..435d4d41607
--- /dev/null
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/UncollectPlannerTest.java
@@ -0,0 +1,141 @@
+/*
+ * 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.planner;
+
+import org.apache.calcite.rel.core.Join;
+import org.apache.calcite.rel.core.Uncollect;
+import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.util.ImmutableIntList;
+import org.apache.ignite.internal.processors.query.calcite.rel.IgniteCorrelatedNestedLoopJoin;
+import org.apache.ignite.internal.processors.query.calcite.rel.IgniteExchange;
+import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTrimExchange;
+import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUncollect;
+import org.apache.ignite.internal.processors.query.calcite.schema.IgniteSchema;
+import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions.broadcast;
+import static org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions.single;
+
+/**
+ * Test uncollect operator.
+ */
+public class UncollectPlannerTest extends AbstractPlannerTest {
+    /** Public schema. */
+    private IgniteSchema publicSchema;
+
+    /** {@inheritDoc} */
+    @Before
+    @Override public void setup() {
+        super.setup();
+
+        publicSchema = createSchema(
+            createTable("HASH_TBL", IgniteDistributions.hash(ImmutableIntList.of(0)),
+                "ID", SqlTypeName.INTEGER, "NAME", SqlTypeName.VARCHAR),
+            createTable("RANDOM_TBL", IgniteDistributions.random(),
+                "ID", SqlTypeName.INTEGER, "NAME", SqlTypeName.VARCHAR),
+            createTable("BROADCAST_TBL", broadcast(),
+                "ID", SqlTypeName.INTEGER, "NAME", SqlTypeName.VARCHAR)
+        );
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testSimpleUncollect() throws Exception {
+        String sql = "SELECT * FROM UNNEST(ARRAY[1, 2, 3])";
+
+        assertPlan(sql, publicSchema, isInstanceOf(Uncollect.class));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testBroadcastTableAndUnnestJoin() throws Exception {
+        String sql = "SELECT * FROM broadcast_tbl t JOIN UNNEST(ARRAY[1, 2, 3]) AS r(x) ON (t.id = r.x)";
+
+        assertPlan(sql, publicSchema, nodeOrAnyChild(isInstanceOf(IgniteExchange.class)).negate()
+            .and(nodeOrAnyChild(isInstanceOf(Join.class)
+                .and(nodeOrAnyChild(isTableScan("broadcast_tbl")))
+                .and(nodeOrAnyChild(isInstanceOf(IgniteUncollect.class)
+                    .and(nodeOrAnyChild(isInstanceOf(IgniteUncollect.class)
+                        .and(distributionSatisfies(single()))
+                    ))
+                ))
+            ))
+        );
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testRandomTableAndUnnestJoin() throws Exception {
+        String sql = "SELECT * FROM random_tbl t JOIN UNNEST(ARRAY[1, 2, 3]) AS r(x) ON (t.id = r.x)";
+
+        assertPlan(sql, publicSchema, nodeOrAnyChild(isInstanceOf(Join.class)
+            .and(nodeOrAnyChild(isInstanceOf(IgniteExchange.class)
+                .and(nodeOrAnyChild(isTableScan("random_tbl")))))
+            .and(nodeOrAnyChild(isInstanceOf(IgniteExchange.class).negate())
+                .and(nodeOrAnyChild(isInstanceOf(IgniteUncollect.class)
+                    .and(distributionSatisfies(single()))
+                ))
+            )
+        ));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testHashTableAndUnnestJoin() throws Exception {
+        String sql = "SELECT * FROM hash_tbl t JOIN UNNEST(ARRAY[1, 2, 3]) AS r(x) ON (t.id = r.x)";
+
+        assertPlan(sql, publicSchema, nodeOrAnyChild(isInstanceOf(Join.class)
+            .and(nodeOrAnyChild(isInstanceOf(IgniteExchange.class).negate())
+                .and(nodeOrAnyChild(isTableScan("hash_tbl"))))
+            .and(nodeOrAnyChild(isInstanceOf(IgniteTrimExchange.class))
+                .and(nodeOrAnyChild(isInstanceOf(IgniteUncollect.class)
+                    .and(hasDistribution(broadcast()))
+                ))
+            )
+        ));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testCorrelatedUnnestJoin() throws Exception {
+        String sql = "SELECT t.id, (SELECT * FROM UNNEST(ARRAY[t.id])) FROM random_tbl t";
+
+        assertPlan(sql, publicSchema, nodeOrAnyChild(isInstanceOf(IgniteCorrelatedNestedLoopJoin.class)
+            .and(input(0, nodeOrAnyChild(isTableScan("random_tbl"))))
+            .and(input(1, nodeOrAnyChild(isInstanceOf(IgniteExchange.class).negate())
+                .and(nodeOrAnyChild(isInstanceOf(IgniteUncollect.class)
+                    .and(nodeOrAnyChild(isInstanceOf(IgniteUncollect.class)
+                        .and(distributionSatisfies(single()))
+                    ))
+                ))
+            ))
+        ));
+    }
+}
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/sql/SqlReservedWordsTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/sql/SqlReservedWordsTest.java
index 45f25a07a5e..4137028bf79 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/sql/SqlReservedWordsTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/sql/SqlReservedWordsTest.java
@@ -106,6 +106,7 @@ public class SqlReservedWordsTest extends GridCommonAbstractTest {
         "TRAILING", // TRIM(TRAILING .. FROM ..)
         "TRUE",
         "UNION",
+        "UNNEST",
         "UPDATE",
         "USER",
         "USING",
diff --git a/modules/calcite/src/test/java/org/apache/ignite/testsuites/ExecutionTestSuite.java b/modules/calcite/src/test/java/org/apache/ignite/testsuites/ExecutionTestSuite.java
index ee4547cd4ea..a9392bf7abb 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/testsuites/ExecutionTestSuite.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/testsuites/ExecutionTestSuite.java
@@ -32,6 +32,7 @@ import org.apache.ignite.internal.processors.query.calcite.exec.rel.SortAggregat
 import org.apache.ignite.internal.processors.query.calcite.exec.rel.SortedIndexSpoolExecutionTest;
 import org.apache.ignite.internal.processors.query.calcite.exec.rel.TableSpoolExecutionTest;
 import org.apache.ignite.internal.processors.query.calcite.exec.rel.TimeCalculationExecutionTest;
+import org.apache.ignite.internal.processors.query.calcite.exec.rel.UncollectExecutionTest;
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
 
@@ -55,6 +56,7 @@ import org.junit.runners.Suite;
     RuntimeSortedIndexTest.class,
     LimitExecutionTest.class,
     TimeCalculationExecutionTest.class,
+    UncollectExecutionTest.class,
 })
 public class ExecutionTestSuite {
 }
diff --git a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java b/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java
index 954d7a4a883..ba8210203ce 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java
@@ -71,6 +71,7 @@ import org.apache.ignite.internal.processors.query.calcite.integration.SystemVie
 import org.apache.ignite.internal.processors.query.calcite.integration.TableDdlIntegrationTest;
 import org.apache.ignite.internal.processors.query.calcite.integration.TableDmlIntegrationTest;
 import org.apache.ignite.internal.processors.query.calcite.integration.TimeoutIntegrationTest;
+import org.apache.ignite.internal.processors.query.calcite.integration.UnnestIntegrationTest;
 import org.apache.ignite.internal.processors.query.calcite.integration.UnstableTopologyIntegrationTest;
 import org.apache.ignite.internal.processors.query.calcite.integration.UserDdlIntegrationTest;
 import org.apache.ignite.internal.processors.query.calcite.integration.UserDefinedFunctionsIntegrationTest;
@@ -159,6 +160,7 @@ import org.junit.runners.Suite;
     QueryBlockingTaskExecutorIntegrationTest.class,
     ScalarInIntegrationTest.class,
     TpchTest.class,
+    UnnestIntegrationTest.class,
 })
 public class IntegrationTestSuite {
 }
diff --git a/modules/calcite/src/test/java/org/apache/ignite/testsuites/PlannerTestSuite.java b/modules/calcite/src/test/java/org/apache/ignite/testsuites/PlannerTestSuite.java
index c4e4b259deb..86361212b9d 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/testsuites/PlannerTestSuite.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/testsuites/PlannerTestSuite.java
@@ -44,6 +44,7 @@ import org.apache.ignite.internal.processors.query.calcite.planner.StatisticsPla
 import org.apache.ignite.internal.processors.query.calcite.planner.TableDmlPlannerTest;
 import org.apache.ignite.internal.processors.query.calcite.planner.TableFunctionPlannerTest;
 import org.apache.ignite.internal.processors.query.calcite.planner.TableSpoolPlannerTest;
+import org.apache.ignite.internal.processors.query.calcite.planner.UncollectPlannerTest;
 import org.apache.ignite.internal.processors.query.calcite.planner.UnionPlannerTest;
 import org.apache.ignite.internal.processors.query.calcite.planner.UserDefinedViewsPlannerTest;
 import org.apache.ignite.internal.processors.query.calcite.planner.hints.HintsTestSuite;
@@ -83,9 +84,10 @@ import org.junit.runners.Suite;
     InlineIndexScanPlannerTest.class,
     UserDefinedViewsPlannerTest.class,
     RexSimplificationPlannerTest.class,
+    SerializationPlannerTest.class,
+    UncollectPlannerTest.class,
 
     HintsTestSuite.class,
-    SerializationPlannerTest.class,
 })
 public class PlannerTestSuite {
 }