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 <jiajunbernou...@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