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"