From 5c5cc573d08d26285f959646f33467a32ac8818e Mon Sep 17 00:00:00 2001 From: xudong963 Date: Thu, 16 Mar 2023 15:05:21 +0800 Subject: [PATCH 1/2] fix: incorrectly remove mark index --- .../rule/rewrite/filter_join/mark_join_to_semi_join.rs | 7 +++++++ tests/sqllogictests/suites/query/subquery.test | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/src/query/sql/src/planner/optimizer/rule/rewrite/filter_join/mark_join_to_semi_join.rs b/src/query/sql/src/planner/optimizer/rule/rewrite/filter_join/mark_join_to_semi_join.rs index bbd0fabf9257d..23abfa8cec35e 100644 --- a/src/query/sql/src/planner/optimizer/rule/rewrite/filter_join/mark_join_to_semi_join.rs +++ b/src/query/sql/src/planner/optimizer/rule/rewrite/filter_join/mark_join_to_semi_join.rs @@ -32,11 +32,13 @@ pub fn convert_mark_to_semi_join(s_expr: &SExpr) -> Result { } let mark_index = join.marker_index.unwrap(); + let mut find_mark_index = false; // remove mark index filter for (idx, predicate) in filter.predicates.iter().enumerate() { if let ScalarExpr::BoundColumnRef(col) = predicate { if col.column.index == mark_index { + find_mark_index = true; filter.predicates.remove(idx); break; } @@ -51,6 +53,11 @@ pub fn convert_mark_to_semi_join(s_expr: &SExpr) -> Result { } } + if !find_mark_index { + // To be conservative, we do not convert + return Ok(s_expr.clone()); + } + join.join_type = match join.join_type { JoinType::LeftMark => JoinType::RightSemi, JoinType::RightMark => JoinType::LeftSemi, diff --git a/tests/sqllogictests/suites/query/subquery.test b/tests/sqllogictests/suites/query/subquery.test index 79991db459e41..0a2fb85acf699 100644 --- a/tests/sqllogictests/suites/query/subquery.test +++ b/tests/sqllogictests/suites/query/subquery.test @@ -39,6 +39,11 @@ SELECT * FROM c WHERE EXISTS(SELECT * FROM o WHERE o.c_id=c.c_id) ORDER BY c_id 4 TX 6 FL +query IT +SELECT * FROM c WHERE EXISTS(SELECT * FROM o WHERE o.c_id=c.c_id) OR EXISTS(SELECT * FROM o where o.ship = o.bill) ORDER BY c_id +---- + + query IT SELECT * FROM c WHERE NOT EXISTS(SELECT * FROM o WHERE o.c_id=c.c_id) ORDER BY c_id ---- From 88a1630a0d3d06d817de7ead71bdc404e2ee56eb Mon Sep 17 00:00:00 2001 From: xudong963 Date: Thu, 16 Mar 2023 15:16:46 +0800 Subject: [PATCH 2/2] add test --- tests/sqllogictests/suites/query/subquery.test | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tests/sqllogictests/suites/query/subquery.test b/tests/sqllogictests/suites/query/subquery.test index 0a2fb85acf699..a017991e5d50d 100644 --- a/tests/sqllogictests/suites/query/subquery.test +++ b/tests/sqllogictests/suites/query/subquery.test @@ -40,9 +40,17 @@ SELECT * FROM c WHERE EXISTS(SELECT * FROM o WHERE o.c_id=c.c_id) ORDER BY c_id 6 FL query IT -SELECT * FROM c WHERE EXISTS(SELECT * FROM o WHERE o.c_id=c.c_id) OR EXISTS(SELECT * FROM o where o.ship = o.bill) ORDER BY c_id ----- - +SELECT * FROM c, o WHERE c.c_id = o.c_id AND (EXISTS(SELECT * FROM o WHERE o.c_id=c.c_id) OR EXISTS(SELECT * FROM o where o.ship = c.bill)) ORDER BY c_id +---- +1 CA 10 1 CA +1 CA 20 1 CA +1 CA 30 1 CA +2 TX 40 2 CA +2 TX 50 2 TX +2 TX 60 2 NULL +4 TX 70 4 WY +4 TX 80 4 NULL +6 FL 90 6 WA query IT SELECT * FROM c WHERE NOT EXISTS(SELECT * FROM o WHERE o.c_id=c.c_id) ORDER BY c_id