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() {

Reply via email to