You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/05/13 08:10:45 UTC

[doris] 02/14: [fix](planner) insubquery should always be converted to semi or anti join (#19240)

This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 49e8550e9aec93d3c8fdccdebc57ce14308bd534
Author: starocean999 <40...@users.noreply.github.com>
AuthorDate: Thu May 4 11:16:18 2023 +0800

    [fix](planner) insubquery should always be converted to semi or anti join (#19240)
---
 .../src/main/java/org/apache/doris/analysis/StmtRewriter.java  | 10 ++++++----
 .../suites/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 eae4c6e215..c0b3a14ae6 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
@@ -808,11 +808,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;
     """


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org