[ 
https://issues.apache.org/jira/browse/CALCITE-5880?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17753783#comment-17753783
 ] 

LakeShen commented on CALCITE-5880:
-----------------------------------

After I Debug, I discovered that in the convertExpression method of 
SqlToRelConverter, when Exression is determined to be an Exists subquery, would 
generates an is not null Filter based on whether the indicator column is 
nullable,the code like this:

!image-2023-08-13-21-36-00-494.png|width=626,height=277!



I currently have two ideas for the SQL above: 

1. In one case, because the top is the Left Join, for the right NULL case, even 
if there is no match on, the right complement NULL, if the logic of the top 
Left Join is correct, that is, the above IS NOT NULL filtered out the NULL data

2. In the second case, let the top Left Join be associated with the right NULL 
data, so that the right indicator column IS NOT NULL, and the is not NULL will 
not filter the right data.

At the moment I am not sure which logic is correct, I am still debugging and 
thinking, if someone could give me some information, I would really appreciate 
it

> When the association condition of the association subquery is 'is not 
> distinct from', the join condition becomes '=' after decorrelation.
> -----------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CALCITE-5880
>                 URL: https://issues.apache.org/jira/browse/CALCITE-5880
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: libopeng
>            Assignee: LakeShen
>            Priority: Major
>         Attachments: image-2023-08-01-15-20-22-105.png, 
> image-2023-08-02-10-15-00-455.png, image-2023-08-13-21-36-00-494.png
>
>
> {code:java}
> select EMPNO 
> from emp
> where EXISTS (select DEPTNO from dept where emp.EMPNO is not DISTINCT from 
> dept.DEPTNO){code}
> before decorrelation
> {code:java}
> LogicalProject(EMPNO=[$0])
>   LogicalFilter(condition=[IS NOT NULL($9)])
>     LogicalCorrelate(correlation=[$cor0], joinType=[left], 
> requiredColumns=[{0}])
>       LogicalTableScan(table=[[CATALOG, SALES, EMP]])
>       LogicalAggregate(group=[{}], agg#0=[MIN($0)])
>         LogicalProject($f0=[true])
>           LogicalFilter(condition=[OR(AND(IS NULL($cor0.EMPNO), IS NULL($0)), 
> IS TRUE(=($cor0.EMPNO, $0)))])    <---   here is 't1.x is not distinct from 
> t2.x'
>             LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
> {code}
> after decorrelation
> {code:java}
> LogicalProject(EMPNO=[$0])
>   LogicalFilter(condition=[IS NOT NULL($9)])
>     LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], 
> SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], $f0=[$13])
>       LogicalJoin(condition=[AND(=($0, $11), =($9, $12))], joinType=[left])   
>      <---here is 't1.x=t2.x and (t1.x is null = t2.x is null)'
>         LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], 
> HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], $f9=[false], 
> EMPNO0=[$0])
>           LogicalTableScan(table=[[CATALOG, SALES, EMP]])
>         LogicalAggregate(group=[{0, 1}], agg#0=[MIN($2)])
>           LogicalProject(EMPNO=[$2], $f9=[$3], $f0=[true])
>             LogicalJoin(condition=[=($2, $0)], joinType=[inner])
>               LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
>               LogicalProject(EMPNO=[$0], $f9=[false])
>                 LogicalTableScan(table=[[CATALOG, SALES, EMP]])  {code}
>  
> {code:java}
>     EMP               |         DEPT
> +---------+           |      +---------+
> | EMPNO  |            |      | DEPTNO |
> +---------+           |      +---------+
> | null |              |      | null   |
>            {code}
> expect result
> {code:java}
>   EMPNO
> +-------+
> |  null |
> +-------+{code}
> actual result
> {code:java}
>   EMPNO
> +-------+
> +-------+ {code}
>  
>  



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

Reply via email to