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

englefly 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 dad671af8e [feature](nereids)prune runtime filter (tpch part) #19312
dad671af8e is described below

commit dad671af8e91ad197280efa94bbaac3b831f43ee
Author: minghong <[email protected]>
AuthorDate: Wed Sep 13 20:12:08 2023 +0800

    [feature](nereids)prune runtime filter (tpch part) #19312
    
    A rf is effective if it could filter target data.
    In this pr, a rf is effective if any one of following conditions is 
satisfied:
    
    A filter is applied on rf src, like T.A =1
    A effective rf applied on this rf's src,
    denote X as src and target insertsection range. src.ndv with respect to X 
is smaller than target.ndv
    explaination of condition 2
    Supplier join Nation on s_nationkey = n_nationkey
    join Region on n_regionkey = r_regionkey
    RF(nation->supplier) is effective because nation is filtered by an 
effective rf: RF(region->nation)
---
 .../processor/post/RuntimeFilterContext.java       |   6 +-
 .../processor/post/RuntimeFilterPruner.java        |  20 +---
 .../apache/doris/statistics/ColumnStatistic.java   |   2 +
 .../rf_prune/rf10.groovy                           |  88 ++++++++++++++++++
 .../rf_prune/rf11.groovy                           |  84 +++++++++++++++++
 .../rf_prune/rf12.groovy                           |  86 +++++++++++++++++
 .../rf_prune/rf13.groovy                           |  79 ++++++++++++++++
 .../rf_prune/rf14.groovy                           |  68 ++++++++++++++
 .../rf_prune/rf15.groovy                           |  79 ++++++++++++++++
 .../rf_prune/rf16.groovy                           |  87 ++++++++++++++++++
 .../rf_prune/rf17.groovy                           |  74 +++++++++++++++
 .../rf_prune/rf18.groovy                           |  90 ++++++++++++++++++
 .../rf_prune/rf19.groovy                           |  94 +++++++++++++++++++
 .../rf_prune/rf2.groovy                            | 102 +++++++++++++++++++++
 .../rf_prune/rf20.groovy                           |  95 +++++++++++++++++++
 .../rf_prune/rf21.groovy                           |  97 ++++++++++++++++++++
 .../rf_prune/rf22.groovy                           |  94 +++++++++++++++++++
 .../rf_prune/rf3.groovy                            |  83 +++++++++++++++++
 .../rf_prune/rf4.groovy                            |  79 ++++++++++++++++
 .../rf_prune/rf5.groovy                            |  80 ++++++++++++++++
 .../rf_prune/rf7.groovy                            |  99 ++++++++++++++++++++
 .../rf_prune/rf8.groovy                            |  97 ++++++++++++++++++++
 .../rf_prune/rf9.groovy                            |  91 ++++++++++++++++++
 23 files changed, 1758 insertions(+), 16 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterContext.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterContext.java
index 84f9f24e09..d844b98371 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterContext.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterContext.java
@@ -56,6 +56,7 @@ import java.util.Set;
  * runtime filter context used at post process and translation.
  */
 public class RuntimeFilterContext {
+    public List<RuntimeFilter> prunedRF = Lists.newArrayList();
 
     private final IdGenerator<RuntimeFilterId> generator = 
RuntimeFilterId.createGenerator();
 
@@ -153,8 +154,11 @@ public class RuntimeFilterContext {
         if (filters != null) {
             Iterator<RuntimeFilter> iter = filters.iterator();
             while (iter.hasNext()) {
-                if (iter.next().getBuilderNode().equals(builderNode)) {
+                RuntimeFilter rf = iter.next();
+                if (rf.getBuilderNode().equals(builderNode)) {
+                    builderNode.getRuntimeFilters().remove(rf);
                     iter.remove();
+                    prunedRF.add(rf);
                 }
             }
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterPruner.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterPruner.java
index 873e58c29f..c9cc43d0c2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterPruner.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterPruner.java
@@ -27,7 +27,6 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalAssertNumRows;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalDistribute;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalFilter;
-import org.apache.doris.nereids.trees.plans.physical.PhysicalHashAggregate;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalHashJoin;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalLimit;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalProject;
@@ -54,17 +53,6 @@ import java.util.Set;
  */
 public class RuntimeFilterPruner extends PlanPostProcessor {
 
-    // *******************************
-    // Physical plans
-    // *******************************
-    @Override
-    public PhysicalHashAggregate visitPhysicalHashAggregate(
-            PhysicalHashAggregate<? extends Plan> agg, CascadesContext 
context) {
-        agg.child().accept(this, context);
-        context.getRuntimeFilterContext().addEffectiveSrcNode(agg);
-        return agg;
-    }
-
     @Override
     public PhysicalQuickSort visitPhysicalQuickSort(PhysicalQuickSort<? 
extends Plan> sort, CascadesContext context) {
         sort.child().accept(this, context);
@@ -165,7 +153,9 @@ public class RuntimeFilterPruner extends PlanPostProcessor {
     /**
      * consider L join R on L.a=R.b
      * runtime-filter: L.a<-R.b is effective,
-     * if R.b.selectivity<1 or b is partly covered by a
+     * if rf could reduce tuples of L,
+     * 1. some L.a distinctive value are not covered by R.b, or
+     * 2. if there is a effective RF applied on R
      *
      * TODO: min-max
      * @param equalTo join condition
@@ -199,7 +189,7 @@ public class RuntimeFilterPruner extends PlanPostProcessor {
         if (probeColumnStat.isUnKnown || buildColumnStat.isUnKnown) {
             return true;
         }
-        return probeColumnStat.notEnclosed(buildColumnStat)
-                || buildColumnStat.ndv < probeColumnStat.ndv * 0.95;
+        double buildNdvInProbeRange = 
buildColumnStat.ndvIntersection(probeColumnStat);
+        return probeColumnStat.ndv > buildNdvInProbeRange * (1 + 
ColumnStatistic.STATS_ERROR);
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/ColumnStatistic.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/ColumnStatistic.java
index 80d33e7c85..b4a261847d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/ColumnStatistic.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/ColumnStatistic.java
@@ -38,6 +38,8 @@ import java.util.Set;
 
 public class ColumnStatistic {
 
+    public static final double STATS_ERROR = 0.1D;
+
     public static final StatsType NDV = StatsType.NDV;
     public static final StatsType AVG_SIZE = StatsType.AVG_SIZE;
     public static final StatsType MAX_SIZE = StatsType.MAX_SIZE;
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf10.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf10.groovy
new file mode 100644
index 0000000000..0e627ed78b
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf10.groovy
@@ -0,0 +1,88 @@
+/*
+ * 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("rf10") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+sql 'set be_number_for_test=3'
+    String query = """
+    explain physical plan
+    select 
+        c_custkey,
+        c_name,
+        sum(l_extendedprice * (1 - l_discount)) as revenue,
+        c_acctbal,
+        n_name,
+        c_address,
+        c_phone,
+        c_comment
+    from
+        customer,
+        orders,
+        lineitem,
+        nation
+    where
+        c_custkey = o_custkey
+        and l_orderkey = o_orderkey
+        and o_orderdate >= date '1993-10-01'
+        and o_orderdate < date '1993-10-01' + interval '3' month
+        and l_returnflag = 'R'
+        and c_nationkey = n_nationkey
+    group by
+        c_custkey,
+        c_name,
+        c_acctbal,
+        c_phone,
+        n_name,
+        c_address,
+        c_comment
+    order by
+        revenue desc
+    limit 20;
+    """
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+        // prune 1 RF
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h10 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h10 after prune:\n" + plan2)
+    
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+
+    assertEquals(3, count1)
+    assertEquals(2, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf11.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf11.groovy
new file mode 100644
index 0000000000..3e38c5fd95
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf11.groovy
@@ -0,0 +1,84 @@
+/*
+ * 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("rf11") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+    sql 'set parallel_pipeline_task_num=8'
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+sql 'set be_number_for_test=3'
+
+
+    
+    def String query = """
+    explain physical plan
+    select  
+        ps_partkey,
+        sum(ps_supplycost * ps_availqty) as value
+    from
+        partsupp,
+        supplier,
+        nation
+    where
+        ps_suppkey = s_suppkey
+        and s_nationkey = n_nationkey
+        and n_name = 'GERMANY'
+    group by
+        ps_partkey having
+            sum(ps_supplycost * ps_availqty) > (
+                select
+                    sum(ps_supplycost * ps_availqty) * 0.000002
+                from
+                    partsupp,
+                    supplier,
+                    nation
+                where
+                    ps_suppkey = s_suppkey
+                    and s_nationkey = n_nationkey
+                    and n_name = 'GERMANY'
+            )
+    order by
+        value desc;
+    """
+
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+
+    log.info("tcph_sf1000 h11 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h11 after prune:\n" + plan2)
+
+    assertEquals(4, count1)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf12.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf12.groovy
new file mode 100644
index 0000000000..10fa1cafd6
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf12.groovy
@@ -0,0 +1,86 @@
+/*
+ * 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("rf12") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+    sql 'set parallel_pipeline_task_num=8'
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+sql 'set be_number_for_test=3'
+    
+    def query = """
+    explain physical plan
+    select 
+        l_shipmode,
+        sum(case
+            when o_orderpriority = '1-URGENT'
+                or o_orderpriority = '2-HIGH'
+                then 1
+            else 0
+        end) as high_line_count,
+        sum(case
+            when o_orderpriority <> '1-URGENT'
+                and o_orderpriority <> '2-HIGH'
+                then 1
+            else 0
+        end) as low_line_count
+    from
+        orders,
+        lineitem
+    where
+        o_orderkey = l_orderkey
+        and l_shipmode in ('MAIL', 'SHIP')
+        and l_commitdate < l_receiptdate
+        and l_shipdate < l_commitdate
+        and l_receiptdate >= date '1994-01-01'
+        and l_receiptdate < date '1994-01-01' + interval '1' year
+    group by
+        l_shipmode
+    order by
+        l_shipmode;
+    """
+
+    
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h12 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h12 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+    assertEquals(1, count1)
+
+    
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf13.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf13.groovy
new file mode 100644
index 0000000000..c384aad246
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf13.groovy
@@ -0,0 +1,79 @@
+/*
+ * 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("rf13") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+
+sql 'set be_number_for_test=3'
+    def query = """
+    explain physical plan
+    select 
+        c_count,
+        count(*) as custdist
+    from
+        (
+            select
+                c_custkey,
+                count(o_orderkey) as c_count
+            from
+                customer left outer join orders on
+                    c_custkey = o_custkey
+                    and o_comment not like '%special%requests%'
+            group by
+                c_custkey
+        ) as c_orders
+    group by
+        c_count
+    order by
+        custdist desc,
+        c_count desc;
+    """
+
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h13 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h13 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(0, count2)
+    assertEquals(1, count1)
+
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf14.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf14.groovy
new file mode 100644
index 0000000000..873ca3f905
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf14.groovy
@@ -0,0 +1,68 @@
+/*
+ * 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("rf14") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+sql 'set be_number_for_test=3'
+    def query = """
+    explain physical plan
+    select 
+        100.00 * sum(case
+            when p_type like 'PROMO%'
+                then l_extendedprice * (1 - l_discount)
+            else 0
+        end) / sum(l_extendedprice * (1 - l_discount)) as promo_revenue
+    from
+        lineitem,
+        part
+    where
+        l_partkey = p_partkey
+        and l_shipdate >= date '1995-09-01'
+        and l_shipdate < date '1995-09-01' + interval '1' month;
+    """
+    
+    
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h14 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h14 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf15.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf15.groovy
new file mode 100644
index 0000000000..8c795b19cc
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf15.groovy
@@ -0,0 +1,79 @@
+/*
+ * 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("rf15") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+    
+sql 'set be_number_for_test=3'
+    
+    def query = """
+    explain physical plan
+    select 
+        s_suppkey,
+        s_name,
+        s_address,
+        s_phone,
+        total_revenue
+    from
+        supplier,
+        revenue0
+    where
+        s_suppkey = supplier_no
+        and total_revenue = (
+            select
+                max(total_revenue)
+            from
+                revenue0
+        )
+    order by
+        s_suppkey;
+    """
+
+    
+    
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h15 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h15 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf16.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf16.groovy
new file mode 100644
index 0000000000..896c66c223
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf16.groovy
@@ -0,0 +1,87 @@
+/*
+ * 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("rf16") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+    
+sql 'set be_number_for_test=3'
+    
+    def query = """
+    explain physical plan
+    select 
+        p_brand,
+        p_type,
+        p_size,
+        count(distinct ps_suppkey) as supplier_cnt
+    from
+        partsupp,
+        part
+    where
+        p_partkey = ps_partkey
+        and p_brand <> 'Brand#45'
+        and p_type not like 'MEDIUM POLISHED%'
+        and p_size in (49, 14, 23, 45, 19, 3, 36, 9)
+        and ps_suppkey not in (
+            select
+                s_suppkey
+            from
+                supplier
+            where
+                s_comment like '%Customer%Complaints%'
+        )
+    group by
+        p_brand,
+        p_type,
+        p_size
+    order by
+        supplier_cnt desc,
+        p_brand,
+        p_type,
+        p_size;
+    """
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h16 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h16 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf17.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf17.groovy
new file mode 100644
index 0000000000..cc2b4786d4
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf17.groovy
@@ -0,0 +1,74 @@
+/*
+ * 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("rf17") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+    
+sql 'set be_number_for_test=3'
+    
+    def query = """
+    explain physical plan
+    select
+        sum(l_extendedprice) / 7.0 as avg_yearly
+    from
+        lineitem,
+        part
+    where
+        p_partkey = l_partkey
+        and p_brand = 'Brand#23'
+        and p_container = 'MED BOX'
+        and l_quantity < (
+            select
+                0.2 * avg(l_quantity)
+            from
+                lineitem
+            where
+                l_partkey = p_partkey
+        );
+    """
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+    
+    log.info("tcph_sf1000 h17 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h17 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf18.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf18.groovy
new file mode 100644
index 0000000000..07c38e8396
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf18.groovy
@@ -0,0 +1,90 @@
+/*
+ * 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("rf18") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+    
+sql 'set be_number_for_test=3'
+    
+    def query = """
+    explain physical plan
+    select 
+    c_name,
+            c_custkey,
+            o_orderkey,
+            o_orderdate,
+            o_totalprice,
+            sum(l_quantity)
+    from
+            customer,
+            orders,
+            lineitem
+    where
+            o_orderkey  in  (
+                    select
+                            l_orderkey
+                    from
+                            lineitem
+                    group  by
+                            l_orderkey  having
+                                    sum(l_quantity)  >  300
+            )
+            and  c_custkey  =  o_custkey
+            and  o_orderkey  =  l_orderkey
+    group  by
+            c_name,
+            c_custkey,
+            o_orderkey,
+            o_orderdate,
+            o_totalprice
+    order  by
+            o_totalprice  desc,
+            o_orderdate
+    limit  100;
+    """
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h18 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h18 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf19.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf19.groovy
new file mode 100644
index 0000000000..5ca7434c24
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf19.groovy
@@ -0,0 +1,94 @@
+/*
+ * 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("rf19") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+    
+sql 'set be_number_for_test=3'
+    
+    def query = """
+    explain physical plan
+        select
+                sum(l_extendedprice* (1 - l_discount)) as revenue
+        from
+                lineitem,
+                part
+        where
+        (
+                p_partkey = l_partkey
+                and p_brand = 'Brand#12'
+                and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
+                and l_quantity >= 1 and l_quantity <= 1 + 10
+                and p_size between 1 and 5
+                and l_shipmode in ('AIR', 'AIR REG')
+                and l_shipinstruct = 'DELIVER IN PERSON'
+        )
+        or
+        (
+                p_partkey = l_partkey
+                and p_brand = 'Brand#23'
+                and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED 
PACK')
+                and l_quantity >= 10 and l_quantity <= 10 + 10
+                and p_size between 1 and 10
+                and l_shipmode in ('AIR', 'AIR REG')
+                and l_shipinstruct = 'DELIVER IN PERSON'
+        )
+        or
+        (
+                p_partkey = l_partkey
+                and p_brand = 'Brand#34'
+                and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
+                and l_quantity >= 20 and l_quantity <= 20 + 10
+                and p_size between 1 and 15
+                and l_shipmode in ('AIR', 'AIR REG')
+                and l_shipinstruct = 'DELIVER IN PERSON'
+        );
+    
+    """
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h19 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h19 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf2.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf2.groovy
new file mode 100644
index 0000000000..0a53ee8795
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf2.groovy
@@ -0,0 +1,102 @@
+/*
+ * 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("rf2") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+    def getRuntimeFilterCountFromPlan = { plan -> {
+            int count = 0
+            plan.eachMatch("RF\\d+\\[") {
+                ch -> count ++
+            }
+            return count
+    }}
+
+
+    sql 'set be_number_for_test=3'
+    
+    String query = """
+    explain physical plan
+    select 
+        s_acctbal,
+        s_name,
+        n_name,
+        p_partkey,
+        p_mfgr,
+        s_address,
+        s_phone,
+        s_comment
+    from
+        part,
+        supplier,
+        partsupp,
+        nation,
+        region
+    where
+        p_partkey = ps_partkey
+        and s_suppkey = ps_suppkey
+        and p_size = 15
+        and p_type like '%BRASS'
+        and s_nationkey = n_nationkey
+        and n_regionkey = r_regionkey
+        and r_name = 'EUROPE'
+        and ps_supplycost = (
+            select
+                min(ps_supplycost)
+            from
+                partsupp,
+                supplier,
+                nation,
+                region
+            where
+                p_partkey = ps_partkey
+                and s_suppkey = ps_suppkey
+                and s_nationkey = n_nationkey
+                and n_regionkey = r_regionkey
+                and r_name = 'EUROPE'
+        )
+    order by
+        s_acctbal desc,
+        n_name,
+        s_name,
+        p_partkey
+    limit 100;
+    """
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql("${query}")
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql("${query}")
+
+    log.info("tcph_sf1000 h2 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h2 after prune:\n" + plan2)
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+
+    assertEquals(4, count1)
+    assertEquals(4, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf20.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf20.groovy
new file mode 100644
index 0000000000..7fd96509db
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf20.groovy
@@ -0,0 +1,95 @@
+/*
+ * 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("rf20") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+    
+sql 'set be_number_for_test=3'
+    
+    def query = """
+    explain physical plan
+        select 
+        s_name,
+        s_address
+        from
+        supplier,
+        nation
+        where
+        s_suppkey in (
+                select
+                ps_suppkey
+                from
+                partsupp
+                where
+                ps_partkey in (
+                        select
+                        p_partkey
+                        from
+                        part
+                        where
+                        p_name like 'forest%'
+                )
+                and ps_availqty > (
+                        select
+                        0.5 * sum(l_quantity)
+                        from
+                        lineitem
+                        where
+                        l_partkey = ps_partkey
+                        and l_suppkey = ps_suppkey
+                        and l_shipdate >= date '1994-01-01'
+                        and l_shipdate < date '1994-01-01' + interval '1' year
+                )
+        )
+        and s_nationkey = n_nationkey
+        and n_name = 'CANADA'
+        order by
+        s_name;
+    """
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h20 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h20 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf21.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf21.groovy
new file mode 100644
index 0000000000..1fa0970752
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf21.groovy
@@ -0,0 +1,97 @@
+/*
+ * 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("rf21") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+    
+sql 'set be_number_for_test=3'
+    
+    def query = """
+    explain physical plan
+        select
+                s_name,
+                count(*) as numwait
+        from
+                supplier,
+                lineitem l1,
+                orders,
+                nation
+        where
+        s_suppkey = l1.l_suppkey
+        and o_orderkey = l1.l_orderkey
+        and o_orderstatus = 'F'
+        and l1.l_receiptdate > l1.l_commitdate
+        and exists (
+                select
+                *
+                from
+                lineitem l2
+                where
+                l2.l_orderkey = l1.l_orderkey
+                and l2.l_suppkey <> l1.l_suppkey
+        )
+        and not exists (
+                select
+                *
+                from
+                lineitem l3
+                where
+                l3.l_orderkey = l1.l_orderkey
+                and l3.l_suppkey <> l1.l_suppkey
+                and l3.l_receiptdate > l3.l_commitdate
+        )
+        and s_nationkey = n_nationkey
+        and n_name = 'SAUDI ARABIA'
+        group by
+        s_name
+        order by
+        numwait desc,
+        s_name
+        limit 100;
+    """
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h21 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h21 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf22.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf22.groovy
new file mode 100644
index 0000000000..30c31adc34
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf22.groovy
@@ -0,0 +1,94 @@
+/*
+ * 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("q22") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+    
+sql 'set be_number_for_test=3'
+    
+    def query = """
+    explain physical plan
+        select 
+        cntrycode,
+        count(*) as numcust,
+        sum(c_acctbal) as totacctbal
+    from
+        (
+            select
+                substring(c_phone, 1, 2) as cntrycode,
+                c_acctbal
+            from
+                customer
+            where
+                substring(c_phone, 1, 2) in
+                    ('13', '31', '23', '29', '30', '18', '17')
+                and c_acctbal > (
+                    select
+                        avg(c_acctbal)
+                    from
+                        customer
+                    where
+                        c_acctbal > 0.00
+                        and substring(c_phone, 1, 2) in
+                            ('13', '31', '23', '29', '30', '18', '17')
+                )
+                and not exists (
+                    select
+                        *
+                    from
+                        orders
+                    where
+                        o_custkey = c_custkey
+                )
+        ) as custsale
+    group by
+        cntrycode
+    order by
+        cntrycode;
+    """
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h22 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h22 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf3.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf3.groovy
new file mode 100644
index 0000000000..882c6c5e1e
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf3.groovy
@@ -0,0 +1,83 @@
+/*
+ * 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("rf3") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    // db = "tpch"
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+    
+sql 'set be_number_for_test=3'
+
+
+    String query = """
+    explain physical plan
+    select  
+        l_orderkey,
+        sum(l_extendedprice * (1 - l_discount)) as revenue,
+        o_orderdate,
+        o_shippriority
+    from
+        customer,
+        orders,
+        lineitem
+    where
+        c_mktsegment = 'BUILDING'
+        and c_custkey = o_custkey
+        and l_orderkey = o_orderkey
+        and o_orderdate < date '1995-03-15'
+        and l_shipdate > date '1995-03-15'
+    group by
+        l_orderkey,
+        o_orderdate,
+        o_shippriority
+    order by
+        revenue desc,
+        o_orderdate
+    limit 10;
+    """
+
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+    
+    log.info("tcph_sf1000 h3 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h3 before prune:\n" + plan2)
+    
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf4.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf4.groovy
new file mode 100644
index 0000000000..d947f4afb0
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf4.groovy
@@ -0,0 +1,79 @@
+/*
+ * 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("rf4") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set be_number_for_test=3'   
+    sql 'set parallel_pipeline_task_num=8'
+
+
+
+    
+    String query = """
+    explain physical plan
+    select  
+        o_orderpriority,
+        count(*) as order_count
+    from
+        orders
+    where
+        o_orderdate >= date '1993-07-01'
+        and o_orderdate < date '1993-07-01' + interval '3' month
+        and exists (
+            select
+                *
+            from
+                lineitem
+            where
+                l_orderkey = o_orderkey
+                and l_commitdate < l_receiptdate
+        )
+    group by
+        o_orderpriority
+    order by
+        o_orderpriority;
+    """
+
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h4 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h4 after prune:\n" + plan2)
+
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf5.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf5.groovy
new file mode 100644
index 0000000000..017d1ce298
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf5.groovy
@@ -0,0 +1,80 @@
+/*
+ * 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("rf5") {
+    def getRuntimeFilterCountFromPlan = { plan -> {
+            int count = 0
+            plan.eachMatch("RF\\d+\\[") {
+                ch -> count ++
+            }
+            return count
+    }}
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+    sql 'set be_number_for_test=3'
+
+    sql 'set enable_runtime_filter_prune=false'
+
+    String query = """
+    explain physical plan
+    select 
+        n_name,
+        sum(l_extendedprice * (1 - l_discount)) as revenue
+    from
+        customer,
+        orders,
+        lineitem,
+        supplier,
+        nation,
+        region
+    where
+        c_custkey = o_custkey
+        and l_orderkey = o_orderkey
+        and l_suppkey = s_suppkey
+        and c_nationkey = s_nationkey
+        and s_nationkey = n_nationkey
+        and n_regionkey = r_regionkey
+        and r_name = 'ASIA'
+        and o_orderdate >= date '1994-01-01'
+        and o_orderdate < date '1994-01-01' + interval '1' year
+    group by
+        n_name
+    order by
+        revenue desc;
+    """
+    String plan1 = sql "${query}"
+
+
+    sql 'set enable_runtime_filter_prune=true'
+    
+    String plan2 = sql "${query}"
+    log.info("tcph_sf1000 h5 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h5 after prune:\n" + plan2)
+    
+    assertEquals(6, getRuntimeFilterCountFromPlan(plan1))
+    assertEquals(4, getRuntimeFilterCountFromPlan(plan2))
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf7.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf7.groovy
new file mode 100644
index 0000000000..5e1204fc29
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf7.groovy
@@ -0,0 +1,99 @@
+/*
+ * 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("rf7") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+    
+sql 'set be_number_for_test=3'
+    
+    String query = """
+    explain physical plan
+    select 
+        supp_nation,
+        cust_nation,
+        l_year,
+        sum(volume) as revenue
+    from
+        (
+            select
+                n1.n_name as supp_nation,
+                n2.n_name as cust_nation,
+                extract(year from l_shipdate) as l_year,
+                l_extendedprice * (1 - l_discount) as volume
+            from
+                supplier,
+                lineitem,
+                orders,
+                customer,
+                nation n1,
+                nation n2
+            where
+                s_suppkey = l_suppkey
+                and o_orderkey = l_orderkey
+                and c_custkey = o_custkey
+                and s_nationkey = n1.n_nationkey
+                and c_nationkey = n2.n_nationkey
+                and (
+                    (n1.n_name = 'FRANCE' and n2.n_name = 'GERMANY')
+                    or (n1.n_name = 'GERMANY' and n2.n_name = 'FRANCE')
+                )
+                and l_shipdate between date '1995-01-01' and date '1996-12-31'
+        ) as shipping
+    group by
+        supp_nation,
+        cust_nation,
+        l_year
+    order by
+        supp_nation,
+        cust_nation,
+        l_year;
+    """
+
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h7 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h7 after prune:\n" + plan2)
+    
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(5, count2, "after prune")
+    assertEquals(5, count1, "before prune")
+
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf8.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf8.groovy
new file mode 100644
index 0000000000..565d4cbb40
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf8.groovy
@@ -0,0 +1,97 @@
+/*
+ * 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("rf8") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+    
+sql 'set be_number_for_test=3'
+    
+    String query = """
+    explain physical plan
+    select 
+        o_year,
+        sum(case
+            when nation = 'BRAZIL' then volume
+            else 0
+        end) / sum(volume) as mkt_share
+    from
+        (
+            select
+                extract(year from o_orderdate) as o_year,
+                l_extendedprice * (1 - l_discount) as volume,
+                n2.n_name as nation
+            from
+                part,
+                supplier,
+                lineitem,
+                orders,
+                customer,
+                nation n1,
+                nation n2,
+                region
+            where
+                p_partkey = l_partkey
+                and s_suppkey = l_suppkey
+                and l_orderkey = o_orderkey
+                and o_custkey = c_custkey
+                and c_nationkey = n1.n_nationkey
+                and n1.n_regionkey = r_regionkey
+                and r_name = 'AMERICA'
+                and s_nationkey = n2.n_nationkey
+                and o_orderdate between date '1995-01-01' and date '1996-12-31'
+                and p_type = 'ECONOMY ANODIZED STEEL'
+        ) as all_nations
+    group by
+        o_year
+    order by
+        o_year;
+    """
+
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+    // prune 1 RF
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    log.info "before prune, rf count = " + count1
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h8 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h8 after prune:\n" + plan2)
+    
+    assertEquals(7, count1)
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(count1 - 1, count2)
+}
diff --git 
a/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf9.groovy 
b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf9.groovy
new file mode 100644
index 0000000000..be978a6017
--- /dev/null
+++ b/regression-test/suites/nereids_tpch_shape_sf1000_p0/rf_prune/rf9.groovy
@@ -0,0 +1,91 @@
+/*
+ * 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("rf9") {
+    String db = context.config.getDbNameByFile(new File(context.file.parent))
+    sql "use ${db}"
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql "set runtime_filter_mode='GLOBAL'"
+
+    sql 'set exec_mem_limit=21G'
+    sql 'SET enable_pipeline_engine = true'
+    sql 'set parallel_pipeline_task_num=8'
+
+
+
+sql 'set be_number_for_test=3'
+
+    String query =  """
+    explain physical plan
+    select 
+        nation,
+        o_year,
+        sum(amount) as sum_profit
+    from
+        (
+            select
+                n_name as nation,
+                extract(year from o_orderdate) as o_year,
+                l_extendedprice * (1 - l_discount) - ps_supplycost * 
l_quantity as amount
+            from
+                part,
+                supplier,
+                lineitem,
+                partsupp,
+                orders,
+                nation
+            where
+                s_suppkey = l_suppkey
+                and ps_suppkey = l_suppkey
+                and ps_partkey = l_partkey
+                and p_partkey = l_partkey
+                and o_orderkey = l_orderkey
+                and s_nationkey = n_nationkey
+                and p_name like '%green%'
+        ) as profit
+    group by
+        nation,
+        o_year
+    order by
+        nation,
+        o_year desc;
+    """
+    def getRuntimeFilterCountFromPlan = { plan -> {
+        int count = 0
+        plan.eachMatch("RF\\d+\\[") {
+            ch -> count ++
+        }
+        return count
+    }}
+    // prune 4 RF
+    sql "set enable_runtime_filter_prune=false"
+    String plan1 = sql "${query}"
+    int count1 = getRuntimeFilterCountFromPlan(plan1)
+    sql "set enable_runtime_filter_prune=true"
+    String plan2 = sql "${query}"
+
+    log.info("tcph_sf1000 h9 before prune:\n" + plan1)
+    log.info("tcph_sf1000 h9 after prune:\n" + plan2)
+
+    assertEquals(6, count1)
+    assertEquals(6, getRuntimeFilterCountFromPlan(plan1))
+    int count2 = getRuntimeFilterCountFromPlan(plan2)
+    assertEquals(2, count2)
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to