You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by ru...@apache.org on 2022/12/12 09:46:56 UTC
[calcite] branch main updated: [CALCITE-5394] RelToSql converter fails when semi-join is under a join node
This is an automated email from the ASF dual-hosted git repository.
rubenql 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 6bea101b66 [CALCITE-5394] RelToSql converter fails when semi-join is under a join node
6bea101b66 is described below
commit 6bea101b664b93d42f171d079a60a67dbbc22607
Author: xiejiajun <ji...@foxmail.com>
AuthorDate: Sat Nov 26 15:46:45 2022 +0800
[CALCITE-5394] RelToSql converter fails when semi-join is under a join node
---
.../calcite/rel/rel2sql/RelToSqlConverter.java | 2 +-
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 33 ++++++++++++++++++++++
2 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
index b877e1fe6f..41ca2e2290 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
@@ -298,7 +298,7 @@ public class RelToSqlConverter extends SqlImplementor
final SqlNode resultNode =
leftResult.neededAlias == null ? sqlSelect
: as(sqlSelect, leftResult.neededAlias);
- return result(resultNode, leftResult, rightResult);
+ return result(resultNode, ImmutableList.of(Clause.FROM), e, null);
}
/** Returns whether this join should be unparsed as a {@link JoinType#COMMA}.
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 fb89b310b6..940d4b34fa 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
@@ -1249,6 +1249,39 @@ class RelToSqlConverterTest {
assertThat(toSql(root), isLinux(expectedSql));
}
+ /** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-5394">[CALCITE-5394]
+ * RelToSql converter fails when semi-join is under a join node</a>. */
+ @Test void testSemiJoinUnderJoin() {
+ final RelBuilder builder = relBuilder();
+ final RelNode base = builder
+ .scan("EMP")
+ .scan("EMP")
+ .join(
+ JoinRelType.SEMI, builder.equals(
+ builder.field(2, 0, "EMPNO"),
+ builder.field(2, 1, "EMPNO")))
+ .build();
+ final RelNode root = builder
+ .scan("DEPT")
+ .push(base)
+ .join(
+ JoinRelType.INNER, builder.equals(
+ builder.field(2, 1, "DEPTNO"),
+ builder.field(2, 0, "DEPTNO")))
+ .project(builder.field("DEPTNO"))
+ .build();
+ final String expectedSql = "SELECT \"DEPT\".\"DEPTNO\"\n"
+ + "FROM \"scott\".\"DEPT\"\n"
+ + "INNER JOIN (SELECT *\n"
+ + "FROM \"scott\".\"EMP\"\n"
+ + "WHERE EXISTS (SELECT 1\n"
+ + "FROM \"scott\".\"EMP\" AS \"EMP0\"\n"
+ + "WHERE \"EMP\".\"EMPNO\" = \"EMP0\".\"EMPNO\")) AS \"t\" ON \"DEPT\".\"DEPTNO\" = \"t\""
+ + ".\"DEPTNO\"";
+ assertThat(toSql(root), isLinux(expectedSql));
+ }
+
/** Test case for
* <a href="https://issues.apache.org/jira/browse/CALCITE-2792">[CALCITE-2792]
* StackOverflowError while evaluating filter with large number of OR