[
https://issues.apache.org/jira/browse/CALCITE-4560?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17334768#comment-17334768
]
Stamatis Zampetakis commented on CALCITE-4560:
----------------------------------------------
Thanks [~julianhyde], I addressed all the comments. Moreover, I marked the new
public classes as experimental to be on the safe side if we want to make
changes in the near future.
For the record the change was also tested in the Hive suite which has many
cases where this transformation applies. The correctness of the results was not
affected, and many plans have improved.
> Wrong plan when decorrelating EXISTS subquery with COALESCE in the predicate
> ----------------------------------------------------------------------------
>
> Key: CALCITE-4560
> URL: https://issues.apache.org/jira/browse/CALCITE-4560
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.26.0
> Reporter: Stamatis Zampetakis
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.27.0
>
> Time Spent: 1h 20m
> Remaining Estimate: 0h
>
> The problem can be seen by adding the following test in
> {{SqlToRelConverterTest}}.
> {code:java}
> @Test void testExistsCorrelatedDecorrelate01() {
> final String sql = "select e1.empno from empnullables e1 where exists (\n"
> + " select 1 from empnullables e2 where
> COALESCE(e1.ename,'M')=COALESCE(e2.ename,'M'))";
> sql(sql).decorrelate(true).ok();
> }
> {code}
> The plan after decorrelation is shown below:
> {noformat}
> LogicalProject(EMPNO=[$0])
> LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4],
> SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], ENAME0=[$9],
> $f1=[CAST($10):BOOLEAN])
> LogicalJoin(condition=[=($1, $9)], joinType=[inner])
> LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
> LogicalAggregate(group=[{0}], agg#0=[MIN($1)])
> LogicalProject(ENAME0=[$9], $f0=[true])
> LogicalJoin(condition=[=(CASE(IS NOT NULL($9), $9,
> 'M':VARCHAR(20)), CASE(IS NOT NULL($1), CAST($1):VARCHAR(20) NOT NULL,
> 'M':VARCHAR(20)))], joinType=[inner])
> LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
> LogicalAggregate(group=[{0}])
> LogicalProject(ENAME=[$1])
> LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
> {noformat}
> The problem lies in the {{LogicalJoin(condition=[=($1, $9)],
> joinType=[inner])}} operator. If there are rows with {{NULL}} values in the
> {{ENAME}} column these are going to be incorrectly removed from the result
> set. The COALESCE operator is present in the SQL query to ensure that rows
> with NULL values are retained in the result.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)