You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by ru...@apache.org on 2026/08/25 18:03:59 UTC

(calcite) branch main updated: [CALCITE-6087] EnumerableSortedAggregate returns incorrect result when input is empty

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

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


The following commit(s) were added to refs/heads/main by this push:
     new bd65b15fc6 [CALCITE-6087] EnumerableSortedAggregate returns incorrect result when input is empty
bd65b15fc6 is described below

commit bd65b15fc6e8b55777ea93aad097f5ff6bf31a0f
Author: 1fanwang <1f...@gmail.com>
AuthorDate: Mon Aug 24 11:35:33 2026 -0400

    [CALCITE-6087] EnumerableSortedAggregate returns incorrect result when input is empty
    
    Signed-off-by: 1fanwang <1f...@gmail.com>
---
 .../enumerable/EnumerableSortedAggregateRule.java  |  2 +-
 .../enumerable/EnumerableSortedAggregateTest.java  | 24 ++++++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java
index 30f76e28de..ffeb646a1b 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java
@@ -47,7 +47,7 @@ protected EnumerableSortedAggregateRule(Config config) {
 
   @Override public @Nullable RelNode convert(RelNode rel) {
     final Aggregate agg = (Aggregate) rel;
-    if (!Aggregate.isSimple(agg)) {
+    if (!Aggregate.isSimple(agg) || agg.getGroupSet().isEmpty()) {
       return null;
     }
     final RelTraitSet inputTraits = rel.getCluster()
diff --git a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableSortedAggregateTest.java b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableSortedAggregateTest.java
index 454beb2015..6b188b3b35 100644
--- a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableSortedAggregateTest.java
+++ b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableSortedAggregateTest.java
@@ -50,6 +50,30 @@ public class EnumerableSortedAggregateTest {
             "deptno=20; max_salary=8000.0; num_employee=1");
   }
 
+  @Test void aggOnEmptyInput() {
+    tester(false, new HrSchema())
+        .query("select max(deptno) as m, count(*) as c "
+            + "from emps where deptno > 100")
+        .explainContains(
+            "EnumerableAggregate(group=[{}], m=[MAX($1)], c=[COUNT()])\n"
+                + "  EnumerableCalc")
+        .returnsOrdered("m=null; c=0");
+  }
+
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-6087">[CALCITE-6087]
+   * EnumerableSortedAggregate returns incorrect result when input is empty</a>. */
+  @Test void sortedAggRuleRejectsEmptyGroupSet() {
+    tester(false, new HrSchema())
+        .query("select max(deptno) as m, count(*) as c "
+            + "from emps where deptno > 100")
+        .withHook(Hook.PLANNER, (Consumer<RelOptPlanner>) planner -> {
+          planner.removeRule(EnumerableRules.ENUMERABLE_AGGREGATE_RULE);
+          planner.addRule(EnumerableRules.ENUMERABLE_SORTED_AGGREGATE_RULE);
+        })
+        .throws_("There are not enough rules to produce a node with desired properties");
+  }
+
   @Test void sortedAggTwoGroupKeys() {
     tester(false, new HrSchema())
         .query(