You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by li...@apache.org on 2022/03/04 13:24:35 UTC
[calcite] 31/41: [CALCITE-4683] IN-list converted to JOIN throws type mismatch exception
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 <ha...@tencent.com>
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)]]>