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

zstan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new edae5218a6 IGNITE-19401 Sql. Correct processing count(distinct) 
without arguments (#2106)
edae5218a6 is described below

commit edae5218a68b8e7d2bcbd662c1613e8448ac9065
Author: Evgeniy Stanilovskiy <[email protected]>
AuthorDate: Mon May 27 10:44:59 2024 +0300

    IGNITE-19401 Sql. Correct processing count(distinct) without arguments 
(#2106)
---
 .../subquery/any_all/test_correlated_any_all.test  |  23 ++--
 .../scalar/test_grouped_correlated_subquery.test   | 117 ++++++++++++++++++
 .../test_grouped_correlated_subquery.test_ignore   | 137 ---------------------
 .../engine/exec/exp/agg/AccumulatorsFactory.java   |  18 ++-
 .../sql/engine/exec/rel/BaseAggregateTest.java     | 101 ++++++++++++++-
 .../exec/rel/HashAggregateExecutionTest.java       |  36 ++++--
 .../exec/rel/SortAggregateExecutionTest.java       |  34 +++--
 7 files changed, 286 insertions(+), 180 deletions(-)

diff --git 
a/modules/sql-engine/src/integrationTest/sql/subquery/any_all/test_correlated_any_all.test
 
b/modules/sql-engine/src/integrationTest/sql/subquery/any_all/test_correlated_any_all.test
index 91c8b7f6d8..f26c48aa2e 100644
--- 
a/modules/sql-engine/src/integrationTest/sql/subquery/any_all/test_correlated_any_all.test
+++ 
b/modules/sql-engine/src/integrationTest/sql/subquery/any_all/test_correlated_any_all.test
@@ -1,7 +1,6 @@
 # name: test/sql/subquery/any_all/test_correlated_any_all.test
 # description: Test correlated ANY/ALL subqueries
 # group: [any_all]
-# Ignore https://issues.apache.org/jira/browse/IGNITE-19401
 # Ignore https://issues.apache.org/jira/browse/IGNITE-19402
 
 statement ok
@@ -30,8 +29,6 @@ false
 true
 NULL
 
-# Ignore https://issues.apache.org/jira/browse/IGNITE-19401
-skipif ignite3
 query T
 SELECT i=ALL(SELECT i FROM integers WHERE i<>i1.i) FROM integers i1 ORDER BY i;
 ----
@@ -48,8 +45,6 @@ SELECT i FROM integers i1 WHERE i=ANY(SELECT i FROM integers 
WHERE i=i1.i) ORDER
 2
 3
 
-# Ignore https://issues.apache.org/jira/browse/IGNITE-19401
-skipif ignite3
 query I
 SELECT i FROM integers i1 WHERE i<>ANY(SELECT i FROM integers WHERE i=i1.i) 
ORDER BY i;
 ----
@@ -69,8 +64,6 @@ SELECT i FROM integers i1 WHERE i>ALL(SELECT (i+i1.i-1)/2 
FROM integers WHERE i
 ----
 3
 
-# Ignore https://issues.apache.org/jira/browse/IGNITE-19401
-skipif ignite3
 # if there is i=ANY() where the subquery returns an EMPTY result set and 
i=NULL, the result becomes FALSE instead
 # of NULL
 query T
@@ -97,8 +90,6 @@ false
 false
 true
 
-# Ignore https://issues.apache.org/jira/browse/IGNITE-19401
-skipif ignite3
 query T
 SELECT i<>ANY(SELECT i FROM integers WHERE i=i1.i) FROM integers i1 ORDER BY i;
 ----
@@ -107,8 +98,6 @@ false
 false
 false
 
-# Ignore https://issues.apache.org/jira/browse/IGNITE-19401
-skipif ignite3
 query T
 SELECT i=ALL(SELECT i FROM integers WHERE i<>i1.i) FROM integers i1 ORDER BY i;
 ----
@@ -157,7 +146,17 @@ true
 true
 NULL
 
-# Ignore https://issues.apache.org/jira/browse/IGNITE-19401
+#Ignore https://issues.apache.org/jira/browse/IGNITE-22314
+skipif ignite3
+query T
+SELECT i=ALL(SELECT i FROM (values(null), (1)) integers(i) WHERE i=i1.i OR i 
IS NULL) FROM integers i1 ORDER BY i;
+----
+NULL
+NULL
+NULL
+NULL
+
+#Ignore https://issues.apache.org/jira/browse/IGNITE-22314
 skipif ignite3
 query T
 SELECT i=ALL(SELECT i FROM integers WHERE i=i1.i OR i IS NULL) FROM integers 
i1 ORDER BY i;
diff --git 
a/modules/sql-engine/src/integrationTest/sql/subquery/scalar/test_grouped_correlated_subquery.test
 
b/modules/sql-engine/src/integrationTest/sql/subquery/scalar/test_grouped_correlated_subquery.test
index e40c6d7bc3..f90d4ea658 100644
--- 
a/modules/sql-engine/src/integrationTest/sql/subquery/scalar/test_grouped_correlated_subquery.test
+++ 
b/modules/sql-engine/src/integrationTest/sql/subquery/scalar/test_grouped_correlated_subquery.test
@@ -33,6 +33,123 @@ false
 false
 false
 
+skipif ignite3
+# https://issues.apache.org/jira/browse/IGNITE-16000
+query T
+SELECT col1 IN (SELECT ColID + col1 FROM tbl_ProductSales) FROM another_T 
GROUP BY col1;
+----
+false
+false
+false
+false
+
+skipif ignite3
+# https://issues.apache.org/jira/browse/IGNITE-16000
+query T
+SELECT col1 IN (SELECT ColID + another_T.col1 FROM tbl_ProductSales) FROM 
another_T GROUP BY col1;
+----
+false
+false
+false
+false
+
+skipif ignite3
+# https://issues.apache.org/jira/browse/IGNITE-16000
+query IT
+SELECT (col1 + 1) AS k, k IN (SELECT ColID + k FROM tbl_ProductSales) FROM 
another_T GROUP BY k ORDER BY 1;
+----
+2      false
+12     false
+112    false
+1112   false
+
+skipif ignite3
+# https://issues.apache.org/jira/browse/IGNITE-16000
+query T
+SELECT (col1 + 1) IN (SELECT ColID + (col1 + 1) FROM tbl_ProductSales) FROM 
another_T GROUP BY (col1 + 1);
+----
+false
+false
+false
+false
+
 # this should fail, col1 + 42 is not a grouping column
 statement error
 SELECT col1+1, col1+42 FROM another_T GROUP BY col1+1;
+
+# this should also fail, col1 + 42 is not a grouping column
+statement error
+SELECT (col1 + 1) IN (SELECT ColID + (col1 + 42) FROM tbl_ProductSales) FROM 
another_T GROUP BY (col1 + 1);
+
+skipif ignite3
+# https://issues.apache.org/jira/browse/IGNITE-16000
+# having without GROUP BY in subquery
+query T
+SELECT col5 = ALL (SELECT 1 FROM tbl_ProductSales HAVING MIN(col8) IS NULL) 
FROM another_T GROUP BY col1, col2, col5, col8;
+----
+1
+1
+1
+1
+
+query I
+SELECT CASE WHEN 1 IN (SELECT MAX(col7) UNION ALL (SELECT MIN(ColID) FROM 
tbl_ProductSales INNER JOIN another_T t2 ON t2.col5 = t2.col1)) THEN 2 ELSE 
NULL END FROM another_T t1;
+----
+NULL
+NULL
+NULL
+NULL
+
+skipif ignite3
+# https://issues.apache.org/jira/browse/IGNITE-16000
+query I
+SELECT CASE WHEN 1 IN (SELECT (SELECT MAX(col7))) THEN 2 ELSE NULL END FROM 
another_T t1;
+----
+NULL
+
+skipif ignite3
+# https://issues.apache.org/jira/browse/IGNITE-16000
+# UNION ALL with correlated subquery on either side
+query I
+SELECT CASE WHEN 1 IN (SELECT (SELECT MAX(col7)) UNION ALL (SELECT MIN(ColID) 
FROM tbl_ProductSales INNER JOIN another_T t2 ON t2.col5 = t2.col1)) THEN 2 
ELSE NULL END FROM another_T t1;
+----
+NULL
+
+query I
+SELECT CASE WHEN 1 IN (SELECT (SELECT MIN(ColID) FROM tbl_ProductSales INNER 
JOIN another_T t2 ON t2.col5 = t2.col1) UNION ALL (SELECT MAX(col7))) THEN 2 
ELSE NULL END FROM another_T t1;
+----
+NULL
+NULL
+NULL
+NULL
+
+# correlated column comparison with correlated subquery
+query I
+SELECT (SELECT MIN(ColID) FROM tbl_ProductSales INNER JOIN another_T t2 ON 
t1.col7 <> (SELECT MAX(t1.col1 + t3.col4) FROM another_T t3)) FROM another_T t1;
+----
+1
+1
+1
+1
+
+query I
+SELECT (SELECT MIN(ColID) FROM tbl_ProductSales INNER JOIN another_T t2 ON 
t1.col7 <> ANY(SELECT MAX(t1.col1 + t3.col4) FROM another_T t3)) FROM another_T 
t1;
+----
+1
+1
+1
+1
+
+# LEFT JOIN between correlated columns not supported for now
+statement error
+SELECT CASE WHEN NOT col1 NOT IN (SELECT (SELECT MAX(col7)) UNION (SELECT 
MIN(ColID) FROM tbl_ProductSales LEFT JOIN another_T t2 ON t2.col5 = t1.col1)) 
THEN 1 ELSE 2 END FROM another_T t1 GROUP BY col1 ORDER BY 1;
+
+# REQUIRE(CHECK_COLUMN(result, 0, {1, 2, 2, 2}));
+# correlated columns in window functions not supported yet
+statement error
+SELECT EXISTS (SELECT RANK() OVER (PARTITION BY SUM(DISTINCT col5))) FROM 
another_T t1;
+
+# REQUIRE(CHECK_COLUMN(result, 0, {true}));
+statement error
+SELECT (SELECT SUM(col2) OVER (PARTITION BY SUM(col2) ORDER BY MAX(col1 + 
ColID) ROWS UNBOUNDED PRECEDING) FROM tbl_ProductSales) FROM another_T t1 GROUP 
BY col1
+
diff --git 
a/modules/sql-engine/src/integrationTest/sql/subquery/scalar/test_grouped_correlated_subquery.test_ignore
 
b/modules/sql-engine/src/integrationTest/sql/subquery/scalar/test_grouped_correlated_subquery.test_ignore
deleted file mode 100644
index 90cbab3f3f..0000000000
--- 
a/modules/sql-engine/src/integrationTest/sql/subquery/scalar/test_grouped_correlated_subquery.test_ignore
+++ /dev/null
@@ -1,137 +0,0 @@
-# name: test/sql/subquery/scalar/test_grouped_correlated_subquery.test
-# description: Test correlated subquery with grouping columns
-# group: [scalar]
-# Ignore https://issues.apache.org/jira/browse/IGNITE-15607
-# Ignore https://issues.apache.org/jira/browse/IGNITE-16000
-
-statement ok
-PRAGMA enable_verification
-
-statement ok
-CREATE TABLE tbl_ProductSales (ColID int, Product_Category  varchar(64), 
Product_Name  varchar(64), TotalSales int);
-
-statement ok
-CREATE TABLE another_T (col1 INT, col2 INT, col3 INT, col4 INT, col5 INT, col6 
INT, col7 INT, col8 INT);
-
-statement ok
-INSERT INTO tbl_ProductSales VALUES (1,'Game','Mobo Game',200),(2,'Game','PKO 
Game',400),(3,'Fashion','Shirt',500),(4,'Fashion','Shorts',100);
-
-statement ok
-INSERT INTO another_T VALUES (1,2,3,4,5,6,7,8), (11,22,33,44,55,66,77,88), 
(111,222,333,444,555,666,777,888), (1111,2222,3333,4444,5555,6666,7777,8888);
-
-query T rowsort
-SELECT col1 IN (SELECT ColID FROM tbl_ProductSales) FROM another_T
-----
-true
-false
-false
-false
-
-query T
-SELECT col1 IN (SELECT ColID + col1 FROM tbl_ProductSales) FROM another_T;
-----
-false
-false
-false
-false
-
-query T
-SELECT col1 IN (SELECT ColID + col1 FROM tbl_ProductSales) FROM another_T 
GROUP BY col1;
-----
-false
-false
-false
-false
-
-query T
-SELECT col1 IN (SELECT ColID + another_T.col1 FROM tbl_ProductSales) FROM 
another_T GROUP BY col1;
-----
-false
-false
-false
-false
-
-query IT
-SELECT (col1 + 1) AS k, k IN (SELECT ColID + k FROM tbl_ProductSales) FROM 
another_T GROUP BY k ORDER BY 1;
-----
-2      false
-12     false
-112    false
-1112   false
-
-query T
-SELECT (col1 + 1) IN (SELECT ColID + (col1 + 1) FROM tbl_ProductSales) FROM 
another_T GROUP BY (col1 + 1);
-----
-false
-false
-false
-false
-
-# this should fail, col1 + 42 is not a grouping column
-statement error
-SELECT col1+1, col1+42 FROM another_T GROUP BY col1+1;
-
-# this should also fail, col1 + 42 is not a grouping column
-statement error
-SELECT (col1 + 1) IN (SELECT ColID + (col1 + 42) FROM tbl_ProductSales) FROM 
another_T GROUP BY (col1 + 1);
-
-# having without GROUP BY in subquery
-query T
-SELECT col5 = ALL (SELECT 1 FROM tbl_ProductSales HAVING MIN(col8) IS NULL) 
FROM another_T GROUP BY col1, col2, col5, col8;
-----
-1
-1
-1
-1
-
-query I
-SELECT CASE WHEN 1 IN (SELECT MAX(col7) UNION ALL (SELECT MIN(ColID) FROM 
tbl_ProductSales INNER JOIN another_T t2 ON t2.col5 = t2.col1)) THEN 2 ELSE 
NULL END FROM another_T t1;
-----
-NULL
-
-query I
-SELECT CASE WHEN 1 IN (SELECT (SELECT MAX(col7))) THEN 2 ELSE NULL END FROM 
another_T t1;
-----
-NULL
-
-# UNION ALL with correlated subquery on either side
-query I
-SELECT CASE WHEN 1 IN (SELECT (SELECT MAX(col7)) UNION ALL (SELECT MIN(ColID) 
FROM tbl_ProductSales INNER JOIN another_T t2 ON t2.col5 = t2.col1)) THEN 2 
ELSE NULL END FROM another_T t1;
-----
-NULL
-
-query I
-SELECT CASE WHEN 1 IN (SELECT (SELECT MIN(ColID) FROM tbl_ProductSales INNER 
JOIN another_T t2 ON t2.col5 = t2.col1) UNION ALL (SELECT MAX(col7))) THEN 2 
ELSE NULL END FROM another_T t1;
-----
-NULL
-
-# correlated column comparison with correlated subquery
-query I
-SELECT (SELECT MIN(ColID) FROM tbl_ProductSales INNER JOIN another_T t2 ON 
t1.col7 <> (SELECT MAX(t1.col1 + t3.col4) FROM another_T t3)) FROM another_T t1;
-----
-1
-1
-1
-1
-
-query I
-SELECT (SELECT MIN(ColID) FROM tbl_ProductSales INNER JOIN another_T t2 ON 
t1.col7 <> ANY(SELECT MAX(t1.col1 + t3.col4) FROM another_T t3)) FROM another_T 
t1;
-----
-1
-1
-1
-1
-
-# LEFT JOIN between correlated columns not supported for now
-statement error
-SELECT CASE WHEN NOT col1 NOT IN (SELECT (SELECT MAX(col7)) UNION (SELECT 
MIN(ColID) FROM tbl_ProductSales LEFT JOIN another_T t2 ON t2.col5 = t1.col1)) 
THEN 1 ELSE 2 END FROM another_T t1 GROUP BY col1 ORDER BY 1;
-
-# REQUIRE(CHECK_COLUMN(result, 0, {1, 2, 2, 2}));
-# correlated columns in window functions not supported yet
-statement error
-SELECT EXISTS (SELECT RANK() OVER (PARTITION BY SUM(DISTINCT col5))) FROM 
another_T t1;
-
-# REQUIRE(CHECK_COLUMN(result, 0, {true}));
-statement error
-SELECT (SELECT SUM(col2) OVER (PARTITION BY SUM(col2) ORDER BY MAX(col1 + 
ColID) ROWS UNBOUNDED PRECEDING) FROM tbl_ProductSales) FROM another_T t1 GROUP 
BY col1
-
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java
index 9b55baa9ca..5145455e42 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java
@@ -263,6 +263,8 @@ public class AccumulatorsFactory<RowT> implements 
Supplier<List<AccumulatorWrapp
 
         private final RowHandler<RowT> handler;
 
+        private final boolean distinct;
+
         AccumulatorWrapperImpl(
                 Accumulator accumulator,
                 AggregateCall call,
@@ -272,7 +274,9 @@ public class AccumulatorsFactory<RowT> implements 
Supplier<List<AccumulatorWrapp
             this.accumulator = accumulator;
             this.inAdapter = inAdapter;
             this.outAdapter = outAdapter;
+            distinct = call.isDistinct();
 
+            // need to be refactored after 
https://issues.apache.org/jira/browse/IGNITE-22320
             literalAgg = call.getAggregation() == LITERAL_AGG;
             argList = call.getArgList();
             ignoreNulls = call.ignoreNulls();
@@ -288,12 +292,20 @@ public class AccumulatorsFactory<RowT> implements 
Supplier<List<AccumulatorWrapp
                 return;
             }
 
-            // need to be refactored after 
https://issues.apache.org/jira/browse/CALCITE-5969
-            int params = literalAgg ? 1 : argList.size();
+            int params = argList.size();
+
+            List<Integer> argList0 = argList;
+
+            if ((distinct && argList.isEmpty()) || literalAgg) {
+                int cnt = handler.columnCount(row);
+                assert cnt <= 1;
+                argList0 = List.of(0);
+                params = 1;
+            }
 
             Object[] args = new Object[params];
             for (int i = 0; i < params; i++) {
-                int argPos = literalAgg ? 0 : argList.get(i);
+                int argPos = argList0.get(i);
                 args[i] = handler.get(argPos, row);
 
                 if (ignoreNulls && args[i] == null) {
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/BaseAggregateTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/BaseAggregateTest.java
index 111eb5968c..8455bd6ecf 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/BaseAggregateTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/BaseAggregateTest.java
@@ -112,6 +112,59 @@ public abstract class BaseAggregateTest extends 
AbstractExecutionTest<Object[]>
         assertFalse(root.hasNext());
     }
 
+    @ParameterizedTest
+    @EnumSource
+    public void countDistinct(TestAggregateType testAgg) {
+        ExecutionContext<Object[]> ctx = executionContext(false);
+        IgniteTypeFactory tf = ctx.getTypeFactory();
+        RelDataType rowType = TypeUtils.createRowType(tf, 
TypeUtils.native2relationalTypes(tf, NativeTypes.INT32));
+        ScanNode<Object[]> scan = new ScanNode<>(ctx, Arrays.asList(
+                row(0),
+                row(1),
+                row(1),
+                row(0),
+                row(2)
+        ));
+
+        AggregateCall call = AggregateCall.create(
+                SqlStdOperatorTable.COUNT,
+                true,
+                false,
+                false,
+                ImmutableList.of(),
+                ImmutableIntList.of(),
+                -1,
+                null,
+                RelCollations.EMPTY,
+                tf.createJavaType(int.class),
+                null);
+
+        List<ImmutableBitSet> grpSets = List.of(ImmutableBitSet.of());
+
+        RelDataType aggRowType = TypeUtils.createRowType(tf, 
TypeUtils.native2relationalTypes(tf, NativeTypes.INT32));
+
+        SingleNode<Object[]> aggChain = createAggregateNodesChain(
+                testAgg,
+                ctx,
+                grpSets,
+                call,
+                rowType,
+                aggRowType,
+                rowFactory(),
+                scan,
+                false
+        );
+
+        RootNode<Object[]> root = new RootNode<>(ctx);
+        root.register(aggChain);
+
+        assertTrue(root.hasNext());
+
+        assertArrayEquals(row(3), root.next());
+
+        assertFalse(root.hasNext());
+    }
+
     @ParameterizedTest
     @EnumSource
     public void min(TestAggregateType testAgg) {
@@ -674,13 +727,27 @@ public abstract class BaseAggregateTest extends 
AbstractExecutionTest<Object[]>
             RelDataType aggRowType,
             RowHandler.RowFactory<Object[]> rowFactory,
             ScanNode<Object[]> scan
+    ) {
+        return createAggregateNodesChain(testAgg, ctx, grpSets, aggCall, 
inRowType, aggRowType, rowFactory, scan, true);
+    }
+
+    protected SingleNode<Object[]> createAggregateNodesChain(
+            TestAggregateType testAgg,
+            ExecutionContext<Object[]> ctx,
+            List<ImmutableBitSet> grpSets,
+            AggregateCall aggCall,
+            RelDataType inRowType,
+            RelDataType aggRowType,
+            RowHandler.RowFactory<Object[]> rowFactory,
+            ScanNode<Object[]> scan,
+            boolean group
     ) {
         switch (testAgg) {
             case COLOCATED:
-                return createColocatedAggregateNodesChain(ctx, grpSets, 
aggCall, inRowType, rowFactory, scan);
+                return createColocatedAggregateNodesChain(ctx, grpSets, 
aggCall, inRowType, rowFactory, scan, group);
 
             case MAP_REDUCE:
-                return createMapReduceAggregateNodesChain(ctx, grpSets, 
aggCall, inRowType, aggRowType, rowFactory, scan);
+                return createMapReduceAggregateNodesChain(ctx, grpSets, 
aggCall, inRowType, aggRowType, rowFactory, scan, group);
 
             default:
                 assert false;
@@ -689,15 +756,40 @@ public abstract class BaseAggregateTest extends 
AbstractExecutionTest<Object[]>
         }
     }
 
+    /**
+     * Create colocation implemented aggregate node.
+     *
+     * @param ctx Execution context.
+     * @param grpSets Grouping fields
+     * @param aggCall Aggregate representation.
+     * @param inRowType Input row type.
+     * @param rowFactory Row factory.
+     * @param scan Scan node.
+     * @param group Append grouping operation.
+     * @return Aggregation nodes chain.
+     */
     protected abstract SingleNode<Object[]> createColocatedAggregateNodesChain(
             ExecutionContext<Object[]> ctx,
             List<ImmutableBitSet> grpSets,
             AggregateCall aggCall,
             RelDataType inRowType,
             RowHandler.RowFactory<Object[]> rowFactory,
-            ScanNode<Object[]> scan
+            ScanNode<Object[]> scan,
+            boolean group
     );
 
+    /**
+     * Create map reduce implemented aggregate node.
+     *
+     * @param ctx Execution context.
+     * @param grpSets Grouping fields
+     * @param call Aggregate representation.
+     * @param inRowType Input row type.
+     * @param rowFactory Row factory.
+     * @param scan Scan node.
+     * @param group Append grouping operation.
+     * @return Aggregation nodes chain.
+     */
     protected abstract SingleNode<Object[]> createMapReduceAggregateNodesChain(
             ExecutionContext<Object[]> ctx,
             List<ImmutableBitSet> grpSets,
@@ -705,7 +797,8 @@ public abstract class BaseAggregateTest extends 
AbstractExecutionTest<Object[]>
             RelDataType inRowType,
             RelDataType aggRowType,
             RowHandler.RowFactory<Object[]> rowFactory,
-            ScanNode<Object[]> scan
+            ScanNode<Object[]> scan,
+            boolean group
     );
 
     protected Supplier<List<AccumulatorWrapper<Object[]>>> accFactory(
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/HashAggregateExecutionTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/HashAggregateExecutionTest.java
index bb4355ca79..47f1135e51 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/HashAggregateExecutionTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/HashAggregateExecutionTest.java
@@ -52,7 +52,8 @@ public class HashAggregateExecutionTest extends 
BaseAggregateTest {
             AggregateCall call,
             RelDataType inRowType,
             RowHandler.RowFactory<Object[]> rowFactory,
-            ScanNode<Object[]> scan
+            ScanNode<Object[]> scan,
+            boolean group
     ) {
         assert grpSets.size() == 1 : "Test checks only simple GROUP BY";
 
@@ -66,16 +67,22 @@ public class HashAggregateExecutionTest extends 
BaseAggregateTest {
 
         agg.register(scan);
 
-        RelCollation collation = createOutCollation(grpSets);
+        if (group) {
+            RelCollation collation = createOutCollation(grpSets);
 
-        Comparator<Object[]> cmp = 
ctx.expressionFactory().comparator(collation);
+            Comparator<Object[]> cmp = 
ctx.expressionFactory().comparator(collation);
 
-        // Create sort node on the top to check sorted results
-        SortNode<Object[]> sort = new SortNode<>(ctx, cmp);
+            // Create sort node on the top to check sorted results
+            SortNode<Object[]> sort = new SortNode<>(ctx, cmp);
 
-        sort.register(agg);
+            sort.register(agg);
+
+            return sort;
+        } else {
+            agg.register(scan);
 
-        return sort;
+            return agg;
+        }
     }
 
     private RelCollation createOutCollation(List<ImmutableBitSet> grpSets) {
@@ -102,7 +109,8 @@ public class HashAggregateExecutionTest extends 
BaseAggregateTest {
             RelDataType inRowType,
             RelDataType aggRowType,
             RowHandler.RowFactory<Object[]> rowFactory,
-            ScanNode<Object[]> scan
+            ScanNode<Object[]> scan,
+            boolean group
     ) {
         assert grpSets.size() == 1 : "Test checks only simple GROUP BY";
 
@@ -140,11 +148,15 @@ public class HashAggregateExecutionTest extends 
BaseAggregateTest {
 
         Comparator<Object[]> cmp = 
ctx.expressionFactory().comparator(collation);
 
-        // Create sort node on the top to check sorted results
-        SortNode<Object[]> sort = new SortNode<>(ctx, cmp);
+        if (group) {
+            // Create sort node on the top to check sorted results
+            SortNode<Object[]> sort = new SortNode<>(ctx, cmp);
 
-        sort.register(aggRdc);
+            sort.register(aggRdc);
 
-        return sort;
+            return sort;
+        } else {
+            return aggRdc;
+        }
     }
 }
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/SortAggregateExecutionTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/SortAggregateExecutionTest.java
index 765ac75912..ab77c61534 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/SortAggregateExecutionTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/SortAggregateExecutionTest.java
@@ -52,7 +52,8 @@ public class SortAggregateExecutionTest extends 
BaseAggregateTest {
             AggregateCall call,
             RelDataType inRowType,
             RowHandler.RowFactory<Object[]> rowFactory,
-            ScanNode<Object[]> scan
+            ScanNode<Object[]> scan,
+            boolean group
     ) {
         assert grpSets.size() == 1;
 
@@ -62,10 +63,6 @@ public class SortAggregateExecutionTest extends 
BaseAggregateTest {
 
         Comparator<Object[]> cmp = 
ctx.expressionFactory().comparator(collation);
 
-        SortNode<Object[]> sort = new SortNode<>(ctx, cmp);
-
-        sort.register(scan);
-
         if (grpSet.isEmpty() && cmp == null) {
             cmp = (k1, k2) -> 0;
         }
@@ -79,7 +76,15 @@ public class SortAggregateExecutionTest extends 
BaseAggregateTest {
                 cmp
         );
 
-        agg.register(sort);
+        if (group) {
+            SortNode<Object[]> sort = new SortNode<>(ctx, cmp);
+
+            sort.register(scan);
+
+            agg.register(sort);
+        } else {
+            agg.register(scan);
+        }
 
         return agg;
     }
@@ -93,7 +98,8 @@ public class SortAggregateExecutionTest extends 
BaseAggregateTest {
             RelDataType inRowType,
             RelDataType aggRowType,
             RowHandler.RowFactory<Object[]> rowFactory,
-            ScanNode<Object[]> scan
+            ScanNode<Object[]> scan,
+            boolean group
     ) {
         assert grpSets.size() == 1;
 
@@ -103,10 +109,6 @@ public class SortAggregateExecutionTest extends 
BaseAggregateTest {
 
         Comparator<Object[]> cmp = 
ctx.expressionFactory().comparator(collation);
 
-        SortNode<Object[]> sort = new SortNode<>(ctx, cmp);
-
-        sort.register(scan);
-
         if (grpSet.isEmpty() && cmp == null) {
             cmp = (k1, k2) -> 0;
         }
@@ -120,7 +122,15 @@ public class SortAggregateExecutionTest extends 
BaseAggregateTest {
                 cmp
         );
 
-        aggMap.register(sort);
+        if (group) {
+            SortNode<Object[]> sort = new SortNode<>(ctx, cmp);
+
+            sort.register(scan);
+
+            aggMap.register(sort);
+        } else {
+            aggMap.register(scan);
+        }
 
         // The group's fields placed on the begin of the output row (planner
         // does this by Projection node for aggregate input).

Reply via email to