From a573e1093ab58c02d16495e4345b974a1c5502e5 Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Thu, 4 May 2023 11:16:18 +0800 Subject: [PATCH] [fix](planner) insubquery should always be converted to semi or anti join (#19240) --- .../java/org/apache/doris/analysis/StmtRewriter.java | 10 ++++++---- .../correctness_p0/test_join_without_condition.groovy | 6 ++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java index c09f034525..3ce3ec00f8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java @@ -822,11 +822,13 @@ public class StmtRewriter { if (expr instanceof ExistsPredicate) { joinOp = ((ExistsPredicate) expr).isNotExists() ? JoinOperator.LEFT_ANTI_JOIN : JoinOperator.LEFT_SEMI_JOIN; - } else if (expr instanceof InPredicate && joinConjunct instanceof FunctionCallExpr - && (((FunctionCallExpr) joinConjunct).getFnName().getFunction() - .equalsIgnoreCase(BITMAP_CONTAINS))) { + } else if (expr instanceof InPredicate && !(joinConjunct instanceof BitmapFilterPredicate)) { joinOp = ((InPredicate) expr).isNotIn() ? JoinOperator.LEFT_ANTI_JOIN : JoinOperator.LEFT_SEMI_JOIN; - isInBitmap = true; + if ((joinConjunct instanceof FunctionCallExpr + && (((FunctionCallExpr) joinConjunct).getFnName().getFunction() + .equalsIgnoreCase(BITMAP_CONTAINS)))) { + isInBitmap = true; + } } else { joinOp = JoinOperator.CROSS_JOIN; // We can equal the aggregate subquery using a cross join. All conjuncts diff --git a/regression-test/suites/correctness_p0/test_join_without_condition.groovy b/regression-test/suites/correctness_p0/test_join_without_condition.groovy index c56144757a..88f86e23c7 100644 --- a/regression-test/suites/correctness_p0/test_join_without_condition.groovy +++ b/regression-test/suites/correctness_p0/test_join_without_condition.groovy @@ -63,6 +63,12 @@ suite("test_join_without_condition") { order by a.a, b.a; """ + explain { + sql("select * from (select 1 id) t where (1 in (select a from test_join_without_condition_a))") + notContains "CROSS JOIN" + contains "LEFT SEMI JOIN" + } + sql """ drop table if exists test_join_without_condition_a; """