IMPALA-10099: Push down DISTINCT in Set operations

INTERSECT/EXCEPT are not duplicate preserving operations. The distinct
aggregations can happen in each operand, the leftmost operand only, or
after all the operands in a separate aggregation step. Except for a
couple special cases we would use the last strategy most often.

This change pushes the distinct aggregation down to the leftmost operand
in cases where there are no analytic functions, or when a distinct or
grouping operation already eliminates duplicates.

In general DISTINCT placement such as in this case should be done
throughout the entire plan tree in a cost based manner as described in
IMPALA-5260

Testing:
 * TpcdsPlannerTest
 * PlannerTest
 * TPC-DS 30TB Perf run for any affected queries
   - Q14-1 180s -> 150s
   - Q14-2 109s -> 90s
   - Q8 no significant change
 * SetOperation Planner Tests
 * Analyzer tests
 * Tpcds Functional Workload

Change-Id: Ia248f1595df2ab48fbe70c778c7c32bde5c518a5
Reviewed-on: http://gerrit.cloudera.org:8080/16350
Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
Reviewed-by: Tim Armstrong <tarmstrong@cloudera.com>
diff --git a/fe/src/main/java/org/apache/impala/analysis/StmtRewriter.java b/fe/src/main/java/org/apache/impala/analysis/StmtRewriter.java
index 705eb07..b8099ad 100644
--- a/fe/src/main/java/org/apache/impala/analysis/StmtRewriter.java
+++ b/fe/src/main/java/org/apache/impala/analysis/StmtRewriter.java
@@ -232,24 +232,37 @@
         case EXCEPT:
         case INTERSECT:
           if (eiSelect == null) {
-            // For a new SelectStmt the left most tableref will either by the first
+            // For a new SelectStmt the left most tableref will either be the first
             // operand or a the SelectStmt from the union operands.
             InlineViewRef leftMostView = null;
             SelectList sl =
                 new SelectList(Lists.newArrayList(SelectListItem.createStarItem(null)));
             // Intersect/Except have set semantics in SQL they must not return duplicates
-            // As an optimization if the leftmost operand is already distinct we remove
-            // the distinct here.
+            // As an optimization we push this distinct down into the first operand if
+            // it's not a UNION and has no other aggregations.
             // This would be best done in a cost based manner during planning.
             sl.setIsDistinct(true);
             eiSelect = new SelectStmt(sl, null, null, null, null, null, null);
 
             if (i == 1) {
               if (firstOperand.getQueryStmt() instanceof SelectStmt) {
-                // optimize out the distinct aggregation in the outer query
-                if (((SelectStmt) firstOperand.getQueryStmt()).getSelectList()
-                    .isDistinct()) {
+                // push down the distinct aggregation if the first operand isn't a UNION
+                // there are no window functions, and we determine the results exprs
+                // already produce distinct results.
+                SelectStmt firstOpStmt = (SelectStmt) firstOperand.getQueryStmt();
+                // DISTINCT is already set
+                if (firstOpStmt.getSelectList().isDistinct()) {
                   sl.setIsDistinct(false);
+                } else {
+                  // Must not have window functions
+                  if (firstOpStmt.getTableRefs().size() > 0
+                      && !firstOpStmt.hasAnalyticInfo()) {
+                    // Add distinct if there isn't any other grouping
+                    if (!firstOpStmt.hasMultiAggInfo()) {
+                      firstOpStmt.getSelectList().setIsDistinct(true);
+                    }
+                    sl.setIsDistinct(false);
+                  }
                 }
               }
               leftMostView = new InlineViewRef(tableAliasGenerator.getNextAlias(),
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/empty.test b/testdata/workloads/functional-planner/queries/PlannerTest/empty.test
index e6cd733..b03ab5a 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/empty.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/empty.test
@@ -556,7 +556,7 @@
 |  03:EMPTYSET
 |
 00:SCAN HDFS [tpch_nested_parquet.customer c]
-   HDFS partitions=1/1 files=4 size=289.01MB
+   HDFS partitions=1/1 files=4 size=289.06MB
    predicates: c_custkey < 10
    row-size=56B cardinality=15.00K
 ====
@@ -598,7 +598,7 @@
 |     row-size=8B cardinality=10
 |
 00:SCAN HDFS [tpch_nested_parquet.customer c]
-   HDFS partitions=1/1 files=4 size=289.01MB
+   HDFS partitions=1/1 files=4 size=289.06MB
    predicates: c_custkey = 1
    row-size=44B cardinality=1
 ====
@@ -643,20 +643,20 @@
 ---- PLAN
 PLAN-ROOT SINK
 |
-03:AGGREGATE [FINALIZE]
-|  group by: int_col
-|  row-size=4B cardinality=0
-|
-02:HASH JOIN [LEFT SEMI JOIN]
+03:HASH JOIN [LEFT SEMI JOIN]
 |  hash predicates: int_col IS NOT DISTINCT FROM int_col
 |  runtime filters: RF000 <- int_col
 |  row-size=4B cardinality=0
 |
-|--01:EMPTYSET
+|--02:EMPTYSET
+|
+01:AGGREGATE [FINALIZE]
+|  group by: int_col
+|  row-size=4B cardinality=10
 |
 00:SCAN HDFS [functional.alltypessmall]
    HDFS partitions=4/4 files=4 size=6.32KB
-   runtime filters: RF000 -> int_col
+   runtime filters: RF000 -> functional.alltypessmall.int_col
    row-size=4B cardinality=100
 ====
 # Improve this so limit 0 removes the entire branch
@@ -668,27 +668,27 @@
 ---- PLAN
 PLAN-ROOT SINK
 |
-05:AGGREGATE [FINALIZE]
-|  group by: id
-|  row-size=4B cardinality=0
-|
-04:HASH JOIN [RIGHT ANTI JOIN]
+05:HASH JOIN [RIGHT ANTI JOIN]
 |  hash predicates: id IS NOT DISTINCT FROM id
 |  row-size=4B cardinality=0
 |
-|--03:HASH JOIN [LEFT SEMI JOIN]
+|--04:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: id IS NOT DISTINCT FROM id
 |  |  runtime filters: RF000 <- id
 |  |  row-size=4B cardinality=0
 |  |
-|  |--01:EMPTYSET
+|  |--02:EMPTYSET
+|  |
+|  01:AGGREGATE [FINALIZE]
+|  |  group by: id
+|  |  row-size=4B cardinality=99
 |  |
 |  00:SCAN HDFS [functional.alltypessmall]
 |     HDFS partitions=4/4 files=4 size=6.32KB
-|     runtime filters: RF000 -> id
+|     runtime filters: RF000 -> functional.alltypessmall.id
 |     row-size=4B cardinality=100
 |
-02:SCAN HDFS [functional.alltypestiny]
+03:SCAN HDFS [functional.alltypestiny]
    HDFS partitions=4/4 files=4 size=460B
    predicates: int_col > 0
    row-size=8B cardinality=1
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/setoperation-rewrite.test b/testdata/workloads/functional-planner/queries/PlannerTest/setoperation-rewrite.test
index 8bfd42e..91ae2ae 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/setoperation-rewrite.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/setoperation-rewrite.test
@@ -5,69 +5,71 @@
 ---- PLAN
 PLAN-ROOT SINK
 |
-04:AGGREGATE [FINALIZE]
-|  group by: `year`, `month`
-|  row-size=8B cardinality=24
-|
-03:HASH JOIN [LEFT SEMI JOIN]
+04:HASH JOIN [LEFT SEMI JOIN]
 |  hash predicates: `month` IS NOT DISTINCT FROM functional.alltypes.month, `year` IS NOT DISTINCT FROM functional.alltypes.year
 |  runtime filters: RF000 <- functional.alltypes.month, RF001 <- functional.alltypes.year
-|  row-size=8B cardinality=7.30K
+|  row-size=8B cardinality=24
 |
-|--02:AGGREGATE [FINALIZE]
+|--03:AGGREGATE [FINALIZE]
 |  |  group by: functional.alltypes.year, functional.alltypes.month
 |  |  row-size=8B cardinality=24
 |  |
-|  01:SCAN HDFS [functional.alltypes]
+|  02:SCAN HDFS [functional.alltypes]
 |     partition predicates: `year` = 2009
 |     HDFS partitions=12/24 files=12 size=238.68KB
 |     row-size=8B cardinality=3.65K
 |
+01:AGGREGATE [FINALIZE]
+|  group by: `year`, `month`
+|  row-size=8B cardinality=24
+|
 00:SCAN HDFS [functional.alltypes]
    HDFS partitions=24/24 files=24 size=478.45KB
-   runtime filters: RF000 -> `month`, RF001 -> `year`
-   row-size=8B cardinality=7.30K
+   runtime filters: RF000 -> functional.alltypes.month, RF001 -> functional.alltypes.year
+   partition key scan
+   row-size=8B cardinality=24
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 10:EXCHANGE [UNPARTITIONED]
 |
-09:AGGREGATE [FINALIZE]
-|  group by: $a$1.year, $a$1.month
-|  row-size=8B cardinality=24
-|
-08:EXCHANGE [HASH($a$1.year,$a$1.month)]
-|
-04:AGGREGATE [STREAMING]
-|  group by: `year`, `month`
-|  row-size=8B cardinality=24
-|
-03:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+04:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  hash predicates: `month` IS NOT DISTINCT FROM functional.alltypes.month, `year` IS NOT DISTINCT FROM functional.alltypes.year
 |  runtime filters: RF000 <- functional.alltypes.month, RF001 <- functional.alltypes.year
-|  row-size=8B cardinality=7.30K
+|  row-size=8B cardinality=24
 |
-|--07:EXCHANGE [BROADCAST]
+|--09:EXCHANGE [HASH(functional.alltypes.year,functional.alltypes.month)]
 |  |
-|  06:AGGREGATE [FINALIZE]
+|  08:AGGREGATE [FINALIZE]
 |  |  group by: functional.alltypes.year, functional.alltypes.month
 |  |  row-size=8B cardinality=24
 |  |
-|  05:EXCHANGE [HASH(functional.alltypes.year,functional.alltypes.month)]
+|  07:EXCHANGE [HASH(functional.alltypes.year,functional.alltypes.month)]
 |  |
-|  02:AGGREGATE [STREAMING]
+|  03:AGGREGATE [STREAMING]
 |  |  group by: functional.alltypes.year, functional.alltypes.month
 |  |  row-size=8B cardinality=24
 |  |
-|  01:SCAN HDFS [functional.alltypes]
+|  02:SCAN HDFS [functional.alltypes]
 |     partition predicates: `year` = 2009
 |     HDFS partitions=12/24 files=12 size=238.68KB
 |     row-size=8B cardinality=3.65K
 |
+06:AGGREGATE [FINALIZE]
+|  group by: `year`, `month`
+|  row-size=8B cardinality=24
+|
+05:EXCHANGE [HASH(`year`,`month`)]
+|
+01:AGGREGATE [STREAMING]
+|  group by: `year`, `month`
+|  row-size=8B cardinality=24
+|
 00:SCAN HDFS [functional.alltypes]
    HDFS partitions=24/24 files=24 size=478.45KB
-   runtime filters: RF000 -> `month`, RF001 -> `year`
-   row-size=8B cardinality=7.30K
+   runtime filters: RF000 -> functional.alltypes.month, RF001 -> functional.alltypes.year
+   partition key scan
+   row-size=8B cardinality=24
 ====
 # intersect unnesting
 select id, year, month from functional.alltypestiny where year=2009 and month=1
@@ -80,132 +82,132 @@
 ---- PLAN
 PLAN-ROOT SINK
 |
-09:AGGREGATE [FINALIZE]
-|  group by: id, `year`, `month`
+09:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- `month`, RF001 <- `year`, RF002 <- id
 |  row-size=12B cardinality=2
 |
-08:HASH JOIN [LEFT SEMI JOIN]
-|  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
-|  runtime filters: RF000 <- $a$1.month, RF001 <- $a$1.year, RF002 <- $a$1.id
-|  row-size=12B cardinality=2
-|
-|--07:AGGREGATE [FINALIZE]
-|  |  group by: id, `year`, `month`
+|--08:HASH JOIN [LEFT SEMI JOIN]
+|  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
+|  |  runtime filters: RF006 <- `month`, RF007 <- `year`, RF008 <- id
 |  |  row-size=12B cardinality=2
 |  |
-|  06:HASH JOIN [LEFT SEMI JOIN]
-|  |  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
-|  |  runtime filters: RF006 <- $a$1.month, RF007 <- $a$1.year, RF008 <- $a$1.id
-|  |  row-size=12B cardinality=2
-|  |
-|  |--05:AGGREGATE [FINALIZE]
-|  |  |  group by: id, `year`, `month`
-|  |  |  row-size=12B cardinality=2
-|  |  |
-|  |  04:HASH JOIN [LEFT SEMI JOIN]
+|  |--07:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  |  |  runtime filters: RF012 <- `month`, RF013 <- `year`, RF014 <- id
 |  |  |  row-size=12B cardinality=2
 |  |  |
-|  |  |--03:SCAN HDFS [functional.alltypestiny]
+|  |  |--06:SCAN HDFS [functional.alltypestiny]
 |  |  |     partition predicates: `year` = 2009, `month` = 2
 |  |  |     HDFS partitions=1/4 files=1 size=115B
 |  |  |     row-size=12B cardinality=2
 |  |  |
-|  |  02:SCAN HDFS [functional.alltypestiny]
+|  |  05:AGGREGATE [FINALIZE]
+|  |  |  group by: id, `year`, `month`
+|  |  |  row-size=12B cardinality=2
+|  |  |
+|  |  04:SCAN HDFS [functional.alltypestiny]
 |  |     partition predicates: `year` = 2009, `month` = 2
 |  |     HDFS partitions=1/4 files=1 size=115B
-|  |     runtime filters: RF012 -> `month`, RF013 -> `year`, RF014 -> id
+|  |     runtime filters: RF012 -> functional.alltypestiny.month, RF013 -> functional.alltypestiny.year, RF014 -> functional.alltypestiny.id
 |  |     row-size=12B cardinality=2
 |  |
-|  01:SCAN HDFS [functional.alltypestiny]
+|  03:AGGREGATE [FINALIZE]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
-|     runtime filters: RF006 -> `month`, RF007 -> `year`, RF008 -> id
+|     runtime filters: RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.year, RF008 -> functional.alltypestiny.id
 |     row-size=12B cardinality=2
 |
+01:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
-   runtime filters: RF000 -> `month`, RF001 -> `year`, RF002 -> id
+   runtime filters: RF000 -> functional.alltypestiny.month, RF001 -> functional.alltypestiny.year, RF002 -> functional.alltypestiny.id
    row-size=12B cardinality=2
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 19:EXCHANGE [UNPARTITIONED]
 |
-18:AGGREGATE [FINALIZE]
-|  group by: $a$1.id, $a$1.year, $a$1.month
+09:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
+|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- `month`, RF001 <- `year`, RF002 <- id
 |  row-size=12B cardinality=2
 |
-17:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
-|
-09:AGGREGATE [STREAMING]
-|  group by: id, `year`, `month`
-|  row-size=12B cardinality=2
-|
-08:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
-|  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
-|  runtime filters: RF000 <- $a$1.month, RF001 <- $a$1.year, RF002 <- $a$1.id
-|  row-size=12B cardinality=2
-|
-|--16:EXCHANGE [BROADCAST]
+|--18:EXCHANGE [HASH(id,`year`,`month`)]
 |  |
-|  15:AGGREGATE [FINALIZE]
-|  |  group by: $a$1.id, $a$1.year, $a$1.month
+|  08:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
+|  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
+|  |  runtime filters: RF006 <- `month`, RF007 <- `year`, RF008 <- id
 |  |  row-size=12B cardinality=2
 |  |
-|  14:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
-|  |
-|  07:AGGREGATE [STREAMING]
-|  |  group by: id, `year`, `month`
-|  |  row-size=12B cardinality=2
-|  |
-|  06:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
-|  |  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
-|  |  runtime filters: RF006 <- $a$1.month, RF007 <- $a$1.year, RF008 <- $a$1.id
-|  |  row-size=12B cardinality=2
-|  |
-|  |--13:EXCHANGE [BROADCAST]
+|  |--17:EXCHANGE [HASH(id,`year`,`month`)]
 |  |  |
-|  |  12:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$1.id, $a$1.year, $a$1.month
+|  |  07:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
+|  |  |  runtime filters: RF012 <- `month`, RF013 <- `year`, RF014 <- id
 |  |  |  row-size=12B cardinality=2
 |  |  |
-|  |  11:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
+|  |  |--16:EXCHANGE [BROADCAST]
+|  |  |  |
+|  |  |  06:SCAN HDFS [functional.alltypestiny]
+|  |  |     partition predicates: `year` = 2009, `month` = 2
+|  |  |     HDFS partitions=1/4 files=1 size=115B
+|  |  |     row-size=12B cardinality=2
+|  |  |
+|  |  15:AGGREGATE [FINALIZE]
+|  |  |  group by: id, `year`, `month`
+|  |  |  row-size=12B cardinality=2
+|  |  |
+|  |  14:EXCHANGE [HASH(id,`year`,`month`)]
 |  |  |
 |  |  05:AGGREGATE [STREAMING]
 |  |  |  group by: id, `year`, `month`
 |  |  |  row-size=12B cardinality=2
 |  |  |
-|  |  04:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
-|  |  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
-|  |  |  runtime filters: RF012 <- `month`, RF013 <- `year`, RF014 <- id
-|  |  |  row-size=12B cardinality=2
-|  |  |
-|  |  |--10:EXCHANGE [BROADCAST]
-|  |  |  |
-|  |  |  03:SCAN HDFS [functional.alltypestiny]
-|  |  |     partition predicates: `year` = 2009, `month` = 2
-|  |  |     HDFS partitions=1/4 files=1 size=115B
-|  |  |     row-size=12B cardinality=2
-|  |  |
-|  |  02:SCAN HDFS [functional.alltypestiny]
+|  |  04:SCAN HDFS [functional.alltypestiny]
 |  |     partition predicates: `year` = 2009, `month` = 2
 |  |     HDFS partitions=1/4 files=1 size=115B
-|  |     runtime filters: RF012 -> `month`, RF013 -> `year`, RF014 -> id
+|  |     runtime filters: RF012 -> functional.alltypestiny.month, RF013 -> functional.alltypestiny.year, RF014 -> functional.alltypestiny.id
 |  |     row-size=12B cardinality=2
 |  |
-|  01:SCAN HDFS [functional.alltypestiny]
+|  13:AGGREGATE [FINALIZE]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  12:EXCHANGE [HASH(id,`year`,`month`)]
+|  |
+|  03:AGGREGATE [STREAMING]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
-|     runtime filters: RF006 -> `month`, RF007 -> `year`, RF008 -> id
+|     runtime filters: RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.year, RF008 -> functional.alltypestiny.id
 |     row-size=12B cardinality=2
 |
+11:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
+10:EXCHANGE [HASH(id,`year`,`month`)]
+|
+01:AGGREGATE [STREAMING]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
-   runtime filters: RF000 -> `month`, RF001 -> `year`, RF002 -> id
+   runtime filters: RF000 -> functional.alltypestiny.month, RF001 -> functional.alltypestiny.year, RF002 -> functional.alltypestiny.id
    row-size=12B cardinality=2
 ====
 # intersect uses inner join if distinct on both sides
@@ -290,28 +292,28 @@
 ---- PLAN
 PLAN-ROOT SINK
 |
-05:AGGREGATE [FINALIZE]
-|  group by: id, `year`, `month`
+05:HASH JOIN [LEFT ANTI JOIN]
+|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
+|--03:SCAN HDFS [functional.alltypestiny]
+|     partition predicates: `year` = 2009, `month` = 2
+|     HDFS partitions=1/4 files=1 size=115B
+|     row-size=12B cardinality=2
+|
 04:HASH JOIN [LEFT ANTI JOIN]
 |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
 |--02:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 2
-|     HDFS partitions=1/4 files=1 size=115B
-|     row-size=12B cardinality=2
-|
-03:HASH JOIN [LEFT ANTI JOIN]
-|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
-|  row-size=12B cardinality=2
-|
-|--01:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=12B cardinality=2
 |
+01:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
@@ -321,38 +323,38 @@
 |
 10:EXCHANGE [UNPARTITIONED]
 |
-09:AGGREGATE [FINALIZE]
-|  group by: $a$1.id, $a$1.year, $a$1.month
+05:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
+|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
-08:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
-|
-05:AGGREGATE [STREAMING]
-|  group by: id, `year`, `month`
-|  row-size=12B cardinality=2
+|--09:EXCHANGE [BROADCAST]
+|  |
+|  03:SCAN HDFS [functional.alltypestiny]
+|     partition predicates: `year` = 2009, `month` = 2
+|     HDFS partitions=1/4 files=1 size=115B
+|     row-size=12B cardinality=2
 |
 04:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
 |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
-|--07:EXCHANGE [BROADCAST]
+|--08:EXCHANGE [BROADCAST]
 |  |
 |  02:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 2
-|     HDFS partitions=1/4 files=1 size=115B
-|     row-size=12B cardinality=2
-|
-03:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
-|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
-|  row-size=12B cardinality=2
-|
-|--06:EXCHANGE [BROADCAST]
-|  |
-|  01:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=12B cardinality=2
 |
+07:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
+06:EXCHANGE [HASH(id,`year`,`month`)]
+|
+01:AGGREGATE [STREAMING]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
@@ -368,32 +370,32 @@
 ---- PLAN
 PLAN-ROOT SINK
 |
-06:AGGREGATE [FINALIZE]
-|  group by: id, `year`, `month`
+06:HASH JOIN [LEFT ANTI JOIN]
+|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
-05:HASH JOIN [LEFT ANTI JOIN]
-|  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
-|  row-size=12B cardinality=2
-|
-|--04:AGGREGATE [FINALIZE]
-|  |  group by: id, `year`, `month`
-|  |  row-size=12B cardinality=2
-|  |
-|  03:HASH JOIN [LEFT ANTI JOIN]
+|--05:HASH JOIN [LEFT ANTI JOIN]
 |  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  |  row-size=12B cardinality=2
 |  |
-|  |--02:SCAN HDFS [functional.alltypestiny]
+|  |--04:SCAN HDFS [functional.alltypestiny]
 |  |     partition predicates: `year` = 2009, `month` = 2
 |  |     HDFS partitions=1/4 files=1 size=115B
 |  |     row-size=12B cardinality=2
 |  |
-|  01:SCAN HDFS [functional.alltypestiny]
+|  03:AGGREGATE [FINALIZE]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=12B cardinality=2
 |
+01:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
@@ -403,48 +405,48 @@
 |
 13:EXCHANGE [UNPARTITIONED]
 |
-12:AGGREGATE [FINALIZE]
-|  group by: $a$1.id, $a$1.year, $a$1.month
+06:HASH JOIN [LEFT ANTI JOIN, PARTITIONED]
+|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
-11:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
-|
-06:AGGREGATE [STREAMING]
-|  group by: id, `year`, `month`
-|  row-size=12B cardinality=2
-|
-05:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
-|  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
-|  row-size=12B cardinality=2
-|
-|--10:EXCHANGE [BROADCAST]
+|--12:EXCHANGE [HASH(id,`year`,`month`)]
 |  |
-|  09:AGGREGATE [FINALIZE]
-|  |  group by: $a$1.id, $a$1.year, $a$1.month
-|  |  row-size=12B cardinality=2
-|  |
-|  08:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
-|  |
-|  04:AGGREGATE [STREAMING]
-|  |  group by: id, `year`, `month`
-|  |  row-size=12B cardinality=2
-|  |
-|  03:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
+|  05:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
 |  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  |  row-size=12B cardinality=2
 |  |
-|  |--07:EXCHANGE [BROADCAST]
+|  |--11:EXCHANGE [BROADCAST]
 |  |  |
-|  |  02:SCAN HDFS [functional.alltypestiny]
+|  |  04:SCAN HDFS [functional.alltypestiny]
 |  |     partition predicates: `year` = 2009, `month` = 2
 |  |     HDFS partitions=1/4 files=1 size=115B
 |  |     row-size=12B cardinality=2
 |  |
-|  01:SCAN HDFS [functional.alltypestiny]
+|  10:AGGREGATE [FINALIZE]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  09:EXCHANGE [HASH(id,`year`,`month`)]
+|  |
+|  03:AGGREGATE [STREAMING]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=12B cardinality=2
 |
+08:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
+07:EXCHANGE [HASH(id,`year`,`month`)]
+|
+01:AGGREGATE [STREAMING]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
@@ -622,9 +624,44 @@
 |  row-size=89B cardinality=3
 |
 00:UNION
-|  pass-through-operands: all
+|  pass-through-operands: 08,10
 |  row-size=89B cardinality=3
 |
+|--07:HASH JOIN [LEFT SEMI JOIN]
+|  |  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM functional.alltypestiny.bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM functional.alltypestiny.bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM functional.alltypestiny.double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM functional.alltypestiny.float_col, functional.alltypestiny.id IS NOT DISTINCT FROM functional.alltypestiny.id, functional.alltypestiny.int_col IS NOT DISTINCT FROM functional.alltypestiny.int_col, functional.alltypestiny.month IS NOT DISTINCT FROM functional.alltypestiny.month, functional.alltypestiny.smallint_col IS NOT DISTINCT FROM functional.alltypestiny.smallint_col, functional.alltypestiny.timestamp_col IS NOT DISTINCT FROM functional.alltypestiny.timestamp_col, functional.alltypestiny.tinyint_col IS NOT DISTINCT FROM functional.alltypestiny.tinyint_col, functional.alltypestiny.year IS NOT DISTINCT FROM functional.alltypestiny.year, functional.alltypestiny.string_col IS NOT DISTINCT FROM functional.alltypestiny.string_col, functional.alltypestiny.date_string_col IS NOT DISTINCT FROM functional.alltypestiny.date_string_col
+|  |  runtime filters: RF000 <- functional.alltypestiny.bigint_col, RF001 <- functional.alltypestiny.bool_col, RF002 <- functional.alltypestiny.double_col, RF003 <- functional.alltypestiny.float_col, RF004 <- functional.alltypestiny.id, RF005 <- functional.alltypestiny.int_col, RF006 <- functional.alltypestiny.month, RF007 <- functional.alltypestiny.smallint_col, RF008 <- functional.alltypestiny.timestamp_col, RF010 <- functional.alltypestiny.tinyint_col
+|  |  row-size=89B cardinality=1
+|  |
+|  |--05:SCAN HDFS [functional.alltypestiny]
+|  |     partition predicates: `year` = 2009, `month` = 2
+|  |     HDFS partitions=1/4 files=1 size=115B
+|  |     limit: 1
+|  |     row-size=89B cardinality=1
+|  |
+|  06:HASH JOIN [LEFT ANTI JOIN]
+|  |  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM float_col, functional.alltypestiny.id IS NOT DISTINCT FROM id, functional.alltypestiny.int_col IS NOT DISTINCT FROM int_col, functional.alltypestiny.month IS NOT DISTINCT FROM month, functional.alltypestiny.smallint_col IS NOT DISTINCT FROM smallint_col, functional.alltypestiny.timestamp_col IS NOT DISTINCT FROM timestamp_col, functional.alltypestiny.tinyint_col IS NOT DISTINCT FROM tinyint_col, functional.alltypestiny.year IS NOT DISTINCT FROM year, functional.alltypestiny.string_col IS NOT DISTINCT FROM string_col, functional.alltypestiny.date_string_col IS NOT DISTINCT FROM date_string_col
+|  |  row-size=89B cardinality=1
+|  |
+|  |--04:TOP-N [LIMIT=1]
+|  |  |  order by: int_col ASC
+|  |  |  row-size=89B cardinality=1
+|  |  |
+|  |  03:SCAN HDFS [functional.alltypestiny]
+|  |     partition predicates: `year` = 2009, `month` = 1
+|  |     HDFS partitions=1/4 files=1 size=115B
+|  |     row-size=89B cardinality=2
+|  |
+|  02:AGGREGATE [FINALIZE]
+|  |  group by: functional.alltypestiny.id, functional.alltypestiny.bool_col, functional.alltypestiny.tinyint_col, functional.alltypestiny.smallint_col, functional.alltypestiny.int_col, functional.alltypestiny.bigint_col, functional.alltypestiny.float_col, functional.alltypestiny.double_col, functional.alltypestiny.date_string_col, functional.alltypestiny.string_col, functional.alltypestiny.timestamp_col, functional.alltypestiny.year, functional.alltypestiny.month
+|  |  limit: 1
+|  |  row-size=89B cardinality=1
+|  |
+|  01:SCAN HDFS [functional.alltypestiny]
+|     partition predicates: `year` = 2009, `month` = 2
+|     HDFS partitions=1/4 files=1 size=115B
+|     runtime filters: RF000 -> functional.alltypestiny.bigint_col, RF001 -> functional.alltypestiny.bool_col, RF002 -> functional.alltypestiny.double_col, RF003 -> functional.alltypestiny.float_col, RF004 -> functional.alltypestiny.id, RF005 -> functional.alltypestiny.int_col, RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.smallint_col, RF008 -> functional.alltypestiny.timestamp_col, RF010 -> functional.alltypestiny.tinyint_col
+|     row-size=89B cardinality=2
+|
 |--10:TOP-N [LIMIT=1]
 |  |  order by: int_col ASC
 |  |  row-size=89B cardinality=1
@@ -634,44 +671,9 @@
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=89B cardinality=2
 |
-|--08:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 1
-|     HDFS partitions=1/4 files=1 size=115B
-|     limit: 1
-|     row-size=89B cardinality=1
-|
-07:AGGREGATE [FINALIZE]
-|  group by: functional.alltypestiny.id, functional.alltypestiny.bool_col, functional.alltypestiny.tinyint_col, functional.alltypestiny.smallint_col, functional.alltypestiny.int_col, functional.alltypestiny.bigint_col, functional.alltypestiny.float_col, functional.alltypestiny.double_col, functional.alltypestiny.date_string_col, functional.alltypestiny.string_col, functional.alltypestiny.timestamp_col, functional.alltypestiny.year, functional.alltypestiny.month
-|  row-size=89B cardinality=1
-|
-06:HASH JOIN [LEFT SEMI JOIN]
-|  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM functional.alltypestiny.bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM functional.alltypestiny.bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM functional.alltypestiny.double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM functional.alltypestiny.float_col, functional.alltypestiny.id IS NOT DISTINCT FROM functional.alltypestiny.id, functional.alltypestiny.int_col IS NOT DISTINCT FROM functional.alltypestiny.int_col, functional.alltypestiny.month IS NOT DISTINCT FROM functional.alltypestiny.month, functional.alltypestiny.smallint_col IS NOT DISTINCT FROM functional.alltypestiny.smallint_col, functional.alltypestiny.timestamp_col IS NOT DISTINCT FROM functional.alltypestiny.timestamp_col, functional.alltypestiny.tinyint_col IS NOT DISTINCT FROM functional.alltypestiny.tinyint_col, functional.alltypestiny.year IS NOT DISTINCT FROM functional.alltypestiny.year, functional.alltypestiny.string_col IS NOT DISTINCT FROM functional.alltypestiny.string_col, functional.alltypestiny.date_string_col IS NOT DISTINCT FROM functional.alltypestiny.date_string_col
-|  runtime filters: RF000 <- functional.alltypestiny.bigint_col, RF001 <- functional.alltypestiny.bool_col, RF002 <- functional.alltypestiny.double_col, RF003 <- functional.alltypestiny.float_col, RF004 <- functional.alltypestiny.id, RF005 <- functional.alltypestiny.int_col, RF006 <- functional.alltypestiny.month, RF007 <- functional.alltypestiny.smallint_col, RF008 <- functional.alltypestiny.timestamp_col, RF010 <- functional.alltypestiny.tinyint_col
-|  row-size=89B cardinality=1
-|
-|--04:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 2
-|     HDFS partitions=1/4 files=1 size=115B
-|     limit: 1
-|     row-size=89B cardinality=1
-|
-05:HASH JOIN [LEFT ANTI JOIN]
-|  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM float_col, functional.alltypestiny.id IS NOT DISTINCT FROM id, functional.alltypestiny.int_col IS NOT DISTINCT FROM int_col, functional.alltypestiny.month IS NOT DISTINCT FROM month, functional.alltypestiny.smallint_col IS NOT DISTINCT FROM smallint_col, functional.alltypestiny.timestamp_col IS NOT DISTINCT FROM timestamp_col, functional.alltypestiny.tinyint_col IS NOT DISTINCT FROM tinyint_col, functional.alltypestiny.year IS NOT DISTINCT FROM year, functional.alltypestiny.string_col IS NOT DISTINCT FROM string_col, functional.alltypestiny.date_string_col IS NOT DISTINCT FROM date_string_col
-|  row-size=89B cardinality=1
-|
-|--03:TOP-N [LIMIT=1]
-|  |  order by: int_col ASC
-|  |  row-size=89B cardinality=1
-|  |
-|  02:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 1
-|     HDFS partitions=1/4 files=1 size=115B
-|     row-size=89B cardinality=2
-|
-01:SCAN HDFS [functional.alltypestiny]
-   partition predicates: `year` = 2009, `month` = 2
+08:SCAN HDFS [functional.alltypestiny]
+   partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
-   runtime filters: RF000 -> functional.alltypestiny.bigint_col, RF001 -> functional.alltypestiny.bool_col, RF002 -> functional.alltypestiny.double_col, RF003 -> functional.alltypestiny.float_col, RF004 -> functional.alltypestiny.id, RF005 -> functional.alltypestiny.int_col, RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.smallint_col, RF008 -> functional.alltypestiny.timestamp_col, RF010 -> functional.alltypestiny.tinyint_col
    limit: 1
    row-size=89B cardinality=1
 ---- DISTRIBUTEDPLAN
@@ -682,10 +684,65 @@
 |  row-size=89B cardinality=3
 |
 00:UNION
-|  pass-through-operands: all
+|  pass-through-operands: 12,13
 |  row-size=89B cardinality=3
 |
-|--18:MERGING-EXCHANGE [UNPARTITIONED]
+|--07:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM functional.alltypestiny.bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM functional.alltypestiny.bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM functional.alltypestiny.double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM functional.alltypestiny.float_col, functional.alltypestiny.id IS NOT DISTINCT FROM functional.alltypestiny.id, functional.alltypestiny.int_col IS NOT DISTINCT FROM functional.alltypestiny.int_col, functional.alltypestiny.month IS NOT DISTINCT FROM functional.alltypestiny.month, functional.alltypestiny.smallint_col IS NOT DISTINCT FROM functional.alltypestiny.smallint_col, functional.alltypestiny.timestamp_col IS NOT DISTINCT FROM functional.alltypestiny.timestamp_col, functional.alltypestiny.tinyint_col IS NOT DISTINCT FROM functional.alltypestiny.tinyint_col, functional.alltypestiny.year IS NOT DISTINCT FROM functional.alltypestiny.year, functional.alltypestiny.string_col IS NOT DISTINCT FROM functional.alltypestiny.string_col, functional.alltypestiny.date_string_col IS NOT DISTINCT FROM functional.alltypestiny.date_string_col
+|  |  runtime filters: RF000 <- functional.alltypestiny.bigint_col, RF001 <- functional.alltypestiny.bool_col, RF002 <- functional.alltypestiny.double_col, RF003 <- functional.alltypestiny.float_col, RF004 <- functional.alltypestiny.id, RF005 <- functional.alltypestiny.int_col, RF006 <- functional.alltypestiny.month, RF007 <- functional.alltypestiny.smallint_col, RF008 <- functional.alltypestiny.timestamp_col, RF010 <- functional.alltypestiny.tinyint_col
+|  |  row-size=89B cardinality=1
+|  |
+|  |--20:EXCHANGE [UNPARTITIONED]
+|  |  |
+|  |  19:EXCHANGE [UNPARTITIONED]
+|  |  |  limit: 1
+|  |  |
+|  |  05:SCAN HDFS [functional.alltypestiny]
+|  |     partition predicates: `year` = 2009, `month` = 2
+|  |     HDFS partitions=1/4 files=1 size=115B
+|  |     limit: 1
+|  |     row-size=89B cardinality=1
+|  |
+|  06:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
+|  |  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM float_col, functional.alltypestiny.id IS NOT DISTINCT FROM id, functional.alltypestiny.int_col IS NOT DISTINCT FROM int_col, functional.alltypestiny.month IS NOT DISTINCT FROM month, functional.alltypestiny.smallint_col IS NOT DISTINCT FROM smallint_col, functional.alltypestiny.timestamp_col IS NOT DISTINCT FROM timestamp_col, functional.alltypestiny.tinyint_col IS NOT DISTINCT FROM tinyint_col, functional.alltypestiny.year IS NOT DISTINCT FROM year, functional.alltypestiny.string_col IS NOT DISTINCT FROM string_col, functional.alltypestiny.date_string_col IS NOT DISTINCT FROM date_string_col
+|  |  row-size=89B cardinality=1
+|  |
+|  |--18:EXCHANGE [UNPARTITIONED]
+|  |  |
+|  |  17:MERGING-EXCHANGE [UNPARTITIONED]
+|  |  |  order by: int_col ASC
+|  |  |  limit: 1
+|  |  |
+|  |  04:TOP-N [LIMIT=1]
+|  |  |  order by: int_col ASC
+|  |  |  row-size=89B cardinality=1
+|  |  |
+|  |  03:SCAN HDFS [functional.alltypestiny]
+|  |     partition predicates: `year` = 2009, `month` = 1
+|  |     HDFS partitions=1/4 files=1 size=115B
+|  |     row-size=89B cardinality=2
+|  |
+|  16:EXCHANGE [UNPARTITIONED]
+|  |  limit: 1
+|  |
+|  15:AGGREGATE [FINALIZE]
+|  |  group by: functional.alltypestiny.id, functional.alltypestiny.bool_col, functional.alltypestiny.tinyint_col, functional.alltypestiny.smallint_col, functional.alltypestiny.int_col, functional.alltypestiny.bigint_col, functional.alltypestiny.float_col, functional.alltypestiny.double_col, functional.alltypestiny.date_string_col, functional.alltypestiny.string_col, functional.alltypestiny.timestamp_col, functional.alltypestiny.year, functional.alltypestiny.month
+|  |  limit: 1
+|  |  row-size=89B cardinality=1
+|  |
+|  14:EXCHANGE [HASH(functional.alltypestiny.id,functional.alltypestiny.bool_col,functional.alltypestiny.tinyint_col,functional.alltypestiny.smallint_col,functional.alltypestiny.int_col,functional.alltypestiny.bigint_col,functional.alltypestiny.float_col,functional.alltypestiny.double_col,functional.alltypestiny.date_string_col,functional.alltypestiny.string_col,functional.alltypestiny.timestamp_col,functional.alltypestiny.year,functional.alltypestiny.month)]
+|  |
+|  02:AGGREGATE [STREAMING]
+|  |  group by: functional.alltypestiny.id, functional.alltypestiny.bool_col, functional.alltypestiny.tinyint_col, functional.alltypestiny.smallint_col, functional.alltypestiny.int_col, functional.alltypestiny.bigint_col, functional.alltypestiny.float_col, functional.alltypestiny.double_col, functional.alltypestiny.date_string_col, functional.alltypestiny.string_col, functional.alltypestiny.timestamp_col, functional.alltypestiny.year, functional.alltypestiny.month
+|  |  row-size=89B cardinality=2
+|  |
+|  01:SCAN HDFS [functional.alltypestiny]
+|     partition predicates: `year` = 2009, `month` = 2
+|     HDFS partitions=1/4 files=1 size=115B
+|     runtime filters: RF000 -> functional.alltypestiny.bigint_col, RF001 -> functional.alltypestiny.bool_col, RF002 -> functional.alltypestiny.double_col, RF003 -> functional.alltypestiny.float_col, RF004 -> functional.alltypestiny.id, RF005 -> functional.alltypestiny.int_col, RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.smallint_col, RF008 -> functional.alltypestiny.timestamp_col, RF010 -> functional.alltypestiny.tinyint_col
+|     row-size=89B cardinality=2
+|
+|--13:MERGING-EXCHANGE [UNPARTITIONED]
 |  |  order by: int_col ASC
 |  |  limit: 1
 |  |
@@ -698,61 +755,255 @@
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=89B cardinality=2
 |
-|--17:EXCHANGE [UNPARTITIONED]
-|  |  limit: 1
-|  |
-|  08:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 1
-|     HDFS partitions=1/4 files=1 size=115B
-|     limit: 1
-|     row-size=89B cardinality=1
-|
-07:AGGREGATE [FINALIZE]
-|  group by: functional.alltypestiny.id, functional.alltypestiny.bool_col, functional.alltypestiny.tinyint_col, functional.alltypestiny.smallint_col, functional.alltypestiny.int_col, functional.alltypestiny.bigint_col, functional.alltypestiny.float_col, functional.alltypestiny.double_col, functional.alltypestiny.date_string_col, functional.alltypestiny.string_col, functional.alltypestiny.timestamp_col, functional.alltypestiny.year, functional.alltypestiny.month
-|  row-size=89B cardinality=1
-|
-06:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
-|  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM functional.alltypestiny.bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM functional.alltypestiny.bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM functional.alltypestiny.double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM functional.alltypestiny.float_col, functional.alltypestiny.id IS NOT DISTINCT FROM functional.alltypestiny.id, functional.alltypestiny.int_col IS NOT DISTINCT FROM functional.alltypestiny.int_col, functional.alltypestiny.month IS NOT DISTINCT FROM functional.alltypestiny.month, functional.alltypestiny.smallint_col IS NOT DISTINCT FROM functional.alltypestiny.smallint_col, functional.alltypestiny.timestamp_col IS NOT DISTINCT FROM functional.alltypestiny.timestamp_col, functional.alltypestiny.tinyint_col IS NOT DISTINCT FROM functional.alltypestiny.tinyint_col, functional.alltypestiny.year IS NOT DISTINCT FROM functional.alltypestiny.year, functional.alltypestiny.string_col IS NOT DISTINCT FROM functional.alltypestiny.string_col, functional.alltypestiny.date_string_col IS NOT DISTINCT FROM functional.alltypestiny.date_string_col
-|  runtime filters: RF000 <- functional.alltypestiny.bigint_col, RF001 <- functional.alltypestiny.bool_col, RF002 <- functional.alltypestiny.double_col, RF003 <- functional.alltypestiny.float_col, RF004 <- functional.alltypestiny.id, RF005 <- functional.alltypestiny.int_col, RF006 <- functional.alltypestiny.month, RF007 <- functional.alltypestiny.smallint_col, RF008 <- functional.alltypestiny.timestamp_col, RF010 <- functional.alltypestiny.tinyint_col
-|  row-size=89B cardinality=1
-|
-|--16:EXCHANGE [UNPARTITIONED]
-|  |
-|  15:EXCHANGE [UNPARTITIONED]
-|  |  limit: 1
-|  |
-|  04:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 2
-|     HDFS partitions=1/4 files=1 size=115B
-|     limit: 1
-|     row-size=89B cardinality=1
-|
-05:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
-|  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM float_col, functional.alltypestiny.id IS NOT DISTINCT FROM id, functional.alltypestiny.int_col IS NOT DISTINCT FROM int_col, functional.alltypestiny.month IS NOT DISTINCT FROM month, functional.alltypestiny.smallint_col IS NOT DISTINCT FROM smallint_col, functional.alltypestiny.timestamp_col IS NOT DISTINCT FROM timestamp_col, functional.alltypestiny.tinyint_col IS NOT DISTINCT FROM tinyint_col, functional.alltypestiny.year IS NOT DISTINCT FROM year, functional.alltypestiny.string_col IS NOT DISTINCT FROM string_col, functional.alltypestiny.date_string_col IS NOT DISTINCT FROM date_string_col
-|  row-size=89B cardinality=1
-|
-|--14:EXCHANGE [UNPARTITIONED]
-|  |
-|  13:MERGING-EXCHANGE [UNPARTITIONED]
-|  |  order by: int_col ASC
-|  |  limit: 1
-|  |
-|  03:TOP-N [LIMIT=1]
-|  |  order by: int_col ASC
-|  |  row-size=89B cardinality=1
-|  |
-|  02:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 1
-|     HDFS partitions=1/4 files=1 size=115B
-|     row-size=89B cardinality=2
-|
 12:EXCHANGE [UNPARTITIONED]
 |  limit: 1
 |
-01:SCAN HDFS [functional.alltypestiny]
-   partition predicates: `year` = 2009, `month` = 2
+08:SCAN HDFS [functional.alltypestiny]
+   partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
-   runtime filters: RF000 -> functional.alltypestiny.bigint_col, RF001 -> functional.alltypestiny.bool_col, RF002 -> functional.alltypestiny.double_col, RF003 -> functional.alltypestiny.float_col, RF004 -> functional.alltypestiny.id, RF005 -> functional.alltypestiny.int_col, RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.smallint_col, RF008 -> functional.alltypestiny.timestamp_col, RF010 -> functional.alltypestiny.tinyint_col
    limit: 1
    row-size=89B cardinality=1
 ====
+# DISTINCT is pushed down to left-most operand
+select id from functional.alltypessmall
+intersect
+select id from functional.alltypestiny where int_col > 0;
+---- PLAN
+PLAN-ROOT SINK
+|
+03:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=4B cardinality=1
+|
+|--02:SCAN HDFS [functional.alltypestiny]
+|     HDFS partitions=4/4 files=4 size=460B
+|     predicates: int_col > 0
+|     row-size=8B cardinality=1
+|
+01:AGGREGATE [FINALIZE]
+|  group by: id
+|  row-size=4B cardinality=99
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> functional.alltypessmall.id
+   row-size=4B cardinality=100
+---- DISTRIBUTEDPLAN
+PLAN-ROOT SINK
+|
+07:EXCHANGE [UNPARTITIONED]
+|
+03:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
+|  hash predicates: id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=4B cardinality=1
+|
+|--06:EXCHANGE [HASH(id)]
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
+|     HDFS partitions=4/4 files=4 size=460B
+|     predicates: int_col > 0
+|     row-size=8B cardinality=1
+|
+05:AGGREGATE [FINALIZE]
+|  group by: id
+|  row-size=4B cardinality=99
+|
+04:EXCHANGE [HASH(id)]
+|
+01:AGGREGATE [STREAMING]
+|  group by: id
+|  row-size=4B cardinality=99
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> functional.alltypessmall.id
+   row-size=4B cardinality=100
+====
+# no pushdown of DISTINCT into operands with analytical functions
+select id, count(*) OVER() from functional.alltypessmall
+intersect
+select id, count(*) OVER() from functional.alltypessmall;
+---- PLAN
+PLAN-ROOT SINK
+|
+05:AGGREGATE [FINALIZE]
+|  group by: id, count(*)
+|  row-size=12B cardinality=99
+|
+04:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: count(*) IS NOT DISTINCT FROM count(*), id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=12B cardinality=100
+|
+|--03:ANALYTIC
+|  |  functions: count(*)
+|  |  row-size=12B cardinality=100
+|  |
+|  02:SCAN HDFS [functional.alltypessmall]
+|     HDFS partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
+|
+01:ANALYTIC
+|  functions: count(*)
+|  row-size=12B cardinality=100
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> id
+   row-size=4B cardinality=100
+---- DISTRIBUTEDPLAN
+PLAN-ROOT SINK
+|
+05:AGGREGATE [FINALIZE]
+|  group by: id, count(*)
+|  row-size=12B cardinality=99
+|
+04:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  hash predicates: count(*) IS NOT DISTINCT FROM count(*), id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=12B cardinality=100
+|
+|--08:EXCHANGE [UNPARTITIONED]
+|  |
+|  03:ANALYTIC
+|  |  functions: count(*)
+|  |  row-size=12B cardinality=100
+|  |
+|  07:EXCHANGE [UNPARTITIONED]
+|  |
+|  02:SCAN HDFS [functional.alltypessmall]
+|     HDFS partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
+|
+01:ANALYTIC
+|  functions: count(*)
+|  row-size=12B cardinality=100
+|
+06:EXCHANGE [UNPARTITIONED]
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> id
+   row-size=4B cardinality=100
+====
+# no DISTINCT needed as leftmost operand has grouping which implies distinct rows
+select id, sum(int_col) from functional.alltypessmall group by id
+intersect
+select id, 5 from functional.alltypestiny where int_col > 0;
+---- PLAN
+PLAN-ROOT SINK
+|
+03:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: sum(int_col) IS NOT DISTINCT FROM 5, id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=12B cardinality=1
+|
+|--02:SCAN HDFS [functional.alltypestiny]
+|     HDFS partitions=4/4 files=4 size=460B
+|     predicates: int_col > 0
+|     row-size=8B cardinality=1
+|
+01:AGGREGATE [FINALIZE]
+|  output: sum(int_col)
+|  group by: id
+|  row-size=12B cardinality=99
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> functional.alltypessmall.id
+   row-size=8B cardinality=100
+---- DISTRIBUTEDPLAN
+PLAN-ROOT SINK
+|
+07:EXCHANGE [UNPARTITIONED]
+|
+03:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  hash predicates: sum(int_col) IS NOT DISTINCT FROM 5, id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=12B cardinality=1
+|
+|--06:EXCHANGE [BROADCAST]
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
+|     HDFS partitions=4/4 files=4 size=460B
+|     predicates: int_col > 0
+|     row-size=8B cardinality=1
+|
+05:AGGREGATE [FINALIZE]
+|  output: sum:merge(int_col)
+|  group by: id
+|  row-size=12B cardinality=99
+|
+04:EXCHANGE [HASH(id)]
+|
+01:AGGREGATE [STREAMING]
+|  output: sum(int_col)
+|  group by: id
+|  row-size=12B cardinality=99
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> functional.alltypessmall.id
+   row-size=8B cardinality=100
+====
+# no DISTINCT pushdown for valuestmt or single unionstmt without a FROM clause
+select 1 intersect select 1 intersect select 2;
+---- PLAN
+PLAN-ROOT SINK
+|
+05:AGGREGATE [FINALIZE]
+|  group by: $a$1.1
+|  row-size=1B cardinality=1
+|
+04:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: `$a$1`.`1` IS NOT DISTINCT FROM `$a$3`.`$c$2`
+|  row-size=1B cardinality=1
+|
+|--02:UNION
+|     constant-operands=1
+|     row-size=1B cardinality=1
+|
+03:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: `$a$1`.`1` IS NOT DISTINCT FROM `$a$2`.`$c$1`
+|  row-size=1B cardinality=1
+|
+|--01:UNION
+|     constant-operands=1
+|     row-size=1B cardinality=1
+|
+00:UNION
+   constant-operands=1
+   row-size=1B cardinality=1
+---- DISTRIBUTEDPLAN
+PLAN-ROOT SINK
+|
+05:AGGREGATE [FINALIZE]
+|  group by: $a$1.1
+|  row-size=1B cardinality=1
+|
+04:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  hash predicates: `$a$1`.`1` IS NOT DISTINCT FROM `$a$3`.`$c$2`
+|  row-size=1B cardinality=1
+|
+|--07:EXCHANGE [UNPARTITIONED]
+|  |
+|  02:UNION
+|     constant-operands=1
+|     row-size=1B cardinality=1
+|
+03:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  hash predicates: `$a$1`.`1` IS NOT DISTINCT FROM `$a$2`.`$c$1`
+|  row-size=1B cardinality=1
+|
+|--06:EXCHANGE [UNPARTITIONED]
+|  |
+|  01:UNION
+|     constant-operands=1
+|     row-size=1B cardinality=1
+|
+00:UNION
+   constant-operands=1
+   row-size=1B cardinality=1
+====
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q08.test b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q08.test
index 96ecc7e..862baca 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q08.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q08.test
@@ -78,10 +78,10 @@
 ORDER BY s_store_name
 LIMIT 100;
 ---- PLAN
-Max Per-Host Resource Reservation: Memory=14.90MB Threads=7
-Per-Host Resource Estimates: Memory=219MB
+Max Per-Host Resource Reservation: Memory=15.84MB Threads=7
+Per-Host Resource Estimates: Memory=228MB
 F00:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
-|  Per-Host Resources: mem-estimate=218.81MB mem-reservation=14.90MB thread-reservation=7 runtime-filters-memory=5.00MB
+|  Per-Host Resources: mem-estimate=227.81MB mem-reservation=15.84MB thread-reservation=7 runtime-filters-memory=4.00MB
 PLAN-ROOT SINK
 |  output exprs: s_store_name, sum(ss_net_profit)
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
@@ -100,43 +100,36 @@
 |  in pipelines: 13(GETNEXT), 00(OPEN)
 |
 12:HASH JOIN [INNER JOIN]
-|  hash predicates: substring(s_zip, 1, 2) = substring($a$1.ca_zip, 1, 2)
+|  hash predicates: substring(s_zip, 1, 2) = substring(substring(ca_zip, 1, 5), 1, 2)
 |  fk/pk conjuncts: assumed fk/pk
-|  runtime filters: RF000[bloom] <- substring($a$1.ca_zip, 1, 2)
+|  runtime filters: RF000[bloom] <- substring(substring(ca_zip, 1, 5), 1, 2)
 |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  tuple-ids=0,1,2,10 row-size=73B cardinality=293.73K
-|  in pipelines: 00(GETNEXT), 09(OPEN)
+|  tuple-ids=0,1,2,4 row-size=73B cardinality=293.73K
+|  in pipelines: 00(GETNEXT), 04(OPEN)
 |
-|--09:AGGREGATE [FINALIZE]
-|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 09(GETNEXT), 03(OPEN)
-|  |
-|  08:HASH JOIN [LEFT SEMI JOIN]
+|--09:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: substring(ca_zip, 1, 5) IS NOT DISTINCT FROM substring(ca_zip, 1, 5)
-|  |  runtime filters: RF006[bloom] <- substring(ca_zip, 1, 5)
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=3 row-size=17B cardinality=5.00K
-|  |  in pipelines: 03(GETNEXT), 07(OPEN)
+|  |  tuple-ids=4 row-size=12B cardinality=396
+|  |  in pipelines: 04(GETNEXT), 08(OPEN)
 |  |
-|  |--07:AGGREGATE [FINALIZE]
+|  |--08:AGGREGATE [FINALIZE]
 |  |  |  output: count(*)
 |  |  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
 |  |  |  having: count(*) > CAST(10 AS BIGINT)
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=396
-|  |  |  in pipelines: 07(GETNEXT), 04(OPEN)
+|  |  |  tuple-ids=8 row-size=20B cardinality=396
+|  |  |  in pipelines: 08(GETNEXT), 05(OPEN)
 |  |  |
-|  |  06:HASH JOIN [INNER JOIN]
+|  |  07:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ca_address_sk = c_current_addr_sk
 |  |  |  fk/pk conjuncts: none
-|  |  |  runtime filters: RF008[bloom] <- c_current_addr_sk
+|  |  |  runtime filters: RF006[bloom] <- c_current_addr_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=5,6 row-size=38B cardinality=51.30K
-|  |  |  in pipelines: 04(GETNEXT), 05(OPEN)
+|  |  |  tuple-ids=6,7 row-size=38B cardinality=51.30K
+|  |  |  in pipelines: 05(GETNEXT), 06(OPEN)
 |  |  |
-|  |  |--05:SCAN HDFS [tpcds_parquet.customer]
+|  |  |--06:SCAN HDFS [tpcds_parquet.customer]
 |  |  |     HDFS partitions=1/1 files=1 size=5.49MB
 |  |  |     predicates: c_preferred_cust_flag = 'Y'
 |  |  |     stored statistics:
@@ -146,24 +139,29 @@
 |  |  |     parquet statistics predicates: c_preferred_cust_flag = 'Y'
 |  |  |     parquet dictionary predicates: c_preferred_cust_flag = 'Y'
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=6 row-size=17B cardinality=50.00K
-|  |  |     in pipelines: 05(GETNEXT)
+|  |  |     tuple-ids=7 row-size=17B cardinality=50.00K
+|  |  |     in pipelines: 06(GETNEXT)
 |  |  |
-|  |  04:SCAN HDFS [tpcds_parquet.customer_address]
+|  |  05:SCAN HDFS [tpcds_parquet.customer_address]
 |  |     HDFS partitions=1/1 files=1 size=1.16MB
-|  |     runtime filters: RF008[bloom] -> ca_address_sk
+|  |     runtime filters: RF006[bloom] -> ca_address_sk
 |  |     stored statistics:
 |  |       table: rows=50.00K size=1.16MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=50.00K
 |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |     tuple-ids=5 row-size=21B cardinality=50.00K
-|  |     in pipelines: 04(GETNEXT)
+|  |     tuple-ids=6 row-size=21B cardinality=50.00K
+|  |     in pipelines: 05(GETNEXT)
+|  |
+|  04:AGGREGATE [FINALIZE]
+|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 04(GETNEXT), 03(OPEN)
 |  |
 |  03:SCAN HDFS [tpcds_parquet.customer_address]
 |     HDFS partitions=1/1 files=1 size=1.16MB
 |     predicates: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT)) IN ('24128', '76232', '65084', '87816', '83926', '77556', '20548', '26231', '43848', '15126', '91137', '61265', '98294', '25782', '17920', '18426', '98235', '40081', '84093', '28577', '55565', '17183', '54601', '67897', '22752', '86284', '18376', '38607', '45200', '21756', '29741', '96765', '23932', '89360', '29839', '25989', '28898', '91068', '72550', '10390', '18845', '47770', '82636', '41367', '76638', '86198', '81312', '37126', '39192', '88424', '72175', '81426', '53672', '10445', '42666', '66864', '66708', '41248', '48583', '82276', '18842', '78890', '49448', '14089', '38122', '34425', '79077', '19849', '43285', '39861', '66162', '77610', '13695', '99543', '83444', '83041', '12305', '57665', '68341', '25003', '57834', '62878', '49130', '81096', '18840', '27700', '23470', '50412', '21195', '16021', '76107', '71954', '68309', '18119', '98359', '64544', '10336', '86379', '27068', '39736', '98569', '28915', '24206', '56529', '57647', '54917', '42961', '91110', '63981', '14922', '36420', '23006', '67467', '32754', '30903', '20260', '31671', '51798', '72325', '85816', '68621', '13955', '36446', '41766', '68806', '16725', '15146', '22744', '35850', '88086', '51649', '18270', '52867', '39972', '96976', '63792', '11376', '94898', '13595', '10516', '90225', '58943', '39371', '94945', '28587', '96576', '57855', '28488', '26105', '83933', '25858', '34322', '44438', '73171', '30122', '34102', '22685', '71256', '78451', '54364', '13354', '45375', '40558', '56458', '28286', '45266', '47305', '69399', '83921', '26233', '11101', '15371', '69913', '35942', '15882', '25631', '24610', '44165', '99076', '33786', '70738', '26653', '14328', '72305', '62496', '22152', '10144', '64147', '48425', '14663', '21076', '18799', '30450', '63089', '81019', '68893', '24996', '51200', '51211', '45692', '92712', '70466', '79994', '22437', '25280', '38935', '71791', '73134', '56571', '14060', '19505', '72425', '56575', '74351', '68786', '51650', '20004', '18383', '76614', '11634', '18906', '15765', '41368', '73241', '76698', '78567', '97189', '28545', '76231', '75691', '22246', '51061', '90578', '56691', '68014', '51103', '94167', '57047', '14867', '73520', '15734', '63435', '25733', '35474', '24676', '94627', '53535', '17879', '15559', '53268', '59166', '11928', '59402', '33282', '45721', '43933', '68101', '33515', '36634', '71286', '19736', '58058', '55253', '67473', '41918', '19515', '36495', '19430', '22351', '77191', '91393', '49156', '50298', '87501', '18652', '53179', '18767', '63193', '23968', '65164', '68880', '21286', '72823', '58470', '67301', '13394', '31016', '70372', '67030', '40604', '24317', '45748', '39127', '26065', '77721', '31029', '31880', '60576', '24671', '45549', '13376', '50016', '33123', '19769', '22927', '97789', '46081', '72151', '15723', '46136', '51949', '68100', '96888', '64528', '14171', '79777', '28709', '11489', '25103', '32213', '78668', '22245', '15798', '27156', '37930', '62971', '21337', '51622', '67853', '10567', '38415', '15455', '58263', '42029', '60279', '37125', '56240', '88190', '50308', '26859', '64457', '89091', '82136', '62377', '36233', '63837', '58078', '17043', '30010', '60099', '28810', '98025', '29178', '87343', '73273', '30469', '64034', '39516', '86057', '21309', '90257', '67875', '40162', '11356', '73650', '61810', '72013', '30431', '22461', '19512', '13375', '55307', '30625', '83849', '68908', '26689', '96451', '38193', '46820', '88885', '84935', '69035', '83144', '47537', '56616', '94983', '48033', '69952', '25486', '61547', '27385', '61860', '58048', '56910', '16807', '17871', '35258', '31387', '35458', '35576')
-|     runtime filters: RF006[bloom] -> substring(ca_zip, 1, 5)
 |     stored statistics:
 |       table: rows=50.00K size=1.16MB
 |       columns: all
@@ -225,15 +223,15 @@
    tuple-ids=0 row-size=12B cardinality=2.88M
    in pipelines: 00(GETNEXT)
 ---- DISTRIBUTEDPLAN
-Max Per-Host Resource Reservation: Memory=30.15MB Threads=16
-Per-Host Resource Estimates: Memory=285MB
+Max Per-Host Resource Reservation: Memory=29.15MB Threads=15
+Per-Host Resource Estimates: Memory=284MB
 F09:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=16.00KB mem-reservation=0B thread-reservation=1
 PLAN-ROOT SINK
 |  output exprs: s_store_name, sum(ss_net_profit)
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
 |
-26:MERGING-EXCHANGE [UNPARTITIONED]
+25:MERGING-EXCHANGE [UNPARTITIONED]
 |  order by: s_store_name ASC
 |  limit: 100
 |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
@@ -246,22 +244,22 @@
 |  order by: s_store_name ASC
 |  mem-estimate=258B mem-reservation=0B thread-reservation=0
 |  tuple-ids=14 row-size=32B cardinality=8
-|  in pipelines: 14(GETNEXT), 25(OPEN)
+|  in pipelines: 14(GETNEXT), 24(OPEN)
 |
-25:AGGREGATE [FINALIZE]
+24:AGGREGATE [FINALIZE]
 |  output: sum:merge(ss_net_profit)
 |  group by: s_store_name
 |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  tuple-ids=13 row-size=32B cardinality=8
-|  in pipelines: 25(GETNEXT), 00(OPEN)
+|  in pipelines: 24(GETNEXT), 00(OPEN)
 |
-24:EXCHANGE [HASH(s_store_name)]
+23:EXCHANGE [HASH(s_store_name)]
 |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
 |  tuple-ids=13 row-size=32B cardinality=8
 |  in pipelines: 00(GETNEXT)
 |
 F00:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-Per-Host Resources: mem-estimate=50.90MB mem-reservation=11.81MB thread-reservation=2 runtime-filters-memory=3.00MB
+Per-Host Resources: mem-estimate=50.86MB mem-reservation=11.81MB thread-reservation=2 runtime-filters-memory=3.00MB
 13:AGGREGATE [STREAMING]
 |  output: sum(ss_net_profit)
 |  group by: s_store_name
@@ -270,91 +268,64 @@
 |  in pipelines: 00(GETNEXT)
 |
 12:HASH JOIN [INNER JOIN, BROADCAST]
-|  hash predicates: substring(s_zip, 1, 2) = substring($a$1.ca_zip, 1, 2)
+|  hash predicates: substring(s_zip, 1, 2) = substring(substring(ca_zip, 1, 5), 1, 2)
 |  fk/pk conjuncts: assumed fk/pk
-|  runtime filters: RF000[bloom] <- substring($a$1.ca_zip, 1, 2)
+|  runtime filters: RF000[bloom] <- substring(substring(ca_zip, 1, 5), 1, 2)
 |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  tuple-ids=0,1,2,10 row-size=73B cardinality=293.73K
-|  in pipelines: 00(GETNEXT), 22(OPEN)
+|  tuple-ids=0,1,2,4 row-size=73B cardinality=293.73K
+|  in pipelines: 00(GETNEXT), 18(OPEN)
 |
-|--23:EXCHANGE [BROADCAST]
-|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 22(GETNEXT)
+|--22:EXCHANGE [BROADCAST]
+|  |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=396
+|  |  in pipelines: 18(GETNEXT)
 |  |
-|  F07:PLAN FRAGMENT [HASH($a$1.ca_zip)] hosts=1 instances=1
-|  Per-Host Resources: mem-estimate=10.06MB mem-reservation=1.94MB thread-reservation=1
-|  22:AGGREGATE [FINALIZE]
-|  |  group by: $a$1.ca_zip
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 22(GETNEXT), 03(OPEN)
-|  |
-|  21:EXCHANGE [HASH($a$1.ca_zip)]
-|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 03(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
-|  Per-Host Resources: mem-estimate=28.95MB mem-reservation=5.06MB thread-reservation=2 runtime-filters-memory=1.00MB
-|  09:AGGREGATE [STREAMING]
-|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
-|  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 03(GETNEXT)
-|  |
-|  08:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  F04:PLAN FRAGMENT [HASH(substring(ca_zip, 1, 5))] hosts=1 instances=1
+|  Per-Host Resources: mem-estimate=22.00MB mem-reservation=5.81MB thread-reservation=1
+|  09:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash predicates: substring(ca_zip, 1, 5) IS NOT DISTINCT FROM substring(ca_zip, 1, 5)
-|  |  runtime filters: RF006[bloom] <- substring(ca_zip, 1, 5)
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=3 row-size=17B cardinality=5.00K
-|  |  in pipelines: 03(GETNEXT), 19(OPEN)
+|  |  tuple-ids=4 row-size=12B cardinality=396
+|  |  in pipelines: 18(GETNEXT), 21(OPEN)
 |  |
-|  |--20:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=17.02KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=396
-|  |  |  in pipelines: 19(GETNEXT)
-|  |  |
-|  |  F06:PLAN FRAGMENT [HASH(substring(ca_zip, 1, 5))] hosts=1 instances=1
-|  |  Per-Host Resources: mem-estimate=10.10MB mem-reservation=1.94MB thread-reservation=1
-|  |  19:AGGREGATE [FINALIZE]
+|  |--21:AGGREGATE [FINALIZE]
 |  |  |  output: count:merge(*)
 |  |  |  group by: substring(ca_zip, 1, 5)
 |  |  |  having: count(*) > CAST(10 AS BIGINT)
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=396
-|  |  |  in pipelines: 19(GETNEXT), 04(OPEN)
+|  |  |  tuple-ids=8 row-size=20B cardinality=396
+|  |  |  in pipelines: 21(GETNEXT), 05(OPEN)
 |  |  |
-|  |  18:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
+|  |  20:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
 |  |  |  mem-estimate=101.36KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=3.96K
-|  |  |  in pipelines: 04(GETNEXT)
+|  |  |  tuple-ids=8 row-size=20B cardinality=3.96K
+|  |  |  in pipelines: 05(GETNEXT)
 |  |  |
-|  |  F04:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  F05:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  Per-Host Resources: mem-estimate=45.77MB mem-reservation=5.44MB thread-reservation=2 runtime-filters-memory=1.00MB
-|  |  07:AGGREGATE [STREAMING]
+|  |  08:AGGREGATE [STREAMING]
 |  |  |  output: count(*)
 |  |  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=3.96K
-|  |  |  in pipelines: 04(GETNEXT)
+|  |  |  tuple-ids=8 row-size=20B cardinality=3.96K
+|  |  |  in pipelines: 05(GETNEXT)
 |  |  |
-|  |  06:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  07:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ca_address_sk = c_current_addr_sk
 |  |  |  fk/pk conjuncts: none
-|  |  |  runtime filters: RF008[bloom] <- c_current_addr_sk
+|  |  |  runtime filters: RF006[bloom] <- c_current_addr_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=5,6 row-size=38B cardinality=51.30K
-|  |  |  in pipelines: 04(GETNEXT), 05(OPEN)
+|  |  |  tuple-ids=6,7 row-size=38B cardinality=51.30K
+|  |  |  in pipelines: 05(GETNEXT), 06(OPEN)
 |  |  |
-|  |  |--17:EXCHANGE [BROADCAST]
+|  |  |--19:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=851.08KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=6 row-size=17B cardinality=50.00K
-|  |  |  |  in pipelines: 05(GETNEXT)
+|  |  |  |  tuple-ids=7 row-size=17B cardinality=50.00K
+|  |  |  |  in pipelines: 06(GETNEXT)
 |  |  |  |
-|  |  |  F05:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F06:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  05:SCAN HDFS [tpcds_parquet.customer, RANDOM]
+|  |  |  06:SCAN HDFS [tpcds_parquet.customer, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=5.49MB
 |  |  |     predicates: c_preferred_cust_flag = 'Y'
 |  |  |     stored statistics:
@@ -364,24 +335,42 @@
 |  |  |     parquet statistics predicates: c_preferred_cust_flag = 'Y'
 |  |  |     parquet dictionary predicates: c_preferred_cust_flag = 'Y'
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=6 row-size=17B cardinality=50.00K
-|  |  |     in pipelines: 05(GETNEXT)
+|  |  |     tuple-ids=7 row-size=17B cardinality=50.00K
+|  |  |     in pipelines: 06(GETNEXT)
 |  |  |
-|  |  04:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
+|  |  05:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=1.16MB
-|  |     runtime filters: RF008[bloom] -> ca_address_sk
+|  |     runtime filters: RF006[bloom] -> ca_address_sk
 |  |     stored statistics:
 |  |       table: rows=50.00K size=1.16MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=50.00K
 |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |     tuple-ids=5 row-size=21B cardinality=50.00K
-|  |     in pipelines: 04(GETNEXT)
+|  |     tuple-ids=6 row-size=21B cardinality=50.00K
+|  |     in pipelines: 05(GETNEXT)
+|  |
+|  18:AGGREGATE [FINALIZE]
+|  |  group by: substring(ca_zip, 1, 5)
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 18(GETNEXT), 03(OPEN)
+|  |
+|  17:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
+|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 03(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  Per-Host Resources: mem-estimate=26.00MB mem-reservation=2.12MB thread-reservation=2
+|  04:AGGREGATE [STREAMING]
+|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
+|  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 03(GETNEXT)
 |  |
 |  03:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
 |     HDFS partitions=1/1 files=1 size=1.16MB
 |     predicates: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT)) IN ('24128', '76232', '65084', '87816', '83926', '77556', '20548', '26231', '43848', '15126', '91137', '61265', '98294', '25782', '17920', '18426', '98235', '40081', '84093', '28577', '55565', '17183', '54601', '67897', '22752', '86284', '18376', '38607', '45200', '21756', '29741', '96765', '23932', '89360', '29839', '25989', '28898', '91068', '72550', '10390', '18845', '47770', '82636', '41367', '76638', '86198', '81312', '37126', '39192', '88424', '72175', '81426', '53672', '10445', '42666', '66864', '66708', '41248', '48583', '82276', '18842', '78890', '49448', '14089', '38122', '34425', '79077', '19849', '43285', '39861', '66162', '77610', '13695', '99543', '83444', '83041', '12305', '57665', '68341', '25003', '57834', '62878', '49130', '81096', '18840', '27700', '23470', '50412', '21195', '16021', '76107', '71954', '68309', '18119', '98359', '64544', '10336', '86379', '27068', '39736', '98569', '28915', '24206', '56529', '57647', '54917', '42961', '91110', '63981', '14922', '36420', '23006', '67467', '32754', '30903', '20260', '31671', '51798', '72325', '85816', '68621', '13955', '36446', '41766', '68806', '16725', '15146', '22744', '35850', '88086', '51649', '18270', '52867', '39972', '96976', '63792', '11376', '94898', '13595', '10516', '90225', '58943', '39371', '94945', '28587', '96576', '57855', '28488', '26105', '83933', '25858', '34322', '44438', '73171', '30122', '34102', '22685', '71256', '78451', '54364', '13354', '45375', '40558', '56458', '28286', '45266', '47305', '69399', '83921', '26233', '11101', '15371', '69913', '35942', '15882', '25631', '24610', '44165', '99076', '33786', '70738', '26653', '14328', '72305', '62496', '22152', '10144', '64147', '48425', '14663', '21076', '18799', '30450', '63089', '81019', '68893', '24996', '51200', '51211', '45692', '92712', '70466', '79994', '22437', '25280', '38935', '71791', '73134', '56571', '14060', '19505', '72425', '56575', '74351', '68786', '51650', '20004', '18383', '76614', '11634', '18906', '15765', '41368', '73241', '76698', '78567', '97189', '28545', '76231', '75691', '22246', '51061', '90578', '56691', '68014', '51103', '94167', '57047', '14867', '73520', '15734', '63435', '25733', '35474', '24676', '94627', '53535', '17879', '15559', '53268', '59166', '11928', '59402', '33282', '45721', '43933', '68101', '33515', '36634', '71286', '19736', '58058', '55253', '67473', '41918', '19515', '36495', '19430', '22351', '77191', '91393', '49156', '50298', '87501', '18652', '53179', '18767', '63193', '23968', '65164', '68880', '21286', '72823', '58470', '67301', '13394', '31016', '70372', '67030', '40604', '24317', '45748', '39127', '26065', '77721', '31029', '31880', '60576', '24671', '45549', '13376', '50016', '33123', '19769', '22927', '97789', '46081', '72151', '15723', '46136', '51949', '68100', '96888', '64528', '14171', '79777', '28709', '11489', '25103', '32213', '78668', '22245', '15798', '27156', '37930', '62971', '21337', '51622', '67853', '10567', '38415', '15455', '58263', '42029', '60279', '37125', '56240', '88190', '50308', '26859', '64457', '89091', '82136', '62377', '36233', '63837', '58078', '17043', '30010', '60099', '28810', '98025', '29178', '87343', '73273', '30469', '64034', '39516', '86057', '21309', '90257', '67875', '40162', '11356', '73650', '61810', '72013', '30431', '22461', '19512', '13375', '55307', '30625', '83849', '68908', '26689', '96451', '38193', '46820', '88885', '84935', '69035', '83144', '47537', '56616', '94983', '48033', '69952', '25486', '61547', '27385', '61860', '58048', '56910', '16807', '17871', '35258', '31387', '35458', '35576')
-|     runtime filters: RF006[bloom] -> substring(ca_zip, 1, 5)
 |     stored statistics:
 |       table: rows=50.00K size=1.16MB
 |       columns: all
@@ -457,15 +446,15 @@
    tuple-ids=0 row-size=12B cardinality=2.88M
    in pipelines: 00(GETNEXT)
 ---- PARALLELPLANS
-Max Per-Host Resource Reservation: Memory=48.77MB Threads=17
-Per-Host Resource Estimates: Memory=223MB
+Max Per-Host Resource Reservation: Memory=44.84MB Threads=16
+Per-Host Resource Estimates: Memory=218MB
 F09:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Instance Resources: mem-estimate=16.00KB mem-reservation=0B thread-reservation=1
 PLAN-ROOT SINK
 |  output exprs: s_store_name, sum(ss_net_profit)
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
 |
-26:MERGING-EXCHANGE [UNPARTITIONED]
+25:MERGING-EXCHANGE [UNPARTITIONED]
 |  order by: s_store_name ASC
 |  limit: 100
 |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
@@ -478,16 +467,16 @@
 |  order by: s_store_name ASC
 |  mem-estimate=258B mem-reservation=0B thread-reservation=0
 |  tuple-ids=14 row-size=32B cardinality=8
-|  in pipelines: 14(GETNEXT), 25(OPEN)
+|  in pipelines: 14(GETNEXT), 24(OPEN)
 |
-25:AGGREGATE [FINALIZE]
+24:AGGREGATE [FINALIZE]
 |  output: sum:merge(ss_net_profit)
 |  group by: s_store_name
 |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  tuple-ids=13 row-size=32B cardinality=8
-|  in pipelines: 25(GETNEXT), 00(OPEN)
+|  in pipelines: 24(GETNEXT), 00(OPEN)
 |
-24:EXCHANGE [HASH(s_store_name)]
+23:EXCHANGE [HASH(s_store_name)]
 |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
 |  tuple-ids=13 row-size=32B cardinality=8
 |  in pipelines: 00(GETNEXT)
@@ -504,116 +493,88 @@
 |
 12:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash-table-id=00
-|  hash predicates: substring(s_zip, 1, 2) = substring($a$1.ca_zip, 1, 2)
+|  hash predicates: substring(s_zip, 1, 2) = substring(substring(ca_zip, 1, 5), 1, 2)
 |  fk/pk conjuncts: assumed fk/pk
 |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  tuple-ids=0,1,2,10 row-size=73B cardinality=293.73K
-|  in pipelines: 00(GETNEXT), 22(OPEN)
+|  tuple-ids=0,1,2,4 row-size=73B cardinality=293.73K
+|  in pipelines: 00(GETNEXT), 18(OPEN)
 |
 |--F10:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  Per-Instance Resources: mem-estimate=4.94MB mem-reservation=4.88MB thread-reservation=1 runtime-filters-memory=1.00MB
+|  |  Per-Instance Resources: mem-estimate=4.89MB mem-reservation=4.88MB thread-reservation=1 runtime-filters-memory=1.00MB
 |  JOIN BUILD
 |  |  join-table-id=00 plan-id=01 cohort-id=01
-|  |  build expressions: substring($a$1.ca_zip, 1, 2)
-|  |  runtime filters: RF000[bloom] <- substring($a$1.ca_zip, 1, 2)
+|  |  build expressions: substring(substring(ca_zip, 1, 5), 1, 2)
+|  |  runtime filters: RF000[bloom] <- substring(substring(ca_zip, 1, 5), 1, 2)
 |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |
-|  23:EXCHANGE [BROADCAST]
-|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 22(GETNEXT)
+|  22:EXCHANGE [BROADCAST]
+|  |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=396
+|  |  in pipelines: 18(GETNEXT)
 |  |
-|  F07:PLAN FRAGMENT [HASH($a$1.ca_zip)] hosts=1 instances=1
+|  F04:PLAN FRAGMENT [HASH(substring(ca_zip, 1, 5))] hosts=1 instances=1
 |  Per-Instance Resources: mem-estimate=10.06MB mem-reservation=1.94MB thread-reservation=1
-|  22:AGGREGATE [FINALIZE]
-|  |  group by: $a$1.ca_zip
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 22(GETNEXT), 03(OPEN)
-|  |
-|  21:EXCHANGE [HASH($a$1.ca_zip)]
-|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 03(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
-|  Per-Host Shared Resources: mem-estimate=1.00MB mem-reservation=1.00MB thread-reservation=0 runtime-filters-memory=1.00MB
-|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=2.12MB thread-reservation=1
-|  09:AGGREGATE [STREAMING]
-|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
-|  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 03(GETNEXT)
-|  |
-|  08:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  09:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash-table-id=01
 |  |  hash predicates: substring(ca_zip, 1, 5) IS NOT DISTINCT FROM substring(ca_zip, 1, 5)
 |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=3 row-size=17B cardinality=5.00K
-|  |  in pipelines: 03(GETNEXT), 19(OPEN)
+|  |  tuple-ids=4 row-size=12B cardinality=396
+|  |  in pipelines: 18(GETNEXT), 21(OPEN)
 |  |
-|  |--F11:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
-|  |  |  Per-Instance Resources: mem-estimate=4.89MB mem-reservation=4.88MB thread-reservation=1 runtime-filters-memory=1.00MB
+|  |--F11:PLAN FRAGMENT [HASH(substring(ca_zip, 1, 5))] hosts=1 instances=1
+|  |  |  Per-Instance Resources: mem-estimate=11.94MB mem-reservation=3.88MB thread-reservation=1
 |  |  JOIN BUILD
 |  |  |  join-table-id=01 plan-id=02 cohort-id=02
 |  |  |  build expressions: substring(ca_zip, 1, 5)
-|  |  |  runtime filters: RF006[bloom] <- substring(ca_zip, 1, 5)
-|  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |
-|  |  20:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=17.02KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=396
-|  |  |  in pipelines: 19(GETNEXT)
-|  |  |
-|  |  F06:PLAN FRAGMENT [HASH(substring(ca_zip, 1, 5))] hosts=1 instances=1
-|  |  Per-Instance Resources: mem-estimate=10.10MB mem-reservation=1.94MB thread-reservation=1
-|  |  19:AGGREGATE [FINALIZE]
+|  |  21:AGGREGATE [FINALIZE]
 |  |  |  output: count:merge(*)
 |  |  |  group by: substring(ca_zip, 1, 5)
 |  |  |  having: count(*) > CAST(10 AS BIGINT)
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=396
-|  |  |  in pipelines: 19(GETNEXT), 04(OPEN)
+|  |  |  tuple-ids=8 row-size=20B cardinality=396
+|  |  |  in pipelines: 21(GETNEXT), 05(OPEN)
 |  |  |
-|  |  18:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
+|  |  20:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
 |  |  |  mem-estimate=101.36KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=3.96K
-|  |  |  in pipelines: 04(GETNEXT)
+|  |  |  tuple-ids=8 row-size=20B cardinality=3.96K
+|  |  |  in pipelines: 05(GETNEXT)
 |  |  |
-|  |  F04:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  F05:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  Per-Host Shared Resources: mem-estimate=1.00MB mem-reservation=1.00MB thread-reservation=0 runtime-filters-memory=1.00MB
 |  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=2.50MB thread-reservation=1
-|  |  07:AGGREGATE [STREAMING]
+|  |  08:AGGREGATE [STREAMING]
 |  |  |  output: count(*)
 |  |  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=3.96K
-|  |  |  in pipelines: 04(GETNEXT)
+|  |  |  tuple-ids=8 row-size=20B cardinality=3.96K
+|  |  |  in pipelines: 05(GETNEXT)
 |  |  |
-|  |  06:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  07:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=02
 |  |  |  hash predicates: ca_address_sk = c_current_addr_sk
 |  |  |  fk/pk conjuncts: none
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=5,6 row-size=38B cardinality=51.30K
-|  |  |  in pipelines: 04(GETNEXT), 05(OPEN)
+|  |  |  tuple-ids=6,7 row-size=38B cardinality=51.30K
+|  |  |  in pipelines: 05(GETNEXT), 06(OPEN)
 |  |  |
 |  |  |--F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=5.71MB mem-reservation=4.88MB thread-reservation=1 runtime-filters-memory=1.00MB
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=02 plan-id=03 cohort-id=03
 |  |  |  |  build expressions: c_current_addr_sk
-|  |  |  |  runtime filters: RF008[bloom] <- c_current_addr_sk
+|  |  |  |  runtime filters: RF006[bloom] <- c_current_addr_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  17:EXCHANGE [BROADCAST]
+|  |  |  19:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=851.08KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=6 row-size=17B cardinality=50.00K
-|  |  |  |  in pipelines: 05(GETNEXT)
+|  |  |  |  tuple-ids=7 row-size=17B cardinality=50.00K
+|  |  |  |  in pipelines: 06(GETNEXT)
 |  |  |  |
-|  |  |  F05:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F06:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  05:SCAN HDFS [tpcds_parquet.customer, RANDOM]
+|  |  |  06:SCAN HDFS [tpcds_parquet.customer, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=5.49MB
 |  |  |     predicates: c_preferred_cust_flag = 'Y'
 |  |  |     stored statistics:
@@ -623,24 +584,42 @@
 |  |  |     parquet statistics predicates: c_preferred_cust_flag = 'Y'
 |  |  |     parquet dictionary predicates: c_preferred_cust_flag = 'Y'
 |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |     tuple-ids=6 row-size=17B cardinality=50.00K
-|  |  |     in pipelines: 05(GETNEXT)
+|  |  |     tuple-ids=7 row-size=17B cardinality=50.00K
+|  |  |     in pipelines: 06(GETNEXT)
 |  |  |
-|  |  04:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
+|  |  05:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=1.16MB
-|  |     runtime filters: RF008[bloom] -> ca_address_sk
+|  |     runtime filters: RF006[bloom] -> ca_address_sk
 |  |     stored statistics:
 |  |       table: rows=50.00K size=1.16MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=50.00K
 |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |     tuple-ids=5 row-size=21B cardinality=50.00K
-|  |     in pipelines: 04(GETNEXT)
+|  |     tuple-ids=6 row-size=21B cardinality=50.00K
+|  |     in pipelines: 05(GETNEXT)
+|  |
+|  18:AGGREGATE [FINALIZE]
+|  |  group by: substring(ca_zip, 1, 5)
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 18(GETNEXT), 03(OPEN)
+|  |
+|  17:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
+|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 03(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=2.12MB thread-reservation=1
+|  04:AGGREGATE [STREAMING]
+|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
+|  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 03(GETNEXT)
 |  |
 |  03:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
 |     HDFS partitions=1/1 files=1 size=1.16MB
 |     predicates: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT)) IN ('24128', '76232', '65084', '87816', '83926', '77556', '20548', '26231', '43848', '15126', '91137', '61265', '98294', '25782', '17920', '18426', '98235', '40081', '84093', '28577', '55565', '17183', '54601', '67897', '22752', '86284', '18376', '38607', '45200', '21756', '29741', '96765', '23932', '89360', '29839', '25989', '28898', '91068', '72550', '10390', '18845', '47770', '82636', '41367', '76638', '86198', '81312', '37126', '39192', '88424', '72175', '81426', '53672', '10445', '42666', '66864', '66708', '41248', '48583', '82276', '18842', '78890', '49448', '14089', '38122', '34425', '79077', '19849', '43285', '39861', '66162', '77610', '13695', '99543', '83444', '83041', '12305', '57665', '68341', '25003', '57834', '62878', '49130', '81096', '18840', '27700', '23470', '50412', '21195', '16021', '76107', '71954', '68309', '18119', '98359', '64544', '10336', '86379', '27068', '39736', '98569', '28915', '24206', '56529', '57647', '54917', '42961', '91110', '63981', '14922', '36420', '23006', '67467', '32754', '30903', '20260', '31671', '51798', '72325', '85816', '68621', '13955', '36446', '41766', '68806', '16725', '15146', '22744', '35850', '88086', '51649', '18270', '52867', '39972', '96976', '63792', '11376', '94898', '13595', '10516', '90225', '58943', '39371', '94945', '28587', '96576', '57855', '28488', '26105', '83933', '25858', '34322', '44438', '73171', '30122', '34102', '22685', '71256', '78451', '54364', '13354', '45375', '40558', '56458', '28286', '45266', '47305', '69399', '83921', '26233', '11101', '15371', '69913', '35942', '15882', '25631', '24610', '44165', '99076', '33786', '70738', '26653', '14328', '72305', '62496', '22152', '10144', '64147', '48425', '14663', '21076', '18799', '30450', '63089', '81019', '68893', '24996', '51200', '51211', '45692', '92712', '70466', '79994', '22437', '25280', '38935', '71791', '73134', '56571', '14060', '19505', '72425', '56575', '74351', '68786', '51650', '20004', '18383', '76614', '11634', '18906', '15765', '41368', '73241', '76698', '78567', '97189', '28545', '76231', '75691', '22246', '51061', '90578', '56691', '68014', '51103', '94167', '57047', '14867', '73520', '15734', '63435', '25733', '35474', '24676', '94627', '53535', '17879', '15559', '53268', '59166', '11928', '59402', '33282', '45721', '43933', '68101', '33515', '36634', '71286', '19736', '58058', '55253', '67473', '41918', '19515', '36495', '19430', '22351', '77191', '91393', '49156', '50298', '87501', '18652', '53179', '18767', '63193', '23968', '65164', '68880', '21286', '72823', '58470', '67301', '13394', '31016', '70372', '67030', '40604', '24317', '45748', '39127', '26065', '77721', '31029', '31880', '60576', '24671', '45549', '13376', '50016', '33123', '19769', '22927', '97789', '46081', '72151', '15723', '46136', '51949', '68100', '96888', '64528', '14171', '79777', '28709', '11489', '25103', '32213', '78668', '22245', '15798', '27156', '37930', '62971', '21337', '51622', '67853', '10567', '38415', '15455', '58263', '42029', '60279', '37125', '56240', '88190', '50308', '26859', '64457', '89091', '82136', '62377', '36233', '63837', '58078', '17043', '30010', '60099', '28810', '98025', '29178', '87343', '73273', '30469', '64034', '39516', '86057', '21309', '90257', '67875', '40162', '11356', '73650', '61810', '72013', '30431', '22461', '19512', '13375', '55307', '30625', '83849', '68908', '26689', '96451', '38193', '46820', '88885', '84935', '69035', '83144', '47537', '56616', '94983', '48033', '69952', '25486', '61547', '27385', '61860', '58048', '56910', '16807', '17871', '35258', '31387', '35458', '35576')
-|     runtime filters: RF006[bloom] -> substring(ca_zip, 1, 5)
 |     stored statistics:
 |       table: rows=50.00K size=1.16MB
 |       columns: all
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14a.test b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14a.test
index 53de25f..6abbd89 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14a.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14a.test
@@ -101,10 +101,10 @@
  order by channel,i_brand_id,i_class_id,i_category_id
 LIMIT 100
 ---- PLAN
-Max Per-Host Resource Reservation: Memory=128.62MB Threads=16
+Max Per-Host Resource Reservation: Memory=130.75MB Threads=16
 Per-Host Resource Estimates: Memory=1.19GB
 F00:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
-|  Per-Host Resources: mem-estimate=1.19GB mem-reservation=128.62MB thread-reservation=16 runtime-filters-memory=10.00MB
+|  Per-Host Resources: mem-estimate=1.19GB mem-reservation=130.75MB thread-reservation=16 runtime-filters-memory=10.00MB
 PLAN-ROOT SINK
 |  output exprs: CASE valid_tid(104,105,106,107,108) WHEN 104 THEN channel WHEN 105 THEN channel WHEN 106 THEN channel WHEN 107 THEN channel WHEN 108 THEN NULL END, CASE valid_tid(104,105,106,107,108) WHEN 104 THEN i_brand_id WHEN 105 THEN i_brand_id WHEN 106 THEN i_brand_id WHEN 107 THEN NULL WHEN 108 THEN NULL END, CASE valid_tid(104,105,106,107,108) WHEN 104 THEN i_class_id WHEN 105 THEN i_class_id WHEN 106 THEN NULL WHEN 107 THEN NULL WHEN 108 THEN NULL END, CASE valid_tid(104,105,106,107,108) WHEN 104 THEN i_category_id WHEN 105 THEN NULL WHEN 106 THEN NULL WHEN 107 THEN NULL WHEN 108 THEN NULL END, aggif(valid_tid(104,105,106,107,108) IN (104, 105, 106, 107, 108), CASE valid_tid(104,105,106,107,108) WHEN 104 THEN sum(sales) WHEN 105 THEN sum(sales) WHEN 106 THEN sum(sales) WHEN 107 THEN sum(sales) WHEN 108 THEN sum(sales) END), aggif(valid_tid(104,105,106,107,108) IN (104, 105, 106, 107, 108), CASE valid_tid(104,105,106,107,108) WHEN 104 THEN sum(number_sales) WHEN 105 THEN sum(number_sales) WHEN 106 THEN sum(number_sales) WHEN 107 THEN sum(number_sales) WHEN 108 THEN sum(number_sales) END)
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
@@ -272,14 +272,14 @@
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 112(GETNEXT), 108(OPEN)
+|  |  |  in pipelines: 112(GETNEXT), 94(OPEN)
 |  |  |
 |  |  109:HASH JOIN [INNER JOIN]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=84,71 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 108(GETNEXT), 88(OPEN)
+|  |  |  tuple-ids=75,71 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 94(GETNEXT), 88(OPEN)
 |  |  |
 |  |  |--88:SCAN HDFS [tpcds_parquet.item]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
@@ -291,32 +291,26 @@
 |  |  |     tuple-ids=71 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 88(GETNEXT)
 |  |  |
-|  |  108:AGGREGATE [FINALIZE]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 108(GETNEXT), 89(OPEN)
-|  |  |
-|  |  107:HASH JOIN [LEFT SEMI JOIN]
+|  |  108:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 106(OPEN)
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 94(GETNEXT), 107(OPEN)
 |  |  |
-|  |  |--106:AGGREGATE [FINALIZE]
+|  |  |--107:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 106(GETNEXT), 99(OPEN)
+|  |  |  |  in pipelines: 107(GETNEXT), 100(OPEN)
 |  |  |  |
-|  |  |  103:HASH JOIN [INNER JOIN]
+|  |  |  104:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81,82 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 101(OPEN)
+|  |  |  |  tuple-ids=81,82,83 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 102(OPEN)
 |  |  |  |
-|  |  |  |--101:SCAN HDFS [tpcds_parquet.date_dim d3]
+|  |  |  |--102:SCAN HDFS [tpcds_parquet.date_dim d3]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -326,56 +320,56 @@
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=82 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 101(GETNEXT)
+|  |  |  |     tuple-ids=83 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 102(GETNEXT)
 |  |  |  |
-|  |  |  102:HASH JOIN [INNER JOIN]
+|  |  |  103:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 100(OPEN)
+|  |  |  |  tuple-ids=81,82 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 101(OPEN)
 |  |  |  |
-|  |  |  |--100:SCAN HDFS [tpcds_parquet.item iws]
+|  |  |  |--101:SCAN HDFS [tpcds_parquet.item iws]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=81 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 100(GETNEXT)
+|  |  |  |     tuple-ids=82 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 101(GETNEXT)
 |  |  |  |
-|  |  |  99:SCAN HDFS [tpcds_parquet.web_sales]
+|  |  |  100:SCAN HDFS [tpcds_parquet.web_sales]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=80 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 99(GETNEXT)
+|  |  |     tuple-ids=81 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 100(GETNEXT)
 |  |  |
-|  |  105:HASH JOIN [LEFT SEMI JOIN]
+|  |  106:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 104(OPEN)
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 94(GETNEXT), 105(OPEN)
 |  |  |
-|  |  |--104:AGGREGATE [FINALIZE]
+|  |  |--105:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 104(GETNEXT), 94(OPEN)
+|  |  |  |  in pipelines: 105(GETNEXT), 95(OPEN)
 |  |  |  |
-|  |  |  98:HASH JOIN [INNER JOIN]
+|  |  |  99:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77,78 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 96(OPEN)
+|  |  |  |  tuple-ids=77,78,79 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 97(OPEN)
 |  |  |  |
-|  |  |  |--96:SCAN HDFS [tpcds_parquet.date_dim d2]
+|  |  |  |--97:SCAN HDFS [tpcds_parquet.date_dim d2]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -385,35 +379,41 @@
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=78 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 96(GETNEXT)
+|  |  |  |     tuple-ids=79 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 97(GETNEXT)
 |  |  |  |
-|  |  |  97:HASH JOIN [INNER JOIN]
+|  |  |  98:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 95(OPEN)
+|  |  |  |  tuple-ids=77,78 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 96(OPEN)
 |  |  |  |
-|  |  |  |--95:SCAN HDFS [tpcds_parquet.item ics]
+|  |  |  |--96:SCAN HDFS [tpcds_parquet.item ics]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=77 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 95(GETNEXT)
+|  |  |  |     tuple-ids=78 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 96(GETNEXT)
 |  |  |  |
-|  |  |  94:SCAN HDFS [tpcds_parquet.catalog_sales]
+|  |  |  95:SCAN HDFS [tpcds_parquet.catalog_sales]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=76 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 94(GETNEXT)
+|  |  |     tuple-ids=77 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 95(GETNEXT)
+|  |  |
+|  |  94:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 94(GETNEXT), 89(OPEN)
 |  |  |
 |  |  93:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -637,14 +637,14 @@
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 70(GETNEXT), 66(OPEN)
+|  |  |  in pipelines: 70(GETNEXT), 52(OPEN)
 |  |  |
 |  |  67:HASH JOIN [INNER JOIN]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=50,37 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 66(GETNEXT), 46(OPEN)
+|  |  |  tuple-ids=41,37 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 52(GETNEXT), 46(OPEN)
 |  |  |
 |  |  |--46:SCAN HDFS [tpcds_parquet.item]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
@@ -656,32 +656,26 @@
 |  |  |     tuple-ids=37 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 46(GETNEXT)
 |  |  |
-|  |  66:AGGREGATE [FINALIZE]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 66(GETNEXT), 47(OPEN)
-|  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN]
+|  |  66:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 64(OPEN)
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 52(GETNEXT), 65(OPEN)
 |  |  |
-|  |  |--64:AGGREGATE [FINALIZE]
+|  |  |--65:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 64(GETNEXT), 57(OPEN)
+|  |  |  |  in pipelines: 65(GETNEXT), 58(OPEN)
 |  |  |  |
-|  |  |  61:HASH JOIN [INNER JOIN]
+|  |  |  62:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 59(OPEN)
+|  |  |  |  tuple-ids=47,48,49 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 60(OPEN)
 |  |  |  |
-|  |  |  |--59:SCAN HDFS [tpcds_parquet.date_dim d3]
+|  |  |  |--60:SCAN HDFS [tpcds_parquet.date_dim d3]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -691,56 +685,56 @@
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 59(GETNEXT)
+|  |  |  |     tuple-ids=49 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  60:HASH JOIN [INNER JOIN]
+|  |  |  61:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 58(OPEN)
+|  |  |  |  tuple-ids=47,48 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 59(OPEN)
 |  |  |  |
-|  |  |  |--58:SCAN HDFS [tpcds_parquet.item iws]
+|  |  |  |--59:SCAN HDFS [tpcds_parquet.item iws]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 58(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 59(GETNEXT)
 |  |  |  |
-|  |  |  57:SCAN HDFS [tpcds_parquet.web_sales]
+|  |  |  58:SCAN HDFS [tpcds_parquet.web_sales]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=46 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 57(GETNEXT)
+|  |  |     tuple-ids=47 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 58(GETNEXT)
 |  |  |
-|  |  63:HASH JOIN [LEFT SEMI JOIN]
+|  |  64:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 62(OPEN)
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 52(GETNEXT), 63(OPEN)
 |  |  |
-|  |  |--62:AGGREGATE [FINALIZE]
+|  |  |--63:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 62(GETNEXT), 52(OPEN)
+|  |  |  |  in pipelines: 63(GETNEXT), 53(OPEN)
 |  |  |  |
-|  |  |  56:HASH JOIN [INNER JOIN]
+|  |  |  57:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43,44 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 54(OPEN)
+|  |  |  |  tuple-ids=43,44,45 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 55(OPEN)
 |  |  |  |
-|  |  |  |--54:SCAN HDFS [tpcds_parquet.date_dim d2]
+|  |  |  |--55:SCAN HDFS [tpcds_parquet.date_dim d2]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -750,35 +744,41 @@
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=44 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 54(GETNEXT)
+|  |  |  |     tuple-ids=45 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  55:HASH JOIN [INNER JOIN]
+|  |  |  56:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 53(OPEN)
+|  |  |  |  tuple-ids=43,44 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 54(OPEN)
 |  |  |  |
-|  |  |  |--53:SCAN HDFS [tpcds_parquet.item ics]
+|  |  |  |--54:SCAN HDFS [tpcds_parquet.item ics]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=43 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 53(GETNEXT)
+|  |  |  |     tuple-ids=44 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 54(GETNEXT)
 |  |  |  |
-|  |  |  52:SCAN HDFS [tpcds_parquet.catalog_sales]
+|  |  |  53:SCAN HDFS [tpcds_parquet.catalog_sales]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=42 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 52(GETNEXT)
+|  |  |     tuple-ids=43 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 53(GETNEXT)
+|  |  |
+|  |  52:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 52(GETNEXT), 47(OPEN)
 |  |  |
 |  |  51:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -1003,15 +1003,15 @@
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 28(GETNEXT), 24(OPEN)
+|  |  in pipelines: 28(GETNEXT), 10(OPEN)
 |  |
 |  25:HASH JOIN [INNER JOIN]
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  runtime filters: RF006[bloom] <- i_brand_id, RF007[bloom] <- i_category_id, RF008[bloom] <- i_class_id
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 24(GETNEXT), 04(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 10(GETNEXT), 04(OPEN)
 |  |
 |  |--04:SCAN HDFS [tpcds_parquet.item]
 |  |     HDFS partitions=1/1 files=1 size=1.73MB
@@ -1023,33 +1023,27 @@
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 04(GETNEXT)
 |  |
-|  24:AGGREGATE [FINALIZE]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 24(GETNEXT), 05(OPEN)
-|  |
-|  23:HASH JOIN [LEFT SEMI JOIN]
+|  24:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  runtime filters: RF012[bloom] <- iws.i_brand_id, RF013[bloom] <- iws.i_category_id
 |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 22(OPEN)
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 10(GETNEXT), 23(OPEN)
 |  |
-|  |--22:AGGREGATE [FINALIZE]
+|  |--23:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 22(GETNEXT), 15(OPEN)
+|  |  |  in pipelines: 23(GETNEXT), 16(OPEN)
 |  |  |
-|  |  19:HASH JOIN [INNER JOIN]
+|  |  20:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 18(OPEN)
 |  |  |
-|  |  |--17:SCAN HDFS [tpcds_parquet.date_dim d3]
+|  |  |--18:SCAN HDFS [tpcds_parquet.date_dim d3]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -1059,56 +1053,56 @@
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 17(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 18(GETNEXT)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN]
+|  |  19:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 17(OPEN)
 |  |  |
-|  |  |--16:SCAN HDFS [tpcds_parquet.item iws]
+|  |  |--17:SCAN HDFS [tpcds_parquet.item iws]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  15:SCAN HDFS [tpcds_parquet.web_sales]
+|  |  16:SCAN HDFS [tpcds_parquet.web_sales]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 15(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 16(GETNEXT)
 |  |
-|  21:HASH JOIN [LEFT SEMI JOIN]
+|  22:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
 |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 20(OPEN)
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 10(GETNEXT), 21(OPEN)
 |  |
-|  |--20:AGGREGATE [FINALIZE]
+|  |--21:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 20(GETNEXT), 10(OPEN)
+|  |  |  in pipelines: 21(GETNEXT), 11(OPEN)
 |  |  |
-|  |  14:HASH JOIN [INNER JOIN]
+|  |  15:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 13(OPEN)
 |  |  |
-|  |  |--12:SCAN HDFS [tpcds_parquet.date_dim d2]
+|  |  |--13:SCAN HDFS [tpcds_parquet.date_dim d2]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -1118,35 +1112,41 @@
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 12(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 13(GETNEXT)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN]
+|  |  14:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 12(OPEN)
 |  |  |
-|  |  |--11:SCAN HDFS [tpcds_parquet.item ics]
+|  |  |--12:SCAN HDFS [tpcds_parquet.item ics]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales]
+|  |  11:SCAN HDFS [tpcds_parquet.catalog_sales]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 10(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 11(GETNEXT)
+|  |
+|  10:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 10(GETNEXT), 05(OPEN)
 |  |
 |  09:HASH JOIN [INNER JOIN]
 |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -1249,8 +1249,8 @@
    tuple-ids=0 row-size=20B cardinality=2.88M
    in pipelines: 01(GETNEXT)
 ---- DISTRIBUTEDPLAN
-Max Per-Host Resource Reservation: Memory=396.69MB Threads=120
-Per-Host Resource Estimates: Memory=3.67GB
+Max Per-Host Resource Reservation: Memory=391.06MB Threads=120
+Per-Host Resource Estimates: Memory=3.66GB
 F80:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=16.80KB mem-reservation=0B thread-reservation=1
 PLAN-ROOT SINK
@@ -1518,27 +1518,27 @@
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 204(GETNEXT), 201(OPEN)
+|  |  |  in pipelines: 204(GETNEXT), 191(OPEN)
 |  |  |
 |  |  203:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=82.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 201(GETNEXT)
+|  |  |  in pipelines: 191(GETNEXT)
 |  |  |
-|  |  F66:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=22.92MB mem-reservation=5.88MB thread-reservation=1
+|  |  F58:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=28.29MB mem-reservation=9.75MB thread-reservation=1
 |  |  112:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 201(GETNEXT)
+|  |  |  in pipelines: 191(GETNEXT)
 |  |  |
 |  |  109:HASH JOIN [INNER JOIN, PARTITIONED]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=84,71 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 201(GETNEXT), 88(OPEN)
+|  |  |  tuple-ids=75,71 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 88(OPEN)
 |  |  |
 |  |  |--202:EXCHANGE [HASH(i_brand_id,i_class_id,i_category_id)]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
@@ -1557,72 +1557,53 @@
 |  |  |     tuple-ids=71 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 88(GETNEXT)
 |  |  |
-|  |  201:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 201(GETNEXT), 89(OPEN)
-|  |  |
-|  |  200:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 89(GETNEXT)
-|  |  |
-|  |  F55:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=39.54MB mem-reservation=13.12MB thread-reservation=2
-|  |  108:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 89(GETNEXT)
-|  |  |
-|  |  107:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  108:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 198(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 200(OPEN)
 |  |  |
-|  |  |--199:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |--201:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 198(GETNEXT)
+|  |  |  |  in pipelines: 200(GETNEXT)
 |  |  |  |
-|  |  |  F65:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F66:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  198:AGGREGATE [FINALIZE]
+|  |  |  200:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 198(GETNEXT), 99(OPEN)
+|  |  |  |  in pipelines: 200(GETNEXT), 100(OPEN)
 |  |  |  |
-|  |  |  197:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  199:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 99(GETNEXT)
+|  |  |  |  in pipelines: 100(GETNEXT)
 |  |  |  |
-|  |  |  F62:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F63:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=78.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  106:AGGREGATE [STREAMING]
+|  |  |  107:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 99(GETNEXT)
+|  |  |  |  in pipelines: 100(GETNEXT)
 |  |  |  |
-|  |  |  103:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  104:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81,82 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 101(OPEN)
+|  |  |  |  tuple-ids=81,82,83 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 102(OPEN)
 |  |  |  |
-|  |  |  |--196:EXCHANGE [BROADCAST]
+|  |  |  |--198:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=82 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 101(GETNEXT)
+|  |  |  |  |  tuple-ids=83 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 102(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F64:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F65:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  101:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  102:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -1632,90 +1613,90 @@
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=82 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 101(GETNEXT)
+|  |  |  |     tuple-ids=83 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 102(GETNEXT)
 |  |  |  |
-|  |  |  102:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  103:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 100(OPEN)
+|  |  |  |  tuple-ids=81,82 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 101(OPEN)
 |  |  |  |
-|  |  |  |--195:EXCHANGE [BROADCAST]
+|  |  |  |--197:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=81 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 100(GETNEXT)
+|  |  |  |  |  tuple-ids=82 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 101(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F63:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F64:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  100:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  101:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=81 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 100(GETNEXT)
+|  |  |  |     tuple-ids=82 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 101(GETNEXT)
 |  |  |  |
-|  |  |  99:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  100:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=80 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 99(GETNEXT)
+|  |  |     tuple-ids=81 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 100(GETNEXT)
 |  |  |
-|  |  105:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  106:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 193(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 195(OPEN)
 |  |  |
-|  |  |--194:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |--196:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 193(GETNEXT)
+|  |  |  |  in pipelines: 195(GETNEXT)
 |  |  |  |
-|  |  |  F61:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F62:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  193:AGGREGATE [FINALIZE]
+|  |  |  195:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 193(GETNEXT), 94(OPEN)
+|  |  |  |  in pipelines: 195(GETNEXT), 95(OPEN)
 |  |  |  |
-|  |  |  192:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  194:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 94(GETNEXT)
+|  |  |  |  in pipelines: 95(GETNEXT)
 |  |  |  |
-|  |  |  F58:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F59:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=110.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  104:AGGREGATE [STREAMING]
+|  |  |  105:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 94(GETNEXT)
+|  |  |  |  in pipelines: 95(GETNEXT)
 |  |  |  |
-|  |  |  98:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  99:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77,78 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 96(OPEN)
+|  |  |  |  tuple-ids=77,78,79 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 97(OPEN)
 |  |  |  |
-|  |  |  |--191:EXCHANGE [BROADCAST]
+|  |  |  |--193:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=78 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 96(GETNEXT)
+|  |  |  |  |  tuple-ids=79 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 97(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F60:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F61:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  96:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  97:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -1725,42 +1706,61 @@
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=78 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 96(GETNEXT)
+|  |  |  |     tuple-ids=79 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 97(GETNEXT)
 |  |  |  |
-|  |  |  97:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  98:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 95(OPEN)
+|  |  |  |  tuple-ids=77,78 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 96(OPEN)
 |  |  |  |
-|  |  |  |--190:EXCHANGE [BROADCAST]
+|  |  |  |--192:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=77 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 95(GETNEXT)
+|  |  |  |  |  tuple-ids=78 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 96(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F59:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F60:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  95:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  96:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=77 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 95(GETNEXT)
+|  |  |  |     tuple-ids=78 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 96(GETNEXT)
 |  |  |  |
-|  |  |  94:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  95:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=76 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 94(GETNEXT)
+|  |  |     tuple-ids=77 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 95(GETNEXT)
+|  |  |
+|  |  191:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 89(OPEN)
+|  |  |
+|  |  190:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 89(GETNEXT)
+|  |  |
+|  |  F55:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=30.31MB mem-reservation=7.38MB thread-reservation=2
+|  |  94:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 89(GETNEXT)
 |  |  |
 |  |  93:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -2074,27 +2074,27 @@
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 176(GETNEXT), 173(OPEN)
+|  |  |  in pipelines: 176(GETNEXT), 163(OPEN)
 |  |  |
 |  |  175:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=82.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 173(GETNEXT)
+|  |  |  in pipelines: 163(GETNEXT)
 |  |  |
-|  |  F40:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=22.92MB mem-reservation=5.88MB thread-reservation=1
+|  |  F32:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=28.29MB mem-reservation=9.75MB thread-reservation=1
 |  |  70:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 173(GETNEXT)
+|  |  |  in pipelines: 163(GETNEXT)
 |  |  |
 |  |  67:HASH JOIN [INNER JOIN, PARTITIONED]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=50,37 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 173(GETNEXT), 46(OPEN)
+|  |  |  tuple-ids=41,37 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 46(OPEN)
 |  |  |
 |  |  |--174:EXCHANGE [HASH(i_brand_id,i_class_id,i_category_id)]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
@@ -2113,72 +2113,53 @@
 |  |  |     tuple-ids=37 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 46(GETNEXT)
 |  |  |
-|  |  173:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 173(GETNEXT), 47(OPEN)
-|  |  |
-|  |  172:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 47(GETNEXT)
-|  |  |
-|  |  F29:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=39.54MB mem-reservation=13.12MB thread-reservation=2
-|  |  66:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 47(GETNEXT)
-|  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  66:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 170(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 172(OPEN)
 |  |  |
-|  |  |--171:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |--173:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 170(GETNEXT)
+|  |  |  |  in pipelines: 172(GETNEXT)
 |  |  |  |
-|  |  |  F39:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F40:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  170:AGGREGATE [FINALIZE]
+|  |  |  172:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 170(GETNEXT), 57(OPEN)
+|  |  |  |  in pipelines: 172(GETNEXT), 58(OPEN)
 |  |  |  |
-|  |  |  169:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  171:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 57(GETNEXT)
+|  |  |  |  in pipelines: 58(GETNEXT)
 |  |  |  |
-|  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=78.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  64:AGGREGATE [STREAMING]
+|  |  |  65:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 57(GETNEXT)
+|  |  |  |  in pipelines: 58(GETNEXT)
 |  |  |  |
-|  |  |  61:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  62:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 59(OPEN)
+|  |  |  |  tuple-ids=47,48,49 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 60(OPEN)
 |  |  |  |
-|  |  |  |--168:EXCHANGE [BROADCAST]
+|  |  |  |--170:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=48 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  |  tuple-ids=49 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  59:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  60:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -2188,90 +2169,90 @@
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 59(GETNEXT)
+|  |  |  |     tuple-ids=49 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  60:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  61:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 58(OPEN)
+|  |  |  |  tuple-ids=47,48 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 59(OPEN)
 |  |  |  |
-|  |  |  |--167:EXCHANGE [BROADCAST]
+|  |  |  |--169:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=47 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 58(GETNEXT)
+|  |  |  |  |  tuple-ids=48 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 59(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  58:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  59:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 58(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 59(GETNEXT)
 |  |  |  |
-|  |  |  57:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  58:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=46 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 57(GETNEXT)
+|  |  |     tuple-ids=47 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 58(GETNEXT)
 |  |  |
-|  |  63:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  64:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 165(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 167(OPEN)
 |  |  |
-|  |  |--166:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |--168:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 165(GETNEXT)
+|  |  |  |  in pipelines: 167(GETNEXT)
 |  |  |  |
-|  |  |  F35:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F36:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  165:AGGREGATE [FINALIZE]
+|  |  |  167:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 165(GETNEXT), 52(OPEN)
+|  |  |  |  in pipelines: 167(GETNEXT), 53(OPEN)
 |  |  |  |
-|  |  |  164:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  166:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 52(GETNEXT)
+|  |  |  |  in pipelines: 53(GETNEXT)
 |  |  |  |
-|  |  |  F32:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F33:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=110.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  62:AGGREGATE [STREAMING]
+|  |  |  63:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 52(GETNEXT)
+|  |  |  |  in pipelines: 53(GETNEXT)
 |  |  |  |
-|  |  |  56:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  57:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43,44 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 54(OPEN)
+|  |  |  |  tuple-ids=43,44,45 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 55(OPEN)
 |  |  |  |
-|  |  |  |--163:EXCHANGE [BROADCAST]
+|  |  |  |--165:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=44 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  |  tuple-ids=45 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  54:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  55:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -2281,42 +2262,61 @@
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=44 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 54(GETNEXT)
+|  |  |  |     tuple-ids=45 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  55:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  56:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 53(OPEN)
+|  |  |  |  tuple-ids=43,44 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 54(OPEN)
 |  |  |  |
-|  |  |  |--162:EXCHANGE [BROADCAST]
+|  |  |  |--164:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=43 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 53(GETNEXT)
+|  |  |  |  |  tuple-ids=44 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 54(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F33:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  53:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  54:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=43 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 53(GETNEXT)
+|  |  |  |     tuple-ids=44 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 54(GETNEXT)
 |  |  |  |
-|  |  |  52:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  53:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=42 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 52(GETNEXT)
+|  |  |     tuple-ids=43 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 53(GETNEXT)
+|  |  |
+|  |  163:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 47(OPEN)
+|  |  |
+|  |  162:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 47(GETNEXT)
+|  |  |
+|  |  F29:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=30.31MB mem-reservation=7.38MB thread-reservation=2
+|  |  52:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 47(GETNEXT)
 |  |  |
 |  |  51:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -2631,28 +2631,28 @@
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 148(GETNEXT), 145(OPEN)
+|  |  in pipelines: 148(GETNEXT), 135(OPEN)
 |  |
 |  147:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  mem-estimate=82.81KB mem-reservation=0B thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 145(GETNEXT)
+|  |  in pipelines: 135(GETNEXT)
 |  |
-|  F14:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=3
-|  Per-Host Resources: mem-estimate=25.92MB mem-reservation=8.88MB thread-reservation=1 runtime-filters-memory=3.00MB
+|  F06:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=3
+|  Per-Host Resources: mem-estimate=33.29MB mem-reservation=14.75MB thread-reservation=1 runtime-filters-memory=5.00MB
 |  28:AGGREGATE [STREAMING]
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 145(GETNEXT)
+|  |  in pipelines: 135(GETNEXT)
 |  |
 |  25:HASH JOIN [INNER JOIN, PARTITIONED]
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  runtime filters: RF006[bloom] <- i_brand_id, RF007[bloom] <- i_category_id, RF008[bloom] <- i_class_id
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 145(GETNEXT), 04(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 04(OPEN)
 |  |
 |  |--146:EXCHANGE [HASH(i_brand_id,i_class_id,i_category_id)]
 |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
@@ -2671,73 +2671,54 @@
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 04(GETNEXT)
 |  |
-|  145:AGGREGATE [FINALIZE]
-|  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 145(GETNEXT), 05(OPEN)
-|  |
-|  144:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 05(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  Per-Host Resources: mem-estimate=41.54MB mem-reservation=15.12MB thread-reservation=2 runtime-filters-memory=2.00MB
-|  24:AGGREGATE [STREAMING]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 05(GETNEXT)
-|  |
-|  23:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  24:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  runtime filters: RF012[bloom] <- iws.i_brand_id, RF013[bloom] <- iws.i_category_id
-|  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 142(OPEN)
+|  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 144(OPEN)
 |  |
-|  |--143:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |--145:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 142(GETNEXT)
+|  |  |  in pipelines: 144(GETNEXT)
 |  |  |
-|  |  F13:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  F14:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  Per-Host Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  142:AGGREGATE [FINALIZE]
+|  |  144:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 142(GETNEXT), 15(OPEN)
+|  |  |  in pipelines: 144(GETNEXT), 16(OPEN)
 |  |  |
-|  |  141:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  143:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 15(GETNEXT)
+|  |  |  in pipelines: 16(GETNEXT)
 |  |  |
-|  |  F10:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  F11:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  Per-Host Resources: mem-estimate=78.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  22:AGGREGATE [STREAMING]
+|  |  23:AGGREGATE [STREAMING]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 15(GETNEXT)
+|  |  |  in pipelines: 16(GETNEXT)
 |  |  |
-|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  20:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 18(OPEN)
 |  |  |
-|  |  |--140:EXCHANGE [BROADCAST]
+|  |  |--142:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 17(GETNEXT)
+|  |  |  |  tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 18(GETNEXT)
 |  |  |  |
-|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F13:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  17:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  18:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -2747,90 +2728,90 @@
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 17(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 18(GETNEXT)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 17(OPEN)
 |  |  |
-|  |  |--139:EXCHANGE [BROADCAST]
+|  |  |--141:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 16(GETNEXT)
+|  |  |  |  tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 17(GETNEXT)
 |  |  |  |
-|  |  |  F11:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  16:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  17:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  15:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  16:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 15(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 16(GETNEXT)
 |  |
-|  21:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  22:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 137(OPEN)
+|  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 139(OPEN)
 |  |
-|  |--138:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |--140:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 139(GETNEXT)
 |  |  |
-|  |  F09:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  F10:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  Per-Host Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  137:AGGREGATE [FINALIZE]
+|  |  139:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 10(OPEN)
+|  |  |  in pipelines: 139(GETNEXT), 11(OPEN)
 |  |  |
-|  |  136:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  138:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 10(GETNEXT)
+|  |  |  in pipelines: 11(GETNEXT)
 |  |  |
-|  |  F06:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  F07:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  Per-Host Resources: mem-estimate=110.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  20:AGGREGATE [STREAMING]
+|  |  21:AGGREGATE [STREAMING]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 10(GETNEXT)
+|  |  |  in pipelines: 11(GETNEXT)
 |  |  |
-|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  15:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 13(OPEN)
 |  |  |
-|  |  |--135:EXCHANGE [BROADCAST]
+|  |  |--137:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 12(GETNEXT)
+|  |  |  |  tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 13(GETNEXT)
 |  |  |  |
-|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F09:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  12:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  13:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -2840,42 +2821,61 @@
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 12(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 13(GETNEXT)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 12(OPEN)
 |  |  |
-|  |  |--134:EXCHANGE [BROADCAST]
+|  |  |--136:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 11(GETNEXT)
+|  |  |  |  tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 12(GETNEXT)
 |  |  |  |
-|  |  |  F07:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  11:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  12:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  11:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 10(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 11(GETNEXT)
+|  |
+|  135:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 05(OPEN)
+|  |
+|  134:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 05(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  Per-Host Resources: mem-estimate=30.31MB mem-reservation=7.38MB thread-reservation=2
+|  10:AGGREGATE [STREAMING]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 05(GETNEXT)
 |  |
 |  09:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -3006,8 +3006,8 @@
    tuple-ids=0 row-size=20B cardinality=2.88M
    in pipelines: 01(GETNEXT)
 ---- PARALLELPLANS
-Max Per-Host Resource Reservation: Memory=634.00MB Threads=135
-Per-Host Resource Estimates: Memory=2.36GB
+Max Per-Host Resource Reservation: Memory=624.75MB Threads=141
+Per-Host Resource Estimates: Memory=2.35GB
 F80:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Instance Resources: mem-estimate=32.03KB mem-reservation=0B thread-reservation=1
 PLAN-ROOT SINK
@@ -3315,30 +3315,30 @@
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 204(GETNEXT), 201(OPEN)
+|  |  |  in pipelines: 204(GETNEXT), 191(OPEN)
 |  |  |
 |  |  203:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=118.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 201(GETNEXT)
+|  |  |  in pipelines: 191(GETNEXT)
 |  |  |
-|  |  F66:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  F58:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  Per-Instance Resources: mem-estimate=20.66MB mem-reservation=3.94MB thread-reservation=1
 |  |  112:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 201(GETNEXT)
+|  |  |  in pipelines: 191(GETNEXT)
 |  |  |
 |  |  109:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  |  hash-table-id=37
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=84,71 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 201(GETNEXT), 88(OPEN)
+|  |  |  tuple-ids=75,71 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 88(OPEN)
 |  |  |
-|  |  |--F118:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  |--F118:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  |  |  Per-Instance Resources: mem-estimate=2.30MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=37 plan-id=38 cohort-id=11
@@ -3362,72 +3362,53 @@
 |  |  |     tuple-ids=71 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 88(GETNEXT)
 |  |  |
-|  |  201:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 201(GETNEXT), 89(OPEN)
-|  |  |
-|  |  200:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 89(GETNEXT)
-|  |  |
-|  |  F55:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
-|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
-|  |  108:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 89(GETNEXT)
-|  |  |
-|  |  107:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  108:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=38
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 198(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 200(OPEN)
 |  |  |
-|  |  |--F119:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.48MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F119:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.82MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=38 plan-id=39 cohort-id=11
 |  |  |  |  build expressions: iws.i_brand_id, iws.i_category_id, iws.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  199:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |  201:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 198(GETNEXT)
+|  |  |  |  in pipelines: 200(GETNEXT)
 |  |  |  |
-|  |  |  F65:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F66:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  198:AGGREGATE [FINALIZE]
+|  |  |  200:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 198(GETNEXT), 99(OPEN)
+|  |  |  |  in pipelines: 200(GETNEXT), 100(OPEN)
 |  |  |  |
-|  |  |  197:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  199:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 99(GETNEXT)
+|  |  |  |  in pipelines: 100(GETNEXT)
 |  |  |  |
-|  |  |  F62:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F63:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=42.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  106:AGGREGATE [STREAMING]
+|  |  |  107:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 99(GETNEXT)
+|  |  |  |  in pipelines: 100(GETNEXT)
 |  |  |  |
-|  |  |  103:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  104:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=39
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81,82 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 101(OPEN)
+|  |  |  |  tuple-ids=81,82,83 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 102(OPEN)
 |  |  |  |
 |  |  |  |--F120:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -3436,14 +3417,14 @@
 |  |  |  |  |  build expressions: d3.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  196:EXCHANGE [BROADCAST]
+|  |  |  |  198:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=82 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 101(GETNEXT)
+|  |  |  |  |  tuple-ids=83 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 102(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F64:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F65:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  101:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  102:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -3453,16 +3434,16 @@
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=82 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 101(GETNEXT)
+|  |  |  |     tuple-ids=83 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 102(GETNEXT)
 |  |  |  |
-|  |  |  102:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  103:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=40
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 100(OPEN)
+|  |  |  |  tuple-ids=81,82 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 101(OPEN)
 |  |  |  |
 |  |  |  |--F121:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -3471,80 +3452,80 @@
 |  |  |  |  |  build expressions: iws.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  195:EXCHANGE [BROADCAST]
+|  |  |  |  197:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=81 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 100(GETNEXT)
+|  |  |  |  |  tuple-ids=82 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 101(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F63:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F64:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  100:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  101:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=81 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 100(GETNEXT)
+|  |  |  |     tuple-ids=82 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 101(GETNEXT)
 |  |  |  |
-|  |  |  99:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  100:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=32.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=80 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 99(GETNEXT)
+|  |  |     tuple-ids=81 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 100(GETNEXT)
 |  |  |
-|  |  105:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  106:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=41
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 193(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 195(OPEN)
 |  |  |
-|  |  |--F122:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.50MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F122:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.55MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=41 plan-id=42 cohort-id=11
 |  |  |  |  build expressions: ics.i_brand_id, ics.i_category_id, ics.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  194:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |  196:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 193(GETNEXT)
+|  |  |  |  in pipelines: 195(GETNEXT)
 |  |  |  |
-|  |  |  F61:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F62:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  193:AGGREGATE [FINALIZE]
+|  |  |  195:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 193(GETNEXT), 94(OPEN)
+|  |  |  |  in pipelines: 195(GETNEXT), 95(OPEN)
 |  |  |  |
-|  |  |  192:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  194:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 94(GETNEXT)
+|  |  |  |  in pipelines: 95(GETNEXT)
 |  |  |  |
-|  |  |  F58:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F59:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=58.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  104:AGGREGATE [STREAMING]
+|  |  |  105:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 94(GETNEXT)
+|  |  |  |  in pipelines: 95(GETNEXT)
 |  |  |  |
-|  |  |  98:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  99:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=42
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77,78 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 96(OPEN)
+|  |  |  |  tuple-ids=77,78,79 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 97(OPEN)
 |  |  |  |
 |  |  |  |--F123:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -3553,14 +3534,14 @@
 |  |  |  |  |  build expressions: d2.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  191:EXCHANGE [BROADCAST]
+|  |  |  |  193:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=78 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 96(GETNEXT)
+|  |  |  |  |  tuple-ids=79 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 97(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F60:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F61:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  96:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  97:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -3570,16 +3551,16 @@
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=78 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 96(GETNEXT)
+|  |  |  |     tuple-ids=79 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 97(GETNEXT)
 |  |  |  |
-|  |  |  97:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  98:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=43
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 95(OPEN)
+|  |  |  |  tuple-ids=77,78 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 96(OPEN)
 |  |  |  |
 |  |  |  |--F124:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -3588,32 +3569,51 @@
 |  |  |  |  |  build expressions: ics.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  190:EXCHANGE [BROADCAST]
+|  |  |  |  192:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=77 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 95(GETNEXT)
+|  |  |  |  |  tuple-ids=78 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 96(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F59:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F60:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  95:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  96:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=77 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 95(GETNEXT)
+|  |  |  |     tuple-ids=78 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 96(GETNEXT)
 |  |  |  |
-|  |  |  94:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  95:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=48.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=76 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 94(GETNEXT)
+|  |  |     tuple-ids=77 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 95(GETNEXT)
+|  |  |
+|  |  191:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 89(OPEN)
+|  |  |
+|  |  190:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 89(GETNEXT)
+|  |  |
+|  |  F55:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
+|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
+|  |  94:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 89(GETNEXT)
 |  |  |
 |  |  93:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=44
@@ -3999,30 +3999,30 @@
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 176(GETNEXT), 173(OPEN)
+|  |  |  in pipelines: 176(GETNEXT), 163(OPEN)
 |  |  |
 |  |  175:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=118.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 173(GETNEXT)
+|  |  |  in pipelines: 163(GETNEXT)
 |  |  |
-|  |  F40:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  F32:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  Per-Instance Resources: mem-estimate=20.66MB mem-reservation=3.94MB thread-reservation=1
 |  |  70:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 173(GETNEXT)
+|  |  |  in pipelines: 163(GETNEXT)
 |  |  |
 |  |  67:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  |  hash-table-id=25
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=50,37 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 173(GETNEXT), 46(OPEN)
+|  |  |  tuple-ids=41,37 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 46(OPEN)
 |  |  |
-|  |  |--F106:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  |--F106:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  |  |  Per-Instance Resources: mem-estimate=2.30MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=25 plan-id=26 cohort-id=08
@@ -4046,72 +4046,53 @@
 |  |  |     tuple-ids=37 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 46(GETNEXT)
 |  |  |
-|  |  173:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 173(GETNEXT), 47(OPEN)
-|  |  |
-|  |  172:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 47(GETNEXT)
-|  |  |
-|  |  F29:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
-|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
-|  |  66:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 47(GETNEXT)
-|  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  66:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=26
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 170(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 172(OPEN)
 |  |  |
-|  |  |--F107:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.48MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F107:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.82MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=26 plan-id=27 cohort-id=08
 |  |  |  |  build expressions: iws.i_brand_id, iws.i_category_id, iws.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  171:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |  173:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 170(GETNEXT)
+|  |  |  |  in pipelines: 172(GETNEXT)
 |  |  |  |
-|  |  |  F39:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F40:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  170:AGGREGATE [FINALIZE]
+|  |  |  172:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 170(GETNEXT), 57(OPEN)
+|  |  |  |  in pipelines: 172(GETNEXT), 58(OPEN)
 |  |  |  |
-|  |  |  169:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  171:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 57(GETNEXT)
+|  |  |  |  in pipelines: 58(GETNEXT)
 |  |  |  |
-|  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=42.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  64:AGGREGATE [STREAMING]
+|  |  |  65:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 57(GETNEXT)
+|  |  |  |  in pipelines: 58(GETNEXT)
 |  |  |  |
-|  |  |  61:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  62:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=27
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 59(OPEN)
+|  |  |  |  tuple-ids=47,48,49 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 60(OPEN)
 |  |  |  |
 |  |  |  |--F108:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -4120,14 +4101,14 @@
 |  |  |  |  |  build expressions: d3.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  168:EXCHANGE [BROADCAST]
+|  |  |  |  170:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=48 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  |  tuple-ids=49 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  59:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  60:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -4137,16 +4118,16 @@
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 59(GETNEXT)
+|  |  |  |     tuple-ids=49 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  60:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  61:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=28
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 58(OPEN)
+|  |  |  |  tuple-ids=47,48 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 59(OPEN)
 |  |  |  |
 |  |  |  |--F109:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -4155,80 +4136,80 @@
 |  |  |  |  |  build expressions: iws.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  167:EXCHANGE [BROADCAST]
+|  |  |  |  169:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=47 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 58(GETNEXT)
+|  |  |  |  |  tuple-ids=48 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 59(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  58:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  59:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 58(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 59(GETNEXT)
 |  |  |  |
-|  |  |  57:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  58:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=32.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=46 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 57(GETNEXT)
+|  |  |     tuple-ids=47 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 58(GETNEXT)
 |  |  |
-|  |  63:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  64:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=29
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 165(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 167(OPEN)
 |  |  |
-|  |  |--F110:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.50MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F110:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.55MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=29 plan-id=30 cohort-id=08
 |  |  |  |  build expressions: ics.i_brand_id, ics.i_category_id, ics.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  166:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |  168:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 165(GETNEXT)
+|  |  |  |  in pipelines: 167(GETNEXT)
 |  |  |  |
-|  |  |  F35:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F36:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  165:AGGREGATE [FINALIZE]
+|  |  |  167:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 165(GETNEXT), 52(OPEN)
+|  |  |  |  in pipelines: 167(GETNEXT), 53(OPEN)
 |  |  |  |
-|  |  |  164:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  166:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 52(GETNEXT)
+|  |  |  |  in pipelines: 53(GETNEXT)
 |  |  |  |
-|  |  |  F32:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F33:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=58.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  62:AGGREGATE [STREAMING]
+|  |  |  63:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 52(GETNEXT)
+|  |  |  |  in pipelines: 53(GETNEXT)
 |  |  |  |
-|  |  |  56:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  57:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=30
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43,44 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 54(OPEN)
+|  |  |  |  tuple-ids=43,44,45 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 55(OPEN)
 |  |  |  |
 |  |  |  |--F111:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -4237,14 +4218,14 @@
 |  |  |  |  |  build expressions: d2.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  163:EXCHANGE [BROADCAST]
+|  |  |  |  165:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=44 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  |  tuple-ids=45 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  54:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  55:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -4254,16 +4235,16 @@
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=44 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 54(GETNEXT)
+|  |  |  |     tuple-ids=45 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  55:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  56:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=31
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 53(OPEN)
+|  |  |  |  tuple-ids=43,44 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 54(OPEN)
 |  |  |  |
 |  |  |  |--F112:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -4272,32 +4253,51 @@
 |  |  |  |  |  build expressions: ics.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  162:EXCHANGE [BROADCAST]
+|  |  |  |  164:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=43 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 53(GETNEXT)
+|  |  |  |  |  tuple-ids=44 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 54(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F33:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  53:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  54:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=43 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 53(GETNEXT)
+|  |  |  |     tuple-ids=44 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 54(GETNEXT)
 |  |  |  |
-|  |  |  52:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  53:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=48.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=42 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 52(GETNEXT)
+|  |  |     tuple-ids=43 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 53(GETNEXT)
+|  |  |
+|  |  163:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 47(OPEN)
+|  |  |
+|  |  162:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 47(GETNEXT)
+|  |  |
+|  |  F29:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
+|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
+|  |  52:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 47(GETNEXT)
 |  |  |
 |  |  51:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=32
@@ -4684,30 +4684,30 @@
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 148(GETNEXT), 145(OPEN)
+|  |  in pipelines: 148(GETNEXT), 135(OPEN)
 |  |
 |  147:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  mem-estimate=118.81KB mem-reservation=0B thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 145(GETNEXT)
+|  |  in pipelines: 135(GETNEXT)
 |  |
-|  F14:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  F06:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  Per-Instance Resources: mem-estimate=20.66MB mem-reservation=3.94MB thread-reservation=1
 |  28:AGGREGATE [STREAMING]
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 145(GETNEXT)
+|  |  in pipelines: 135(GETNEXT)
 |  |
 |  25:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  hash-table-id=13
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 145(GETNEXT), 04(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 04(OPEN)
 |  |
-|  |--F94:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |--F94:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  |  Per-Instance Resources: mem-estimate=5.30MB mem-reservation=4.94MB thread-reservation=1 runtime-filters-memory=3.00MB
 |  |  JOIN BUILD
 |  |  |  join-table-id=13 plan-id=14 cohort-id=05
@@ -4732,73 +4732,54 @@
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 04(GETNEXT)
 |  |
-|  145:AGGREGATE [FINALIZE]
-|  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 145(GETNEXT), 05(OPEN)
-|  |
-|  144:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 05(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
-|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
-|  24:AGGREGATE [STREAMING]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 05(GETNEXT)
-|  |
-|  23:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  24:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash-table-id=14
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 142(OPEN)
+|  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 144(OPEN)
 |  |
-|  |--F95:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  Per-Instance Resources: mem-estimate=9.48MB mem-reservation=7.75MB thread-reservation=1 runtime-filters-memory=2.00MB
+|  |--F95:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  Per-Instance Resources: mem-estimate=4.82MB mem-reservation=3.94MB thread-reservation=1 runtime-filters-memory=2.00MB
 |  |  JOIN BUILD
 |  |  |  join-table-id=14 plan-id=15 cohort-id=05
 |  |  |  build expressions: iws.i_brand_id, iws.i_category_id, iws.i_class_id
 |  |  |  runtime filters: RF012[bloom] <- iws.i_brand_id, RF013[bloom] <- iws.i_category_id
-|  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |
-|  |  143:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  145:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 142(GETNEXT)
+|  |  |  in pipelines: 144(GETNEXT)
 |  |  |
-|  |  F13:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  F14:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  Per-Instance Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  142:AGGREGATE [FINALIZE]
+|  |  144:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 142(GETNEXT), 15(OPEN)
+|  |  |  in pipelines: 144(GETNEXT), 16(OPEN)
 |  |  |
-|  |  141:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  143:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 15(GETNEXT)
+|  |  |  in pipelines: 16(GETNEXT)
 |  |  |
-|  |  F10:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  F11:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  Per-Instance Resources: mem-estimate=42.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  22:AGGREGATE [STREAMING]
+|  |  23:AGGREGATE [STREAMING]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 15(GETNEXT)
+|  |  |  in pipelines: 16(GETNEXT)
 |  |  |
-|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  20:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=15
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 18(OPEN)
 |  |  |
 |  |  |--F96:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -4807,14 +4788,14 @@
 |  |  |  |  build expressions: d3.d_date_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  140:EXCHANGE [BROADCAST]
+|  |  |  142:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 17(GETNEXT)
+|  |  |  |  tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 18(GETNEXT)
 |  |  |  |
-|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F13:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  17:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  18:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -4824,16 +4805,16 @@
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 17(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 18(GETNEXT)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=16
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 17(OPEN)
 |  |  |
 |  |  |--F97:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -4842,80 +4823,80 @@
 |  |  |  |  build expressions: iws.i_item_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  139:EXCHANGE [BROADCAST]
+|  |  |  141:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 16(GETNEXT)
+|  |  |  |  tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 17(GETNEXT)
 |  |  |  |
-|  |  |  F11:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  16:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  17:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  15:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  16:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=32.00MB mem-reservation=4.00MB thread-reservation=0
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 15(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 16(GETNEXT)
 |  |
-|  21:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  22:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash-table-id=17
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 137(OPEN)
+|  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 139(OPEN)
 |  |
-|  |--F98:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  Per-Instance Resources: mem-estimate=7.50MB mem-reservation=5.75MB thread-reservation=1
+|  |--F98:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  Per-Instance Resources: mem-estimate=2.55MB mem-reservation=1.94MB thread-reservation=1
 |  |  JOIN BUILD
 |  |  |  join-table-id=17 plan-id=18 cohort-id=05
 |  |  |  build expressions: ics.i_brand_id, ics.i_category_id, ics.i_class_id
-|  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |
-|  |  138:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  140:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 139(GETNEXT)
 |  |  |
-|  |  F09:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  F10:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  Per-Instance Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  137:AGGREGATE [FINALIZE]
+|  |  139:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 10(OPEN)
+|  |  |  in pipelines: 139(GETNEXT), 11(OPEN)
 |  |  |
-|  |  136:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  138:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 10(GETNEXT)
+|  |  |  in pipelines: 11(GETNEXT)
 |  |  |
-|  |  F06:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  F07:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  Per-Instance Resources: mem-estimate=58.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  20:AGGREGATE [STREAMING]
+|  |  21:AGGREGATE [STREAMING]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 10(GETNEXT)
+|  |  |  in pipelines: 11(GETNEXT)
 |  |  |
-|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  15:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=18
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 13(OPEN)
 |  |  |
 |  |  |--F99:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -4924,14 +4905,14 @@
 |  |  |  |  build expressions: d2.d_date_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  135:EXCHANGE [BROADCAST]
+|  |  |  137:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 12(GETNEXT)
+|  |  |  |  tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 13(GETNEXT)
 |  |  |  |
-|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F09:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  12:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  13:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -4941,16 +4922,16 @@
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 12(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 13(GETNEXT)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=19
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 12(OPEN)
 |  |  |
 |  |  |--F100:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -4959,32 +4940,51 @@
 |  |  |  |  build expressions: ics.i_item_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  134:EXCHANGE [BROADCAST]
+|  |  |  136:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 11(GETNEXT)
+|  |  |  |  tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 12(GETNEXT)
 |  |  |  |
-|  |  |  F07:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  11:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  12:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  11:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=48.00MB mem-reservation=4.00MB thread-reservation=0
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 10(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 11(GETNEXT)
+|  |
+|  135:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 05(OPEN)
+|  |
+|  134:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 05(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
+|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
+|  10:AGGREGATE [STREAMING]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 05(GETNEXT)
 |  |
 |  09:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  hash-table-id=20
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14b.test b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14b.test
index bde95df..1846d02 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14b.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14b.test
@@ -129,10 +129,10 @@
          this_year.i_category_id
 LIMIT 100
 ---- PLAN
-Max Per-Host Resource Reservation: Memory=95.62MB Threads=33
+Max Per-Host Resource Reservation: Memory=99.88MB Threads=33
 Per-Host Resource Estimates: Memory=1.85GB
 F00:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
-|  Per-Host Resources: mem-estimate=1.85GB mem-reservation=95.62MB thread-reservation=33 runtime-filters-memory=10.00MB
+|  Per-Host Resources: mem-estimate=1.85GB mem-reservation=99.88MB thread-reservation=33 runtime-filters-memory=10.00MB
 PLAN-ROOT SINK
 |  output exprs: channel, i_brand_id, i_class_id, i_category_id, sales, number_sales, channel, i_brand_id, i_class_id, i_category_id, sales, number_sales
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
@@ -303,14 +303,14 @@
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 74(GETNEXT), 68(OPEN)
+|  |  |  in pipelines: 74(GETNEXT), 54(OPEN)
 |  |  |
 |  |  69:HASH JOIN [INNER JOIN]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=53,40 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 68(GETNEXT), 48(OPEN)
+|  |  |  tuple-ids=44,40 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 54(GETNEXT), 48(OPEN)
 |  |  |
 |  |  |--48:SCAN HDFS [tpcds_parquet.item]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
@@ -322,32 +322,26 @@
 |  |  |     tuple-ids=40 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 48(GETNEXT)
 |  |  |
-|  |  68:AGGREGATE [FINALIZE]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 68(GETNEXT), 49(OPEN)
-|  |  |
-|  |  67:HASH JOIN [LEFT SEMI JOIN]
+|  |  68:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 66(OPEN)
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 54(GETNEXT), 67(OPEN)
 |  |  |
-|  |  |--66:AGGREGATE [FINALIZE]
+|  |  |--67:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 66(GETNEXT), 59(OPEN)
+|  |  |  |  in pipelines: 67(GETNEXT), 60(OPEN)
 |  |  |  |
-|  |  |  63:HASH JOIN [INNER JOIN]
+|  |  |  64:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50,51 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 61(OPEN)
+|  |  |  |  tuple-ids=50,51,52 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 62(OPEN)
 |  |  |  |
-|  |  |  |--61:SCAN HDFS [tpcds_parquet.date_dim d3]
+|  |  |  |--62:SCAN HDFS [tpcds_parquet.date_dim d3]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -357,56 +351,56 @@
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=51 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 61(GETNEXT)
+|  |  |  |     tuple-ids=52 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 62(GETNEXT)
 |  |  |  |
-|  |  |  62:HASH JOIN [INNER JOIN]
+|  |  |  63:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 60(OPEN)
+|  |  |  |  tuple-ids=50,51 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 61(OPEN)
 |  |  |  |
-|  |  |  |--60:SCAN HDFS [tpcds_parquet.item iws]
+|  |  |  |--61:SCAN HDFS [tpcds_parquet.item iws]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=50 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 60(GETNEXT)
+|  |  |  |     tuple-ids=51 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 61(GETNEXT)
 |  |  |  |
-|  |  |  59:SCAN HDFS [tpcds_parquet.web_sales]
+|  |  |  60:SCAN HDFS [tpcds_parquet.web_sales]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=49 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 59(GETNEXT)
+|  |  |     tuple-ids=50 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 60(GETNEXT)
 |  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN]
+|  |  66:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 64(OPEN)
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 54(GETNEXT), 65(OPEN)
 |  |  |
-|  |  |--64:AGGREGATE [FINALIZE]
+|  |  |--65:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 64(GETNEXT), 54(OPEN)
+|  |  |  |  in pipelines: 65(GETNEXT), 55(OPEN)
 |  |  |  |
-|  |  |  58:HASH JOIN [INNER JOIN]
+|  |  |  59:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46,47 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 56(OPEN)
+|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 57(OPEN)
 |  |  |  |
-|  |  |  |--56:SCAN HDFS [tpcds_parquet.date_dim d2]
+|  |  |  |--57:SCAN HDFS [tpcds_parquet.date_dim d2]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -416,35 +410,41 @@
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=47 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 56(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 57(GETNEXT)
 |  |  |  |
-|  |  |  57:HASH JOIN [INNER JOIN]
+|  |  |  58:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 55(OPEN)
+|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 56(OPEN)
 |  |  |  |
-|  |  |  |--55:SCAN HDFS [tpcds_parquet.item ics]
+|  |  |  |--56:SCAN HDFS [tpcds_parquet.item ics]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=46 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 55(GETNEXT)
+|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 56(GETNEXT)
 |  |  |  |
-|  |  |  54:SCAN HDFS [tpcds_parquet.catalog_sales]
+|  |  |  55:SCAN HDFS [tpcds_parquet.catalog_sales]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=45 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 54(GETNEXT)
+|  |  |     tuple-ids=46 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 55(GETNEXT)
+|  |  |
+|  |  54:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 54(GETNEXT), 49(OPEN)
 |  |  |
 |  |  53:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -693,15 +693,15 @@
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 29(GETNEXT), 23(OPEN)
+|  |  in pipelines: 29(GETNEXT), 09(OPEN)
 |  |
 |  24:HASH JOIN [INNER JOIN]
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  runtime filters: RF014[bloom] <- i_brand_id, RF015[bloom] <- i_category_id
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 23(GETNEXT), 03(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 09(GETNEXT), 03(OPEN)
 |  |
 |  |--03:SCAN HDFS [tpcds_parquet.item]
 |  |     HDFS partitions=1/1 files=1 size=1.73MB
@@ -713,32 +713,26 @@
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 03(GETNEXT)
 |  |
-|  23:AGGREGATE [FINALIZE]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 23(GETNEXT), 04(OPEN)
-|  |
-|  22:HASH JOIN [LEFT SEMI JOIN]
+|  23:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 21(OPEN)
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 09(GETNEXT), 22(OPEN)
 |  |
-|  |--21:AGGREGATE [FINALIZE]
+|  |--22:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 21(GETNEXT), 14(OPEN)
+|  |  |  in pipelines: 22(GETNEXT), 15(OPEN)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN]
+|  |  19:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
 |  |  |
-|  |  |--16:SCAN HDFS [tpcds_parquet.date_dim d3]
+|  |  |--17:SCAN HDFS [tpcds_parquet.date_dim d3]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -748,56 +742,56 @@
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  17:HASH JOIN [INNER JOIN]
+|  |  18:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 15(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
 |  |  |
-|  |  |--15:SCAN HDFS [tpcds_parquet.item iws]
+|  |  |--16:SCAN HDFS [tpcds_parquet.item iws]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 15(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 16(GETNEXT)
 |  |  |
-|  |  14:SCAN HDFS [tpcds_parquet.web_sales]
+|  |  15:SCAN HDFS [tpcds_parquet.web_sales]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 14(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 15(GETNEXT)
 |  |
-|  20:HASH JOIN [LEFT SEMI JOIN]
+|  21:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
 |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 19(OPEN)
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 09(GETNEXT), 20(OPEN)
 |  |
-|  |--19:AGGREGATE [FINALIZE]
+|  |--20:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 19(GETNEXT), 09(OPEN)
+|  |  |  in pipelines: 20(GETNEXT), 10(OPEN)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN]
+|  |  14:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
 |  |  |
-|  |  |--11:SCAN HDFS [tpcds_parquet.date_dim d2]
+|  |  |--12:SCAN HDFS [tpcds_parquet.date_dim d2]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -807,35 +801,41 @@
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  12:HASH JOIN [INNER JOIN]
+|  |  13:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 10(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
 |  |  |
-|  |  |--10:SCAN HDFS [tpcds_parquet.item ics]
+|  |  |--11:SCAN HDFS [tpcds_parquet.item ics]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 10(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 11(GETNEXT)
 |  |  |
-|  |  09:SCAN HDFS [tpcds_parquet.catalog_sales]
+|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 09(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 10(GETNEXT)
+|  |
+|  09:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 09(GETNEXT), 04(OPEN)
 |  |
 |  08:HASH JOIN [INNER JOIN]
 |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -936,7 +936,7 @@
    tuple-ids=0 row-size=20B cardinality=2.88M
    in pipelines: 00(GETNEXT)
 ---- DISTRIBUTEDPLAN
-Max Per-Host Resource Reservation: Memory=160.81MB Threads=86
+Max Per-Host Resource Reservation: Memory=157.06MB Threads=86
 Per-Host Resource Estimates: Memory=2.23GB
 F56:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=16.00KB mem-reservation=0B thread-reservation=1
@@ -1196,27 +1196,27 @@
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 140(GETNEXT), 137(OPEN)
+|  |  |  in pipelines: 140(GETNEXT), 127(OPEN)
 |  |  |
 |  |  139:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=82.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 127(GETNEXT)
 |  |  |
-|  |  F42:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=22.92MB mem-reservation=5.88MB thread-reservation=1
+|  |  F34:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=28.29MB mem-reservation=9.75MB thread-reservation=1
 |  |  74:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 127(GETNEXT)
 |  |  |
 |  |  69:HASH JOIN [INNER JOIN, PARTITIONED]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=53,40 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 48(OPEN)
+|  |  |  tuple-ids=44,40 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 48(OPEN)
 |  |  |
 |  |  |--138:EXCHANGE [HASH(i_brand_id,i_class_id,i_category_id)]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
@@ -1235,72 +1235,53 @@
 |  |  |     tuple-ids=40 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 48(GETNEXT)
 |  |  |
-|  |  137:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 49(OPEN)
-|  |  |
-|  |  136:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 49(GETNEXT)
-|  |  |
-|  |  F31:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=39.54MB mem-reservation=13.12MB thread-reservation=2
-|  |  68:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 49(GETNEXT)
-|  |  |
-|  |  67:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  68:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 134(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 136(OPEN)
 |  |  |
-|  |  |--135:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |--137:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 134(GETNEXT)
+|  |  |  |  in pipelines: 136(GETNEXT)
 |  |  |  |
-|  |  |  F41:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F42:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  134:AGGREGATE [FINALIZE]
+|  |  |  136:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 134(GETNEXT), 59(OPEN)
+|  |  |  |  in pipelines: 136(GETNEXT), 60(OPEN)
 |  |  |  |
-|  |  |  133:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  135:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=78.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  66:AGGREGATE [STREAMING]
+|  |  |  67:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  63:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  64:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50,51 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 61(OPEN)
+|  |  |  |  tuple-ids=50,51,52 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 62(OPEN)
 |  |  |  |
-|  |  |  |--132:EXCHANGE [BROADCAST]
+|  |  |  |--134:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=51 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 61(GETNEXT)
+|  |  |  |  |  tuple-ids=52 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 62(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F40:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F41:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  61:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  62:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -1310,90 +1291,90 @@
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=51 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 61(GETNEXT)
+|  |  |  |     tuple-ids=52 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 62(GETNEXT)
 |  |  |  |
-|  |  |  62:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  63:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 60(OPEN)
+|  |  |  |  tuple-ids=50,51 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 61(OPEN)
 |  |  |  |
-|  |  |  |--131:EXCHANGE [BROADCAST]
+|  |  |  |--133:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=50 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 60(GETNEXT)
+|  |  |  |  |  tuple-ids=51 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 61(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F40:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  60:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  61:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=50 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 60(GETNEXT)
+|  |  |  |     tuple-ids=51 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 61(GETNEXT)
 |  |  |  |
-|  |  |  59:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  60:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=49 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 59(GETNEXT)
+|  |  |     tuple-ids=50 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 60(GETNEXT)
 |  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  66:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 129(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 131(OPEN)
 |  |  |
-|  |  |--130:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |--132:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 129(GETNEXT)
+|  |  |  |  in pipelines: 131(GETNEXT)
 |  |  |  |
-|  |  |  F37:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F38:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  129:AGGREGATE [FINALIZE]
+|  |  |  131:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 129(GETNEXT), 54(OPEN)
+|  |  |  |  in pipelines: 131(GETNEXT), 55(OPEN)
 |  |  |  |
-|  |  |  128:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  130:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=110.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  64:AGGREGATE [STREAMING]
+|  |  |  65:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  58:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  59:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46,47 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 56(OPEN)
+|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 57(OPEN)
 |  |  |  |
-|  |  |  |--127:EXCHANGE [BROADCAST]
+|  |  |  |--129:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=47 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 56(GETNEXT)
+|  |  |  |  |  tuple-ids=48 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 57(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  56:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  57:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -1403,42 +1384,61 @@
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=47 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 56(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 57(GETNEXT)
 |  |  |  |
-|  |  |  57:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  58:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 55(OPEN)
+|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 56(OPEN)
 |  |  |  |
-|  |  |  |--126:EXCHANGE [BROADCAST]
+|  |  |  |--128:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=46 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 55(GETNEXT)
+|  |  |  |  |  tuple-ids=47 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 56(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  55:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  56:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=46 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 55(GETNEXT)
+|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 56(GETNEXT)
 |  |  |  |
-|  |  |  54:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  55:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=45 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 54(GETNEXT)
+|  |  |     tuple-ids=46 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 55(GETNEXT)
+|  |  |
+|  |  127:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 49(OPEN)
+|  |  |
+|  |  126:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 49(GETNEXT)
+|  |  |
+|  |  F31:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=30.31MB mem-reservation=7.38MB thread-reservation=2
+|  |  54:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 49(GETNEXT)
 |  |  |
 |  |  53:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -1792,28 +1792,28 @@
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 110(GETNEXT), 107(OPEN)
+|  |  in pipelines: 110(GETNEXT), 97(OPEN)
 |  |
 |  109:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  mem-estimate=82.81KB mem-reservation=0B thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 107(GETNEXT)
+|  |  in pipelines: 97(GETNEXT)
 |  |
-|  F14:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=3
-|  Per-Host Resources: mem-estimate=24.92MB mem-reservation=7.88MB thread-reservation=1 runtime-filters-memory=2.00MB
+|  F06:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=3
+|  Per-Host Resources: mem-estimate=30.29MB mem-reservation=11.75MB thread-reservation=1 runtime-filters-memory=2.00MB
 |  29:AGGREGATE [STREAMING]
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 107(GETNEXT)
+|  |  in pipelines: 97(GETNEXT)
 |  |
 |  24:HASH JOIN [INNER JOIN, PARTITIONED]
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  runtime filters: RF014[bloom] <- i_brand_id, RF015[bloom] <- i_category_id
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 107(GETNEXT), 03(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 03(OPEN)
 |  |
 |  |--108:EXCHANGE [HASH(i_brand_id,i_class_id,i_category_id)]
 |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
@@ -1832,72 +1832,53 @@
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 03(GETNEXT)
 |  |
-|  107:AGGREGATE [FINALIZE]
-|  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 107(GETNEXT), 04(OPEN)
-|  |
-|  106:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 04(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  Per-Host Resources: mem-estimate=39.54MB mem-reservation=13.12MB thread-reservation=2
-|  23:AGGREGATE [STREAMING]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 04(GETNEXT)
-|  |
-|  22:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  23:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 104(OPEN)
+|  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 106(OPEN)
 |  |
-|  |--105:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |--107:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 104(GETNEXT)
+|  |  |  in pipelines: 106(GETNEXT)
 |  |  |
-|  |  F13:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  F14:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  Per-Host Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  104:AGGREGATE [FINALIZE]
+|  |  106:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 104(GETNEXT), 14(OPEN)
+|  |  |  in pipelines: 106(GETNEXT), 15(OPEN)
 |  |  |
-|  |  103:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  105:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 14(GETNEXT)
+|  |  |  in pipelines: 15(GETNEXT)
 |  |  |
-|  |  F10:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  F11:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  Per-Host Resources: mem-estimate=78.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  21:AGGREGATE [STREAMING]
+|  |  22:AGGREGATE [STREAMING]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 14(GETNEXT)
+|  |  |  in pipelines: 15(GETNEXT)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
 |  |  |
-|  |  |--102:EXCHANGE [BROADCAST]
+|  |  |--104:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 16(GETNEXT)
+|  |  |  |  tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 17(GETNEXT)
 |  |  |  |
-|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F13:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  16:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  17:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -1907,90 +1888,90 @@
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  17:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 15(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
 |  |  |
-|  |  |--101:EXCHANGE [BROADCAST]
+|  |  |--103:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 15(GETNEXT)
+|  |  |  |  tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 16(GETNEXT)
 |  |  |  |
-|  |  |  F11:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  15:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  16:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 15(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 16(GETNEXT)
 |  |  |
-|  |  14:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  15:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 14(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 15(GETNEXT)
 |  |
-|  20:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  21:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 99(OPEN)
+|  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 101(OPEN)
 |  |
-|  |--100:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |--102:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 99(GETNEXT)
+|  |  |  in pipelines: 101(GETNEXT)
 |  |  |
-|  |  F09:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  F10:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  Per-Host Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  99:AGGREGATE [FINALIZE]
+|  |  101:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 99(GETNEXT), 09(OPEN)
+|  |  |  in pipelines: 101(GETNEXT), 10(OPEN)
 |  |  |
-|  |  98:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  100:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 09(GETNEXT)
+|  |  |  in pipelines: 10(GETNEXT)
 |  |  |
-|  |  F06:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  F07:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  Per-Host Resources: mem-estimate=110.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  19:AGGREGATE [STREAMING]
+|  |  20:AGGREGATE [STREAMING]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 09(GETNEXT)
+|  |  |  in pipelines: 10(GETNEXT)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
 |  |  |
-|  |  |--97:EXCHANGE [BROADCAST]
+|  |  |--99:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 11(GETNEXT)
+|  |  |  |  tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 12(GETNEXT)
 |  |  |  |
-|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F09:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  11:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  12:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -2000,42 +1981,61 @@
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  12:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 10(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
 |  |  |
-|  |  |--96:EXCHANGE [BROADCAST]
+|  |  |--98:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 10(GETNEXT)
+|  |  |  |  tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 11(GETNEXT)
 |  |  |  |
-|  |  |  F07:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  10:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  11:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 10(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 11(GETNEXT)
 |  |  |
-|  |  09:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 09(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 10(GETNEXT)
+|  |
+|  97:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 04(OPEN)
+|  |
+|  96:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 04(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  Per-Host Resources: mem-estimate=30.31MB mem-reservation=7.38MB thread-reservation=2
+|  09:AGGREGATE [STREAMING]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 04(GETNEXT)
 |  |
 |  08:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -2164,7 +2164,7 @@
    tuple-ids=0 row-size=20B cardinality=2.88M
    in pipelines: 00(GETNEXT)
 ---- PARALLELPLANS
-Max Per-Host Resource Reservation: Memory=280.88MB Threads=99
+Max Per-Host Resource Reservation: Memory=273.38MB Threads=103
 Per-Host Resource Estimates: Memory=1.42GB
 F56:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Instance Resources: mem-estimate=16.00KB mem-reservation=0B thread-reservation=1
@@ -2479,30 +2479,30 @@
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 140(GETNEXT), 137(OPEN)
+|  |  |  in pipelines: 140(GETNEXT), 127(OPEN)
 |  |  |
 |  |  139:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=118.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 127(GETNEXT)
 |  |  |
-|  |  F42:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  F34:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  Per-Instance Resources: mem-estimate=20.66MB mem-reservation=3.94MB thread-reservation=1
 |  |  74:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 127(GETNEXT)
 |  |  |
 |  |  69:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  |  hash-table-id=07
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=53,40 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 48(OPEN)
+|  |  |  tuple-ids=44,40 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 48(OPEN)
 |  |  |
-|  |  |--F64:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  |--F64:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  |  |  Per-Instance Resources: mem-estimate=2.30MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=07 plan-id=08 cohort-id=04
@@ -2526,72 +2526,53 @@
 |  |  |     tuple-ids=40 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 48(GETNEXT)
 |  |  |
-|  |  137:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 49(OPEN)
-|  |  |
-|  |  136:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 49(GETNEXT)
-|  |  |
-|  |  F31:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
-|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
-|  |  68:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 49(GETNEXT)
-|  |  |
-|  |  67:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  68:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=08
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 134(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 136(OPEN)
 |  |  |
-|  |  |--F65:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.48MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F65:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.82MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=08 plan-id=09 cohort-id=04
 |  |  |  |  build expressions: iws.i_brand_id, iws.i_category_id, iws.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  135:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |  137:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 134(GETNEXT)
+|  |  |  |  in pipelines: 136(GETNEXT)
 |  |  |  |
-|  |  |  F41:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F42:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  134:AGGREGATE [FINALIZE]
+|  |  |  136:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 134(GETNEXT), 59(OPEN)
+|  |  |  |  in pipelines: 136(GETNEXT), 60(OPEN)
 |  |  |  |
-|  |  |  133:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  135:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=42.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  66:AGGREGATE [STREAMING]
+|  |  |  67:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  63:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  64:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=09
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50,51 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 61(OPEN)
+|  |  |  |  tuple-ids=50,51,52 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 62(OPEN)
 |  |  |  |
 |  |  |  |--F66:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -2600,14 +2581,14 @@
 |  |  |  |  |  build expressions: d3.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  132:EXCHANGE [BROADCAST]
+|  |  |  |  134:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=51 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 61(GETNEXT)
+|  |  |  |  |  tuple-ids=52 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 62(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F40:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F41:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  61:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  62:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -2617,16 +2598,16 @@
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=51 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 61(GETNEXT)
+|  |  |  |     tuple-ids=52 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 62(GETNEXT)
 |  |  |  |
-|  |  |  62:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  63:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=10
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 60(OPEN)
+|  |  |  |  tuple-ids=50,51 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 61(OPEN)
 |  |  |  |
 |  |  |  |--F67:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -2635,80 +2616,80 @@
 |  |  |  |  |  build expressions: iws.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  131:EXCHANGE [BROADCAST]
+|  |  |  |  133:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=50 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 60(GETNEXT)
+|  |  |  |  |  tuple-ids=51 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 61(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F40:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  60:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  61:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=50 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 60(GETNEXT)
+|  |  |  |     tuple-ids=51 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 61(GETNEXT)
 |  |  |  |
-|  |  |  59:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  60:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=32.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=49 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 59(GETNEXT)
+|  |  |     tuple-ids=50 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 60(GETNEXT)
 |  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  66:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=11
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 129(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 131(OPEN)
 |  |  |
-|  |  |--F68:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.50MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F68:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.55MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=11 plan-id=12 cohort-id=04
 |  |  |  |  build expressions: ics.i_brand_id, ics.i_category_id, ics.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  130:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |  132:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 129(GETNEXT)
+|  |  |  |  in pipelines: 131(GETNEXT)
 |  |  |  |
-|  |  |  F37:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F38:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  129:AGGREGATE [FINALIZE]
+|  |  |  131:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 129(GETNEXT), 54(OPEN)
+|  |  |  |  in pipelines: 131(GETNEXT), 55(OPEN)
 |  |  |  |
-|  |  |  128:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  130:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=58.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  64:AGGREGATE [STREAMING]
+|  |  |  65:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  58:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  59:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=12
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46,47 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 56(OPEN)
+|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 57(OPEN)
 |  |  |  |
 |  |  |  |--F69:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -2717,14 +2698,14 @@
 |  |  |  |  |  build expressions: d2.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  127:EXCHANGE [BROADCAST]
+|  |  |  |  129:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=47 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 56(GETNEXT)
+|  |  |  |  |  tuple-ids=48 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 57(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  56:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  57:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -2734,16 +2715,16 @@
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=47 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 56(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 57(GETNEXT)
 |  |  |  |
-|  |  |  57:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  58:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=13
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 55(OPEN)
+|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 56(OPEN)
 |  |  |  |
 |  |  |  |--F70:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -2752,32 +2733,51 @@
 |  |  |  |  |  build expressions: ics.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  126:EXCHANGE [BROADCAST]
+|  |  |  |  128:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=46 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 55(GETNEXT)
+|  |  |  |  |  tuple-ids=47 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 56(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  55:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  56:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=46 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 55(GETNEXT)
+|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 56(GETNEXT)
 |  |  |  |
-|  |  |  54:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  55:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=48.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=45 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 54(GETNEXT)
+|  |  |     tuple-ids=46 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 55(GETNEXT)
+|  |  |
+|  |  127:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 49(OPEN)
+|  |  |
+|  |  126:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 49(GETNEXT)
+|  |  |
+|  |  F31:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
+|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
+|  |  54:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 49(GETNEXT)
 |  |  |
 |  |  53:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=14
@@ -3212,30 +3212,30 @@
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 110(GETNEXT), 107(OPEN)
+|  |  in pipelines: 110(GETNEXT), 97(OPEN)
 |  |
 |  109:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  mem-estimate=118.81KB mem-reservation=0B thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 107(GETNEXT)
+|  |  in pipelines: 97(GETNEXT)
 |  |
-|  F14:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  F06:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  Per-Instance Resources: mem-estimate=20.66MB mem-reservation=3.94MB thread-reservation=1
 |  29:AGGREGATE [STREAMING]
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 107(GETNEXT)
+|  |  in pipelines: 97(GETNEXT)
 |  |
 |  24:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  hash-table-id=24
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 107(GETNEXT), 03(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 03(OPEN)
 |  |
-|  |--F81:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |--F81:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  |  Per-Instance Resources: mem-estimate=4.30MB mem-reservation=3.94MB thread-reservation=1 runtime-filters-memory=2.00MB
 |  |  JOIN BUILD
 |  |  |  join-table-id=24 plan-id=25 cohort-id=08
@@ -3260,72 +3260,53 @@
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 03(GETNEXT)
 |  |
-|  107:AGGREGATE [FINALIZE]
-|  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 107(GETNEXT), 04(OPEN)
-|  |
-|  106:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 04(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
-|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
-|  23:AGGREGATE [STREAMING]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 04(GETNEXT)
-|  |
-|  22:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  23:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash-table-id=25
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 104(OPEN)
+|  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 106(OPEN)
 |  |
-|  |--F82:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  Per-Instance Resources: mem-estimate=7.48MB mem-reservation=5.75MB thread-reservation=1
+|  |--F82:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  Per-Instance Resources: mem-estimate=2.82MB mem-reservation=1.94MB thread-reservation=1
 |  |  JOIN BUILD
 |  |  |  join-table-id=25 plan-id=26 cohort-id=08
 |  |  |  build expressions: iws.i_brand_id, iws.i_category_id, iws.i_class_id
-|  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |
-|  |  105:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  107:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 104(GETNEXT)
+|  |  |  in pipelines: 106(GETNEXT)
 |  |  |
-|  |  F13:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  F14:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  Per-Instance Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  104:AGGREGATE [FINALIZE]
+|  |  106:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 104(GETNEXT), 14(OPEN)
+|  |  |  in pipelines: 106(GETNEXT), 15(OPEN)
 |  |  |
-|  |  103:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  105:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 14(GETNEXT)
+|  |  |  in pipelines: 15(GETNEXT)
 |  |  |
-|  |  F10:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  F11:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  Per-Instance Resources: mem-estimate=42.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  21:AGGREGATE [STREAMING]
+|  |  22:AGGREGATE [STREAMING]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 14(GETNEXT)
+|  |  |  in pipelines: 15(GETNEXT)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=26
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
 |  |  |
 |  |  |--F83:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -3334,14 +3315,14 @@
 |  |  |  |  build expressions: d3.d_date_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  102:EXCHANGE [BROADCAST]
+|  |  |  104:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 16(GETNEXT)
+|  |  |  |  tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 17(GETNEXT)
 |  |  |  |
-|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F13:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  16:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  17:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -3351,16 +3332,16 @@
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  17:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=27
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 15(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
 |  |  |
 |  |  |--F84:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -3369,80 +3350,80 @@
 |  |  |  |  build expressions: iws.i_item_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  101:EXCHANGE [BROADCAST]
+|  |  |  103:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 15(GETNEXT)
+|  |  |  |  tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 16(GETNEXT)
 |  |  |  |
-|  |  |  F11:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  15:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  16:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 15(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 16(GETNEXT)
 |  |  |
-|  |  14:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  15:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=32.00MB mem-reservation=4.00MB thread-reservation=0
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 14(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 15(GETNEXT)
 |  |
-|  20:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  21:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash-table-id=28
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 99(OPEN)
+|  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 101(OPEN)
 |  |
-|  |--F85:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  Per-Instance Resources: mem-estimate=7.50MB mem-reservation=5.75MB thread-reservation=1
+|  |--F85:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  Per-Instance Resources: mem-estimate=2.55MB mem-reservation=1.94MB thread-reservation=1
 |  |  JOIN BUILD
 |  |  |  join-table-id=28 plan-id=29 cohort-id=08
 |  |  |  build expressions: ics.i_brand_id, ics.i_category_id, ics.i_class_id
-|  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |
-|  |  100:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  102:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 99(GETNEXT)
+|  |  |  in pipelines: 101(GETNEXT)
 |  |  |
-|  |  F09:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  F10:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  Per-Instance Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  99:AGGREGATE [FINALIZE]
+|  |  101:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 99(GETNEXT), 09(OPEN)
+|  |  |  in pipelines: 101(GETNEXT), 10(OPEN)
 |  |  |
-|  |  98:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  100:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 09(GETNEXT)
+|  |  |  in pipelines: 10(GETNEXT)
 |  |  |
-|  |  F06:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  F07:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  Per-Instance Resources: mem-estimate=58.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  19:AGGREGATE [STREAMING]
+|  |  20:AGGREGATE [STREAMING]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 09(GETNEXT)
+|  |  |  in pipelines: 10(GETNEXT)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=29
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
 |  |  |
 |  |  |--F86:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -3451,14 +3432,14 @@
 |  |  |  |  build expressions: d2.d_date_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  97:EXCHANGE [BROADCAST]
+|  |  |  99:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 11(GETNEXT)
+|  |  |  |  tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 12(GETNEXT)
 |  |  |  |
-|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F09:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  11:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  12:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -3468,16 +3449,16 @@
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  12:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=30
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 10(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
 |  |  |
 |  |  |--F87:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -3486,32 +3467,51 @@
 |  |  |  |  build expressions: ics.i_item_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  96:EXCHANGE [BROADCAST]
+|  |  |  98:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 10(GETNEXT)
+|  |  |  |  tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 11(GETNEXT)
 |  |  |  |
-|  |  |  F07:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  10:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  11:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 10(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 11(GETNEXT)
 |  |  |
-|  |  09:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=48.00MB mem-reservation=4.00MB thread-reservation=0
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 09(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 10(GETNEXT)
+|  |
+|  97:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 04(OPEN)
+|  |
+|  96:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 04(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
+|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
+|  09:AGGREGATE [STREAMING]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 04(GETNEXT)
 |  |
 |  08:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  hash-table-id=31