This is an automated email from the ASF dual-hosted git repository.
mihaibudiu 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 6400e14a2d [CALCITE-7838] HsqldbSqlDialect incorrectly claims to
support nested aggregations
6400e14a2d is described below
commit 6400e14a2daa14259675c6446d3837472d353ce9
Author: Sean Broeder <[email protected]>
AuthorDate: Mon Oct 5 13:27:04 2026 -0700
[CALCITE-7838] HsqldbSqlDialect incorrectly claims to support nested
aggregations
HsqldbSqlDialect incorrectly used the default true behavior for
supportsNestedAggregations(), so an aggregate over an expression
of another aggregate was pushed down, which HSQLDB itself rejects.
Override supportsNestedAggregations() to return false so that the
converter generates a sub-SELECT, similar to how MySQL and
PostgreSQL are already handled.
---
.../calcite/sql/dialect/HsqldbSqlDialect.java | 4 +++
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 29 ++++++++++++++++++++++
.../org/apache/calcite/test/JdbcAdapterTest.java | 19 ++++++++++++++
3 files changed, 52 insertions(+)
diff --git
a/core/src/main/java/org/apache/calcite/sql/dialect/HsqldbSqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/dialect/HsqldbSqlDialect.java
index e5b4791358..599d70f4a5 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/HsqldbSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/HsqldbSqlDialect.java
@@ -49,6 +49,10 @@ public HsqldbSqlDialect(Context context) {
super(context);
}
+ @Override public boolean supportsNestedAggregations() {
+ return false;
+ }
+
@Override public boolean supportsCharSet() {
return false;
}
diff --git
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
index 3ca31df695..1e15dfb6ec 100644
---
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
+++
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
@@ -2745,6 +2745,35 @@ private static RelNode sqlToRel(String sql, SchemaPlus
defaultSchema,
.withDoris().ok(expectedStarRocks);
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-7838">[CALCITE-7838]
+ * HsqldbSqlDialect incorrectly claims to support nested aggregations</a>.
+ *
+ * <p>The inner aggregate is wrapped in an expression, so the outer aggregate
+ * must read it from a sub-SELECT on dialects that do not support nested
+ * aggregate functions. Oracle can do it in a single SELECT. */
+ @Test void testNestedAggregatesOverExpression() {
+ final String query = "select\n"
+ + " SUM(\"net_weight1\") as \"net_weight_converted\"\n"
+ + " from ("
+ + " select\n"
+ + " SUM(\"net_weight\") + 1 as \"net_weight1\"\n"
+ + " from \"foodmart\".\"product\"\n"
+ + " group by \"product_id\")";
+ final String expectedOracle =
+ "SELECT SUM(SUM(\"net_weight\") + 1) \"net_weight_converted\"\n"
+ + "FROM \"foodmart\".\"product\"\n"
+ + "GROUP BY \"product_id\"";
+ final String expectedHsqldb =
+ "SELECT SUM(net_weight1) AS net_weight_converted\n"
+ + "FROM (SELECT SUM(net_weight) + 1 AS net_weight1\n"
+ + "FROM foodmart.product\n"
+ + "GROUP BY product_id) AS t1";
+ sql(query)
+ .withOracle().ok(expectedOracle)
+ .withHsqldb().ok(expectedHsqldb);
+ }
+
/** Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-2628">[CALCITE-2628]
* JDBC adapter throws NullPointerException while generating GROUP BY query
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
b/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
index fbf502169d..c8e540dc32 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
@@ -89,6 +89,25 @@ class JdbcAdapterTest {
.returnsCount(14);
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-7838">[CALCITE-7838]
+ * HsqldbSqlDialect incorrectly claims to support nested aggregations</a>.
+ *
+ * <p>Runs against a real HSQLDB, which rejects
+ * {@code SELECT SUM(CAST(SUM(x) AS DOUBLE)) ... GROUP BY y}. */
+ @Test void testNestedAggregateUnderCast() {
+ CalciteAssert.model(JdbcTest.FOODMART_SCOTT_MODEL)
+ .query("select sum(m) from (\n"
+ + " select cast(sum(sal) as double) as m\n"
+ + " from scott.emp group by deptno)")
+ .enable(CalciteAssert.DB == CalciteAssert.DatabaseInstance.HSQLDB)
+ .planHasSql("SELECT SUM(\"M\")\n"
+ + "FROM (SELECT CAST(SUM(\"SAL\") AS DOUBLE) AS \"M\"\n"
+ + "FROM \"SCOTT\".\"EMP\"\n"
+ + "GROUP BY \"DEPTNO\") AS \"t0\"")
+ .returns("EXPR$0=29025.0\n");
+ }
+
/** Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-5161">[CALCITE-5161]
* NPE when inserting a null value into a decimal column</a>. */