[
https://issues.apache.org/jira/browse/CALCITE-4560?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Stamatis Zampetakis resolved CALCITE-4560.
------------------------------------------
Assignee: Stamatis Zampetakis
Resolution: Fixed
Fixed in
[d7b3c83e06e4a63e5cb97c6f93b66795556d53db|https://github.com/apache/calcite/commit/d7b3c83e06e4a63e5cb97c6f93b66795556d53db].
Thanks for the reviews [~jamesstarr], [~julianhyde]!
> 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
> Assignee: Stamatis Zampetakis
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.27.0
>
> Time Spent: 1.5h
> 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)