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

libopeng updated CALCITE-5880:
------------------------------
    Description: 
{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}
 

  was:
{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}
 


> 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
>            Priority: Major
>
> {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