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

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


The following commit(s) were added to refs/heads/master by this push:
     new 1ae20f3  [CALCITE-4239] RelMdUniqueKeys returns wrong unique keys for 
Aggregate with grouping sets
1ae20f3 is described below

commit 1ae20f3e47d9ffab52e934c077d1b7629f798a2f
Author: Chunwei Lei <chunwei.l...@gmail.com>
AuthorDate: Thu Sep 10 10:48:57 2020 +0800

    [CALCITE-4239] RelMdUniqueKeys returns wrong unique keys for Aggregate with 
grouping sets
---
 .../apache/calcite/rel/metadata/RelMdColumnUniqueness.java    | 11 +++++++----
 .../java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java | 10 ++++++++--
 .../test/java/org/apache/calcite/test/RelMetadataTest.java    |  6 ++++++
 3 files changed, 21 insertions(+), 6 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java 
b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
index 86b1e82..755964c 100644
--- 
a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
+++ 
b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
@@ -348,10 +348,13 @@ public class RelMdColumnUniqueness
 
   public Boolean areColumnsUnique(Aggregate rel, RelMetadataQuery mq,
       ImmutableBitSet columns, boolean ignoreNulls) {
-    columns = decorateWithConstantColumnsFromPredicates(columns, rel, mq);
-    // group by keys form a unique key
-    ImmutableBitSet groupKey = ImmutableBitSet.range(rel.getGroupCount());
-    return columns.contains(groupKey);
+    if (Aggregate.isSimple(rel) || ignoreNulls) {
+      columns = decorateWithConstantColumnsFromPredicates(columns, rel, mq);
+      // group by keys form a unique key
+      ImmutableBitSet groupKey = ImmutableBitSet.range(rel.getGroupCount());
+      return columns.contains(groupKey);
+    }
+    return null;
   }
 
   public Boolean areColumnsUnique(Values rel, RelMetadataQuery mq,
diff --git 
a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java 
b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java
index 1969d31..c0ea749 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java
@@ -246,8 +246,14 @@ public class RelMdUniqueKeys
 
   public Set<ImmutableBitSet> getUniqueKeys(Aggregate rel, RelMetadataQuery mq,
       boolean ignoreNulls) {
-    // group by keys form a unique key
-    return ImmutableSet.of(rel.getGroupSet());
+    if (Aggregate.isSimple(rel) || ignoreNulls) {
+      // group by keys form a unique key
+      return ImmutableSet.of(rel.getGroupSet());
+    } else {
+      // If the aggregate has grouping sets, all group by keys might be null 
which means group by
+      // keys do not form a unique key.
+      return ImmutableSet.of();
+    }
   }
 
   public Set<ImmutableBitSet> getUniqueKeys(Union rel, RelMetadataQuery mq,
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 8c5bd1d..76d33c5 100644
--- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
@@ -1198,6 +1198,12 @@ public class RelMetadataTest extends SqlToRelTestBase {
         ImmutableSet.of(ImmutableBitSet.of(0)));
   }
 
+  @Test void testGroupingSets() {
+    checkGetUniqueKeys("select deptno, sal, count(*) from emp\n"
+            + "group by GROUPING SETS (deptno, sal)",
+        ImmutableSet.of());
+  }
+
   @Test void testUnion() {
     checkGetUniqueKeys("select deptno from emp\n"
         + "union\n"

Reply via email to