This is an automated email from the ASF dual-hosted git repository. jcamacho pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/calcite.git
commit 2fa7fd79b7dbb09276574784baa80b99edf37412 Author: Jesus Camacho Rodriguez <[email protected]> AuthorDate: Fri Mar 22 18:31:31 2019 -0700 [CALCITE-2946] RelBuilder wrongly skips creation of Aggregate that prunes columns if input produces one row at most Close apache/calcite#1128 --- .../java/org/apache/calcite/tools/RelBuilder.java | 2 +- .../java/org/apache/calcite/test/RelBuilderTest.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java index c62c42c..7f85432 100644 --- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java +++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java @@ -1431,7 +1431,7 @@ public class RelBuilder { final Double maxRowCount = mq.getMaxRowCount(peek()); if (maxRowCount != null && maxRowCount <= 1D) { // If there is at most one row, rel is already unique. - return this; + return project(fields(groupSet.asList())); } } final ImmutableList<ImmutableBitSet> groupSets; diff --git a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java index 1a50e95..3ec2859 100644 --- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java @@ -855,6 +855,25 @@ public class RelBuilderTest { assertThat(root, hasTree(expected)); } + /** Test case for + * <a href="https://issues.apache.org/jira/browse/CALCITE-2946">[CALCITE-2946] + * RelBuilder wrongly skips creation of Aggregate that prunes columns if input + * produces one row at most</a>. */ + @Test public void testAggregate5() { + final RelBuilder builder = RelBuilder.create(config().build()); + RelNode root = + builder.scan("EMP") + .aggregate(builder.groupKey(), builder.count().as("C")) + .project(builder.literal(4), builder.literal(2), builder.field(0)) + .aggregate(builder.groupKey(builder.field(0), builder.field(1))) + .build(); + final String expected = "" + + "LogicalProject($f0=[4], $f1=[2])\n" + + " LogicalAggregate(group=[{}], C=[COUNT()])\n" + + " LogicalTableScan(table=[[scott, EMP]])\n"; + assertThat(root, hasTree(expected)); + } + @Test public void testAggregateFilter() { // Equivalent SQL: // SELECT deptno, COUNT(*) FILTER (WHERE empno > 100) AS c
