You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2022/03/25 02:34:16 UTC

[calcite] 01/01: [CALCITE-5050] Metadata (RelMdRowCount) should reflect the fact that an Aggregate with no GROUP BY always returns 1 row

This is an automated email from the ASF dual-hosted git repository.

jhyde pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git

commit 1ce516dcb660caa40ac806617f37cae9532bd0aa
Author: Jing Zhang <be...@gmail.com>
AuthorDate: Thu Mar 17 21:45:00 2022 +0800

    [CALCITE-5050] Metadata (RelMdRowCount) should reflect the fact that an Aggregate with no GROUP BY always returns 1 row
    
    Close apache/calcite#2746
---
 .../apache/calcite/rel/metadata/RelMdRowCount.java |  5 +++-
 .../org/apache/calcite/test/RelMetadataTest.java   | 29 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java
index 6b10195..3de9314 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java
@@ -199,7 +199,10 @@ public class RelMdRowCount
 
   public Double getRowCount(Aggregate rel, RelMetadataQuery mq) {
     ImmutableBitSet groupKey = rel.getGroupSet();
-
+    if (groupKey.isEmpty()) {
+      // Aggregate with no GROUP BY always returns 1 row (even on empty table).
+      return 1D;
+    }
     // rowCount is the cardinality of the group by columns
     Double distinctRowCount =
         mq.getDistinctRowCount(rel.getInput(), groupKey, null);
diff --git a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
index c7498da..038547c 100644
--- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
@@ -674,6 +674,35 @@ public class RelMetadataTest {
     sql(sql).assertThatRowCount(is(1D), is(1D), is(1D));
   }
 
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-5050">[CALCITE-5050]
+   * Aggregate with no GROUP BY always returns 1 row. </a>. */
+  @Test void testRowCountAggregateEmptyGroupKey() {
+    fixture()
+        .withRelFn(b ->
+            b.scan("EMP")
+                .aggregate(
+                    b.groupKey(),
+                    b.count(false, "C"))
+                .build())
+        .assertThatRowCount(is(1D), is(1D), is(1D));
+  }
+
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-5050">[CALCITE-5050]
+   * Aggregate with no GROUP BY always returns 1 row (even on empty table). </a>. */
+  @Test void testRowCountAggregateEmptyGroupKeyWithEmptyTable() {
+    fixture()
+        .withRelFn(b ->
+            b.scan("EMP")
+                .filter(b.literal(false))
+                .aggregate(
+                    b.groupKey(),
+                    b.count(false, "C"))
+                .build())
+        .assertThatRowCount(is(1D), is(1D), is(1D));
+  }
+
   @Test void testRowCountAggregateConstantKey() {
     final String sql = "select count(*) from emp where deptno=2 and ename='emp1' "
         + "group by deptno, ename";