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
