Repository: calcite
Updated Branches:
  refs/heads/master 88da6a18c -> 7d8e0528b


[CALCITE-1293] Bad code generated when argument to COUNT(DISTINCT) is a GROUP 
BY column


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/2ddff7a5
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/2ddff7a5
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/2ddff7a5

Branch: refs/heads/master
Commit: 2ddff7a5eceef62b906e9e17820bc0238c2f351a
Parents: 88da6a1
Author: Julian Hyde <[email protected]>
Authored: Fri May 19 12:36:08 2017 -0400
Committer: Julian Hyde <[email protected]>
Committed: Sat May 20 09:05:17 2017 -0700

----------------------------------------------------------------------
 .../AggregateExpandDistinctAggregatesRule.java  |  8 ++-
 .../apache/calcite/test/RelOptRulesTest.java    | 13 +++++
 .../org/apache/calcite/test/RelOptRulesTest.xml | 22 ++++++++
 core/src/test/resources/sql/agg.iq              | 59 ++++++++++++++++++++
 4 files changed, 99 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/2ddff7a5/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
----------------------------------------------------------------------
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 044afba..bec1042 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
@@ -450,11 +450,13 @@ public final class AggregateExpandDistinctAggregatesRule 
extends RelOptRule {
 
     final RelBuilder relBuilder = call.builder();
     relBuilder.push(aggregate.getInput());
-    relBuilder.aggregate(relBuilder.groupKey(fullGroupSet, groupSets.size() > 
1, groupSets),
+    final boolean indicator = groupSets.size() > 1;
+    relBuilder.aggregate(
+        relBuilder.groupKey(fullGroupSet, indicator, groupSets),
         distinctAggCalls);
     final RelNode distinct = relBuilder.peek();
     final int groupCount = fullGroupSet.cardinality();
-    final int indicatorCount = groupSets.size() > 1 ? groupCount : 0;
+    final int indicatorCount = indicator ? groupCount : 0;
 
     final RelOptCluster cluster = aggregate.getCluster();
     final RexBuilder rexBuilder = cluster.getRexBuilder();
@@ -515,7 +517,7 @@ public final class AggregateExpandDistinctAggregatesRule 
extends RelOptRule {
     }
     final Registrar registrar = new Registrar();
     for (ImmutableBitSet groupSet : groupSets) {
-      filters.put(groupSet, registrar.register(groupSet));
+      filters.put(groupSet, indicator ? registrar.register(groupSet) : -1);
     }
 
     if (!predicates.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/2ddff7a5/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
----------------------------------------------------------------------
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 3f22f52..0fe5939 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -758,6 +758,19 @@ public class RelOptRulesTest extends RelOptTestBase {
             + " from sales.emp group by deptno");
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-1293";>[CALCITE-1293]
+   * Bad code generated when argument to COUNT(DISTINCT) is a # GROUP BY
+   * column</a>. */
+  @Test public void testDistinctCount3() {
+    final String sql = "select count(distinct deptno), sum(sal)"
+        + " from sales.emp group by deptno";
+    final HepProgram program = HepProgram.builder()
+        .addRuleInstance(AggregateExpandDistinctAggregatesRule.INSTANCE)
+        .build();
+    sql(sql).with(program).check();
+  }
+
   /** Tests implementing multiple distinct count the old way, using a join. */
   @Test public void testDistinctCountMultipleViaJoin() {
     final HepProgram program = HepProgram.builder()

http://git-wip-us.apache.org/repos/asf/calcite/blob/2ddff7a5/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
----------------------------------------------------------------------
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 046505c..a042dbd 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -394,6 +394,28 @@ LogicalProject(DEPTNO=[$0], I0=[$2], I1=[$3])
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testDistinctCount3">
+        <Resource name="sql">
+            <![CDATA[select count(distinct deptno), sum(sal) from sales.emp 
group by deptno]]>
+        </Resource>
+        <Resource name="planBefore">
+            <![CDATA[
+LogicalProject(EXPR$0=[$1], EXPR$1=[$2])
+  LogicalAggregate(group=[{0}], EXPR$0=[COUNT(DISTINCT $0)], EXPR$1=[SUM($1)])
+    LogicalProject(DEPTNO=[$7], SAL=[$5])
+      LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+        </Resource>
+        <Resource name="planAfter">
+            <![CDATA[
+LogicalProject(EXPR$0=[$1], EXPR$1=[$2])
+  LogicalAggregate(group=[{0}], EXPR$0=[COUNT($0)], EXPR$1=[MIN($1)])
+    LogicalAggregate(group=[{0}], EXPR$1=[SUM($1)])
+      LogicalProject(DEPTNO=[$7], SAL=[$5])
+        LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testDistinctNonDistinctAggregatesWithGrouping1">
         <Resource name="sql">
             <![CDATA[SELECT deptno,

http://git-wip-us.apache.org/repos/asf/calcite/blob/2ddff7a5/core/src/test/resources/sql/agg.iq
----------------------------------------------------------------------
diff --git a/core/src/test/resources/sql/agg.iq 
b/core/src/test/resources/sql/agg.iq
index 51ab512..7382eb7 100755
--- a/core/src/test/resources/sql/agg.iq
+++ b/core/src/test/resources/sql/agg.iq
@@ -962,6 +962,65 @@ group by deptno;
 
 !ok
 
+# [CALCITE-1293] Bad code generated when argument to COUNT(DISTINCT) is a
+# GROUP BY column
+select count(distinct deptno) as cd, count(*) as c
+from "scott".emp
+group by deptno;
++----+---+
+| CD | C |
++----+---+
+|  1 | 3 |
+|  1 | 5 |
+|  1 | 6 |
++----+---+
+(3 rows)
+
+!ok
+
+select count(distinct deptno) as cd, count(*) as c
+from "scott".emp
+group by cube(deptno);
++----+---+
+| CD | C |
++----+---+
+|  1 | 3 |
+|  1 | 5 |
+|  1 | 6 |
+|  3 | 3 |
++----+---+
+(4 rows)
+
+!ok
+
+select deptno, count(distinct deptno) as c
+from "scott".emp
+group by deptno;
++--------+---+
+| DEPTNO | C |
++--------+---+
+|     10 | 1 |
+|     20 | 1 |
+|     30 | 1 |
++--------+---+
+(3 rows)
+
+!ok
+
+select count(distinct deptno) as c
+from "scott".emp
+group by deptno;
++---+
+| C |
++---+
+| 1 |
+| 1 |
+| 1 |
++---+
+(3 rows)
+
+!ok
+
 # Multiple distinct count
 select deptno,
  count(distinct job) as j, count(distinct mgr) as m

Reply via email to