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 <[email protected]>
AuthorDate: Mon Aug 24 11:35:33 2026 -0400
[CALCITE-6087] EnumerableSortedAggregate returns incorrect result when
input is empty
Signed-off-by: 1fanwang <[email protected]>
---
.../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(