This is an automated email from the ASF dual-hosted git repository.
gian 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 d0e0d0e379 [CALCITE-7162] AggregateMergeRule type mismatch on MIN/MAX
d0e0d0e379 is described below
commit d0e0d0e3794aec0bfb0ccc1e2e59473dcfebec63
Author: Gian Merlino <[email protected]>
AuthorDate: Sat Sep 6 23:00:40 2025 -0700
[CALCITE-7162] AggregateMergeRule type mismatch on MIN/MAX
---
.../calcite/sql/SqlSplittableAggFunction.java | 4 ++--
.../org/apache/calcite/test/RelOptRulesTest.java | 20 ++++++++++++++++++++
.../org/apache/calcite/test/RelOptRulesTest.xml | 22 ++++++++++++++++++++++
3 files changed, 44 insertions(+), 2 deletions(-)
diff --git
a/core/src/main/java/org/apache/calcite/sql/SqlSplittableAggFunction.java
b/core/src/main/java/org/apache/calcite/sql/SqlSplittableAggFunction.java
index 1918ef6701..d5bdeb00f3 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlSplittableAggFunction.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlSplittableAggFunction.java
@@ -189,7 +189,7 @@ class CountSplitter implements SqlSplittableAggFunction {
bottom.isDistinct(), bottom.isApproximate(), false,
bottom.rexList, bottom.getArgList(), bottom.filterArg,
bottom.distinctKeys, bottom.getCollation(),
- bottom.getType(), top.getName());
+ top.getType(), top.getName());
} else {
return null;
}
@@ -234,7 +234,7 @@ class SelfSplitter implements SqlSplittableAggFunction {
bottom.isDistinct(), bottom.isApproximate(), false,
bottom.rexList, bottom.getArgList(), bottom.filterArg,
bottom.distinctKeys, bottom.getCollation(),
- bottom.getType(), top.getName());
+ top.getType(), top.getName());
} else {
return null;
}
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index f8f8db2484..cfd0173b65 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -7583,6 +7583,26 @@ private HepProgram getTransitiveProgram() {
.check();
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-7162">[CALCITE-7162]
+ * AggregateMergeRule throws 'type mismatch' AssertionError</a>. The scenario
+ * has the same aggregate functions (MIN and MAX) at multiple levels; the
+ * lower level is NOT NULL (because of GROUP BY) and the upper level is
+ * nullable. */
+ @Test void testAggregateMerge10() {
+ final String sql = "SELECT min(mn), max(mx)\n"
+ + "FROM (\n"
+ + " SELECT min(deptno) mn, max(deptno) mx\n"
+ + " FROM dept\n"
+ + " GROUP BY name)";
+ sql(sql)
+ .withPreRule(CoreRules.AGGREGATE_PROJECT_MERGE,
+ CoreRules.PROJECT_MERGE)
+ .withRule(CoreRules.AGGREGATE_PROJECT_MERGE,
+ CoreRules.AGGREGATE_MERGE)
+ .check();
+ }
+
/**
* Test case for AggregateRemoveRule, should remove aggregates since
* empno is unique and all aggregate functions are splittable.
diff --git
a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index f33dd05151..aa5fe6d55c 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -843,6 +843,28 @@ LogicalAggregate(group=[{}], EXPR$0=[SUM($1)])
<![CDATA[
LogicalAggregate(group=[{}], EXPR$0=[SUM($0)])
LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testAggregateMerge10">
+ <Resource name="sql">
+ <![CDATA[SELECT min(mn), max(mx)
+FROM (
+ SELECT min(deptno) mn, max(deptno) mx
+ FROM dept
+ GROUP BY name)]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalAggregate(group=[{}], EXPR$0=[MIN($1)], EXPR$1=[MAX($2)])
+ LogicalAggregate(group=[{1}], MN=[MIN($0)], MX=[MAX($0)])
+ LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+LogicalAggregate(group=[{}], EXPR$0=[MIN($0)], EXPR$1=[MAX($0)])
+ LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
]]>
</Resource>
</TestCase>