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