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

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

commit a55f609456cacbf2c5473d73d92877155cfc553d
Author: amashenkov <[email protected]>
AuthorDate: Mon Aug 25 15:28:57 2025 +0300

    Enable GROUPING function
---
 .../sql/engine/prepare/IgniteSqlValidator.java     |  3 +-
 .../sql/engine/sql/fun/IgniteSqlOperatorTable.java |  1 +
 .../sql/engine/planner/TpcdsQueryPlannerTest.java  |  4 +-
 .../src/test/resources/tpcds/plan/q27.plan         | 68 ++++++++++++++++++++++
 .../test/resources/tpcds/plan/q27_colocated.plan   | 68 ++++++++++++++++++++++
 5 files changed, 140 insertions(+), 4 deletions(-)

diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
index c777e66bdbc..89cc7d86acd 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
@@ -1229,7 +1229,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
     }
 
     private void validateAggregateFunction(SqlCall call, SqlAggFunction 
aggFunction) {
-        if (!SqlKind.AGGREGATE.contains(aggFunction.kind)) {
+        if (!aggFunction.isAggregator()) {
             throw newValidationError(call,
                     
IgniteResource.INSTANCE.unsupportedAggregationFunction(aggFunction.getName()));
         }
@@ -1246,6 +1246,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
             case MIN:
             case MAX:
             case ANY_VALUE:
+            case GROUPING:
 
                 return;
             default:
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
index f88f433de2a..dd8edff3533 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
@@ -544,6 +544,7 @@ public class IgniteSqlOperatorTable extends 
ReflectiveSqlOperatorTable {
         definedOperatorsBuilder.add(SqlStdOperatorTable.ANY_VALUE);
         definedOperatorsBuilder.add(SqlStdOperatorTable.SINGLE_VALUE);
         definedOperatorsBuilder.add(SqlStdOperatorTable.FILTER);
+        definedOperatorsBuilder.add(SqlStdOperatorTable.GROUPING);
 
         definedOperatorsBuilder.add(EVERY);
         definedOperatorsBuilder.add(SOME);
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/TpcdsQueryPlannerTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/TpcdsQueryPlannerTest.java
index d1f989a4207..4b3905a4fce 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/TpcdsQueryPlannerTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/TpcdsQueryPlannerTest.java
@@ -45,10 +45,8 @@ public class TpcdsQueryPlannerTest extends 
AbstractTpcQueryPlannerTest {
     private static final IntSet UNSUPPORTED_TESTS = IntSet.of(
             // TODO https://issues.apache.org/jira/browse/IGNITE-14642 Support 
STDDEV_SAMP function and unmute tests.
             17, 29, 35, 39,
-            // TODO https://issues.apache.org/jira/browse/IGNITE-25872 Support 
GROUPING function and unmute tests.
-            27, 36, 86,
             // TODO https://issues.apache.org/jira/browse/IGNITE-25873 Support 
aggregate window function RANK and unmute tests.
-            44, 47, 49, 57, 67, 70
+            44, 47, 49, 57, 67, 70, 36, 86
     );
 
     @ParameterizedTest
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q27.plan 
b/modules/sql-engine/src/test/resources/tpcds/plan/q27.plan
new file mode 100644
index 00000000000..1ce5258a1f7
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q27.plan
@@ -0,0 +1,68 @@
+Sort
+    collation: [I_ITEM_ID ASC, S_STATE ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      fieldNames: [I_ITEM_ID, S_STATE, G_STATE, AGG1, AGG2, AGG3, AGG4]
+      group: [I_ITEM_ID, S_STATE]
+      groupSets: [[I_ITEM_ID, S_STATE], [I_ITEM_ID], []]
+      aggregation: [GROUPING(S_STATE), AVG(SS_QUANTITY), AVG(SS_LIST_PRICE), 
AVG(SS_COUPON_AMT), AVG(SS_SALES_PRICE)]
+      est: (rows=12751)
+    Project
+        fieldNames: [I_ITEM_ID, S_STATE, SS_QUANTITY, SS_LIST_PRICE, 
SS_COUPON_AMT, SS_SALES_PRICE]
+        projection: [I_ITEM_ID, S_STATE, SS_QUANTITY, SS_LIST_PRICE, 
SS_COUPON_AMT, SS_SALES_PRICE]
+        est: (rows=35419)
+      HashJoin
+          predicate: =(SS_STORE_SK, S_STORE_SK)
+          type: inner
+          est: (rows=35419)
+        HashJoin
+            predicate: =(SS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=35419)
+          HashJoin
+              predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+              type: inner
+              est: (rows=35419)
+            HashJoin
+                predicate: =(SS_CDEMO_SK, CD_DEMO_SK)
+                type: inner
+                est: (rows=106362)
+              Exchange
+                  distribution: single
+                  est: (rows=2880404)
+                TableScan
+                    table: PUBLIC.STORE_SALES
+                    fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_CDEMO_SK, 
SS_STORE_SK, SS_QUANTITY, SS_LIST_PRICE, SS_SALES_PRICE, SS_COUPON_AMT]
+                    est: (rows=2880404)
+              Exchange
+                  distribution: single
+                  est: (rows=70928)
+                TableScan
+                    table: PUBLIC.CUSTOMER_DEMOGRAPHICS
+                    predicate: AND(=(CD_GENDER, _UTF-8'F'), 
=(CD_MARITAL_STATUS, _UTF-8'U'), =(CD_EDUCATION_STATUS, _UTF-8'2 yr Degree'))
+                    fieldNames: [CD_DEMO_SK, CD_GENDER, CD_MARITAL_STATUS, 
CD_EDUCATION_STATUS]
+                    est: (rows=70928)
+            Exchange
+                distribution: single
+                est: (rows=24325)
+              TableScan
+                  table: PUBLIC.DATE_DIM
+                  predicate: =(D_YEAR, 2000)
+                  fieldNames: [D_DATE_SK, D_YEAR]
+                  est: (rows=24325)
+          Exchange
+              distribution: single
+              est: (rows=18000)
+            TableScan
+                table: PUBLIC.ITEM
+                fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                est: (rows=18000)
+        Exchange
+            distribution: single
+            est: (rows=12)
+          TableScan
+              table: PUBLIC.STORE
+              predicate: SEARCH(S_STATE, Sarg[_UTF-8'AL':VARCHAR(2) CHARACTER 
SET "UTF-8", _UTF-8'FL':VARCHAR(2) CHARACTER SET "UTF-8", _UTF-8'IN':VARCHAR(2) 
CHARACTER SET "UTF-8", _UTF-8'NY':VARCHAR(2) CHARACTER SET "UTF-8", 
_UTF-8'OH':VARCHAR(2) CHARACTER SET "UTF-8", _UTF-8'SC':VARCHAR(2) CHARACTER 
SET "UTF-8"]:VARCHAR(2) CHARACTER SET "UTF-8")
+              fieldNames: [S_STORE_SK, S_STATE]
+              est: (rows=12)
diff --git 
a/modules/sql-engine/src/test/resources/tpcds/plan/q27_colocated.plan 
b/modules/sql-engine/src/test/resources/tpcds/plan/q27_colocated.plan
new file mode 100644
index 00000000000..1ce5258a1f7
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q27_colocated.plan
@@ -0,0 +1,68 @@
+Sort
+    collation: [I_ITEM_ID ASC, S_STATE ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      fieldNames: [I_ITEM_ID, S_STATE, G_STATE, AGG1, AGG2, AGG3, AGG4]
+      group: [I_ITEM_ID, S_STATE]
+      groupSets: [[I_ITEM_ID, S_STATE], [I_ITEM_ID], []]
+      aggregation: [GROUPING(S_STATE), AVG(SS_QUANTITY), AVG(SS_LIST_PRICE), 
AVG(SS_COUPON_AMT), AVG(SS_SALES_PRICE)]
+      est: (rows=12751)
+    Project
+        fieldNames: [I_ITEM_ID, S_STATE, SS_QUANTITY, SS_LIST_PRICE, 
SS_COUPON_AMT, SS_SALES_PRICE]
+        projection: [I_ITEM_ID, S_STATE, SS_QUANTITY, SS_LIST_PRICE, 
SS_COUPON_AMT, SS_SALES_PRICE]
+        est: (rows=35419)
+      HashJoin
+          predicate: =(SS_STORE_SK, S_STORE_SK)
+          type: inner
+          est: (rows=35419)
+        HashJoin
+            predicate: =(SS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=35419)
+          HashJoin
+              predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+              type: inner
+              est: (rows=35419)
+            HashJoin
+                predicate: =(SS_CDEMO_SK, CD_DEMO_SK)
+                type: inner
+                est: (rows=106362)
+              Exchange
+                  distribution: single
+                  est: (rows=2880404)
+                TableScan
+                    table: PUBLIC.STORE_SALES
+                    fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_CDEMO_SK, 
SS_STORE_SK, SS_QUANTITY, SS_LIST_PRICE, SS_SALES_PRICE, SS_COUPON_AMT]
+                    est: (rows=2880404)
+              Exchange
+                  distribution: single
+                  est: (rows=70928)
+                TableScan
+                    table: PUBLIC.CUSTOMER_DEMOGRAPHICS
+                    predicate: AND(=(CD_GENDER, _UTF-8'F'), 
=(CD_MARITAL_STATUS, _UTF-8'U'), =(CD_EDUCATION_STATUS, _UTF-8'2 yr Degree'))
+                    fieldNames: [CD_DEMO_SK, CD_GENDER, CD_MARITAL_STATUS, 
CD_EDUCATION_STATUS]
+                    est: (rows=70928)
+            Exchange
+                distribution: single
+                est: (rows=24325)
+              TableScan
+                  table: PUBLIC.DATE_DIM
+                  predicate: =(D_YEAR, 2000)
+                  fieldNames: [D_DATE_SK, D_YEAR]
+                  est: (rows=24325)
+          Exchange
+              distribution: single
+              est: (rows=18000)
+            TableScan
+                table: PUBLIC.ITEM
+                fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                est: (rows=18000)
+        Exchange
+            distribution: single
+            est: (rows=12)
+          TableScan
+              table: PUBLIC.STORE
+              predicate: SEARCH(S_STATE, Sarg[_UTF-8'AL':VARCHAR(2) CHARACTER 
SET "UTF-8", _UTF-8'FL':VARCHAR(2) CHARACTER SET "UTF-8", _UTF-8'IN':VARCHAR(2) 
CHARACTER SET "UTF-8", _UTF-8'NY':VARCHAR(2) CHARACTER SET "UTF-8", 
_UTF-8'OH':VARCHAR(2) CHARACTER SET "UTF-8", _UTF-8'SC':VARCHAR(2) CHARACTER 
SET "UTF-8"]:VARCHAR(2) CHARACTER SET "UTF-8")
+              fieldNames: [S_STORE_SK, S_STATE]
+              est: (rows=12)

Reply via email to