This is an automated email from the ASF dual-hosted git repository.

mbudiu 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 d0384ce5ed [CALCITE-3772] RelFieldTrimmer incorrectly trims fields 
when the query includes correlated-subquery
d0384ce5ed is described below

commit d0384ce5edcf0cc182d6bbab8a58aea70d9fe5fa
Author: Xiong Duan <[email protected]>
AuthorDate: Wed Jan 1 10:54:18 2025 +0800

    [CALCITE-3772] RelFieldTrimmer incorrectly trims fields when the query 
includes correlated-subquery
---
 .../calcite/sql2rel/RelFieldTrimmerTest.java       | 47 ++++++++++++++++++++++
 .../test/java/org/apache/calcite/test/CsvTest.java | 15 +++++++
 example/csv/src/test/resources/bug/NUMBERS.csv     |  6 +++
 3 files changed, 68 insertions(+)

diff --git 
a/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java 
b/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java
index 34d94f990c..0318552bc3 100644
--- a/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java
+++ b/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java
@@ -672,5 +672,52 @@ class RelFieldTrimmerTest {
     assertThat(trimmed, hasTree(expected));
   }
 
+  /**
+   * Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-3772";>[CALCITE-3772]
+   * RelFieldTrimmer incorrectly trims fields when the query includes 
correlated-subquery</a>.
+   */
+  @Test void testTrimCorrelatedSubquery() {
+    final RelBuilder builder = RelBuilder.create(config().build());
+    final Holder<@Nullable RexCorrelVariable> v = Holder.empty();
+    RelNode root = builder.scan("EMP")
+        .variable(v::set)
+        .filter(
+            builder.call(SqlStdOperatorTable.GREATER_THAN, builder.field(5),
+            builder.literal(10)))
+        .project(
+            builder.field(0),
+            builder.scalarQuery(
+                b2 -> builder.scan("EMP").filter(
+                    builder.call(SqlStdOperatorTable.LESS_THAN,
+                        builder.field(3), builder.field(v.get(), "MGR")))
+                    .project(builder.field(0))
+                    .aggregate(builder.groupKey(), builder.countStar("c"))
+                    .build()))
+        .build();
+
+    String origTree = ""
+        + "LogicalProject(EMPNO=[$0], $f1=[$SCALAR_QUERY({\n"
+        + "LogicalAggregate(group=[{}], c=[COUNT()])\n"
+        + "  LogicalFilter(condition=[<($3, $cor0.MGR)])\n"
+        + "    LogicalTableScan(table=[[scott, EMP]])\n})])\n"
+        + "  LogicalFilter(condition=[>($5, 10)])\n"
+        + "    LogicalTableScan(table=[[scott, EMP]])\n";
+    assertThat(root, hasTree(origTree));
+
+    final RelFieldTrimmer fieldTrimmer = new RelFieldTrimmer(null, builder);
+    final RelNode trimmed = fieldTrimmer.trim(root);
+    final String expected = ""
+        + "LogicalProject(EMPNO=[$0], $f1=[$SCALAR_QUERY({\n"
+        + "LogicalAggregate(group=[{}], c=[COUNT()])\n"
+        + "  LogicalFilter(condition=[<($3, $cor0.MGR)])\n"
+        + "    LogicalTableScan(table=[[scott, EMP]])\n"
+        + "})])\n"
+        + "  LogicalFilter(condition=[>($2, 10)])\n"
+        + "    LogicalProject(EMPNO=[$0], MGR=[$3], SAL=[$5])\n"
+        + "      LogicalTableScan(table=[[scott, EMP]])\n";
+
+    assertThat(trimmed, hasTree(expected));
+  }
 
 }
diff --git a/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java 
b/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java
index dd81427ba2..7616fcef26 100644
--- a/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java
+++ b/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java
@@ -734,6 +734,21 @@ class CsvTest {
     }
   }
 
+  /**
+   * Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-3772";>[CALCITE-3772]
+   * RelFieldTrimmer incorrectly trims fields when the query includes 
correlated-subquery</a>.
+   */
+  @Test public void testCorrelatedSubquery() throws SQLException {
+    final String sql = "SELECT a, (SELECT count(*) FROM NUMBERS AS x WHERE 
x.b<NUMBERS.b)\n"
+        + "FROM NUMBERS where e>100 order by a";
+    sql("bug", sql).returns("A=104; EXPR$1=0",
+        "A=107; EXPR$1=1",
+        "A=111; EXPR$1=2",
+        "A=115; EXPR$1=3",
+        "A=121; EXPR$1=4").ok();
+  }
+
   /** As {@link #testTimestampGroupBy()} but with ORDER BY. */
   @Test void testTimestampOrderBy() throws SQLException {
     Properties info = new Properties();
diff --git a/example/csv/src/test/resources/bug/NUMBERS.csv 
b/example/csv/src/test/resources/bug/NUMBERS.csv
new file mode 100644
index 0000000000..0816da93bd
--- /dev/null
+++ b/example/csv/src/test/resources/bug/NUMBERS.csv
@@ -0,0 +1,6 @@
+A:int,B:int,C:int,D:int,E:int
+104,100,102,101,103
+107,105,106,108,109
+111,112,113,114,110
+115,118,119,116,117
+121,124,123,122,120

Reply via email to