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)
