This is an automated email from the ASF dual-hosted git repository.
mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 8c98d4210a [CALCITE-6332] Optimization
CoreRules.AGGREGATE_EXPAND_DISTINCT_AGGREGATES_TO_JOIN produces incorrect
results for aggregates with groupSets
8c98d4210a is described below
commit 8c98d4210a35e8d8261187ac108d7ca6ecc75936
Author: Mihai Budiu <[email protected]>
AuthorDate: Mon Apr 8 15:04:32 2024 -0700
[CALCITE-6332] Optimization
CoreRules.AGGREGATE_EXPAND_DISTINCT_AGGREGATES_TO_JOIN produces incorrect
results for aggregates with groupSets
Signed-off-by: Mihai Budiu <[email protected]>
---
.../rel/rules/AggregateExpandDistinctAggregatesRule.java | 7 +++++++
.../java/org/apache/calcite/test/RelOptRulesTest.java | 12 ++++++++++++
.../resources/org/apache/calcite/test/RelOptRulesTest.xml | 15 +++++++++++++++
3 files changed, 34 insertions(+)
diff --git
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
index 7a00db8d72..ccf32284e7 100644
---
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
+++
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
@@ -133,6 +133,13 @@ public final class AggregateExpandDistinctAggregatesRule
return;
}
+ if (!config.isUsingGroupingSets()
+ && aggregate.groupSets.size() > 1) {
+ // Grouping sets are not handled correctly
+ // when generating joins.
+ return;
+ }
+
// Find all of the agg expressions. We use a LinkedHashSet to ensure
determinism.
final List<AggregateCall> aggCalls = aggregate.getAggCallList();
// Find all aggregate calls with distinct
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index bfe1f4b036..0681d4b7fc 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -1990,6 +1990,18 @@ class RelOptRulesTest extends RelOptTestBase {
.check();
}
+ /** Test case for <a
href="https://issues.apache.org/jira/projects/CALCITE/issues/CALCITE-6332">
+ * [CALCITE-6332] Optimization
CoreRules.AGGREGATE_EXPAND_DISTINCT_AGGREGATES_TO_JOIN
+ * produces incorrect results for aggregates with groupSets</a>. */
+ @Test void testIssue6332() {
+ final String sql = "select count(distinct deptno) as cd, count(*) as c\n"
+ + "from emp\n"
+ + "group by cube(deptno)";
+ sql(sql)
+ .withRule(CoreRules.AGGREGATE_EXPAND_DISTINCT_AGGREGATES_TO_JOIN)
+ .checkUnchanged();
+ }
+
@Test void testDistinctCountMixed() {
final String sql = "select deptno, count(distinct deptno, job) as cddj,\n"
+ " sum(sal) as s\n"
diff --git
a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 7302939c95..177abc997b 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -5180,6 +5180,21 @@ LogicalProject(EMPNO=[$0], DEPTNO=[$1], W_COUNT=[$2])
LogicalProject(EMPNO=[$0], DEPTNO=[$7], $2=[$9])
LogicalWindow(window#0=[window(aggs [COUNT($0)])])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testIssue6332">
+ <Resource name="sql">
+ <![CDATA[select count(distinct deptno) as cd, count(*) as c
+from emp
+group by cube(deptno)]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalProject(CD=[$1], C=[$2])
+ LogicalAggregate(group=[{0}], groups=[[{0}, {}]], CD=[COUNT(DISTINCT $0)],
C=[COUNT()])
+ LogicalProject(DEPTNO=[$7])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
]]>
</Resource>
</TestCase>