This is an automated email from the ASF dual-hosted git repository. liyafan pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/calcite.git
commit 1f660d5008a79df0907387657bd35249d0796db3 Author: hannerwang <[email protected]> AuthorDate: Wed Jan 26 19:58:55 2022 +0800 [CALCITE-4683] IN-list converted to JOIN throws type mismatch exception --- .../apache/calcite/sql2rel/SqlToRelConverter.java | 4 +++- .../apache/calcite/test/SqlToRelConverterTest.java | 13 +++++++++++++ .../apache/calcite/test/SqlToRelConverterTest.xml | 22 ++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java index 973f6dd..c8489ee 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java @@ -4688,7 +4688,9 @@ public class SqlToRelConverter { currentProjection); } - setRoot(newLeftInput, false); + // if the original root rel is a leaf rel, the new root should be a leaf. + // otherwise the field offset will be wrong. + setRoot(newLeftInput, leaves.remove(root()) != null); // right fields appear after the LHS fields. final int rightOffset = root().getRowType().getFieldCount() diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java index 044cd9c..8c5067e 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java @@ -3612,6 +3612,19 @@ class SqlToRelConverterTest extends SqlToRelTestBase { } /** Test case for + * <a href="https://issues.apache.org/jira/browse/CALCITE-4683">[CALCITE-4683] + * IN-list converted to JOIN throws type mismatch exception</a>. */ + @Test void testInToSemiJoinWithNewProject() { + final String sql = "SELECT * FROM (\n" + + "SELECT '20210101' AS dt, deptno\n" + + "FROM emp\n" + + "GROUP BY deptno\n" + + ") t\n" + + "WHERE cast(deptno as varchar) in ('1')"; + sql(sql).withConfig(c -> c.withInSubQueryThreshold(0)).ok(); + } + + /** Test case for * <a href="https://issues.apache.org/jira/browse/CALCITE-1944">[CALCITE-1944] * Window function applied to sub-query with dynamic star gets wrong * plan</a>. */ diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml index 4caaa1d..de52560 100644 --- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml @@ -2425,6 +2425,28 @@ LogicalProject(EMPNO=[$0]) ]]> </Resource> </TestCase> + <TestCase name="testInToSemiJoinWithNewProject"> + <Resource name="sql"> + <![CDATA[SELECT * FROM ( +SELECT '20210101' AS dt, deptno +FROM emp +GROUP BY deptno +) t +WHERE cast(deptno as varchar) in ('1')]]> + </Resource> + <Resource name="plan"> + <![CDATA[ +LogicalProject(DT=[$0], DEPTNO=[$1]) + LogicalJoin(condition=[=($2, $3)], joinType=[inner]) + LogicalProject(DT=['20210101'], DEPTNO=[$0], DEPTNO0=[CAST($0):VARCHAR NOT NULL]) + LogicalAggregate(group=[{0}]) + LogicalProject(DEPTNO=[$7]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) + LogicalAggregate(group=[{0}]) + LogicalValues(tuples=[[{ '1' }]]) +]]> + </Resource> + </TestCase> <TestCase name="testInUncorrelatedSubQuery"> <Resource name="sql"> <![CDATA[select empno from emp where deptno in (select deptno from dept)]]>
