You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2019/03/25 17:52:30 UTC
[calcite] 03/04: [CALCITE-2946] RelBuilder wrongly skips creation
of Aggregate that prunes columns if input produces one row at most
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 <jc...@apache.org>
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