You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Leonid Chistov (Jira)" <ji...@apache.org> on 2023/04/16 19:31:00 UTC

[jira] [Assigned] (CALCITE-5402) RelToSql generates invalid code if left and right side field names clash

     [ https://issues.apache.org/jira/browse/CALCITE-5402?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Leonid Chistov reassigned CALCITE-5402:
---------------------------------------

    Assignee: Leonid Chistov

> RelToSql generates invalid code if left and right side field names clash
> ------------------------------------------------------------------------
>
>                 Key: CALCITE-5402
>                 URL: https://issues.apache.org/jira/browse/CALCITE-5402
>             Project: Calcite
>          Issue Type: Bug
>    Affects Versions: 1.32.0
>            Reporter: Leonid Chistov
>            Assignee: Leonid Chistov
>            Priority: Minor
>
> Wrong SQL code is generated when left and right side of a semi-join have fields with same name.
> Generated condition looks like `FIELD` = `rhs table`.`FIELD`, where left `FIELD` is resolved to be the same as `rhs table`.`FIELD` during query execution, but not a reference to an outer table of correlated subquery, as was intended.
> Examples of tests that would fail if added to RelToSqlConverterTest.java: 
> {code:java}
> @Test void testSemiJoinNameClash() {
>   final RelBuilder builder = relBuilder();
>   final RelNode root = builder
>       .scan("DEPT")
>       .project(builder.field("DEPTNO"), builder.field("DNAME"))
>       .scan("EMP")
>       .filter(
>           builder.call(SqlStdOperatorTable.GREATER_THAN,
>               builder.field("JOB"),
>               builder.literal((short) 10)))
>       .project(builder.field("DEPTNO"))
>       .join(
>           JoinRelType.SEMI, builder.equals(
>               builder.field(2, 0, "DEPTNO"),
>               builder.field(2, 1, "DEPTNO")))
>       .project(builder.field("DEPTNO"))
>       .build();
>   final String expectedSql = "SELECT \"DEPTNO\"\n"
>       + "FROM (SELECT \"DEPTNO\", \"EMPNO\"\n"
>       + "FROM \"scott\".\"DEPT\"\n"
>       + "WHERE EXISTS (SELECT 1\n"
>       + "FROM (SELECT \"EMPNO\"\n"
>       + "FROM \"scott\".\"EMP\"\n"
>       + "WHERE \"JOB\" > 10) AS \"t1\"\n"
>       + "WHERE \"DEPT\".\"EMPNO\" = \"t1\".\"EMPNO\")) AS \"t\"";
>   assertThat(toSql(root), isLinux(expectedSql));
> } {code}
>  
> {code:java}
> @Test void testSemiJoinWithSameTable() {
>   final RelBuilder builder = relBuilder();
>   final RelNode root = builder
>       .scan("EMP")
>       .project(builder.field("DEPTNO"), builder.field("EMPNO"))
>       .scan("EMP")
>       .filter(
>           builder.call(SqlStdOperatorTable.GREATER_THAN,
>               builder.field("JOB"),
>               builder.literal((short) 10)))
>       .project(builder.field("EMPNO"))
>       .join(
>           JoinRelType.SEMI, builder.equals(
>               builder.field(2, 0, "EMPNO"),
>               builder.field(2, 1, "EMPNO")))
>       .project(builder.field("DEPTNO"))
>       .build();
>   final String expectedSql = "SELECT \"DEPTNO\"\n"
>       + "FROM (SELECT \"DEPTNO\", \"EMPNO\"\n"
>       + "FROM \"scott\".\"EMP\"\n"
>       + "WHERE EXISTS (SELECT 1\n"
>       + "FROM (SELECT \"EMPNO\"\n"
>       + "FROM \"scott\".\"EMP\"\n"
>       + "WHERE \"JOB\" > 10) AS \"t1\"\n"
>       + "WHERE \"EMP\".\"EMPNO\" = \"t1\".\"EMPNO\")) AS \"t\"";
>   assertThat(toSql(root), isLinux(expectedSql));
> } {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)