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..a017991e5d50d 100644 --- a/tests/sqllogictests/suites/query/subquery.test +++ b/tests/sqllogictests/suites/query/subquery.test @@ -39,6 +39,19 @@ 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, 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 ----