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

starocean999 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new a043679ec8f [fix](nereids)check if correlated filter exists before 
converting apply to join (#47985)
a043679ec8f is described below

commit a043679ec8f51ffc21344826d9c04dc46e9f7c67
Author: starocean999 <li...@selectdb.com>
AuthorDate: Wed Feb 19 17:30:56 2025 +0800

    [fix](nereids)check if correlated filter exists before converting apply to 
join (#47985)
    
    example sql:
    `SELECT *
    FROM
        t1
    WHERE
        t1.x IN (SELECT x FROM t2 WHERE t1.y is NULL AND t1.y is NOT NULL);`
    
    the correlated filter `t1.y is NULL AND t1.y is NOT NULL` will be
    replaced as `FALSE` by SimplifyConflictCompound rule. So we need check
    if correlated filter exists before converting apply to join
    
    Related PR: (https://github.com/apache/doris/pull/47385)
---
 .../nereids/rules/rewrite/ExistsApplyToJoin.java   |  5 +-
 .../doris/nereids/rules/rewrite/InApplyToJoin.java |  6 ++-
 .../nereids/rules/rewrite/ScalarApplyToJoin.java   |  5 +-
 .../subquery/test_correlated_filter_removed.groovy | 54 ++++++++++++++++++++++
 4 files changed, 67 insertions(+), 3 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExistsApplyToJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExistsApplyToJoin.java
index 003aa102860..930e4c467df 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExistsApplyToJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExistsApplyToJoin.java
@@ -81,7 +81,10 @@ public class ExistsApplyToJoin extends OneRewriteRuleFactory 
{
     @Override
     public Rule build() {
         return logicalApply().when(LogicalApply::isExist).then(apply -> {
-            if (apply.isCorrelated()) {
+            // apply.isCorrelated() only check if correlated slot exits
+            // but correlation filter may be eliminated by 
SimplifyConflictCompound rule
+            // so we need check both correlated slot and correlation filter 
exists before creating LogicalJoin node
+            if (apply.isCorrelated() && 
apply.getCorrelationFilter().isPresent()) {
                 return correlatedToJoin(apply);
             } else {
                 return unCorrelatedToJoin(apply);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InApplyToJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InApplyToJoin.java
index fdf6efb8167..67276e92bb3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InApplyToJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InApplyToJoin.java
@@ -122,7 +122,11 @@ public class InApplyToJoin extends OneRewriteRuleFactory {
                         new DistributeHint(DistributeType.NONE), 
apply.getMarkJoinSlotReference(),
                         apply.children(), null);
             } else {
-                if (apply.isCorrelated()) {
+                // apply.isCorrelated() only check if correlated slot exits
+                // but correlation filter may be eliminated by 
SimplifyConflictCompound rule
+                // so we need check both correlated slot and correlation 
filter exists
+                // before creating LogicalJoin node
+                if (apply.isCorrelated() && 
apply.getCorrelationFilter().isPresent()) {
                     if (inSubquery.isNot()) {
                         predicate = ExpressionUtils.and(ExpressionUtils.or(new 
EqualTo(left, right),
                                         new IsNull(left), new IsNull(right)),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ScalarApplyToJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ScalarApplyToJoin.java
index a7b2b9a2045..5cb11914b66 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ScalarApplyToJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ScalarApplyToJoin.java
@@ -45,7 +45,10 @@ public class ScalarApplyToJoin extends OneRewriteRuleFactory 
{
     @Override
     public Rule build() {
         return logicalApply().when(LogicalApply::isScalar).then(apply -> {
-            if (apply.isCorrelated()) {
+            // apply.isCorrelated() only check if correlated slot exits
+            // but correlation filter may be eliminated by 
SimplifyConflictCompound rule
+            // so we need check both correlated slot and correlation filter 
exists before creating LogicalJoin node
+            if (apply.isCorrelated() && 
apply.getCorrelationFilter().isPresent()) {
                 return correlatedToJoin(apply);
             } else {
                 return unCorrelatedToJoin(apply);
diff --git 
a/regression-test/suites/nereids_p0/subquery/test_correlated_filter_removed.groovy
 
b/regression-test/suites/nereids_p0/subquery/test_correlated_filter_removed.groovy
new file mode 100644
index 00000000000..2a3b5124048
--- /dev/null
+++ 
b/regression-test/suites/nereids_p0/subquery/test_correlated_filter_removed.groovy
@@ -0,0 +1,54 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_correlated_filter_removed") {
+    multi_sql """
+        drop table if exists 
table_6_undef_partitions2_keys3_properties4_distributed_by5;
+
+        create table 
table_6_undef_partitions2_keys3_properties4_distributed_by5 (
+        col_int_undef_signed int/*agg_type_placeholder*/   ,
+        col_varchar_10__undef_signed varchar(10)/*agg_type_placeholder*/   ,
+        pk int/*agg_type_placeholder*/
+        ) engine=olap
+        distributed by hash(pk) buckets 10
+        properties("replication_num" = "1");
+
+        insert into 
table_6_undef_partitions2_keys3_properties4_distributed_by5(pk,col_int_undef_signed,col_varchar_10__undef_signed)
 values 
(0,null,'think'),(1,null,''),(2,2,''),(3,null,'r'),(4,null,null),(5,8,'here');
+
+        drop table if exists 
table_100_undef_partitions2_keys3_properties4_distributed_by5;
+
+        create table 
table_100_undef_partitions2_keys3_properties4_distributed_by5 (
+        col_int_undef_signed int/*agg_type_placeholder*/   ,
+        col_varchar_10__undef_signed varchar(10)/*agg_type_placeholder*/   ,
+        pk int/*agg_type_placeholder*/
+        ) engine=olap
+        distributed by hash(pk) buckets 10
+        properties("replication_num" = "1");
+
+        insert into 
table_100_undef_partitions2_keys3_properties4_distributed_by5(pk,col_int_undef_signed,col_varchar_10__undef_signed)
 values 
(0,null,''),(1,null,''),(2,null,''),(3,0,null),(4,7,null),(5,9,'d'),(6,9,null),(7,null,null),(8,null,null),(9,null,''),(10,null,'are'),(11,null,'were'),(12,2,''),(13,null,'one'),(14,null,'ok'),(15,null,'your'),(16,null,''),(17,null,null),(18,4,''),(19,null,null),(20,null,null),(21,null,null),(22,3,''),(23,null,null),(24,8,''),(25,2,'I''m'),(26,nul
 [...]
+    """
+
+    sql """
+        SELECT *
+        FROM table_6_undef_partitions2_keys3_properties4_distributed_by5 AS t1
+        WHERE t1.`pk` + 2 IN 
+            (SELECT 1
+            FROM table_100_undef_partitions2_keys3_properties4_distributed_by5 
AS t2
+            WHERE t1.col_int_undef_signed is NULL
+                    AND t1.col_int_undef_signed is NOT NULL) ;
+    """
+}


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

Reply via email to