This is an automated email from the ASF dual-hosted git repository.
libenchao 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 6f10c132be [CALCITE-5506] RelToSqlConverter should retain the
aggregation logic when Project without RexInputRef on the Aggregate
6f10c132be is described below
commit 6f10c132bea5fc78620bb2485b7dbf2f2652537b
Author: xiejiajun <[email protected]>
AuthorDate: Sat Jan 28 17:35:53 2023 +0800
[CALCITE-5506] RelToSqlConverter should retain the aggregation logic when
Project without RexInputRef on the Aggregate
---
.../apache/calcite/rel/rel2sql/SqlImplementor.java | 15 +++++++++++
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 29 ++++++++++++++++++++++
2 files changed, 44 insertions(+)
diff --git
a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
index 69e6dac5e8..6b77384110 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
@@ -1831,6 +1831,21 @@ public abstract class SqlImplementor {
return true;
}
+ if (rel instanceof Project) {
+ Project project = (Project) rel;
+ RelNode input = project.getInput();
+ // Cannot merge because "select 1 from t"
+ // is different from "select 1 from (select count(1) from t)"
+ final boolean hasInputRef = project.getProjects()
+ .stream()
+ .anyMatch(rex -> RexUtil.containsInputRef(rex));
+ final boolean hasAggregate =
+ input instanceof Aggregate && input.getRowType().getFieldCount() >
0;
+ if (!hasInputRef && hasAggregate) {
+ return true;
+ }
+ }
+
if (rel instanceof Aggregate) {
final Aggregate agg = (Aggregate) rel;
final boolean hasNestedAgg =
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 8193d0ab0c..cbc52712fc 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
@@ -660,6 +660,35 @@ class RelToSqlConverterTest {
relFn(relFn).ok(expectedSql);
}
+
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-5506">[CALCITE-5506]
+ * RelToSqlConverter should retain the aggregation logic</a>. */
+ @Test public void testTrimmedAggregateUnderProject() {
+ final Function<RelBuilder, RelNode> fn = b -> b
+ .values(new String[]{"K", "V"}, 1, 2)
+ .scan("EMP")
+ .aggregate(b.groupKey(),
+ b.aggregateCall(SqlStdOperatorTable.COUNT, b.field(1))
+ .as("DUMMY"))
+ .project(b.alias(b.literal(1), "K"))
+ .join(JoinRelType.INNER,
+ b.call(SqlStdOperatorTable.EQUALS,
+ b.field(2, 0, "K"),
+ b.field(2, 1, "K")
+ )
+ ).project(b.alias(b.field(1), "l_v"))
+ .build();
+ // RelFieldTrimmer maybe build the RelNode.
+ relFn(fn).ok("SELECT \"t\".\"V\" AS \"l_v\"\n"
+ + "FROM (VALUES (1, 2)) AS \"t\" (\"K\", \"V\")\n"
+ + "INNER JOIN "
+ + "(SELECT 1 AS \"K\"\n"
+ + "FROM (SELECT COUNT(\"ENAME\") AS \"DUMMY\"\n"
+ + "FROM \"scott\".\"EMP\") AS \"t0\") AS \"t1\" "
+ + "ON \"t\".\"K\" = \"t1\".\"K\"");
+ }
+
/** Tests GROUP BY ROLLUP of two columns. The SQL for MySQL has
* "GROUP BY ... ROLLUP" but no "ORDER BY". */
@Test void testSelectQueryWithGroupByRollup() {