Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
1.19.0
Description
create table A (a int, b int);
create table B (c int, d int);
insert into A values (1, 1);
insert into A values (2, 2);
sql:
select * from A where A.a not in (select B.c from B where A.b > 1);
the equivalent logical tree:
LogicalProject(a=[$0], b=[$1])
+- LogicalProject(a=[$0], b=[$1])
+- LogicalJoin(condition=[AND(OR(=($0, $3), IS NULL($0), IS NULL($3)), $2)], joinType=[anti])
:- LogicalProject(a=[$0], b=[$1], $f2=[>($1, 1)])
: +- LogicalTableScan(table=[[A]])
+- LogicalProject(c=[$0])
+- LogicalFilter(condition=[true])
+- LogicalTableScan(table=[[B]])
the correct result is: (1, 1), (2, 2)
while if the predicate ($2 in join condition) is pushed into left side, the result is (2, 2) which is incorrect.
Attachments
Issue Links
- contains
-
CALCITE-3169 RelDecorrelator should return for SEMI/ANTI join decorrelate
- Closed
- links to