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