You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by vi...@apache.org on 2024/05/06 17:12:06 UTC

(datafusion-comet) branch main updated: fix: Disable Comet shuffle with AQE coalesce partitions enabled (#380)

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

viirya pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-comet.git


The following commit(s) were added to refs/heads/main by this push:
     new 19379a35 fix: Disable Comet shuffle with AQE coalesce partitions enabled (#380)
19379a35 is described below

commit 19379a35eff387d5bff7941a5cc466009c0e7a61
Author: Liang-Chi Hsieh <vi...@gmail.com>
AuthorDate: Mon May 6 10:12:01 2024 -0700

    fix: Disable Comet shuffle with AQE coalesce partitions enabled (#380)
    
    * fix: Disable Comet shuffle with AQE coalesce partitions enabled
    
    * Update plan stability
    
    * Fix
    
    * Fix
    
    * Remove debug info
    
    * Refine test
---
 .../main/scala/org/apache/comet/CometConf.scala    |   11 +
 .../apache/comet/CometSparkSessionExtensions.scala |    5 +-
 .../approved-plans-v1_4/q16/explain.txt            |   80 +-
 .../approved-plans-v1_4/q16/simplified.txt         |   56 +-
 .../approved-plans-v1_4/q23b/explain.txt           |   70 +-
 .../approved-plans-v1_4/q23b/simplified.txt        |   32 +-
 .../approved-plans-v1_4/q24a/explain.txt           |  264 ++--
 .../approved-plans-v1_4/q24a/simplified.txt        |   80 +-
 .../approved-plans-v1_4/q24b/explain.txt           |  264 ++--
 .../approved-plans-v1_4/q24b/simplified.txt        |   80 +-
 .../approved-plans-v1_4/q28/explain.txt            |  106 +-
 .../approved-plans-v1_4/q28/simplified.txt         |  120 +-
 .../approved-plans-v1_4/q40/explain.txt            |  157 +--
 .../approved-plans-v1_4/q40/simplified.txt         |   58 +-
 .../approved-plans-v1_4/q41/explain.txt            |   46 +-
 .../approved-plans-v1_4/q41/simplified.txt         |   28 +-
 .../approved-plans-v1_4/q44/explain.txt            |  260 ++--
 .../approved-plans-v1_4/q44/simplified.txt         |   59 +-
 .../approved-plans-v1_4/q54/explain.txt            |   40 +-
 .../approved-plans-v1_4/q54/simplified.txt         |   36 +-
 .../approved-plans-v1_4/q6/explain.txt             |  134 +-
 .../approved-plans-v1_4/q6/simplified.txt          |   44 +-
 .../approved-plans-v1_4/q64/explain.txt            | 1325 ++++++++++----------
 .../approved-plans-v1_4/q64/simplified.txt         |  187 +--
 .../approved-plans-v1_4/q72/explain.txt            |   24 +-
 .../approved-plans-v1_4/q72/simplified.txt         |   20 +-
 .../approved-plans-v1_4/q75/explain.txt            |  350 +++---
 .../approved-plans-v1_4/q75/simplified.txt         |  119 +-
 .../approved-plans-v1_4/q78/explain.txt            |  347 ++---
 .../approved-plans-v1_4/q78/simplified.txt         |  148 ++-
 .../approved-plans-v1_4/q80/explain.txt            |  489 ++++----
 .../approved-plans-v1_4/q80/simplified.txt         |  154 ++-
 .../approved-plans-v1_4/q9/explain.txt             |  210 ++--
 .../approved-plans-v1_4/q9/simplified.txt          |   90 +-
 .../approved-plans-v1_4/q93/explain.txt            |  109 +-
 .../approved-plans-v1_4/q93/simplified.txt         |   42 +-
 .../approved-plans-v1_4/q94/explain.txt            |   80 +-
 .../approved-plans-v1_4/q94/simplified.txt         |   56 +-
 .../approved-plans-v1_4/q95/explain.txt            |  230 ++--
 .../approved-plans-v1_4/q95/simplified.txt         |   87 +-
 .../approved-plans-v2_7/q24/explain.txt            |  272 ++--
 .../approved-plans-v2_7/q24/simplified.txt         |   82 +-
 .../approved-plans-v2_7/q6/explain.txt             |  134 +-
 .../approved-plans-v2_7/q6/simplified.txt          |   44 +-
 .../approved-plans-v2_7/q64/explain.txt            | 1325 ++++++++++----------
 .../approved-plans-v2_7/q64/simplified.txt         |  187 +--
 .../approved-plans-v2_7/q72/explain.txt            |   24 +-
 .../approved-plans-v2_7/q72/simplified.txt         |   20 +-
 .../approved-plans-v2_7/q75/explain.txt            |  350 +++---
 .../approved-plans-v2_7/q75/simplified.txt         |  119 +-
 .../approved-plans-v2_7/q78/explain.txt            |  347 ++---
 .../approved-plans-v2_7/q78/simplified.txt         |  148 ++-
 .../approved-plans-v2_7/q80a/explain.txt           |  541 ++++----
 .../approved-plans-v2_7/q80a/simplified.txt        |  166 ++-
 .../org/apache/comet/CometExpressionSuite.scala    |    2 +
 .../apache/comet/exec/CometAggregateSuite.scala    |   17 +-
 .../comet/exec/CometColumnarShuffleSuite.scala     |   21 +
 .../org/apache/comet/exec/CometExecSuite.scala     |    4 +-
 .../scala/org/apache/spark/sql/CometTestBase.scala |    1 +
 59 files changed, 5176 insertions(+), 4725 deletions(-)

diff --git a/common/src/main/scala/org/apache/comet/CometConf.scala b/common/src/main/scala/org/apache/comet/CometConf.scala
index 26114090..f9caee9d 100644
--- a/common/src/main/scala/org/apache/comet/CometConf.scala
+++ b/common/src/main/scala/org/apache/comet/CometConf.scala
@@ -149,6 +149,17 @@ object CometConf {
     .booleanConf
     .createWithDefault(false)
 
+  val COMET_SHUFFLE_ENFORCE_MODE_ENABLED: ConfigEntry[Boolean] =
+    conf("spark.comet.shuffle.enforceMode.enabled")
+      .doc(
+        "Comet shuffle doesn't support Spark AQE coalesce partitions. If AQE coalesce " +
+          "partitions is enabled, Comet shuffle won't be triggered even enabled. This config " +
+          "is used to enforce Comet to trigger shuffle even if AQE coalesce partitions is " +
+          "enabled. This is for testing purpose only.")
+      .internal()
+      .booleanConf
+      .createWithDefault(false)
+
   val COMET_EXEC_BROADCAST_FORCE_ENABLED: ConfigEntry[Boolean] =
     conf(s"$COMET_EXEC_CONFIG_PREFIX.broadcast.enabled")
       .doc(
diff --git a/spark/src/main/scala/org/apache/comet/CometSparkSessionExtensions.scala b/spark/src/main/scala/org/apache/comet/CometSparkSessionExtensions.scala
index 1e78013c..0b93f320 100644
--- a/spark/src/main/scala/org/apache/comet/CometSparkSessionExtensions.scala
+++ b/spark/src/main/scala/org/apache/comet/CometSparkSessionExtensions.scala
@@ -916,7 +916,10 @@ object CometSparkSessionExtensions extends Logging {
   private[comet] def isCometShuffleEnabled(conf: SQLConf): Boolean =
     COMET_EXEC_SHUFFLE_ENABLED.get(conf) &&
       (conf.contains("spark.shuffle.manager") && conf.getConfString("spark.shuffle.manager") ==
-        "org.apache.spark.sql.comet.execution.shuffle.CometShuffleManager")
+        "org.apache.spark.sql.comet.execution.shuffle.CometShuffleManager") &&
+      // TODO: AQE coalesce partitions feature causes Comet shuffle memory leak.
+      // We should disable Comet shuffle when AQE coalesce partitions is enabled.
+      (!conf.coalesceShufflePartitionsEnabled || COMET_SHUFFLE_ENFORCE_MODE_ENABLED.get())
 
   private[comet] def isCometScanEnabled(conf: SQLConf): Boolean = {
     COMET_SCAN_ENABLED.get(conf)
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16/explain.txt
index 1762c8c6..d8ed9c06 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16/explain.txt
@@ -13,20 +13,20 @@
                   :     :     :- * SortMergeJoin LeftAnti (19)
                   :     :     :  :- * Project (13)
                   :     :     :  :  +- * SortMergeJoin LeftSemi (12)
-                  :     :     :  :     :- * ColumnarToRow (6)
-                  :     :     :  :     :  +- CometSort (5)
-                  :     :     :  :     :     +- CometExchange (4)
+                  :     :     :  :     :- * Sort (6)
+                  :     :     :  :     :  +- Exchange (5)
+                  :     :     :  :     :     +- * ColumnarToRow (4)
                   :     :     :  :     :        +- CometProject (3)
                   :     :     :  :     :           +- CometFilter (2)
                   :     :     :  :     :              +- CometScan parquet spark_catalog.default.catalog_sales (1)
-                  :     :     :  :     +- * ColumnarToRow (11)
-                  :     :     :  :        +- CometSort (10)
-                  :     :     :  :           +- CometExchange (9)
+                  :     :     :  :     +- * Sort (11)
+                  :     :     :  :        +- Exchange (10)
+                  :     :     :  :           +- * ColumnarToRow (9)
                   :     :     :  :              +- CometProject (8)
                   :     :     :  :                 +- CometScan parquet spark_catalog.default.catalog_sales (7)
-                  :     :     :  +- * ColumnarToRow (18)
-                  :     :     :     +- CometSort (17)
-                  :     :     :        +- CometExchange (16)
+                  :     :     :  +- * Sort (18)
+                  :     :     :     +- Exchange (17)
+                  :     :     :        +- * ColumnarToRow (16)
                   :     :     :           +- CometProject (15)
                   :     :     :              +- CometScan parquet spark_catalog.default.catalog_returns (14)
                   :     :     +- BroadcastExchange (24)
@@ -61,16 +61,16 @@ Condition : ((isnotnull(cs_ship_date_sk#1) AND isnotnull(cs_ship_addr_sk#2)) AND
 Input [8]: [cs_ship_date_sk#1, cs_ship_addr_sk#2, cs_call_center_sk#3, cs_warehouse_sk#4, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7, cs_sold_date_sk#8]
 Arguments: [cs_ship_date_sk#1, cs_ship_addr_sk#2, cs_call_center_sk#3, cs_warehouse_sk#4, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7], [cs_ship_date_sk#1, cs_ship_addr_sk#2, cs_call_center_sk#3, cs_warehouse_sk#4, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7]
 
-(4) CometExchange
+(4) ColumnarToRow [codegen id : 1]
 Input [7]: [cs_ship_date_sk#1, cs_ship_addr_sk#2, cs_call_center_sk#3, cs_warehouse_sk#4, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7]
-Arguments: hashpartitioning(cs_order_number#5, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(5) CometSort
+(5) Exchange
 Input [7]: [cs_ship_date_sk#1, cs_ship_addr_sk#2, cs_call_center_sk#3, cs_warehouse_sk#4, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7]
-Arguments: [cs_ship_date_sk#1, cs_ship_addr_sk#2, cs_call_center_sk#3, cs_warehouse_sk#4, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7], [cs_order_number#5 ASC NULLS FIRST]
+Arguments: hashpartitioning(cs_order_number#5, 5), ENSURE_REQUIREMENTS, [plan_id=1]
 
-(6) ColumnarToRow [codegen id : 1]
+(6) Sort [codegen id : 2]
 Input [7]: [cs_ship_date_sk#1, cs_ship_addr_sk#2, cs_call_center_sk#3, cs_warehouse_sk#4, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7]
+Arguments: [cs_order_number#5 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.catalog_sales
 Output [3]: [cs_warehouse_sk#9, cs_order_number#10, cs_sold_date_sk#11]
@@ -82,24 +82,24 @@ ReadSchema: struct<cs_warehouse_sk:int,cs_order_number:int>
 Input [3]: [cs_warehouse_sk#9, cs_order_number#10, cs_sold_date_sk#11]
 Arguments: [cs_warehouse_sk#9, cs_order_number#10], [cs_warehouse_sk#9, cs_order_number#10]
 
-(9) CometExchange
+(9) ColumnarToRow [codegen id : 3]
 Input [2]: [cs_warehouse_sk#9, cs_order_number#10]
-Arguments: hashpartitioning(cs_order_number#10, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]
 
-(10) CometSort
+(10) Exchange
 Input [2]: [cs_warehouse_sk#9, cs_order_number#10]
-Arguments: [cs_warehouse_sk#9, cs_order_number#10], [cs_order_number#10 ASC NULLS FIRST]
+Arguments: hashpartitioning(cs_order_number#10, 5), ENSURE_REQUIREMENTS, [plan_id=2]
 
-(11) ColumnarToRow [codegen id : 2]
+(11) Sort [codegen id : 4]
 Input [2]: [cs_warehouse_sk#9, cs_order_number#10]
+Arguments: [cs_order_number#10 ASC NULLS FIRST], false, 0
 
-(12) SortMergeJoin [codegen id : 3]
+(12) SortMergeJoin [codegen id : 5]
 Left keys [1]: [cs_order_number#5]
 Right keys [1]: [cs_order_number#10]
 Join type: LeftSemi
 Join condition: NOT (cs_warehouse_sk#4 = cs_warehouse_sk#9)
 
-(13) Project [codegen id : 3]
+(13) Project [codegen id : 5]
 Output [6]: [cs_ship_date_sk#1, cs_ship_addr_sk#2, cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7]
 Input [7]: [cs_ship_date_sk#1, cs_ship_addr_sk#2, cs_call_center_sk#3, cs_warehouse_sk#4, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7]
 
@@ -113,18 +113,18 @@ ReadSchema: struct<cr_order_number:int>
 Input [2]: [cr_order_number#12, cr_returned_date_sk#13]
 Arguments: [cr_order_number#12], [cr_order_number#12]
 
-(16) CometExchange
+(16) ColumnarToRow [codegen id : 6]
 Input [1]: [cr_order_number#12]
-Arguments: hashpartitioning(cr_order_number#12, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]
 
-(17) CometSort
+(17) Exchange
 Input [1]: [cr_order_number#12]
-Arguments: [cr_order_number#12], [cr_order_number#12 ASC NULLS FIRST]
+Arguments: hashpartitioning(cr_order_number#12, 5), ENSURE_REQUIREMENTS, [plan_id=3]
 
-(18) ColumnarToRow [codegen id : 4]
+(18) Sort [codegen id : 7]
 Input [1]: [cr_order_number#12]
+Arguments: [cr_order_number#12 ASC NULLS FIRST], false, 0
 
-(19) SortMergeJoin [codegen id : 8]
+(19) SortMergeJoin [codegen id : 11]
 Left keys [1]: [cs_order_number#5]
 Right keys [1]: [cr_order_number#12]
 Join type: LeftAnti
@@ -145,20 +145,20 @@ Condition : (((isnotnull(d_date#15) AND (d_date#15 >= 2002-02-01)) AND (d_date#1
 Input [2]: [d_date_sk#14, d_date#15]
 Arguments: [d_date_sk#14], [d_date_sk#14]
 
-(23) ColumnarToRow [codegen id : 5]
+(23) ColumnarToRow [codegen id : 8]
 Input [1]: [d_date_sk#14]
 
 (24) BroadcastExchange
 Input [1]: [d_date_sk#14]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=4]
 
-(25) BroadcastHashJoin [codegen id : 8]
+(25) BroadcastHashJoin [codegen id : 11]
 Left keys [1]: [cs_ship_date_sk#1]
 Right keys [1]: [d_date_sk#14]
 Join type: Inner
 Join condition: None
 
-(26) Project [codegen id : 8]
+(26) Project [codegen id : 11]
 Output [5]: [cs_ship_addr_sk#2, cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7]
 Input [7]: [cs_ship_date_sk#1, cs_ship_addr_sk#2, cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7, d_date_sk#14]
 
@@ -177,20 +177,20 @@ Condition : ((isnotnull(ca_state#17) AND (ca_state#17 = GA)) AND isnotnull(ca_ad
 Input [2]: [ca_address_sk#16, ca_state#17]
 Arguments: [ca_address_sk#16], [ca_address_sk#16]
 
-(30) ColumnarToRow [codegen id : 6]
+(30) ColumnarToRow [codegen id : 9]
 Input [1]: [ca_address_sk#16]
 
 (31) BroadcastExchange
 Input [1]: [ca_address_sk#16]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=5]
 
-(32) BroadcastHashJoin [codegen id : 8]
+(32) BroadcastHashJoin [codegen id : 11]
 Left keys [1]: [cs_ship_addr_sk#2]
 Right keys [1]: [ca_address_sk#16]
 Join type: Inner
 Join condition: None
 
-(33) Project [codegen id : 8]
+(33) Project [codegen id : 11]
 Output [4]: [cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7]
 Input [6]: [cs_ship_addr_sk#2, cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7, ca_address_sk#16]
 
@@ -209,38 +209,38 @@ Condition : ((isnotnull(cc_county#19) AND (cc_county#19 = Williamson County)) AN
 Input [2]: [cc_call_center_sk#18, cc_county#19]
 Arguments: [cc_call_center_sk#18], [cc_call_center_sk#18]
 
-(37) ColumnarToRow [codegen id : 7]
+(37) ColumnarToRow [codegen id : 10]
 Input [1]: [cc_call_center_sk#18]
 
 (38) BroadcastExchange
 Input [1]: [cc_call_center_sk#18]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=6]
 
-(39) BroadcastHashJoin [codegen id : 8]
+(39) BroadcastHashJoin [codegen id : 11]
 Left keys [1]: [cs_call_center_sk#3]
 Right keys [1]: [cc_call_center_sk#18]
 Join type: Inner
 Join condition: None
 
-(40) Project [codegen id : 8]
+(40) Project [codegen id : 11]
 Output [3]: [cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7]
 Input [5]: [cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7, cc_call_center_sk#18]
 
-(41) HashAggregate [codegen id : 8]
+(41) HashAggregate [codegen id : 11]
 Input [3]: [cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7]
 Keys [1]: [cs_order_number#5]
 Functions [2]: [partial_sum(UnscaledValue(cs_ext_ship_cost#6)), partial_sum(UnscaledValue(cs_net_profit#7))]
 Aggregate Attributes [2]: [sum(UnscaledValue(cs_ext_ship_cost#6))#20, sum(UnscaledValue(cs_net_profit#7))#21]
 Results [3]: [cs_order_number#5, sum#22, sum#23]
 
-(42) HashAggregate [codegen id : 8]
+(42) HashAggregate [codegen id : 11]
 Input [3]: [cs_order_number#5, sum#22, sum#23]
 Keys [1]: [cs_order_number#5]
 Functions [2]: [merge_sum(UnscaledValue(cs_ext_ship_cost#6)), merge_sum(UnscaledValue(cs_net_profit#7))]
 Aggregate Attributes [2]: [sum(UnscaledValue(cs_ext_ship_cost#6))#20, sum(UnscaledValue(cs_net_profit#7))#21]
 Results [3]: [cs_order_number#5, sum#22, sum#23]
 
-(43) HashAggregate [codegen id : 8]
+(43) HashAggregate [codegen id : 11]
 Input [3]: [cs_order_number#5, sum#22, sum#23]
 Keys: []
 Functions [3]: [merge_sum(UnscaledValue(cs_ext_ship_cost#6)), merge_sum(UnscaledValue(cs_net_profit#7)), partial_count(distinct cs_order_number#5)]
@@ -251,7 +251,7 @@ Results [3]: [sum#22, sum#23, count#25]
 Input [3]: [sum#22, sum#23, count#25]
 Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=7]
 
-(45) HashAggregate [codegen id : 9]
+(45) HashAggregate [codegen id : 12]
 Input [3]: [sum#22, sum#23, count#25]
 Keys: []
 Functions [3]: [sum(UnscaledValue(cs_ext_ship_cost#6)), sum(UnscaledValue(cs_net_profit#7)), count(distinct cs_order_number#5)]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16/simplified.txt
index 21372637..a55c182b 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16/simplified.txt
@@ -1,8 +1,8 @@
-WholeStageCodegen (9)
+WholeStageCodegen (12)
   HashAggregate [sum,sum,count] [sum(UnscaledValue(cs_ext_ship_cost)),sum(UnscaledValue(cs_net_profit)),count(cs_order_number),order count ,total shipping cost ,total net profit ,sum,sum,count]
     InputAdapter
       Exchange #1
-        WholeStageCodegen (8)
+        WholeStageCodegen (11)
           HashAggregate [cs_order_number] [sum(UnscaledValue(cs_ext_ship_cost)),sum(UnscaledValue(cs_net_profit)),count(cs_order_number),sum,sum,count,sum,sum,count]
             HashAggregate [cs_order_number] [sum(UnscaledValue(cs_ext_ship_cost)),sum(UnscaledValue(cs_net_profit)),sum,sum,sum,sum]
               HashAggregate [cs_order_number,cs_ext_ship_cost,cs_net_profit] [sum(UnscaledValue(cs_ext_ship_cost)),sum(UnscaledValue(cs_net_profit)),sum,sum,sum,sum]
@@ -14,37 +14,43 @@ WholeStageCodegen (9)
                           BroadcastHashJoin [cs_ship_date_sk,d_date_sk]
                             SortMergeJoin [cs_order_number,cr_order_number]
                               InputAdapter
-                                WholeStageCodegen (3)
+                                WholeStageCodegen (5)
                                   Project [cs_ship_date_sk,cs_ship_addr_sk,cs_call_center_sk,cs_order_number,cs_ext_ship_cost,cs_net_profit]
                                     SortMergeJoin [cs_order_number,cs_order_number,cs_warehouse_sk,cs_warehouse_sk]
                                       InputAdapter
-                                        WholeStageCodegen (1)
-                                          ColumnarToRow
+                                        WholeStageCodegen (2)
+                                          Sort [cs_order_number]
                                             InputAdapter
-                                              CometSort [cs_order_number]
-                                                CometExchange [cs_order_number] #2
-                                                  CometProject [cs_ship_date_sk,cs_ship_addr_sk,cs_call_center_sk,cs_warehouse_sk,cs_order_number,cs_ext_ship_cost,cs_net_profit]
-                                                    CometFilter [cs_ship_date_sk,cs_ship_addr_sk,cs_call_center_sk]
-                                                      CometScan parquet spark_catalog.default.catalog_sales [cs_ship_date_sk,cs_ship_addr_sk,cs_call_center_sk,cs_warehouse_sk,cs_order_number,cs_ext_ship_cost,cs_net_profit,cs_sold_date_sk]
+                                              Exchange [cs_order_number] #2
+                                                WholeStageCodegen (1)
+                                                  ColumnarToRow
+                                                    InputAdapter
+                                                      CometProject [cs_ship_date_sk,cs_ship_addr_sk,cs_call_center_sk,cs_warehouse_sk,cs_order_number,cs_ext_ship_cost,cs_net_profit]
+                                                        CometFilter [cs_ship_date_sk,cs_ship_addr_sk,cs_call_center_sk]
+                                                          CometScan parquet spark_catalog.default.catalog_sales [cs_ship_date_sk,cs_ship_addr_sk,cs_call_center_sk,cs_warehouse_sk,cs_order_number,cs_ext_ship_cost,cs_net_profit,cs_sold_date_sk]
                                       InputAdapter
-                                        WholeStageCodegen (2)
-                                          ColumnarToRow
+                                        WholeStageCodegen (4)
+                                          Sort [cs_order_number]
                                             InputAdapter
-                                              CometSort [cs_order_number]
-                                                CometExchange [cs_order_number] #3
-                                                  CometProject [cs_warehouse_sk,cs_order_number]
-                                                    CometScan parquet spark_catalog.default.catalog_sales [cs_warehouse_sk,cs_order_number,cs_sold_date_sk]
+                                              Exchange [cs_order_number] #3
+                                                WholeStageCodegen (3)
+                                                  ColumnarToRow
+                                                    InputAdapter
+                                                      CometProject [cs_warehouse_sk,cs_order_number]
+                                                        CometScan parquet spark_catalog.default.catalog_sales [cs_warehouse_sk,cs_order_number,cs_sold_date_sk]
                               InputAdapter
-                                WholeStageCodegen (4)
-                                  ColumnarToRow
+                                WholeStageCodegen (7)
+                                  Sort [cr_order_number]
                                     InputAdapter
-                                      CometSort [cr_order_number]
-                                        CometExchange [cr_order_number] #4
-                                          CometProject [cr_order_number]
-                                            CometScan parquet spark_catalog.default.catalog_returns [cr_order_number,cr_returned_date_sk]
+                                      Exchange [cr_order_number] #4
+                                        WholeStageCodegen (6)
+                                          ColumnarToRow
+                                            InputAdapter
+                                              CometProject [cr_order_number]
+                                                CometScan parquet spark_catalog.default.catalog_returns [cr_order_number,cr_returned_date_sk]
                             InputAdapter
                               BroadcastExchange #5
-                                WholeStageCodegen (5)
+                                WholeStageCodegen (8)
                                   ColumnarToRow
                                     InputAdapter
                                       CometProject [d_date_sk]
@@ -52,7 +58,7 @@ WholeStageCodegen (9)
                                           CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_date]
                         InputAdapter
                           BroadcastExchange #6
-                            WholeStageCodegen (6)
+                            WholeStageCodegen (9)
                               ColumnarToRow
                                 InputAdapter
                                   CometProject [ca_address_sk]
@@ -60,7 +66,7 @@ WholeStageCodegen (9)
                                       CometScan parquet spark_catalog.default.customer_address [ca_address_sk,ca_state]
                     InputAdapter
                       BroadcastExchange #7
-                        WholeStageCodegen (7)
+                        WholeStageCodegen (10)
                           ColumnarToRow
                             InputAdapter
                               CometProject [cc_call_center_sk]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q23b/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q23b/explain.txt
index 86227b83..8ffb43cf 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q23b/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q23b/explain.txt
@@ -52,9 +52,9 @@ TakeOrderedAndProject (87)
    :              :     :                                   +- CometScan parquet spark_catalog.default.customer (30)
    :              :     +- BroadcastExchange (54)
    :              :        +- * SortMergeJoin LeftSemi (53)
-   :              :           :- * ColumnarToRow (47)
-   :              :           :  +- CometSort (46)
-   :              :           :     +- CometExchange (45)
+   :              :           :- * Sort (47)
+   :              :           :  +- Exchange (46)
+   :              :           :     +- * ColumnarToRow (45)
    :              :           :        +- CometFilter (44)
    :              :           :           +- CometScan parquet spark_catalog.default.customer (43)
    :              :           +- * Sort (52)
@@ -283,7 +283,7 @@ Input [2]: [c_customer_sk#24, ssales#30]
 Input [1]: [c_customer_sk#24]
 Arguments: [c_customer_sk#24 ASC NULLS FIRST], false, 0
 
-(42) SortMergeJoin [codegen id : 16]
+(42) SortMergeJoin [codegen id : 17]
 Left keys [1]: [cs_bill_customer_sk#1]
 Right keys [1]: [c_customer_sk#24]
 Join type: LeftSemi
@@ -300,40 +300,40 @@ ReadSchema: struct<c_customer_sk:int,c_first_name:string,c_last_name:string>
 Input [3]: [c_customer_sk#33, c_first_name#34, c_last_name#35]
 Condition : isnotnull(c_customer_sk#33)
 
-(45) CometExchange
+(45) ColumnarToRow [codegen id : 10]
 Input [3]: [c_customer_sk#33, c_first_name#34, c_last_name#35]
-Arguments: hashpartitioning(c_customer_sk#33, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=7]
 
-(46) CometSort
+(46) Exchange
 Input [3]: [c_customer_sk#33, c_first_name#34, c_last_name#35]
-Arguments: [c_customer_sk#33, c_first_name#34, c_last_name#35], [c_customer_sk#33 ASC NULLS FIRST]
+Arguments: hashpartitioning(c_customer_sk#33, 5), ENSURE_REQUIREMENTS, [plan_id=7]
 
-(47) ColumnarToRow [codegen id : 10]
+(47) Sort [codegen id : 11]
 Input [3]: [c_customer_sk#33, c_first_name#34, c_last_name#35]
+Arguments: [c_customer_sk#33 ASC NULLS FIRST], false, 0
 
 (48) ReusedExchange [Reuses operator id: 37]
 Output [3]: [c_customer_sk#24, sum#27, isEmpty#28]
 
-(49) HashAggregate [codegen id : 13]
+(49) HashAggregate [codegen id : 14]
 Input [3]: [c_customer_sk#24, sum#27, isEmpty#28]
 Keys [1]: [c_customer_sk#24]
 Functions [1]: [sum((cast(ss_quantity#21 as decimal(10,0)) * ss_sales_price#22))]
 Aggregate Attributes [1]: [sum((cast(ss_quantity#21 as decimal(10,0)) * ss_sales_price#22))#29]
 Results [2]: [c_customer_sk#24, sum((cast(ss_quantity#21 as decimal(10,0)) * ss_sales_price#22))#29 AS ssales#30]
 
-(50) Filter [codegen id : 13]
+(50) Filter [codegen id : 14]
 Input [2]: [c_customer_sk#24, ssales#30]
 Condition : (isnotnull(ssales#30) AND (cast(ssales#30 as decimal(38,8)) > (0.500000 * ReusedSubquery Subquery scalar-subquery#31, [id=#32])))
 
-(51) Project [codegen id : 13]
+(51) Project [codegen id : 14]
 Output [1]: [c_customer_sk#24]
 Input [2]: [c_customer_sk#24, ssales#30]
 
-(52) Sort [codegen id : 13]
+(52) Sort [codegen id : 14]
 Input [1]: [c_customer_sk#24]
 Arguments: [c_customer_sk#24 ASC NULLS FIRST], false, 0
 
-(53) SortMergeJoin [codegen id : 14]
+(53) SortMergeJoin [codegen id : 15]
 Left keys [1]: [c_customer_sk#33]
 Right keys [1]: [c_customer_sk#24]
 Join type: LeftSemi
@@ -343,30 +343,30 @@ Join condition: None
 Input [3]: [c_customer_sk#33, c_first_name#34, c_last_name#35]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=8]
 
-(55) BroadcastHashJoin [codegen id : 16]
+(55) BroadcastHashJoin [codegen id : 17]
 Left keys [1]: [cs_bill_customer_sk#1]
 Right keys [1]: [c_customer_sk#33]
 Join type: Inner
 Join condition: None
 
-(56) Project [codegen id : 16]
+(56) Project [codegen id : 17]
 Output [5]: [cs_quantity#3, cs_list_price#4, cs_sold_date_sk#5, c_first_name#34, c_last_name#35]
 Input [7]: [cs_bill_customer_sk#1, cs_quantity#3, cs_list_price#4, cs_sold_date_sk#5, c_customer_sk#33, c_first_name#34, c_last_name#35]
 
 (57) ReusedExchange [Reuses operator id: 92]
 Output [1]: [d_date_sk#36]
 
-(58) BroadcastHashJoin [codegen id : 16]
+(58) BroadcastHashJoin [codegen id : 17]
 Left keys [1]: [cs_sold_date_sk#5]
 Right keys [1]: [d_date_sk#36]
 Join type: Inner
 Join condition: None
 
-(59) Project [codegen id : 16]
+(59) Project [codegen id : 17]
 Output [4]: [cs_quantity#3, cs_list_price#4, c_first_name#34, c_last_name#35]
 Input [6]: [cs_quantity#3, cs_list_price#4, cs_sold_date_sk#5, c_first_name#34, c_last_name#35, d_date_sk#36]
 
-(60) HashAggregate [codegen id : 16]
+(60) HashAggregate [codegen id : 17]
 Input [4]: [cs_quantity#3, cs_list_price#4, c_first_name#34, c_last_name#35]
 Keys [2]: [c_last_name#35, c_first_name#34]
 Functions [1]: [partial_sum((cast(cs_quantity#3 as decimal(10,0)) * cs_list_price#4))]
@@ -377,7 +377,7 @@ Results [4]: [c_last_name#35, c_first_name#34, sum#39, isEmpty#40]
 Input [4]: [c_last_name#35, c_first_name#34, sum#39, isEmpty#40]
 Arguments: hashpartitioning(c_last_name#35, c_first_name#34, 5), ENSURE_REQUIREMENTS, [plan_id=9]
 
-(62) HashAggregate [codegen id : 17]
+(62) HashAggregate [codegen id : 18]
 Input [4]: [c_last_name#35, c_first_name#34, sum#39, isEmpty#40]
 Keys [2]: [c_last_name#35, c_first_name#34]
 Functions [1]: [sum((cast(cs_quantity#3 as decimal(10,0)) * cs_list_price#4))]
@@ -396,19 +396,19 @@ ReadSchema: struct<ws_item_sk:int,ws_bill_customer_sk:int,ws_quantity:int,ws_lis
 Input [5]: [ws_item_sk#43, ws_bill_customer_sk#44, ws_quantity#45, ws_list_price#46, ws_sold_date_sk#47]
 Condition : isnotnull(ws_bill_customer_sk#44)
 
-(65) ColumnarToRow [codegen id : 22]
+(65) ColumnarToRow [codegen id : 23]
 Input [5]: [ws_item_sk#43, ws_bill_customer_sk#44, ws_quantity#45, ws_list_price#46, ws_sold_date_sk#47]
 
 (66) ReusedExchange [Reuses operator id: 21]
 Output [1]: [item_sk#18]
 
-(67) BroadcastHashJoin [codegen id : 22]
+(67) BroadcastHashJoin [codegen id : 23]
 Left keys [1]: [ws_item_sk#43]
 Right keys [1]: [item_sk#18]
 Join type: LeftSemi
 Join condition: None
 
-(68) Project [codegen id : 22]
+(68) Project [codegen id : 23]
 Output [4]: [ws_bill_customer_sk#44, ws_quantity#45, ws_list_price#46, ws_sold_date_sk#47]
 Input [5]: [ws_item_sk#43, ws_bill_customer_sk#44, ws_quantity#45, ws_list_price#46, ws_sold_date_sk#47]
 
@@ -416,33 +416,33 @@ Input [5]: [ws_item_sk#43, ws_bill_customer_sk#44, ws_quantity#45, ws_list_price
 Input [4]: [ws_bill_customer_sk#44, ws_quantity#45, ws_list_price#46, ws_sold_date_sk#47]
 Arguments: hashpartitioning(ws_bill_customer_sk#44, 5), ENSURE_REQUIREMENTS, [plan_id=10]
 
-(70) Sort [codegen id : 23]
+(70) Sort [codegen id : 24]
 Input [4]: [ws_bill_customer_sk#44, ws_quantity#45, ws_list_price#46, ws_sold_date_sk#47]
 Arguments: [ws_bill_customer_sk#44 ASC NULLS FIRST], false, 0
 
 (71) ReusedExchange [Reuses operator id: 37]
 Output [3]: [c_customer_sk#24, sum#27, isEmpty#28]
 
-(72) HashAggregate [codegen id : 26]
+(72) HashAggregate [codegen id : 27]
 Input [3]: [c_customer_sk#24, sum#27, isEmpty#28]
 Keys [1]: [c_customer_sk#24]
 Functions [1]: [sum((cast(ss_quantity#21 as decimal(10,0)) * ss_sales_price#22))]
 Aggregate Attributes [1]: [sum((cast(ss_quantity#21 as decimal(10,0)) * ss_sales_price#22))#29]
 Results [2]: [c_customer_sk#24, sum((cast(ss_quantity#21 as decimal(10,0)) * ss_sales_price#22))#29 AS ssales#30]
 
-(73) Filter [codegen id : 26]
+(73) Filter [codegen id : 27]
 Input [2]: [c_customer_sk#24, ssales#30]
 Condition : (isnotnull(ssales#30) AND (cast(ssales#30 as decimal(38,8)) > (0.500000 * ReusedSubquery Subquery scalar-subquery#31, [id=#32])))
 
-(74) Project [codegen id : 26]
+(74) Project [codegen id : 27]
 Output [1]: [c_customer_sk#24]
 Input [2]: [c_customer_sk#24, ssales#30]
 
-(75) Sort [codegen id : 26]
+(75) Sort [codegen id : 27]
 Input [1]: [c_customer_sk#24]
 Arguments: [c_customer_sk#24 ASC NULLS FIRST], false, 0
 
-(76) SortMergeJoin [codegen id : 33]
+(76) SortMergeJoin [codegen id : 35]
 Left keys [1]: [ws_bill_customer_sk#44]
 Right keys [1]: [c_customer_sk#24]
 Join type: LeftSemi
@@ -451,30 +451,30 @@ Join condition: None
 (77) ReusedExchange [Reuses operator id: 54]
 Output [3]: [c_customer_sk#49, c_first_name#50, c_last_name#51]
 
-(78) BroadcastHashJoin [codegen id : 33]
+(78) BroadcastHashJoin [codegen id : 35]
 Left keys [1]: [ws_bill_customer_sk#44]
 Right keys [1]: [c_customer_sk#49]
 Join type: Inner
 Join condition: None
 
-(79) Project [codegen id : 33]
+(79) Project [codegen id : 35]
 Output [5]: [ws_quantity#45, ws_list_price#46, ws_sold_date_sk#47, c_first_name#50, c_last_name#51]
 Input [7]: [ws_bill_customer_sk#44, ws_quantity#45, ws_list_price#46, ws_sold_date_sk#47, c_customer_sk#49, c_first_name#50, c_last_name#51]
 
 (80) ReusedExchange [Reuses operator id: 92]
 Output [1]: [d_date_sk#52]
 
-(81) BroadcastHashJoin [codegen id : 33]
+(81) BroadcastHashJoin [codegen id : 35]
 Left keys [1]: [ws_sold_date_sk#47]
 Right keys [1]: [d_date_sk#52]
 Join type: Inner
 Join condition: None
 
-(82) Project [codegen id : 33]
+(82) Project [codegen id : 35]
 Output [4]: [ws_quantity#45, ws_list_price#46, c_first_name#50, c_last_name#51]
 Input [6]: [ws_quantity#45, ws_list_price#46, ws_sold_date_sk#47, c_first_name#50, c_last_name#51, d_date_sk#52]
 
-(83) HashAggregate [codegen id : 33]
+(83) HashAggregate [codegen id : 35]
 Input [4]: [ws_quantity#45, ws_list_price#46, c_first_name#50, c_last_name#51]
 Keys [2]: [c_last_name#51, c_first_name#50]
 Functions [1]: [partial_sum((cast(ws_quantity#45 as decimal(10,0)) * ws_list_price#46))]
@@ -485,7 +485,7 @@ Results [4]: [c_last_name#51, c_first_name#50, sum#55, isEmpty#56]
 Input [4]: [c_last_name#51, c_first_name#50, sum#55, isEmpty#56]
 Arguments: hashpartitioning(c_last_name#51, c_first_name#50, 5), ENSURE_REQUIREMENTS, [plan_id=11]
 
-(85) HashAggregate [codegen id : 34]
+(85) HashAggregate [codegen id : 36]
 Input [4]: [c_last_name#51, c_first_name#50, sum#55, isEmpty#56]
 Keys [2]: [c_last_name#51, c_first_name#50]
 Functions [1]: [sum((cast(ws_quantity#45 as decimal(10,0)) * ws_list_price#46))]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q23b/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q23b/simplified.txt
index 9cbb568a..49ddeaef 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q23b/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q23b/simplified.txt
@@ -1,10 +1,10 @@
 TakeOrderedAndProject [c_last_name,c_first_name,sales]
   Union
-    WholeStageCodegen (17)
+    WholeStageCodegen (18)
       HashAggregate [c_last_name,c_first_name,sum,isEmpty] [sum((cast(cs_quantity as decimal(10,0)) * cs_list_price)),sales,sum,isEmpty]
         InputAdapter
           Exchange [c_last_name,c_first_name] #1
-            WholeStageCodegen (16)
+            WholeStageCodegen (17)
               HashAggregate [c_last_name,c_first_name,cs_quantity,cs_list_price] [sum,isEmpty,sum,isEmpty]
                 Project [cs_quantity,cs_list_price,c_first_name,c_last_name]
                   BroadcastHashJoin [cs_sold_date_sk,d_date_sk]
@@ -124,18 +124,20 @@ TakeOrderedAndProject [c_last_name,c_first_name,sales]
                                                               CometScan parquet spark_catalog.default.customer [c_customer_sk]
                         InputAdapter
                           BroadcastExchange #13
-                            WholeStageCodegen (14)
+                            WholeStageCodegen (15)
                               SortMergeJoin [c_customer_sk,c_customer_sk]
                                 InputAdapter
-                                  WholeStageCodegen (10)
-                                    ColumnarToRow
+                                  WholeStageCodegen (11)
+                                    Sort [c_customer_sk]
                                       InputAdapter
-                                        CometSort [c_customer_sk]
-                                          CometExchange [c_customer_sk] #14
-                                            CometFilter [c_customer_sk]
-                                              CometScan parquet spark_catalog.default.customer [c_customer_sk,c_first_name,c_last_name]
+                                        Exchange [c_customer_sk] #14
+                                          WholeStageCodegen (10)
+                                            ColumnarToRow
+                                              InputAdapter
+                                                CometFilter [c_customer_sk]
+                                                  CometScan parquet spark_catalog.default.customer [c_customer_sk,c_first_name,c_last_name]
                                 InputAdapter
-                                  WholeStageCodegen (13)
+                                  WholeStageCodegen (14)
                                     Sort [c_customer_sk]
                                       Project [c_customer_sk]
                                         Filter [ssales]
@@ -145,11 +147,11 @@ TakeOrderedAndProject [c_last_name,c_first_name,sales]
                                               ReusedExchange [c_customer_sk,sum,isEmpty] #8
                     InputAdapter
                       ReusedExchange [d_date_sk] #3
-    WholeStageCodegen (34)
+    WholeStageCodegen (36)
       HashAggregate [c_last_name,c_first_name,sum,isEmpty] [sum((cast(ws_quantity as decimal(10,0)) * ws_list_price)),sales,sum,isEmpty]
         InputAdapter
           Exchange [c_last_name,c_first_name] #15
-            WholeStageCodegen (33)
+            WholeStageCodegen (35)
               HashAggregate [c_last_name,c_first_name,ws_quantity,ws_list_price] [sum,isEmpty,sum,isEmpty]
                 Project [ws_quantity,ws_list_price,c_first_name,c_last_name]
                   BroadcastHashJoin [ws_sold_date_sk,d_date_sk]
@@ -157,11 +159,11 @@ TakeOrderedAndProject [c_last_name,c_first_name,sales]
                       BroadcastHashJoin [ws_bill_customer_sk,c_customer_sk]
                         SortMergeJoin [ws_bill_customer_sk,c_customer_sk]
                           InputAdapter
-                            WholeStageCodegen (23)
+                            WholeStageCodegen (24)
                               Sort [ws_bill_customer_sk]
                                 InputAdapter
                                   Exchange [ws_bill_customer_sk] #16
-                                    WholeStageCodegen (22)
+                                    WholeStageCodegen (23)
                                       Project [ws_bill_customer_sk,ws_quantity,ws_list_price,ws_sold_date_sk]
                                         BroadcastHashJoin [ws_item_sk,item_sk]
                                           ColumnarToRow
@@ -172,7 +174,7 @@ TakeOrderedAndProject [c_last_name,c_first_name,sales]
                                           InputAdapter
                                             ReusedExchange [item_sk] #4
                           InputAdapter
-                            WholeStageCodegen (26)
+                            WholeStageCodegen (27)
                               Sort [c_customer_sk]
                                 Project [c_customer_sk]
                                   Filter [ssales]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24a/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24a/explain.txt
index 6e03148d..d2534e9b 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24a/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24a/explain.txt
@@ -1,49 +1,50 @@
 == Physical Plan ==
-* Filter (45)
-+- * HashAggregate (44)
-   +- Exchange (43)
-      +- * HashAggregate (42)
-         +- * HashAggregate (41)
-            +- Exchange (40)
-               +- * HashAggregate (39)
-                  +- * Project (38)
-                     +- * BroadcastHashJoin Inner BuildRight (37)
-                        :- * Project (32)
-                        :  +- * BroadcastHashJoin Inner BuildRight (31)
-                        :     :- * Project (26)
-                        :     :  +- * BroadcastHashJoin Inner BuildRight (25)
-                        :     :     :- * Project (20)
-                        :     :     :  +- * BroadcastHashJoin Inner BuildRight (19)
-                        :     :     :     :- * ColumnarToRow (13)
-                        :     :     :     :  +- CometProject (12)
-                        :     :     :     :     +- CometSortMergeJoin (11)
-                        :     :     :     :        :- CometSort (5)
-                        :     :     :     :        :  +- CometExchange (4)
-                        :     :     :     :        :     +- CometProject (3)
-                        :     :     :     :        :        +- CometFilter (2)
-                        :     :     :     :        :           +- CometScan parquet spark_catalog.default.store_sales (1)
-                        :     :     :     :        +- CometSort (10)
-                        :     :     :     :           +- CometExchange (9)
-                        :     :     :     :              +- CometProject (8)
-                        :     :     :     :                 +- CometFilter (7)
-                        :     :     :     :                    +- CometScan parquet spark_catalog.default.store_returns (6)
-                        :     :     :     +- BroadcastExchange (18)
-                        :     :     :        +- * ColumnarToRow (17)
-                        :     :     :           +- CometProject (16)
-                        :     :     :              +- CometFilter (15)
-                        :     :     :                 +- CometScan parquet spark_catalog.default.store (14)
-                        :     :     +- BroadcastExchange (24)
-                        :     :        +- * ColumnarToRow (23)
-                        :     :           +- CometFilter (22)
-                        :     :              +- CometScan parquet spark_catalog.default.item (21)
-                        :     +- BroadcastExchange (30)
-                        :        +- * ColumnarToRow (29)
-                        :           +- CometFilter (28)
-                        :              +- CometScan parquet spark_catalog.default.customer (27)
-                        +- BroadcastExchange (36)
-                           +- * ColumnarToRow (35)
-                              +- CometFilter (34)
-                                 +- CometScan parquet spark_catalog.default.customer_address (33)
+* Filter (46)
++- * HashAggregate (45)
+   +- Exchange (44)
+      +- * HashAggregate (43)
+         +- * HashAggregate (42)
+            +- Exchange (41)
+               +- * HashAggregate (40)
+                  +- * Project (39)
+                     +- * BroadcastHashJoin Inner BuildRight (38)
+                        :- * Project (33)
+                        :  +- * BroadcastHashJoin Inner BuildRight (32)
+                        :     :- * Project (27)
+                        :     :  +- * BroadcastHashJoin Inner BuildRight (26)
+                        :     :     :- * Project (21)
+                        :     :     :  +- * BroadcastHashJoin Inner BuildRight (20)
+                        :     :     :     :- * Project (14)
+                        :     :     :     :  +- * SortMergeJoin Inner (13)
+                        :     :     :     :     :- * Sort (6)
+                        :     :     :     :     :  +- Exchange (5)
+                        :     :     :     :     :     +- * ColumnarToRow (4)
+                        :     :     :     :     :        +- CometProject (3)
+                        :     :     :     :     :           +- CometFilter (2)
+                        :     :     :     :     :              +- CometScan parquet spark_catalog.default.store_sales (1)
+                        :     :     :     :     +- * Sort (12)
+                        :     :     :     :        +- Exchange (11)
+                        :     :     :     :           +- * ColumnarToRow (10)
+                        :     :     :     :              +- CometProject (9)
+                        :     :     :     :                 +- CometFilter (8)
+                        :     :     :     :                    +- CometScan parquet spark_catalog.default.store_returns (7)
+                        :     :     :     +- BroadcastExchange (19)
+                        :     :     :        +- * ColumnarToRow (18)
+                        :     :     :           +- CometProject (17)
+                        :     :     :              +- CometFilter (16)
+                        :     :     :                 +- CometScan parquet spark_catalog.default.store (15)
+                        :     :     +- BroadcastExchange (25)
+                        :     :        +- * ColumnarToRow (24)
+                        :     :           +- CometFilter (23)
+                        :     :              +- CometScan parquet spark_catalog.default.item (22)
+                        :     +- BroadcastExchange (31)
+                        :        +- * ColumnarToRow (30)
+                        :           +- CometFilter (29)
+                        :              +- CometScan parquet spark_catalog.default.customer (28)
+                        +- BroadcastExchange (37)
+                           +- * ColumnarToRow (36)
+                              +- CometFilter (35)
+                                 +- CometScan parquet spark_catalog.default.customer_address (34)
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
@@ -61,13 +62,16 @@ Condition : (((isnotnull(ss_ticket_number#4) AND isnotnull(ss_item_sk#1)) AND is
 Input [6]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, ss_sold_date_sk#6]
 Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5], [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
 
-(4) CometExchange
+(4) ColumnarToRow [codegen id : 1]
 Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
-Arguments: hashpartitioning(ss_ticket_number#4, ss_item_sk#1, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(5) CometSort
+(5) Exchange
 Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5], [ss_ticket_number#4 ASC NULLS FIRST, ss_item_sk#1 ASC NULLS FIRST]
+Arguments: hashpartitioning(ss_ticket_number#4, ss_item_sk#1, 5), ENSURE_REQUIREMENTS, [plan_id=1]
+
+(6) Sort [codegen id : 2]
+Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
+Arguments: [ss_ticket_number#4 ASC NULLS FIRST, ss_item_sk#1 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.store_returns
 Output [3]: [sr_item_sk#7, sr_ticket_number#8, sr_returned_date_sk#9]
@@ -76,33 +80,34 @@ Location [not included in comparison]/{warehouse_dir}/store_returns]
 PushedFilters: [IsNotNull(sr_ticket_number), IsNotNull(sr_item_sk)]
 ReadSchema: struct<sr_item_sk:int,sr_ticket_number:int>
 
-(7) CometFilter
+(8) CometFilter
 Input [3]: [sr_item_sk#7, sr_ticket_number#8, sr_returned_date_sk#9]
 Condition : (isnotnull(sr_ticket_number#8) AND isnotnull(sr_item_sk#7))
 
-(8) CometProject
+(9) CometProject
 Input [3]: [sr_item_sk#7, sr_ticket_number#8, sr_returned_date_sk#9]
 Arguments: [sr_item_sk#7, sr_ticket_number#8], [sr_item_sk#7, sr_ticket_number#8]
 
-(9) CometExchange
+(10) ColumnarToRow [codegen id : 3]
 Input [2]: [sr_item_sk#7, sr_ticket_number#8]
-Arguments: hashpartitioning(sr_ticket_number#8, sr_item_sk#7, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]
 
-(10) CometSort
+(11) Exchange
 Input [2]: [sr_item_sk#7, sr_ticket_number#8]
-Arguments: [sr_item_sk#7, sr_ticket_number#8], [sr_ticket_number#8 ASC NULLS FIRST, sr_item_sk#7 ASC NULLS FIRST]
+Arguments: hashpartitioning(sr_ticket_number#8, sr_item_sk#7, 5), ENSURE_REQUIREMENTS, [plan_id=2]
 
-(11) CometSortMergeJoin
-Left output [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
-Right output [2]: [sr_item_sk#7, sr_ticket_number#8]
-Arguments: [ss_ticket_number#4, ss_item_sk#1], [sr_ticket_number#8, sr_item_sk#7], Inner
+(12) Sort [codegen id : 4]
+Input [2]: [sr_item_sk#7, sr_ticket_number#8]
+Arguments: [sr_ticket_number#8 ASC NULLS FIRST, sr_item_sk#7 ASC NULLS FIRST], false, 0
 
-(12) CometProject
-Input [7]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, sr_item_sk#7, sr_ticket_number#8]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5], [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
+(13) SortMergeJoin [codegen id : 9]
+Left keys [2]: [ss_ticket_number#4, ss_item_sk#1]
+Right keys [2]: [sr_ticket_number#8, sr_item_sk#7]
+Join type: Inner
+Join condition: None
 
-(13) ColumnarToRow [codegen id : 5]
-Input [4]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
+(14) Project [codegen id : 9]
+Output [4]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
+Input [7]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, sr_item_sk#7, sr_ticket_number#8]
 
 (unknown) Scan parquet spark_catalog.default.store
 Output [5]: [s_store_sk#10, s_store_name#11, s_market_id#12, s_state#13, s_zip#14]
@@ -111,28 +116,28 @@ Location [not included in comparison]/{warehouse_dir}/store]
 PushedFilters: [IsNotNull(s_market_id), EqualTo(s_market_id,8), IsNotNull(s_store_sk), IsNotNull(s_zip)]
 ReadSchema: struct<s_store_sk:int,s_store_name:string,s_market_id:int,s_state:string,s_zip:string>
 
-(15) CometFilter
+(16) CometFilter
 Input [5]: [s_store_sk#10, s_store_name#11, s_market_id#12, s_state#13, s_zip#14]
 Condition : (((isnotnull(s_market_id#12) AND (s_market_id#12 = 8)) AND isnotnull(s_store_sk#10)) AND isnotnull(s_zip#14))
 
-(16) CometProject
+(17) CometProject
 Input [5]: [s_store_sk#10, s_store_name#11, s_market_id#12, s_state#13, s_zip#14]
 Arguments: [s_store_sk#10, s_store_name#11, s_state#13, s_zip#14], [s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 
-(17) ColumnarToRow [codegen id : 1]
+(18) ColumnarToRow [codegen id : 5]
 Input [4]: [s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 
-(18) BroadcastExchange
+(19) BroadcastExchange
 Input [4]: [s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=3]
 
-(19) BroadcastHashJoin [codegen id : 5]
+(20) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_store_sk#3]
 Right keys [1]: [s_store_sk#10]
 Join type: Inner
 Join condition: None
 
-(20) Project [codegen id : 5]
+(21) Project [codegen id : 9]
 Output [6]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14]
 Input [8]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5, s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 
@@ -143,24 +148,24 @@ Location [not included in comparison]/{warehouse_dir}/item]
 PushedFilters: [IsNotNull(i_color), EqualTo(i_color,pale                ), IsNotNull(i_item_sk)]
 ReadSchema: struct<i_item_sk:int,i_current_price:decimal(7,2),i_size:string,i_color:string,i_units:string,i_manager_id:int>
 
-(22) CometFilter
+(23) CometFilter
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Condition : ((isnotnull(i_color#18) AND (i_color#18 = pale                )) AND isnotnull(i_item_sk#15))
 
-(23) ColumnarToRow [codegen id : 2]
+(24) ColumnarToRow [codegen id : 6]
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 
-(24) BroadcastExchange
+(25) BroadcastExchange
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=4]
 
-(25) BroadcastHashJoin [codegen id : 5]
+(26) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_item_sk#1]
 Right keys [1]: [i_item_sk#15]
 Join type: Inner
 Join condition: None
 
-(26) Project [codegen id : 5]
+(27) Project [codegen id : 9]
 Output [10]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Input [12]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 
@@ -171,24 +176,24 @@ Location [not included in comparison]/{warehouse_dir}/customer]
 PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_birth_country)]
 ReadSchema: struct<c_customer_sk:int,c_first_name:string,c_last_name:string,c_birth_country:string>
 
-(28) CometFilter
+(29) CometFilter
 Input [4]: [c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 Condition : (isnotnull(c_customer_sk#21) AND isnotnull(c_birth_country#24))
 
-(29) ColumnarToRow [codegen id : 3]
+(30) ColumnarToRow [codegen id : 7]
 Input [4]: [c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 
-(30) BroadcastExchange
+(31) BroadcastExchange
 Input [4]: [c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=5]
 
-(31) BroadcastHashJoin [codegen id : 5]
+(32) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_customer_sk#2]
 Right keys [1]: [c_customer_sk#21]
 Join type: Inner
 Join condition: None
 
-(32) Project [codegen id : 5]
+(33) Project [codegen id : 9]
 Output [12]: [ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, c_birth_country#24]
 Input [14]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 
@@ -199,70 +204,70 @@ Location [not included in comparison]/{warehouse_dir}/customer_address]
 PushedFilters: [IsNotNull(ca_country), IsNotNull(ca_zip)]
 ReadSchema: struct<ca_state:string,ca_zip:string,ca_country:string>
 
-(34) CometFilter
+(35) CometFilter
 Input [3]: [ca_state#25, ca_zip#26, ca_country#27]
 Condition : (isnotnull(ca_country#27) AND isnotnull(ca_zip#26))
 
-(35) ColumnarToRow [codegen id : 4]
+(36) ColumnarToRow [codegen id : 8]
 Input [3]: [ca_state#25, ca_zip#26, ca_country#27]
 
-(36) BroadcastExchange
+(37) BroadcastExchange
 Input [3]: [ca_state#25, ca_zip#26, ca_country#27]
 Arguments: HashedRelationBroadcastMode(List(upper(input[2, string, false]), input[1, string, false]),false), [plan_id=6]
 
-(37) BroadcastHashJoin [codegen id : 5]
+(38) BroadcastHashJoin [codegen id : 9]
 Left keys [2]: [c_birth_country#24, s_zip#14]
 Right keys [2]: [upper(ca_country#27), ca_zip#26]
 Join type: Inner
 Join condition: None
 
-(38) Project [codegen id : 5]
+(39) Project [codegen id : 9]
 Output [11]: [ss_net_paid#5, s_store_name#11, s_state#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, ca_state#25]
 Input [15]: [ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, c_birth_country#24, ca_state#25, ca_zip#26, ca_country#27]
 
-(39) HashAggregate [codegen id : 5]
+(40) HashAggregate [codegen id : 9]
 Input [11]: [ss_net_paid#5, s_store_name#11, s_state#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, ca_state#25]
 Keys [10]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
 Functions [1]: [partial_sum(UnscaledValue(ss_net_paid#5))]
 Aggregate Attributes [1]: [sum#28]
 Results [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#29]
 
-(40) Exchange
+(41) Exchange
 Input [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#29]
 Arguments: hashpartitioning(c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, 5), ENSURE_REQUIREMENTS, [plan_id=7]
 
-(41) HashAggregate [codegen id : 6]
+(42) HashAggregate [codegen id : 10]
 Input [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#29]
 Keys [10]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
 Functions [1]: [sum(UnscaledValue(ss_net_paid#5))]
 Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#5))#30]
 Results [4]: [c_last_name#23, c_first_name#22, s_store_name#11, MakeDecimal(sum(UnscaledValue(ss_net_paid#5))#30,17,2) AS netpaid#31]
 
-(42) HashAggregate [codegen id : 6]
+(43) HashAggregate [codegen id : 10]
 Input [4]: [c_last_name#23, c_first_name#22, s_store_name#11, netpaid#31]
 Keys [3]: [c_last_name#23, c_first_name#22, s_store_name#11]
 Functions [1]: [partial_sum(netpaid#31)]
 Aggregate Attributes [2]: [sum#32, isEmpty#33]
 Results [5]: [c_last_name#23, c_first_name#22, s_store_name#11, sum#34, isEmpty#35]
 
-(43) Exchange
+(44) Exchange
 Input [5]: [c_last_name#23, c_first_name#22, s_store_name#11, sum#34, isEmpty#35]
 Arguments: hashpartitioning(c_last_name#23, c_first_name#22, s_store_name#11, 5), ENSURE_REQUIREMENTS, [plan_id=8]
 
-(44) HashAggregate [codegen id : 7]
+(45) HashAggregate [codegen id : 11]
 Input [5]: [c_last_name#23, c_first_name#22, s_store_name#11, sum#34, isEmpty#35]
 Keys [3]: [c_last_name#23, c_first_name#22, s_store_name#11]
 Functions [1]: [sum(netpaid#31)]
 Aggregate Attributes [1]: [sum(netpaid#31)#36]
 Results [4]: [c_last_name#23, c_first_name#22, s_store_name#11, sum(netpaid#31)#36 AS paid#37]
 
-(45) Filter [codegen id : 7]
+(46) Filter [codegen id : 11]
 Input [4]: [c_last_name#23, c_first_name#22, s_store_name#11, paid#37]
 Condition : (isnotnull(paid#37) AND (cast(paid#37 as decimal(33,8)) > cast(Subquery scalar-subquery#38, [id=#39] as decimal(33,8))))
 
 ===== Subqueries =====
 
-Subquery:1 Hosting operator id = 45 Hosting Expression = Subquery scalar-subquery#38, [id=#39]
+Subquery:1 Hosting operator id = 46 Hosting Expression = Subquery scalar-subquery#38, [id=#39]
 * HashAggregate (73)
 +- Exchange (72)
    +- * HashAggregate (71)
@@ -277,13 +282,12 @@ Subquery:1 Hosting operator id = 45 Hosting Expression = Subquery scalar-subquer
                      :     :  +- * BroadcastHashJoin Inner BuildRight (60)
                      :     :     :- * Project (55)
                      :     :     :  +- * BroadcastHashJoin Inner BuildRight (54)
-                     :     :     :     :- * ColumnarToRow (52)
-                     :     :     :     :  +- CometProject (51)
-                     :     :     :     :     +- CometSortMergeJoin (50)
-                     :     :     :     :        :- CometSort (47)
-                     :     :     :     :        :  +- ReusedExchange (46)
-                     :     :     :     :        +- CometSort (49)
-                     :     :     :     :           +- ReusedExchange (48)
+                     :     :     :     :- * Project (52)
+                     :     :     :     :  +- * SortMergeJoin Inner (51)
+                     :     :     :     :     :- * Sort (48)
+                     :     :     :     :     :  +- ReusedExchange (47)
+                     :     :     :     :     +- * Sort (50)
+                     :     :     :     :        +- ReusedExchange (49)
                      :     :     :     +- ReusedExchange (53)
                      :     :     +- BroadcastExchange (59)
                      :     :        +- * ColumnarToRow (58)
@@ -293,42 +297,40 @@ Subquery:1 Hosting operator id = 45 Hosting Expression = Subquery scalar-subquer
                      +- ReusedExchange (65)
 
 
-(46) ReusedExchange [Reuses operator id: 4]
+(47) ReusedExchange [Reuses operator id: 5]
 Output [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
 
-(47) CometSort
+(48) Sort [codegen id : 2]
 Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5], [ss_ticket_number#4 ASC NULLS FIRST, ss_item_sk#1 ASC NULLS FIRST]
+Arguments: [ss_ticket_number#4 ASC NULLS FIRST, ss_item_sk#1 ASC NULLS FIRST], false, 0
 
-(48) ReusedExchange [Reuses operator id: 9]
+(49) ReusedExchange [Reuses operator id: 11]
 Output [2]: [sr_item_sk#7, sr_ticket_number#8]
 
-(49) CometSort
+(50) Sort [codegen id : 4]
 Input [2]: [sr_item_sk#7, sr_ticket_number#8]
-Arguments: [sr_item_sk#7, sr_ticket_number#8], [sr_ticket_number#8 ASC NULLS FIRST, sr_item_sk#7 ASC NULLS FIRST]
+Arguments: [sr_ticket_number#8 ASC NULLS FIRST, sr_item_sk#7 ASC NULLS FIRST], false, 0
 
-(50) CometSortMergeJoin
-Left output [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
-Right output [2]: [sr_item_sk#7, sr_ticket_number#8]
-Arguments: [ss_ticket_number#4, ss_item_sk#1], [sr_ticket_number#8, sr_item_sk#7], Inner
+(51) SortMergeJoin [codegen id : 9]
+Left keys [2]: [ss_ticket_number#4, ss_item_sk#1]
+Right keys [2]: [sr_ticket_number#8, sr_item_sk#7]
+Join type: Inner
+Join condition: None
 
-(51) CometProject
+(52) Project [codegen id : 9]
+Output [4]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
 Input [7]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, sr_item_sk#7, sr_ticket_number#8]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5], [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
-
-(52) ColumnarToRow [codegen id : 5]
-Input [4]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
 
-(53) ReusedExchange [Reuses operator id: 18]
+(53) ReusedExchange [Reuses operator id: 19]
 Output [4]: [s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 
-(54) BroadcastHashJoin [codegen id : 5]
+(54) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_store_sk#3]
 Right keys [1]: [s_store_sk#10]
 Join type: Inner
 Join condition: None
 
-(55) Project [codegen id : 5]
+(55) Project [codegen id : 9]
 Output [6]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14]
 Input [8]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5, s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 
@@ -343,50 +345,50 @@ ReadSchema: struct<i_item_sk:int,i_current_price:decimal(7,2),i_size:string,i_co
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Condition : isnotnull(i_item_sk#15)
 
-(58) ColumnarToRow [codegen id : 2]
+(58) ColumnarToRow [codegen id : 6]
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 
 (59) BroadcastExchange
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=9]
 
-(60) BroadcastHashJoin [codegen id : 5]
+(60) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_item_sk#1]
 Right keys [1]: [i_item_sk#15]
 Join type: Inner
 Join condition: None
 
-(61) Project [codegen id : 5]
+(61) Project [codegen id : 9]
 Output [10]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Input [12]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 
-(62) ReusedExchange [Reuses operator id: 30]
+(62) ReusedExchange [Reuses operator id: 31]
 Output [4]: [c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 
-(63) BroadcastHashJoin [codegen id : 5]
+(63) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_customer_sk#2]
 Right keys [1]: [c_customer_sk#21]
 Join type: Inner
 Join condition: None
 
-(64) Project [codegen id : 5]
+(64) Project [codegen id : 9]
 Output [12]: [ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, c_birth_country#24]
 Input [14]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 
-(65) ReusedExchange [Reuses operator id: 36]
+(65) ReusedExchange [Reuses operator id: 37]
 Output [3]: [ca_state#25, ca_zip#26, ca_country#27]
 
-(66) BroadcastHashJoin [codegen id : 5]
+(66) BroadcastHashJoin [codegen id : 9]
 Left keys [2]: [c_birth_country#24, s_zip#14]
 Right keys [2]: [upper(ca_country#27), ca_zip#26]
 Join type: Inner
 Join condition: None
 
-(67) Project [codegen id : 5]
+(67) Project [codegen id : 9]
 Output [11]: [ss_net_paid#5, s_store_name#11, s_state#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, ca_state#25]
 Input [15]: [ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, c_birth_country#24, ca_state#25, ca_zip#26, ca_country#27]
 
-(68) HashAggregate [codegen id : 5]
+(68) HashAggregate [codegen id : 9]
 Input [11]: [ss_net_paid#5, s_store_name#11, s_state#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, ca_state#25]
 Keys [10]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
 Functions [1]: [partial_sum(UnscaledValue(ss_net_paid#5))]
@@ -397,14 +399,14 @@ Results [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_
 Input [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#41]
 Arguments: hashpartitioning(c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, 5), ENSURE_REQUIREMENTS, [plan_id=10]
 
-(70) HashAggregate [codegen id : 6]
+(70) HashAggregate [codegen id : 10]
 Input [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#41]
 Keys [10]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
 Functions [1]: [sum(UnscaledValue(ss_net_paid#5))]
 Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#5))#30]
 Results [1]: [MakeDecimal(sum(UnscaledValue(ss_net_paid#5))#30,17,2) AS netpaid#31]
 
-(71) HashAggregate [codegen id : 6]
+(71) HashAggregate [codegen id : 10]
 Input [1]: [netpaid#31]
 Keys: []
 Functions [1]: [partial_avg(netpaid#31)]
@@ -415,7 +417,7 @@ Results [2]: [sum#44, count#45]
 Input [2]: [sum#44, count#45]
 Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=11]
 
-(73) HashAggregate [codegen id : 7]
+(73) HashAggregate [codegen id : 11]
 Input [2]: [sum#44, count#45]
 Keys: []
 Functions [1]: [avg(netpaid#31)]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24a/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24a/simplified.txt
index a4b8fef5..8ebd45fd 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24a/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24a/simplified.txt
@@ -1,16 +1,16 @@
-WholeStageCodegen (7)
+WholeStageCodegen (11)
   Filter [paid]
     Subquery #1
-      WholeStageCodegen (7)
+      WholeStageCodegen (11)
         HashAggregate [sum,count] [avg(netpaid),(0.05 * avg(netpaid)),sum,count]
           InputAdapter
             Exchange #9
-              WholeStageCodegen (6)
+              WholeStageCodegen (10)
                 HashAggregate [netpaid] [sum,count,sum,count]
                   HashAggregate [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size,sum] [sum(UnscaledValue(ss_net_paid)),netpaid,sum]
                     InputAdapter
                       Exchange [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size] #10
-                        WholeStageCodegen (5)
+                        WholeStageCodegen (9)
                           HashAggregate [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size,ss_net_paid] [sum,sum]
                             Project [ss_net_paid,s_store_name,s_state,i_current_price,i_size,i_color,i_units,i_manager_id,c_first_name,c_last_name,ca_state]
                               BroadcastHashJoin [c_birth_country,s_zip,ca_country,ca_zip]
@@ -20,19 +20,23 @@ WholeStageCodegen (7)
                                       BroadcastHashJoin [ss_item_sk,i_item_sk]
                                         Project [ss_item_sk,ss_customer_sk,ss_net_paid,s_store_name,s_state,s_zip]
                                           BroadcastHashJoin [ss_store_sk,s_store_sk]
-                                            ColumnarToRow
-                                              InputAdapter
-                                                CometProject [ss_item_sk,ss_customer_sk,ss_store_sk,ss_net_paid]
-                                                  CometSortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
-                                                    CometSort [ss_ticket_number,ss_item_sk]
-                                                      ReusedExchange [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid] #3
-                                                    CometSort [sr_ticket_number,sr_item_sk]
-                                                      ReusedExchange [sr_item_sk,sr_ticket_number] #4
+                                            Project [ss_item_sk,ss_customer_sk,ss_store_sk,ss_net_paid]
+                                              SortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
+                                                InputAdapter
+                                                  WholeStageCodegen (2)
+                                                    Sort [ss_ticket_number,ss_item_sk]
+                                                      InputAdapter
+                                                        ReusedExchange [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid] #3
+                                                InputAdapter
+                                                  WholeStageCodegen (4)
+                                                    Sort [sr_ticket_number,sr_item_sk]
+                                                      InputAdapter
+                                                        ReusedExchange [sr_item_sk,sr_ticket_number] #4
                                             InputAdapter
                                               ReusedExchange [s_store_sk,s_store_name,s_state,s_zip] #5
                                         InputAdapter
                                           BroadcastExchange #11
-                                            WholeStageCodegen (2)
+                                            WholeStageCodegen (6)
                                               ColumnarToRow
                                                 InputAdapter
                                                   CometFilter [i_item_sk]
@@ -44,12 +48,12 @@ WholeStageCodegen (7)
     HashAggregate [c_last_name,c_first_name,s_store_name,sum,isEmpty] [sum(netpaid),paid,sum,isEmpty]
       InputAdapter
         Exchange [c_last_name,c_first_name,s_store_name] #1
-          WholeStageCodegen (6)
+          WholeStageCodegen (10)
             HashAggregate [c_last_name,c_first_name,s_store_name,netpaid] [sum,isEmpty,sum,isEmpty]
               HashAggregate [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size,sum] [sum(UnscaledValue(ss_net_paid)),netpaid,sum]
                 InputAdapter
                   Exchange [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size] #2
-                    WholeStageCodegen (5)
+                    WholeStageCodegen (9)
                       HashAggregate [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size,ss_net_paid] [sum,sum]
                         Project [ss_net_paid,s_store_name,s_state,i_current_price,i_size,i_color,i_units,i_manager_id,c_first_name,c_last_name,ca_state]
                           BroadcastHashJoin [c_birth_country,s_zip,ca_country,ca_zip]
@@ -59,23 +63,33 @@ WholeStageCodegen (7)
                                   BroadcastHashJoin [ss_item_sk,i_item_sk]
                                     Project [ss_item_sk,ss_customer_sk,ss_net_paid,s_store_name,s_state,s_zip]
                                       BroadcastHashJoin [ss_store_sk,s_store_sk]
-                                        ColumnarToRow
-                                          InputAdapter
-                                            CometProject [ss_item_sk,ss_customer_sk,ss_store_sk,ss_net_paid]
-                                              CometSortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
-                                                CometSort [ss_ticket_number,ss_item_sk]
-                                                  CometExchange [ss_ticket_number,ss_item_sk] #3
-                                                    CometProject [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid]
-                                                      CometFilter [ss_ticket_number,ss_item_sk,ss_store_sk,ss_customer_sk]
-                                                        CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid,ss_sold_date_sk]
-                                                CometSort [sr_ticket_number,sr_item_sk]
-                                                  CometExchange [sr_ticket_number,sr_item_sk] #4
-                                                    CometProject [sr_item_sk,sr_ticket_number]
-                                                      CometFilter [sr_ticket_number,sr_item_sk]
-                                                        CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_returned_date_sk]
+                                        Project [ss_item_sk,ss_customer_sk,ss_store_sk,ss_net_paid]
+                                          SortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
+                                            InputAdapter
+                                              WholeStageCodegen (2)
+                                                Sort [ss_ticket_number,ss_item_sk]
+                                                  InputAdapter
+                                                    Exchange [ss_ticket_number,ss_item_sk] #3
+                                                      WholeStageCodegen (1)
+                                                        ColumnarToRow
+                                                          InputAdapter
+                                                            CometProject [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid]
+                                                              CometFilter [ss_ticket_number,ss_item_sk,ss_store_sk,ss_customer_sk]
+                                                                CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid,ss_sold_date_sk]
+                                            InputAdapter
+                                              WholeStageCodegen (4)
+                                                Sort [sr_ticket_number,sr_item_sk]
+                                                  InputAdapter
+                                                    Exchange [sr_ticket_number,sr_item_sk] #4
+                                                      WholeStageCodegen (3)
+                                                        ColumnarToRow
+                                                          InputAdapter
+                                                            CometProject [sr_item_sk,sr_ticket_number]
+                                                              CometFilter [sr_ticket_number,sr_item_sk]
+                                                                CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_returned_date_sk]
                                         InputAdapter
                                           BroadcastExchange #5
-                                            WholeStageCodegen (1)
+                                            WholeStageCodegen (5)
                                               ColumnarToRow
                                                 InputAdapter
                                                   CometProject [s_store_sk,s_store_name,s_state,s_zip]
@@ -83,21 +97,21 @@ WholeStageCodegen (7)
                                                       CometScan parquet spark_catalog.default.store [s_store_sk,s_store_name,s_market_id,s_state,s_zip]
                                     InputAdapter
                                       BroadcastExchange #6
-                                        WholeStageCodegen (2)
+                                        WholeStageCodegen (6)
                                           ColumnarToRow
                                             InputAdapter
                                               CometFilter [i_color,i_item_sk]
                                                 CometScan parquet spark_catalog.default.item [i_item_sk,i_current_price,i_size,i_color,i_units,i_manager_id]
                                 InputAdapter
                                   BroadcastExchange #7
-                                    WholeStageCodegen (3)
+                                    WholeStageCodegen (7)
                                       ColumnarToRow
                                         InputAdapter
                                           CometFilter [c_customer_sk,c_birth_country]
                                             CometScan parquet spark_catalog.default.customer [c_customer_sk,c_first_name,c_last_name,c_birth_country]
                             InputAdapter
                               BroadcastExchange #8
-                                WholeStageCodegen (4)
+                                WholeStageCodegen (8)
                                   ColumnarToRow
                                     InputAdapter
                                       CometFilter [ca_country,ca_zip]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24b/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24b/explain.txt
index fb3113df..f9179096 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24b/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24b/explain.txt
@@ -1,49 +1,50 @@
 == Physical Plan ==
-* Filter (45)
-+- * HashAggregate (44)
-   +- Exchange (43)
-      +- * HashAggregate (42)
-         +- * HashAggregate (41)
-            +- Exchange (40)
-               +- * HashAggregate (39)
-                  +- * Project (38)
-                     +- * BroadcastHashJoin Inner BuildRight (37)
-                        :- * Project (32)
-                        :  +- * BroadcastHashJoin Inner BuildRight (31)
-                        :     :- * Project (26)
-                        :     :  +- * BroadcastHashJoin Inner BuildRight (25)
-                        :     :     :- * Project (20)
-                        :     :     :  +- * BroadcastHashJoin Inner BuildRight (19)
-                        :     :     :     :- * ColumnarToRow (13)
-                        :     :     :     :  +- CometProject (12)
-                        :     :     :     :     +- CometSortMergeJoin (11)
-                        :     :     :     :        :- CometSort (5)
-                        :     :     :     :        :  +- CometExchange (4)
-                        :     :     :     :        :     +- CometProject (3)
-                        :     :     :     :        :        +- CometFilter (2)
-                        :     :     :     :        :           +- CometScan parquet spark_catalog.default.store_sales (1)
-                        :     :     :     :        +- CometSort (10)
-                        :     :     :     :           +- CometExchange (9)
-                        :     :     :     :              +- CometProject (8)
-                        :     :     :     :                 +- CometFilter (7)
-                        :     :     :     :                    +- CometScan parquet spark_catalog.default.store_returns (6)
-                        :     :     :     +- BroadcastExchange (18)
-                        :     :     :        +- * ColumnarToRow (17)
-                        :     :     :           +- CometProject (16)
-                        :     :     :              +- CometFilter (15)
-                        :     :     :                 +- CometScan parquet spark_catalog.default.store (14)
-                        :     :     +- BroadcastExchange (24)
-                        :     :        +- * ColumnarToRow (23)
-                        :     :           +- CometFilter (22)
-                        :     :              +- CometScan parquet spark_catalog.default.item (21)
-                        :     +- BroadcastExchange (30)
-                        :        +- * ColumnarToRow (29)
-                        :           +- CometFilter (28)
-                        :              +- CometScan parquet spark_catalog.default.customer (27)
-                        +- BroadcastExchange (36)
-                           +- * ColumnarToRow (35)
-                              +- CometFilter (34)
-                                 +- CometScan parquet spark_catalog.default.customer_address (33)
+* Filter (46)
++- * HashAggregate (45)
+   +- Exchange (44)
+      +- * HashAggregate (43)
+         +- * HashAggregate (42)
+            +- Exchange (41)
+               +- * HashAggregate (40)
+                  +- * Project (39)
+                     +- * BroadcastHashJoin Inner BuildRight (38)
+                        :- * Project (33)
+                        :  +- * BroadcastHashJoin Inner BuildRight (32)
+                        :     :- * Project (27)
+                        :     :  +- * BroadcastHashJoin Inner BuildRight (26)
+                        :     :     :- * Project (21)
+                        :     :     :  +- * BroadcastHashJoin Inner BuildRight (20)
+                        :     :     :     :- * Project (14)
+                        :     :     :     :  +- * SortMergeJoin Inner (13)
+                        :     :     :     :     :- * Sort (6)
+                        :     :     :     :     :  +- Exchange (5)
+                        :     :     :     :     :     +- * ColumnarToRow (4)
+                        :     :     :     :     :        +- CometProject (3)
+                        :     :     :     :     :           +- CometFilter (2)
+                        :     :     :     :     :              +- CometScan parquet spark_catalog.default.store_sales (1)
+                        :     :     :     :     +- * Sort (12)
+                        :     :     :     :        +- Exchange (11)
+                        :     :     :     :           +- * ColumnarToRow (10)
+                        :     :     :     :              +- CometProject (9)
+                        :     :     :     :                 +- CometFilter (8)
+                        :     :     :     :                    +- CometScan parquet spark_catalog.default.store_returns (7)
+                        :     :     :     +- BroadcastExchange (19)
+                        :     :     :        +- * ColumnarToRow (18)
+                        :     :     :           +- CometProject (17)
+                        :     :     :              +- CometFilter (16)
+                        :     :     :                 +- CometScan parquet spark_catalog.default.store (15)
+                        :     :     +- BroadcastExchange (25)
+                        :     :        +- * ColumnarToRow (24)
+                        :     :           +- CometFilter (23)
+                        :     :              +- CometScan parquet spark_catalog.default.item (22)
+                        :     +- BroadcastExchange (31)
+                        :        +- * ColumnarToRow (30)
+                        :           +- CometFilter (29)
+                        :              +- CometScan parquet spark_catalog.default.customer (28)
+                        +- BroadcastExchange (37)
+                           +- * ColumnarToRow (36)
+                              +- CometFilter (35)
+                                 +- CometScan parquet spark_catalog.default.customer_address (34)
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
@@ -61,13 +62,16 @@ Condition : (((isnotnull(ss_ticket_number#4) AND isnotnull(ss_item_sk#1)) AND is
 Input [6]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, ss_sold_date_sk#6]
 Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5], [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
 
-(4) CometExchange
+(4) ColumnarToRow [codegen id : 1]
 Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
-Arguments: hashpartitioning(ss_ticket_number#4, ss_item_sk#1, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(5) CometSort
+(5) Exchange
 Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5], [ss_ticket_number#4 ASC NULLS FIRST, ss_item_sk#1 ASC NULLS FIRST]
+Arguments: hashpartitioning(ss_ticket_number#4, ss_item_sk#1, 5), ENSURE_REQUIREMENTS, [plan_id=1]
+
+(6) Sort [codegen id : 2]
+Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
+Arguments: [ss_ticket_number#4 ASC NULLS FIRST, ss_item_sk#1 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.store_returns
 Output [3]: [sr_item_sk#7, sr_ticket_number#8, sr_returned_date_sk#9]
@@ -76,33 +80,34 @@ Location [not included in comparison]/{warehouse_dir}/store_returns]
 PushedFilters: [IsNotNull(sr_ticket_number), IsNotNull(sr_item_sk)]
 ReadSchema: struct<sr_item_sk:int,sr_ticket_number:int>
 
-(7) CometFilter
+(8) CometFilter
 Input [3]: [sr_item_sk#7, sr_ticket_number#8, sr_returned_date_sk#9]
 Condition : (isnotnull(sr_ticket_number#8) AND isnotnull(sr_item_sk#7))
 
-(8) CometProject
+(9) CometProject
 Input [3]: [sr_item_sk#7, sr_ticket_number#8, sr_returned_date_sk#9]
 Arguments: [sr_item_sk#7, sr_ticket_number#8], [sr_item_sk#7, sr_ticket_number#8]
 
-(9) CometExchange
+(10) ColumnarToRow [codegen id : 3]
 Input [2]: [sr_item_sk#7, sr_ticket_number#8]
-Arguments: hashpartitioning(sr_ticket_number#8, sr_item_sk#7, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]
 
-(10) CometSort
+(11) Exchange
 Input [2]: [sr_item_sk#7, sr_ticket_number#8]
-Arguments: [sr_item_sk#7, sr_ticket_number#8], [sr_ticket_number#8 ASC NULLS FIRST, sr_item_sk#7 ASC NULLS FIRST]
+Arguments: hashpartitioning(sr_ticket_number#8, sr_item_sk#7, 5), ENSURE_REQUIREMENTS, [plan_id=2]
 
-(11) CometSortMergeJoin
-Left output [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
-Right output [2]: [sr_item_sk#7, sr_ticket_number#8]
-Arguments: [ss_ticket_number#4, ss_item_sk#1], [sr_ticket_number#8, sr_item_sk#7], Inner
+(12) Sort [codegen id : 4]
+Input [2]: [sr_item_sk#7, sr_ticket_number#8]
+Arguments: [sr_ticket_number#8 ASC NULLS FIRST, sr_item_sk#7 ASC NULLS FIRST], false, 0
 
-(12) CometProject
-Input [7]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, sr_item_sk#7, sr_ticket_number#8]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5], [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
+(13) SortMergeJoin [codegen id : 9]
+Left keys [2]: [ss_ticket_number#4, ss_item_sk#1]
+Right keys [2]: [sr_ticket_number#8, sr_item_sk#7]
+Join type: Inner
+Join condition: None
 
-(13) ColumnarToRow [codegen id : 5]
-Input [4]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
+(14) Project [codegen id : 9]
+Output [4]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
+Input [7]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, sr_item_sk#7, sr_ticket_number#8]
 
 (unknown) Scan parquet spark_catalog.default.store
 Output [5]: [s_store_sk#10, s_store_name#11, s_market_id#12, s_state#13, s_zip#14]
@@ -111,28 +116,28 @@ Location [not included in comparison]/{warehouse_dir}/store]
 PushedFilters: [IsNotNull(s_market_id), EqualTo(s_market_id,8), IsNotNull(s_store_sk), IsNotNull(s_zip)]
 ReadSchema: struct<s_store_sk:int,s_store_name:string,s_market_id:int,s_state:string,s_zip:string>
 
-(15) CometFilter
+(16) CometFilter
 Input [5]: [s_store_sk#10, s_store_name#11, s_market_id#12, s_state#13, s_zip#14]
 Condition : (((isnotnull(s_market_id#12) AND (s_market_id#12 = 8)) AND isnotnull(s_store_sk#10)) AND isnotnull(s_zip#14))
 
-(16) CometProject
+(17) CometProject
 Input [5]: [s_store_sk#10, s_store_name#11, s_market_id#12, s_state#13, s_zip#14]
 Arguments: [s_store_sk#10, s_store_name#11, s_state#13, s_zip#14], [s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 
-(17) ColumnarToRow [codegen id : 1]
+(18) ColumnarToRow [codegen id : 5]
 Input [4]: [s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 
-(18) BroadcastExchange
+(19) BroadcastExchange
 Input [4]: [s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=3]
 
-(19) BroadcastHashJoin [codegen id : 5]
+(20) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_store_sk#3]
 Right keys [1]: [s_store_sk#10]
 Join type: Inner
 Join condition: None
 
-(20) Project [codegen id : 5]
+(21) Project [codegen id : 9]
 Output [6]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14]
 Input [8]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5, s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 
@@ -143,24 +148,24 @@ Location [not included in comparison]/{warehouse_dir}/item]
 PushedFilters: [IsNotNull(i_color), EqualTo(i_color,chiffon             ), IsNotNull(i_item_sk)]
 ReadSchema: struct<i_item_sk:int,i_current_price:decimal(7,2),i_size:string,i_color:string,i_units:string,i_manager_id:int>
 
-(22) CometFilter
+(23) CometFilter
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Condition : ((isnotnull(i_color#18) AND (i_color#18 = chiffon             )) AND isnotnull(i_item_sk#15))
 
-(23) ColumnarToRow [codegen id : 2]
+(24) ColumnarToRow [codegen id : 6]
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 
-(24) BroadcastExchange
+(25) BroadcastExchange
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=4]
 
-(25) BroadcastHashJoin [codegen id : 5]
+(26) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_item_sk#1]
 Right keys [1]: [i_item_sk#15]
 Join type: Inner
 Join condition: None
 
-(26) Project [codegen id : 5]
+(27) Project [codegen id : 9]
 Output [10]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Input [12]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 
@@ -171,24 +176,24 @@ Location [not included in comparison]/{warehouse_dir}/customer]
 PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_birth_country)]
 ReadSchema: struct<c_customer_sk:int,c_first_name:string,c_last_name:string,c_birth_country:string>
 
-(28) CometFilter
+(29) CometFilter
 Input [4]: [c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 Condition : (isnotnull(c_customer_sk#21) AND isnotnull(c_birth_country#24))
 
-(29) ColumnarToRow [codegen id : 3]
+(30) ColumnarToRow [codegen id : 7]
 Input [4]: [c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 
-(30) BroadcastExchange
+(31) BroadcastExchange
 Input [4]: [c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=5]
 
-(31) BroadcastHashJoin [codegen id : 5]
+(32) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_customer_sk#2]
 Right keys [1]: [c_customer_sk#21]
 Join type: Inner
 Join condition: None
 
-(32) Project [codegen id : 5]
+(33) Project [codegen id : 9]
 Output [12]: [ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, c_birth_country#24]
 Input [14]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 
@@ -199,70 +204,70 @@ Location [not included in comparison]/{warehouse_dir}/customer_address]
 PushedFilters: [IsNotNull(ca_country), IsNotNull(ca_zip)]
 ReadSchema: struct<ca_state:string,ca_zip:string,ca_country:string>
 
-(34) CometFilter
+(35) CometFilter
 Input [3]: [ca_state#25, ca_zip#26, ca_country#27]
 Condition : (isnotnull(ca_country#27) AND isnotnull(ca_zip#26))
 
-(35) ColumnarToRow [codegen id : 4]
+(36) ColumnarToRow [codegen id : 8]
 Input [3]: [ca_state#25, ca_zip#26, ca_country#27]
 
-(36) BroadcastExchange
+(37) BroadcastExchange
 Input [3]: [ca_state#25, ca_zip#26, ca_country#27]
 Arguments: HashedRelationBroadcastMode(List(upper(input[2, string, false]), input[1, string, false]),false), [plan_id=6]
 
-(37) BroadcastHashJoin [codegen id : 5]
+(38) BroadcastHashJoin [codegen id : 9]
 Left keys [2]: [c_birth_country#24, s_zip#14]
 Right keys [2]: [upper(ca_country#27), ca_zip#26]
 Join type: Inner
 Join condition: None
 
-(38) Project [codegen id : 5]
+(39) Project [codegen id : 9]
 Output [11]: [ss_net_paid#5, s_store_name#11, s_state#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, ca_state#25]
 Input [15]: [ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, c_birth_country#24, ca_state#25, ca_zip#26, ca_country#27]
 
-(39) HashAggregate [codegen id : 5]
+(40) HashAggregate [codegen id : 9]
 Input [11]: [ss_net_paid#5, s_store_name#11, s_state#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, ca_state#25]
 Keys [10]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
 Functions [1]: [partial_sum(UnscaledValue(ss_net_paid#5))]
 Aggregate Attributes [1]: [sum#28]
 Results [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#29]
 
-(40) Exchange
+(41) Exchange
 Input [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#29]
 Arguments: hashpartitioning(c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, 5), ENSURE_REQUIREMENTS, [plan_id=7]
 
-(41) HashAggregate [codegen id : 6]
+(42) HashAggregate [codegen id : 10]
 Input [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#29]
 Keys [10]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
 Functions [1]: [sum(UnscaledValue(ss_net_paid#5))]
 Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#5))#30]
 Results [4]: [c_last_name#23, c_first_name#22, s_store_name#11, MakeDecimal(sum(UnscaledValue(ss_net_paid#5))#30,17,2) AS netpaid#31]
 
-(42) HashAggregate [codegen id : 6]
+(43) HashAggregate [codegen id : 10]
 Input [4]: [c_last_name#23, c_first_name#22, s_store_name#11, netpaid#31]
 Keys [3]: [c_last_name#23, c_first_name#22, s_store_name#11]
 Functions [1]: [partial_sum(netpaid#31)]
 Aggregate Attributes [2]: [sum#32, isEmpty#33]
 Results [5]: [c_last_name#23, c_first_name#22, s_store_name#11, sum#34, isEmpty#35]
 
-(43) Exchange
+(44) Exchange
 Input [5]: [c_last_name#23, c_first_name#22, s_store_name#11, sum#34, isEmpty#35]
 Arguments: hashpartitioning(c_last_name#23, c_first_name#22, s_store_name#11, 5), ENSURE_REQUIREMENTS, [plan_id=8]
 
-(44) HashAggregate [codegen id : 7]
+(45) HashAggregate [codegen id : 11]
 Input [5]: [c_last_name#23, c_first_name#22, s_store_name#11, sum#34, isEmpty#35]
 Keys [3]: [c_last_name#23, c_first_name#22, s_store_name#11]
 Functions [1]: [sum(netpaid#31)]
 Aggregate Attributes [1]: [sum(netpaid#31)#36]
 Results [4]: [c_last_name#23, c_first_name#22, s_store_name#11, sum(netpaid#31)#36 AS paid#37]
 
-(45) Filter [codegen id : 7]
+(46) Filter [codegen id : 11]
 Input [4]: [c_last_name#23, c_first_name#22, s_store_name#11, paid#37]
 Condition : (isnotnull(paid#37) AND (cast(paid#37 as decimal(33,8)) > cast(Subquery scalar-subquery#38, [id=#39] as decimal(33,8))))
 
 ===== Subqueries =====
 
-Subquery:1 Hosting operator id = 45 Hosting Expression = Subquery scalar-subquery#38, [id=#39]
+Subquery:1 Hosting operator id = 46 Hosting Expression = Subquery scalar-subquery#38, [id=#39]
 * HashAggregate (73)
 +- Exchange (72)
    +- * HashAggregate (71)
@@ -277,13 +282,12 @@ Subquery:1 Hosting operator id = 45 Hosting Expression = Subquery scalar-subquer
                      :     :  +- * BroadcastHashJoin Inner BuildRight (60)
                      :     :     :- * Project (55)
                      :     :     :  +- * BroadcastHashJoin Inner BuildRight (54)
-                     :     :     :     :- * ColumnarToRow (52)
-                     :     :     :     :  +- CometProject (51)
-                     :     :     :     :     +- CometSortMergeJoin (50)
-                     :     :     :     :        :- CometSort (47)
-                     :     :     :     :        :  +- ReusedExchange (46)
-                     :     :     :     :        +- CometSort (49)
-                     :     :     :     :           +- ReusedExchange (48)
+                     :     :     :     :- * Project (52)
+                     :     :     :     :  +- * SortMergeJoin Inner (51)
+                     :     :     :     :     :- * Sort (48)
+                     :     :     :     :     :  +- ReusedExchange (47)
+                     :     :     :     :     +- * Sort (50)
+                     :     :     :     :        +- ReusedExchange (49)
                      :     :     :     +- ReusedExchange (53)
                      :     :     +- BroadcastExchange (59)
                      :     :        +- * ColumnarToRow (58)
@@ -293,42 +297,40 @@ Subquery:1 Hosting operator id = 45 Hosting Expression = Subquery scalar-subquer
                      +- ReusedExchange (65)
 
 
-(46) ReusedExchange [Reuses operator id: 4]
+(47) ReusedExchange [Reuses operator id: 5]
 Output [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
 
-(47) CometSort
+(48) Sort [codegen id : 2]
 Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5], [ss_ticket_number#4 ASC NULLS FIRST, ss_item_sk#1 ASC NULLS FIRST]
+Arguments: [ss_ticket_number#4 ASC NULLS FIRST, ss_item_sk#1 ASC NULLS FIRST], false, 0
 
-(48) ReusedExchange [Reuses operator id: 9]
+(49) ReusedExchange [Reuses operator id: 11]
 Output [2]: [sr_item_sk#7, sr_ticket_number#8]
 
-(49) CometSort
+(50) Sort [codegen id : 4]
 Input [2]: [sr_item_sk#7, sr_ticket_number#8]
-Arguments: [sr_item_sk#7, sr_ticket_number#8], [sr_ticket_number#8 ASC NULLS FIRST, sr_item_sk#7 ASC NULLS FIRST]
+Arguments: [sr_ticket_number#8 ASC NULLS FIRST, sr_item_sk#7 ASC NULLS FIRST], false, 0
 
-(50) CometSortMergeJoin
-Left output [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
-Right output [2]: [sr_item_sk#7, sr_ticket_number#8]
-Arguments: [ss_ticket_number#4, ss_item_sk#1], [sr_ticket_number#8, sr_item_sk#7], Inner
+(51) SortMergeJoin [codegen id : 9]
+Left keys [2]: [ss_ticket_number#4, ss_item_sk#1]
+Right keys [2]: [sr_ticket_number#8, sr_item_sk#7]
+Join type: Inner
+Join condition: None
 
-(51) CometProject
+(52) Project [codegen id : 9]
+Output [4]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
 Input [7]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, sr_item_sk#7, sr_ticket_number#8]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5], [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
-
-(52) ColumnarToRow [codegen id : 5]
-Input [4]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5]
 
-(53) ReusedExchange [Reuses operator id: 18]
+(53) ReusedExchange [Reuses operator id: 19]
 Output [4]: [s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 
-(54) BroadcastHashJoin [codegen id : 5]
+(54) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_store_sk#3]
 Right keys [1]: [s_store_sk#10]
 Join type: Inner
 Join condition: None
 
-(55) Project [codegen id : 5]
+(55) Project [codegen id : 9]
 Output [6]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14]
 Input [8]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5, s_store_sk#10, s_store_name#11, s_state#13, s_zip#14]
 
@@ -343,50 +345,50 @@ ReadSchema: struct<i_item_sk:int,i_current_price:decimal(7,2),i_size:string,i_co
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Condition : isnotnull(i_item_sk#15)
 
-(58) ColumnarToRow [codegen id : 2]
+(58) ColumnarToRow [codegen id : 6]
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 
 (59) BroadcastExchange
 Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=9]
 
-(60) BroadcastHashJoin [codegen id : 5]
+(60) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_item_sk#1]
 Right keys [1]: [i_item_sk#15]
 Join type: Inner
 Join condition: None
 
-(61) Project [codegen id : 5]
+(61) Project [codegen id : 9]
 Output [10]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 Input [12]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
 
-(62) ReusedExchange [Reuses operator id: 30]
+(62) ReusedExchange [Reuses operator id: 31]
 Output [4]: [c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 
-(63) BroadcastHashJoin [codegen id : 5]
+(63) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_customer_sk#2]
 Right keys [1]: [c_customer_sk#21]
 Join type: Inner
 Join condition: None
 
-(64) Project [codegen id : 5]
+(64) Project [codegen id : 9]
 Output [12]: [ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, c_birth_country#24]
 Input [14]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_customer_sk#21, c_first_name#22, c_last_name#23, c_birth_country#24]
 
-(65) ReusedExchange [Reuses operator id: 36]
+(65) ReusedExchange [Reuses operator id: 37]
 Output [3]: [ca_state#25, ca_zip#26, ca_country#27]
 
-(66) BroadcastHashJoin [codegen id : 5]
+(66) BroadcastHashJoin [codegen id : 9]
 Left keys [2]: [c_birth_country#24, s_zip#14]
 Right keys [2]: [upper(ca_country#27), ca_zip#26]
 Join type: Inner
 Join condition: None
 
-(67) Project [codegen id : 5]
+(67) Project [codegen id : 9]
 Output [11]: [ss_net_paid#5, s_store_name#11, s_state#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, ca_state#25]
 Input [15]: [ss_net_paid#5, s_store_name#11, s_state#13, s_zip#14, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, c_birth_country#24, ca_state#25, ca_zip#26, ca_country#27]
 
-(68) HashAggregate [codegen id : 5]
+(68) HashAggregate [codegen id : 9]
 Input [11]: [ss_net_paid#5, s_store_name#11, s_state#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#22, c_last_name#23, ca_state#25]
 Keys [10]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
 Functions [1]: [partial_sum(UnscaledValue(ss_net_paid#5))]
@@ -397,14 +399,14 @@ Results [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_
 Input [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#41]
 Arguments: hashpartitioning(c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, 5), ENSURE_REQUIREMENTS, [plan_id=10]
 
-(70) HashAggregate [codegen id : 6]
+(70) HashAggregate [codegen id : 10]
 Input [11]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#41]
 Keys [10]: [c_last_name#23, c_first_name#22, s_store_name#11, ca_state#25, s_state#13, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
 Functions [1]: [sum(UnscaledValue(ss_net_paid#5))]
 Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#5))#30]
 Results [1]: [MakeDecimal(sum(UnscaledValue(ss_net_paid#5))#30,17,2) AS netpaid#31]
 
-(71) HashAggregate [codegen id : 6]
+(71) HashAggregate [codegen id : 10]
 Input [1]: [netpaid#31]
 Keys: []
 Functions [1]: [partial_avg(netpaid#31)]
@@ -415,7 +417,7 @@ Results [2]: [sum#44, count#45]
 Input [2]: [sum#44, count#45]
 Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=11]
 
-(73) HashAggregate [codegen id : 7]
+(73) HashAggregate [codegen id : 11]
 Input [2]: [sum#44, count#45]
 Keys: []
 Functions [1]: [avg(netpaid#31)]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24b/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24b/simplified.txt
index a4b8fef5..8ebd45fd 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24b/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q24b/simplified.txt
@@ -1,16 +1,16 @@
-WholeStageCodegen (7)
+WholeStageCodegen (11)
   Filter [paid]
     Subquery #1
-      WholeStageCodegen (7)
+      WholeStageCodegen (11)
         HashAggregate [sum,count] [avg(netpaid),(0.05 * avg(netpaid)),sum,count]
           InputAdapter
             Exchange #9
-              WholeStageCodegen (6)
+              WholeStageCodegen (10)
                 HashAggregate [netpaid] [sum,count,sum,count]
                   HashAggregate [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size,sum] [sum(UnscaledValue(ss_net_paid)),netpaid,sum]
                     InputAdapter
                       Exchange [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size] #10
-                        WholeStageCodegen (5)
+                        WholeStageCodegen (9)
                           HashAggregate [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size,ss_net_paid] [sum,sum]
                             Project [ss_net_paid,s_store_name,s_state,i_current_price,i_size,i_color,i_units,i_manager_id,c_first_name,c_last_name,ca_state]
                               BroadcastHashJoin [c_birth_country,s_zip,ca_country,ca_zip]
@@ -20,19 +20,23 @@ WholeStageCodegen (7)
                                       BroadcastHashJoin [ss_item_sk,i_item_sk]
                                         Project [ss_item_sk,ss_customer_sk,ss_net_paid,s_store_name,s_state,s_zip]
                                           BroadcastHashJoin [ss_store_sk,s_store_sk]
-                                            ColumnarToRow
-                                              InputAdapter
-                                                CometProject [ss_item_sk,ss_customer_sk,ss_store_sk,ss_net_paid]
-                                                  CometSortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
-                                                    CometSort [ss_ticket_number,ss_item_sk]
-                                                      ReusedExchange [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid] #3
-                                                    CometSort [sr_ticket_number,sr_item_sk]
-                                                      ReusedExchange [sr_item_sk,sr_ticket_number] #4
+                                            Project [ss_item_sk,ss_customer_sk,ss_store_sk,ss_net_paid]
+                                              SortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
+                                                InputAdapter
+                                                  WholeStageCodegen (2)
+                                                    Sort [ss_ticket_number,ss_item_sk]
+                                                      InputAdapter
+                                                        ReusedExchange [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid] #3
+                                                InputAdapter
+                                                  WholeStageCodegen (4)
+                                                    Sort [sr_ticket_number,sr_item_sk]
+                                                      InputAdapter
+                                                        ReusedExchange [sr_item_sk,sr_ticket_number] #4
                                             InputAdapter
                                               ReusedExchange [s_store_sk,s_store_name,s_state,s_zip] #5
                                         InputAdapter
                                           BroadcastExchange #11
-                                            WholeStageCodegen (2)
+                                            WholeStageCodegen (6)
                                               ColumnarToRow
                                                 InputAdapter
                                                   CometFilter [i_item_sk]
@@ -44,12 +48,12 @@ WholeStageCodegen (7)
     HashAggregate [c_last_name,c_first_name,s_store_name,sum,isEmpty] [sum(netpaid),paid,sum,isEmpty]
       InputAdapter
         Exchange [c_last_name,c_first_name,s_store_name] #1
-          WholeStageCodegen (6)
+          WholeStageCodegen (10)
             HashAggregate [c_last_name,c_first_name,s_store_name,netpaid] [sum,isEmpty,sum,isEmpty]
               HashAggregate [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size,sum] [sum(UnscaledValue(ss_net_paid)),netpaid,sum]
                 InputAdapter
                   Exchange [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size] #2
-                    WholeStageCodegen (5)
+                    WholeStageCodegen (9)
                       HashAggregate [c_last_name,c_first_name,s_store_name,ca_state,s_state,i_color,i_current_price,i_manager_id,i_units,i_size,ss_net_paid] [sum,sum]
                         Project [ss_net_paid,s_store_name,s_state,i_current_price,i_size,i_color,i_units,i_manager_id,c_first_name,c_last_name,ca_state]
                           BroadcastHashJoin [c_birth_country,s_zip,ca_country,ca_zip]
@@ -59,23 +63,33 @@ WholeStageCodegen (7)
                                   BroadcastHashJoin [ss_item_sk,i_item_sk]
                                     Project [ss_item_sk,ss_customer_sk,ss_net_paid,s_store_name,s_state,s_zip]
                                       BroadcastHashJoin [ss_store_sk,s_store_sk]
-                                        ColumnarToRow
-                                          InputAdapter
-                                            CometProject [ss_item_sk,ss_customer_sk,ss_store_sk,ss_net_paid]
-                                              CometSortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
-                                                CometSort [ss_ticket_number,ss_item_sk]
-                                                  CometExchange [ss_ticket_number,ss_item_sk] #3
-                                                    CometProject [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid]
-                                                      CometFilter [ss_ticket_number,ss_item_sk,ss_store_sk,ss_customer_sk]
-                                                        CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid,ss_sold_date_sk]
-                                                CometSort [sr_ticket_number,sr_item_sk]
-                                                  CometExchange [sr_ticket_number,sr_item_sk] #4
-                                                    CometProject [sr_item_sk,sr_ticket_number]
-                                                      CometFilter [sr_ticket_number,sr_item_sk]
-                                                        CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_returned_date_sk]
+                                        Project [ss_item_sk,ss_customer_sk,ss_store_sk,ss_net_paid]
+                                          SortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
+                                            InputAdapter
+                                              WholeStageCodegen (2)
+                                                Sort [ss_ticket_number,ss_item_sk]
+                                                  InputAdapter
+                                                    Exchange [ss_ticket_number,ss_item_sk] #3
+                                                      WholeStageCodegen (1)
+                                                        ColumnarToRow
+                                                          InputAdapter
+                                                            CometProject [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid]
+                                                              CometFilter [ss_ticket_number,ss_item_sk,ss_store_sk,ss_customer_sk]
+                                                                CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ticket_number,ss_net_paid,ss_sold_date_sk]
+                                            InputAdapter
+                                              WholeStageCodegen (4)
+                                                Sort [sr_ticket_number,sr_item_sk]
+                                                  InputAdapter
+                                                    Exchange [sr_ticket_number,sr_item_sk] #4
+                                                      WholeStageCodegen (3)
+                                                        ColumnarToRow
+                                                          InputAdapter
+                                                            CometProject [sr_item_sk,sr_ticket_number]
+                                                              CometFilter [sr_ticket_number,sr_item_sk]
+                                                                CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_returned_date_sk]
                                         InputAdapter
                                           BroadcastExchange #5
-                                            WholeStageCodegen (1)
+                                            WholeStageCodegen (5)
                                               ColumnarToRow
                                                 InputAdapter
                                                   CometProject [s_store_sk,s_store_name,s_state,s_zip]
@@ -83,21 +97,21 @@ WholeStageCodegen (7)
                                                       CometScan parquet spark_catalog.default.store [s_store_sk,s_store_name,s_market_id,s_state,s_zip]
                                     InputAdapter
                                       BroadcastExchange #6
-                                        WholeStageCodegen (2)
+                                        WholeStageCodegen (6)
                                           ColumnarToRow
                                             InputAdapter
                                               CometFilter [i_color,i_item_sk]
                                                 CometScan parquet spark_catalog.default.item [i_item_sk,i_current_price,i_size,i_color,i_units,i_manager_id]
                                 InputAdapter
                                   BroadcastExchange #7
-                                    WholeStageCodegen (3)
+                                    WholeStageCodegen (7)
                                       ColumnarToRow
                                         InputAdapter
                                           CometFilter [c_customer_sk,c_birth_country]
                                             CometScan parquet spark_catalog.default.customer [c_customer_sk,c_first_name,c_last_name,c_birth_country]
                             InputAdapter
                               BroadcastExchange #8
-                                WholeStageCodegen (4)
+                                WholeStageCodegen (8)
                                   ColumnarToRow
                                     InputAdapter
                                       CometFilter [ca_country,ca_zip]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/explain.txt
index db6d112e..68590236 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/explain.txt
@@ -8,8 +8,8 @@
 :  :  :  :  :  +- Exchange (9)
 :  :  :  :  :     +- * HashAggregate (8)
 :  :  :  :  :        +- * HashAggregate (7)
-:  :  :  :  :           +- * ColumnarToRow (6)
-:  :  :  :  :              +- CometExchange (5)
+:  :  :  :  :           +- Exchange (6)
+:  :  :  :  :              +- * ColumnarToRow (5)
 :  :  :  :  :                 +- CometHashAggregate (4)
 :  :  :  :  :                    +- CometProject (3)
 :  :  :  :  :                       +- CometFilter (2)
@@ -19,8 +19,8 @@
 :  :  :  :        +- Exchange (19)
 :  :  :  :           +- * HashAggregate (18)
 :  :  :  :              +- * HashAggregate (17)
-:  :  :  :                 +- * ColumnarToRow (16)
-:  :  :  :                    +- CometExchange (15)
+:  :  :  :                 +- Exchange (16)
+:  :  :  :                    +- * ColumnarToRow (15)
 :  :  :  :                       +- CometHashAggregate (14)
 :  :  :  :                          +- CometProject (13)
 :  :  :  :                             +- CometFilter (12)
@@ -30,8 +30,8 @@
 :  :  :        +- Exchange (31)
 :  :  :           +- * HashAggregate (30)
 :  :  :              +- * HashAggregate (29)
-:  :  :                 +- * ColumnarToRow (28)
-:  :  :                    +- CometExchange (27)
+:  :  :                 +- Exchange (28)
+:  :  :                    +- * ColumnarToRow (27)
 :  :  :                       +- CometHashAggregate (26)
 :  :  :                          +- CometProject (25)
 :  :  :                             +- CometFilter (24)
@@ -41,8 +41,8 @@
 :  :        +- Exchange (43)
 :  :           +- * HashAggregate (42)
 :  :              +- * HashAggregate (41)
-:  :                 +- * ColumnarToRow (40)
-:  :                    +- CometExchange (39)
+:  :                 +- Exchange (40)
+:  :                    +- * ColumnarToRow (39)
 :  :                       +- CometHashAggregate (38)
 :  :                          +- CometProject (37)
 :  :                             +- CometFilter (36)
@@ -52,8 +52,8 @@
 :        +- Exchange (55)
 :           +- * HashAggregate (54)
 :              +- * HashAggregate (53)
-:                 +- * ColumnarToRow (52)
-:                    +- CometExchange (51)
+:                 +- Exchange (52)
+:                    +- * ColumnarToRow (51)
 :                       +- CometHashAggregate (50)
 :                          +- CometProject (49)
 :                             +- CometFilter (48)
@@ -63,8 +63,8 @@
       +- Exchange (67)
          +- * HashAggregate (66)
             +- * HashAggregate (65)
-               +- * ColumnarToRow (64)
-                  +- CometExchange (63)
+               +- Exchange (64)
+                  +- * ColumnarToRow (63)
                      +- CometHashAggregate (62)
                         +- CometProject (61)
                            +- CometFilter (60)
@@ -91,21 +91,21 @@ Input [1]: [ss_list_price#3]
 Keys [1]: [ss_list_price#3]
 Functions [2]: [partial_avg(UnscaledValue(ss_list_price#3)), partial_count(ss_list_price#3)]
 
-(5) CometExchange
+(5) ColumnarToRow [codegen id : 1]
 Input [4]: [ss_list_price#3, sum#6, count#7, count#8]
-Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(6) ColumnarToRow [codegen id : 1]
+(6) Exchange
 Input [4]: [ss_list_price#3, sum#6, count#7, count#8]
+Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, [plan_id=1]
 
-(7) HashAggregate [codegen id : 1]
+(7) HashAggregate [codegen id : 2]
 Input [4]: [ss_list_price#3, sum#6, count#7, count#8]
 Keys [1]: [ss_list_price#3]
 Functions [2]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3)]
 Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#3))#9, count(ss_list_price#3)#10]
 Results [4]: [ss_list_price#3, sum#6, count#7, count#8]
 
-(8) HashAggregate [codegen id : 1]
+(8) HashAggregate [codegen id : 2]
 Input [4]: [ss_list_price#3, sum#6, count#7, count#8]
 Keys: []
 Functions [3]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3), partial_count(distinct ss_list_price#3)]
@@ -116,7 +116,7 @@ Results [4]: [sum#6, count#7, count#8, count#12]
 Input [4]: [sum#6, count#7, count#8, count#12]
 Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=2]
 
-(10) HashAggregate [codegen id : 12]
+(10) HashAggregate [codegen id : 18]
 Input [4]: [sum#6, count#7, count#8, count#12]
 Keys: []
 Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)]
@@ -143,21 +143,21 @@ Input [1]: [ss_list_price#18]
 Keys [1]: [ss_list_price#18]
 Functions [2]: [partial_avg(UnscaledValue(ss_list_price#18)), partial_count(ss_list_price#18)]
 
-(15) CometExchange
+(15) ColumnarToRow [codegen id : 3]
 Input [4]: [ss_list_price#18, sum#21, count#22, count#23]
-Arguments: hashpartitioning(ss_list_price#18, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]
 
-(16) ColumnarToRow [codegen id : 2]
+(16) Exchange
 Input [4]: [ss_list_price#18, sum#21, count#22, count#23]
+Arguments: hashpartitioning(ss_list_price#18, 5), ENSURE_REQUIREMENTS, [plan_id=3]
 
-(17) HashAggregate [codegen id : 2]
+(17) HashAggregate [codegen id : 4]
 Input [4]: [ss_list_price#18, sum#21, count#22, count#23]
 Keys [1]: [ss_list_price#18]
 Functions [2]: [merge_avg(UnscaledValue(ss_list_price#18)), merge_count(ss_list_price#18)]
 Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#18))#24, count(ss_list_price#18)#25]
 Results [4]: [ss_list_price#18, sum#21, count#22, count#23]
 
-(18) HashAggregate [codegen id : 2]
+(18) HashAggregate [codegen id : 4]
 Input [4]: [ss_list_price#18, sum#21, count#22, count#23]
 Keys: []
 Functions [3]: [merge_avg(UnscaledValue(ss_list_price#18)), merge_count(ss_list_price#18), partial_count(distinct ss_list_price#18)]
@@ -168,7 +168,7 @@ Results [4]: [sum#21, count#22, count#23, count#27]
 Input [4]: [sum#21, count#22, count#23, count#27]
 Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=4]
 
-(20) HashAggregate [codegen id : 3]
+(20) HashAggregate [codegen id : 5]
 Input [4]: [sum#21, count#22, count#23, count#27]
 Keys: []
 Functions [3]: [avg(UnscaledValue(ss_list_price#18)), count(ss_list_price#18), count(distinct ss_list_price#18)]
@@ -179,7 +179,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#18))#24 / 100.0) as decimal(
 Input [3]: [B2_LP#28, B2_CNT#29, B2_CNTD#30]
 Arguments: IdentityBroadcastMode, [plan_id=5]
 
-(22) BroadcastNestedLoopJoin [codegen id : 12]
+(22) BroadcastNestedLoopJoin [codegen id : 18]
 Join type: Inner
 Join condition: None
 
@@ -203,21 +203,21 @@ Input [1]: [ss_list_price#33]
 Keys [1]: [ss_list_price#33]
 Functions [2]: [partial_avg(UnscaledValue(ss_list_price#33)), partial_count(ss_list_price#33)]
 
-(27) CometExchange
+(27) ColumnarToRow [codegen id : 6]
 Input [4]: [ss_list_price#33, sum#36, count#37, count#38]
-Arguments: hashpartitioning(ss_list_price#33, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=6]
 
-(28) ColumnarToRow [codegen id : 4]
+(28) Exchange
 Input [4]: [ss_list_price#33, sum#36, count#37, count#38]
+Arguments: hashpartitioning(ss_list_price#33, 5), ENSURE_REQUIREMENTS, [plan_id=6]
 
-(29) HashAggregate [codegen id : 4]
+(29) HashAggregate [codegen id : 7]
 Input [4]: [ss_list_price#33, sum#36, count#37, count#38]
 Keys [1]: [ss_list_price#33]
 Functions [2]: [merge_avg(UnscaledValue(ss_list_price#33)), merge_count(ss_list_price#33)]
 Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#33))#39, count(ss_list_price#33)#40]
 Results [4]: [ss_list_price#33, sum#36, count#37, count#38]
 
-(30) HashAggregate [codegen id : 4]
+(30) HashAggregate [codegen id : 7]
 Input [4]: [ss_list_price#33, sum#36, count#37, count#38]
 Keys: []
 Functions [3]: [merge_avg(UnscaledValue(ss_list_price#33)), merge_count(ss_list_price#33), partial_count(distinct ss_list_price#33)]
@@ -228,7 +228,7 @@ Results [4]: [sum#36, count#37, count#38, count#42]
 Input [4]: [sum#36, count#37, count#38, count#42]
 Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=7]
 
-(32) HashAggregate [codegen id : 5]
+(32) HashAggregate [codegen id : 8]
 Input [4]: [sum#36, count#37, count#38, count#42]
 Keys: []
 Functions [3]: [avg(UnscaledValue(ss_list_price#33)), count(ss_list_price#33), count(distinct ss_list_price#33)]
@@ -239,7 +239,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#33))#39 / 100.0) as decimal(
 Input [3]: [B3_LP#43, B3_CNT#44, B3_CNTD#45]
 Arguments: IdentityBroadcastMode, [plan_id=8]
 
-(34) BroadcastNestedLoopJoin [codegen id : 12]
+(34) BroadcastNestedLoopJoin [codegen id : 18]
 Join type: Inner
 Join condition: None
 
@@ -263,21 +263,21 @@ Input [1]: [ss_list_price#48]
 Keys [1]: [ss_list_price#48]
 Functions [2]: [partial_avg(UnscaledValue(ss_list_price#48)), partial_count(ss_list_price#48)]
 
-(39) CometExchange
+(39) ColumnarToRow [codegen id : 9]
 Input [4]: [ss_list_price#48, sum#51, count#52, count#53]
-Arguments: hashpartitioning(ss_list_price#48, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=9]
 
-(40) ColumnarToRow [codegen id : 6]
+(40) Exchange
 Input [4]: [ss_list_price#48, sum#51, count#52, count#53]
+Arguments: hashpartitioning(ss_list_price#48, 5), ENSURE_REQUIREMENTS, [plan_id=9]
 
-(41) HashAggregate [codegen id : 6]
+(41) HashAggregate [codegen id : 10]
 Input [4]: [ss_list_price#48, sum#51, count#52, count#53]
 Keys [1]: [ss_list_price#48]
 Functions [2]: [merge_avg(UnscaledValue(ss_list_price#48)), merge_count(ss_list_price#48)]
 Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#48))#54, count(ss_list_price#48)#55]
 Results [4]: [ss_list_price#48, sum#51, count#52, count#53]
 
-(42) HashAggregate [codegen id : 6]
+(42) HashAggregate [codegen id : 10]
 Input [4]: [ss_list_price#48, sum#51, count#52, count#53]
 Keys: []
 Functions [3]: [merge_avg(UnscaledValue(ss_list_price#48)), merge_count(ss_list_price#48), partial_count(distinct ss_list_price#48)]
@@ -288,7 +288,7 @@ Results [4]: [sum#51, count#52, count#53, count#57]
 Input [4]: [sum#51, count#52, count#53, count#57]
 Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=10]
 
-(44) HashAggregate [codegen id : 7]
+(44) HashAggregate [codegen id : 11]
 Input [4]: [sum#51, count#52, count#53, count#57]
 Keys: []
 Functions [3]: [avg(UnscaledValue(ss_list_price#48)), count(ss_list_price#48), count(distinct ss_list_price#48)]
@@ -299,7 +299,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#48))#54 / 100.0) as decimal(
 Input [3]: [B4_LP#58, B4_CNT#59, B4_CNTD#60]
 Arguments: IdentityBroadcastMode, [plan_id=11]
 
-(46) BroadcastNestedLoopJoin [codegen id : 12]
+(46) BroadcastNestedLoopJoin [codegen id : 18]
 Join type: Inner
 Join condition: None
 
@@ -323,21 +323,21 @@ Input [1]: [ss_list_price#63]
 Keys [1]: [ss_list_price#63]
 Functions [2]: [partial_avg(UnscaledValue(ss_list_price#63)), partial_count(ss_list_price#63)]
 
-(51) CometExchange
+(51) ColumnarToRow [codegen id : 12]
 Input [4]: [ss_list_price#63, sum#66, count#67, count#68]
-Arguments: hashpartitioning(ss_list_price#63, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=12]
 
-(52) ColumnarToRow [codegen id : 8]
+(52) Exchange
 Input [4]: [ss_list_price#63, sum#66, count#67, count#68]
+Arguments: hashpartitioning(ss_list_price#63, 5), ENSURE_REQUIREMENTS, [plan_id=12]
 
-(53) HashAggregate [codegen id : 8]
+(53) HashAggregate [codegen id : 13]
 Input [4]: [ss_list_price#63, sum#66, count#67, count#68]
 Keys [1]: [ss_list_price#63]
 Functions [2]: [merge_avg(UnscaledValue(ss_list_price#63)), merge_count(ss_list_price#63)]
 Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#63))#69, count(ss_list_price#63)#70]
 Results [4]: [ss_list_price#63, sum#66, count#67, count#68]
 
-(54) HashAggregate [codegen id : 8]
+(54) HashAggregate [codegen id : 13]
 Input [4]: [ss_list_price#63, sum#66, count#67, count#68]
 Keys: []
 Functions [3]: [merge_avg(UnscaledValue(ss_list_price#63)), merge_count(ss_list_price#63), partial_count(distinct ss_list_price#63)]
@@ -348,7 +348,7 @@ Results [4]: [sum#66, count#67, count#68, count#72]
 Input [4]: [sum#66, count#67, count#68, count#72]
 Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=13]
 
-(56) HashAggregate [codegen id : 9]
+(56) HashAggregate [codegen id : 14]
 Input [4]: [sum#66, count#67, count#68, count#72]
 Keys: []
 Functions [3]: [avg(UnscaledValue(ss_list_price#63)), count(ss_list_price#63), count(distinct ss_list_price#63)]
@@ -359,7 +359,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#63))#69 / 100.0) as decimal(
 Input [3]: [B5_LP#73, B5_CNT#74, B5_CNTD#75]
 Arguments: IdentityBroadcastMode, [plan_id=14]
 
-(58) BroadcastNestedLoopJoin [codegen id : 12]
+(58) BroadcastNestedLoopJoin [codegen id : 18]
 Join type: Inner
 Join condition: None
 
@@ -383,21 +383,21 @@ Input [1]: [ss_list_price#78]
 Keys [1]: [ss_list_price#78]
 Functions [2]: [partial_avg(UnscaledValue(ss_list_price#78)), partial_count(ss_list_price#78)]
 
-(63) CometExchange
+(63) ColumnarToRow [codegen id : 15]
 Input [4]: [ss_list_price#78, sum#81, count#82, count#83]
-Arguments: hashpartitioning(ss_list_price#78, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=15]
 
-(64) ColumnarToRow [codegen id : 10]
+(64) Exchange
 Input [4]: [ss_list_price#78, sum#81, count#82, count#83]
+Arguments: hashpartitioning(ss_list_price#78, 5), ENSURE_REQUIREMENTS, [plan_id=15]
 
-(65) HashAggregate [codegen id : 10]
+(65) HashAggregate [codegen id : 16]
 Input [4]: [ss_list_price#78, sum#81, count#82, count#83]
 Keys [1]: [ss_list_price#78]
 Functions [2]: [merge_avg(UnscaledValue(ss_list_price#78)), merge_count(ss_list_price#78)]
 Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#78))#84, count(ss_list_price#78)#85]
 Results [4]: [ss_list_price#78, sum#81, count#82, count#83]
 
-(66) HashAggregate [codegen id : 10]
+(66) HashAggregate [codegen id : 16]
 Input [4]: [ss_list_price#78, sum#81, count#82, count#83]
 Keys: []
 Functions [3]: [merge_avg(UnscaledValue(ss_list_price#78)), merge_count(ss_list_price#78), partial_count(distinct ss_list_price#78)]
@@ -408,7 +408,7 @@ Results [4]: [sum#81, count#82, count#83, count#87]
 Input [4]: [sum#81, count#82, count#83, count#87]
 Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=16]
 
-(68) HashAggregate [codegen id : 11]
+(68) HashAggregate [codegen id : 17]
 Input [4]: [sum#81, count#82, count#83, count#87]
 Keys: []
 Functions [3]: [avg(UnscaledValue(ss_list_price#78)), count(ss_list_price#78), count(distinct ss_list_price#78)]
@@ -419,7 +419,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#78))#84 / 100.0) as decimal(
 Input [3]: [B6_LP#88, B6_CNT#89, B6_CNTD#90]
 Arguments: IdentityBroadcastMode, [plan_id=17]
 
-(70) BroadcastNestedLoopJoin [codegen id : 12]
+(70) BroadcastNestedLoopJoin [codegen id : 18]
 Join type: Inner
 Join condition: None
 
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/simplified.txt
index 2f9802ab..47a4fe2c 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/simplified.txt
@@ -1,4 +1,4 @@
-WholeStageCodegen (12)
+WholeStageCodegen (18)
   BroadcastNestedLoopJoin
     BroadcastNestedLoopJoin
       BroadcastNestedLoopJoin
@@ -7,93 +7,105 @@ WholeStageCodegen (12)
             HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B1_LP,B1_CNT,B1_CNTD,sum,count,count,count]
               InputAdapter
                 Exchange #1
-                  WholeStageCodegen (1)
+                  WholeStageCodegen (2)
                     HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count]
                       HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count]
-                        ColumnarToRow
-                          InputAdapter
-                            CometExchange [ss_list_price] #2
-                              CometHashAggregate [ss_list_price]
-                                CometProject [ss_list_price]
-                                  CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
-                                    CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                        InputAdapter
+                          Exchange [ss_list_price] #2
+                            WholeStageCodegen (1)
+                              ColumnarToRow
+                                InputAdapter
+                                  CometHashAggregate [ss_list_price]
+                                    CometProject [ss_list_price]
+                                      CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
+                                        CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
             InputAdapter
               BroadcastExchange #3
-                WholeStageCodegen (3)
+                WholeStageCodegen (5)
                   HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B2_LP,B2_CNT,B2_CNTD,sum,count,count,count]
                     InputAdapter
                       Exchange #4
-                        WholeStageCodegen (2)
+                        WholeStageCodegen (4)
                           HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count]
                             HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count]
-                              ColumnarToRow
-                                InputAdapter
-                                  CometExchange [ss_list_price] #5
-                                    CometHashAggregate [ss_list_price]
-                                      CometProject [ss_list_price]
-                                        CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
-                                          CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                              InputAdapter
+                                Exchange [ss_list_price] #5
+                                  WholeStageCodegen (3)
+                                    ColumnarToRow
+                                      InputAdapter
+                                        CometHashAggregate [ss_list_price]
+                                          CometProject [ss_list_price]
+                                            CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
+                                              CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
           InputAdapter
             BroadcastExchange #6
-              WholeStageCodegen (5)
+              WholeStageCodegen (8)
                 HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B3_LP,B3_CNT,B3_CNTD,sum,count,count,count]
                   InputAdapter
                     Exchange #7
-                      WholeStageCodegen (4)
+                      WholeStageCodegen (7)
                         HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count]
                           HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count]
-                            ColumnarToRow
-                              InputAdapter
-                                CometExchange [ss_list_price] #8
-                                  CometHashAggregate [ss_list_price]
-                                    CometProject [ss_list_price]
-                                      CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
-                                        CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                            InputAdapter
+                              Exchange [ss_list_price] #8
+                                WholeStageCodegen (6)
+                                  ColumnarToRow
+                                    InputAdapter
+                                      CometHashAggregate [ss_list_price]
+                                        CometProject [ss_list_price]
+                                          CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
+                                            CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
         InputAdapter
           BroadcastExchange #9
-            WholeStageCodegen (7)
+            WholeStageCodegen (11)
               HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B4_LP,B4_CNT,B4_CNTD,sum,count,count,count]
                 InputAdapter
                   Exchange #10
-                    WholeStageCodegen (6)
+                    WholeStageCodegen (10)
                       HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count]
                         HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count]
-                          ColumnarToRow
-                            InputAdapter
-                              CometExchange [ss_list_price] #11
-                                CometHashAggregate [ss_list_price]
-                                  CometProject [ss_list_price]
-                                    CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
-                                      CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                          InputAdapter
+                            Exchange [ss_list_price] #11
+                              WholeStageCodegen (9)
+                                ColumnarToRow
+                                  InputAdapter
+                                    CometHashAggregate [ss_list_price]
+                                      CometProject [ss_list_price]
+                                        CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
+                                          CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
       InputAdapter
         BroadcastExchange #12
-          WholeStageCodegen (9)
+          WholeStageCodegen (14)
             HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B5_LP,B5_CNT,B5_CNTD,sum,count,count,count]
               InputAdapter
                 Exchange #13
-                  WholeStageCodegen (8)
+                  WholeStageCodegen (13)
                     HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count]
                       HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count]
-                        ColumnarToRow
-                          InputAdapter
-                            CometExchange [ss_list_price] #14
-                              CometHashAggregate [ss_list_price]
-                                CometProject [ss_list_price]
-                                  CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
-                                    CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                        InputAdapter
+                          Exchange [ss_list_price] #14
+                            WholeStageCodegen (12)
+                              ColumnarToRow
+                                InputAdapter
+                                  CometHashAggregate [ss_list_price]
+                                    CometProject [ss_list_price]
+                                      CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
+                                        CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
     InputAdapter
       BroadcastExchange #15
-        WholeStageCodegen (11)
+        WholeStageCodegen (17)
           HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B6_LP,B6_CNT,B6_CNTD,sum,count,count,count]
             InputAdapter
               Exchange #16
-                WholeStageCodegen (10)
+                WholeStageCodegen (16)
                   HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count]
                     HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count]
-                      ColumnarToRow
-                        InputAdapter
-                          CometExchange [ss_list_price] #17
-                            CometHashAggregate [ss_list_price]
-                              CometProject [ss_list_price]
-                                CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
-                                  CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                      InputAdapter
+                        Exchange [ss_list_price] #17
+                          WholeStageCodegen (15)
+                            ColumnarToRow
+                              InputAdapter
+                                CometHashAggregate [ss_list_price]
+                                  CometProject [ss_list_price]
+                                    CometFilter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost]
+                                      CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q40/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q40/explain.txt
index 9f6036a2..fda4bbae 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q40/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q40/explain.txt
@@ -1,36 +1,37 @@
 == Physical Plan ==
-TakeOrderedAndProject (32)
-+- * HashAggregate (31)
-   +- Exchange (30)
-      +- * HashAggregate (29)
-         +- * Project (28)
-            +- * BroadcastHashJoin Inner BuildRight (27)
-               :- * Project (25)
-               :  +- * BroadcastHashJoin Inner BuildRight (24)
-               :     :- * Project (18)
-               :     :  +- * BroadcastHashJoin Inner BuildRight (17)
-               :     :     :- * ColumnarToRow (12)
-               :     :     :  +- CometProject (11)
-               :     :     :     +- CometSortMergeJoin (10)
-               :     :     :        :- CometSort (4)
-               :     :     :        :  +- CometExchange (3)
-               :     :     :        :     +- CometFilter (2)
-               :     :     :        :        +- CometScan parquet spark_catalog.default.catalog_sales (1)
-               :     :     :        +- CometSort (9)
-               :     :     :           +- CometExchange (8)
-               :     :     :              +- CometProject (7)
-               :     :     :                 +- CometFilter (6)
-               :     :     :                    +- CometScan parquet spark_catalog.default.catalog_returns (5)
-               :     :     +- BroadcastExchange (16)
-               :     :        +- * ColumnarToRow (15)
-               :     :           +- CometFilter (14)
-               :     :              +- CometScan parquet spark_catalog.default.warehouse (13)
-               :     +- BroadcastExchange (23)
-               :        +- * ColumnarToRow (22)
-               :           +- CometProject (21)
-               :              +- CometFilter (20)
-               :                 +- CometScan parquet spark_catalog.default.item (19)
-               +- ReusedExchange (26)
+TakeOrderedAndProject (33)
++- * HashAggregate (32)
+   +- Exchange (31)
+      +- * HashAggregate (30)
+         +- * Project (29)
+            +- * BroadcastHashJoin Inner BuildRight (28)
+               :- * Project (26)
+               :  +- * BroadcastHashJoin Inner BuildRight (25)
+               :     :- * Project (19)
+               :     :  +- * BroadcastHashJoin Inner BuildRight (18)
+               :     :     :- * Project (13)
+               :     :     :  +- * SortMergeJoin LeftOuter (12)
+               :     :     :     :- * Sort (5)
+               :     :     :     :  +- Exchange (4)
+               :     :     :     :     +- * ColumnarToRow (3)
+               :     :     :     :        +- CometFilter (2)
+               :     :     :     :           +- CometScan parquet spark_catalog.default.catalog_sales (1)
+               :     :     :     +- * Sort (11)
+               :     :     :        +- Exchange (10)
+               :     :     :           +- * ColumnarToRow (9)
+               :     :     :              +- CometProject (8)
+               :     :     :                 +- CometFilter (7)
+               :     :     :                    +- CometScan parquet spark_catalog.default.catalog_returns (6)
+               :     :     +- BroadcastExchange (17)
+               :     :        +- * ColumnarToRow (16)
+               :     :           +- CometFilter (15)
+               :     :              +- CometScan parquet spark_catalog.default.warehouse (14)
+               :     +- BroadcastExchange (24)
+               :        +- * ColumnarToRow (23)
+               :           +- CometProject (22)
+               :              +- CometFilter (21)
+               :                 +- CometScan parquet spark_catalog.default.item (20)
+               +- ReusedExchange (27)
 
 
 (unknown) Scan parquet spark_catalog.default.catalog_sales
@@ -45,13 +46,16 @@ ReadSchema: struct<cs_warehouse_sk:int,cs_item_sk:int,cs_order_number:int,cs_sal
 Input [5]: [cs_warehouse_sk#1, cs_item_sk#2, cs_order_number#3, cs_sales_price#4, cs_sold_date_sk#5]
 Condition : (isnotnull(cs_warehouse_sk#1) AND isnotnull(cs_item_sk#2))
 
-(3) CometExchange
+(3) ColumnarToRow [codegen id : 1]
 Input [5]: [cs_warehouse_sk#1, cs_item_sk#2, cs_order_number#3, cs_sales_price#4, cs_sold_date_sk#5]
-Arguments: hashpartitioning(cs_order_number#3, cs_item_sk#2, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(4) CometSort
+(4) Exchange
 Input [5]: [cs_warehouse_sk#1, cs_item_sk#2, cs_order_number#3, cs_sales_price#4, cs_sold_date_sk#5]
-Arguments: [cs_warehouse_sk#1, cs_item_sk#2, cs_order_number#3, cs_sales_price#4, cs_sold_date_sk#5], [cs_order_number#3 ASC NULLS FIRST, cs_item_sk#2 ASC NULLS FIRST]
+Arguments: hashpartitioning(cs_order_number#3, cs_item_sk#2, 5), ENSURE_REQUIREMENTS, [plan_id=1]
+
+(5) Sort [codegen id : 2]
+Input [5]: [cs_warehouse_sk#1, cs_item_sk#2, cs_order_number#3, cs_sales_price#4, cs_sold_date_sk#5]
+Arguments: [cs_order_number#3 ASC NULLS FIRST, cs_item_sk#2 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.catalog_returns
 Output [4]: [cr_item_sk#7, cr_order_number#8, cr_refunded_cash#9, cr_returned_date_sk#10]
@@ -60,33 +64,34 @@ Location [not included in comparison]/{warehouse_dir}/catalog_returns]
 PushedFilters: [IsNotNull(cr_order_number), IsNotNull(cr_item_sk)]
 ReadSchema: struct<cr_item_sk:int,cr_order_number:int,cr_refunded_cash:decimal(7,2)>
 
-(6) CometFilter
+(7) CometFilter
 Input [4]: [cr_item_sk#7, cr_order_number#8, cr_refunded_cash#9, cr_returned_date_sk#10]
 Condition : (isnotnull(cr_order_number#8) AND isnotnull(cr_item_sk#7))
 
-(7) CometProject
+(8) CometProject
 Input [4]: [cr_item_sk#7, cr_order_number#8, cr_refunded_cash#9, cr_returned_date_sk#10]
 Arguments: [cr_item_sk#7, cr_order_number#8, cr_refunded_cash#9], [cr_item_sk#7, cr_order_number#8, cr_refunded_cash#9]
 
-(8) CometExchange
+(9) ColumnarToRow [codegen id : 3]
+Input [3]: [cr_item_sk#7, cr_order_number#8, cr_refunded_cash#9]
+
+(10) Exchange
 Input [3]: [cr_item_sk#7, cr_order_number#8, cr_refunded_cash#9]
-Arguments: hashpartitioning(cr_order_number#8, cr_item_sk#7, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]
+Arguments: hashpartitioning(cr_order_number#8, cr_item_sk#7, 5), ENSURE_REQUIREMENTS, [plan_id=2]
 
-(9) CometSort
+(11) Sort [codegen id : 4]
 Input [3]: [cr_item_sk#7, cr_order_number#8, cr_refunded_cash#9]
-Arguments: [cr_item_sk#7, cr_order_number#8, cr_refunded_cash#9], [cr_order_number#8 ASC NULLS FIRST, cr_item_sk#7 ASC NULLS FIRST]
+Arguments: [cr_order_number#8 ASC NULLS FIRST, cr_item_sk#7 ASC NULLS FIRST], false, 0
 
-(10) CometSortMergeJoin
-Left output [5]: [cs_warehouse_sk#1, cs_item_sk#2, cs_order_number#3, cs_sales_price#4, cs_sold_date_sk#5]
-Right output [3]: [cr_item_sk#7, cr_order_number#8, cr_refunded_cash#9]
-Arguments: [cs_order_number#3, cs_item_sk#2], [cr_order_number#8, cr_item_sk#7], LeftOuter
+(12) SortMergeJoin [codegen id : 8]
+Left keys [2]: [cs_order_number#3, cs_item_sk#2]
+Right keys [2]: [cr_order_number#8, cr_item_sk#7]
+Join type: LeftOuter
+Join condition: None
 
-(11) CometProject
+(13) Project [codegen id : 8]
+Output [5]: [cs_warehouse_sk#1, cs_item_sk#2, cs_sales_price#4, cs_sold_date_sk#5, cr_refunded_cash#9]
 Input [8]: [cs_warehouse_sk#1, cs_item_sk#2, cs_order_number#3, cs_sales_price#4, cs_sold_date_sk#5, cr_item_sk#7, cr_order_number#8, cr_refunded_cash#9]
-Arguments: [cs_warehouse_sk#1, cs_item_sk#2, cs_sales_price#4, cs_sold_date_sk#5, cr_refunded_cash#9], [cs_warehouse_sk#1, cs_item_sk#2, cs_sales_price#4, cs_sold_date_sk#5, cr_refunded_cash#9]
-
-(12) ColumnarToRow [codegen id : 4]
-Input [5]: [cs_warehouse_sk#1, cs_item_sk#2, cs_sales_price#4, cs_sold_date_sk#5, cr_refunded_cash#9]
 
 (unknown) Scan parquet spark_catalog.default.warehouse
 Output [2]: [w_warehouse_sk#11, w_state#12]
@@ -95,24 +100,24 @@ Location [not included in comparison]/{warehouse_dir}/warehouse]
 PushedFilters: [IsNotNull(w_warehouse_sk)]
 ReadSchema: struct<w_warehouse_sk:int,w_state:string>
 
-(14) CometFilter
+(15) CometFilter
 Input [2]: [w_warehouse_sk#11, w_state#12]
 Condition : isnotnull(w_warehouse_sk#11)
 
-(15) ColumnarToRow [codegen id : 1]
+(16) ColumnarToRow [codegen id : 5]
 Input [2]: [w_warehouse_sk#11, w_state#12]
 
-(16) BroadcastExchange
+(17) BroadcastExchange
 Input [2]: [w_warehouse_sk#11, w_state#12]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=3]
 
-(17) BroadcastHashJoin [codegen id : 4]
+(18) BroadcastHashJoin [codegen id : 8]
 Left keys [1]: [cs_warehouse_sk#1]
 Right keys [1]: [w_warehouse_sk#11]
 Join type: Inner
 Join condition: None
 
-(18) Project [codegen id : 4]
+(19) Project [codegen id : 8]
 Output [5]: [cs_item_sk#2, cs_sales_price#4, cs_sold_date_sk#5, cr_refunded_cash#9, w_state#12]
 Input [7]: [cs_warehouse_sk#1, cs_item_sk#2, cs_sales_price#4, cs_sold_date_sk#5, cr_refunded_cash#9, w_warehouse_sk#11, w_state#12]
 
@@ -123,73 +128,73 @@ Location [not included in comparison]/{warehouse_dir}/item]
 PushedFilters: [IsNotNull(i_current_price), GreaterThanOrEqual(i_current_price,0.99), LessThanOrEqual(i_current_price,1.49), IsNotNull(i_item_sk)]
 ReadSchema: struct<i_item_sk:int,i_item_id:string,i_current_price:decimal(7,2)>
 
-(20) CometFilter
+(21) CometFilter
 Input [3]: [i_item_sk#13, i_item_id#14, i_current_price#15]
 Condition : (((isnotnull(i_current_price#15) AND (i_current_price#15 >= 0.99)) AND (i_current_price#15 <= 1.49)) AND isnotnull(i_item_sk#13))
 
-(21) CometProject
+(22) CometProject
 Input [3]: [i_item_sk#13, i_item_id#14, i_current_price#15]
 Arguments: [i_item_sk#13, i_item_id#14], [i_item_sk#13, i_item_id#14]
 
-(22) ColumnarToRow [codegen id : 2]
+(23) ColumnarToRow [codegen id : 6]
 Input [2]: [i_item_sk#13, i_item_id#14]
 
-(23) BroadcastExchange
+(24) BroadcastExchange
 Input [2]: [i_item_sk#13, i_item_id#14]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=4]
 
-(24) BroadcastHashJoin [codegen id : 4]
+(25) BroadcastHashJoin [codegen id : 8]
 Left keys [1]: [cs_item_sk#2]
 Right keys [1]: [i_item_sk#13]
 Join type: Inner
 Join condition: None
 
-(25) Project [codegen id : 4]
+(26) Project [codegen id : 8]
 Output [5]: [cs_sales_price#4, cs_sold_date_sk#5, cr_refunded_cash#9, w_state#12, i_item_id#14]
 Input [7]: [cs_item_sk#2, cs_sales_price#4, cs_sold_date_sk#5, cr_refunded_cash#9, w_state#12, i_item_sk#13, i_item_id#14]
 
-(26) ReusedExchange [Reuses operator id: 36]
+(27) ReusedExchange [Reuses operator id: 37]
 Output [2]: [d_date_sk#16, d_date#17]
 
-(27) BroadcastHashJoin [codegen id : 4]
+(28) BroadcastHashJoin [codegen id : 8]
 Left keys [1]: [cs_sold_date_sk#5]
 Right keys [1]: [d_date_sk#16]
 Join type: Inner
 Join condition: None
 
-(28) Project [codegen id : 4]
+(29) Project [codegen id : 8]
 Output [5]: [cs_sales_price#4, cr_refunded_cash#9, w_state#12, i_item_id#14, d_date#17]
 Input [7]: [cs_sales_price#4, cs_sold_date_sk#5, cr_refunded_cash#9, w_state#12, i_item_id#14, d_date_sk#16, d_date#17]
 
-(29) HashAggregate [codegen id : 4]
+(30) HashAggregate [codegen id : 8]
 Input [5]: [cs_sales_price#4, cr_refunded_cash#9, w_state#12, i_item_id#14, d_date#17]
 Keys [2]: [w_state#12, i_item_id#14]
 Functions [2]: [partial_sum(CASE WHEN (d_date#17 < 2000-03-11) THEN (cs_sales_price#4 - coalesce(cast(cr_refunded_cash#9 as decimal(12,2)), 0.00)) ELSE 0.00 END), partial_sum(CASE WHEN (d_date#17 >= 2000-03-11) THEN (cs_sales_price#4 - coalesce(cast(cr_refunded_cash#9 as decimal(12,2)), 0.00)) ELSE 0.00 END)]
 Aggregate Attributes [4]: [sum#18, isEmpty#19, sum#20, isEmpty#21]
 Results [6]: [w_state#12, i_item_id#14, sum#22, isEmpty#23, sum#24, isEmpty#25]
 
-(30) Exchange
+(31) Exchange
 Input [6]: [w_state#12, i_item_id#14, sum#22, isEmpty#23, sum#24, isEmpty#25]
 Arguments: hashpartitioning(w_state#12, i_item_id#14, 5), ENSURE_REQUIREMENTS, [plan_id=5]
 
-(31) HashAggregate [codegen id : 5]
+(32) HashAggregate [codegen id : 9]
 Input [6]: [w_state#12, i_item_id#14, sum#22, isEmpty#23, sum#24, isEmpty#25]
 Keys [2]: [w_state#12, i_item_id#14]
 Functions [2]: [sum(CASE WHEN (d_date#17 < 2000-03-11) THEN (cs_sales_price#4 - coalesce(cast(cr_refunded_cash#9 as decimal(12,2)), 0.00)) ELSE 0.00 END), sum(CASE WHEN (d_date#17 >= 2000-03-11) THEN (cs_sales_price#4 - coalesce(cast(cr_refunded_cash#9 as decimal(12,2)), 0.00)) ELSE 0.00 END)]
 Aggregate Attributes [2]: [sum(CASE WHEN (d_date#17 < 2000-03-11) THEN (cs_sales_price#4 - coalesce(cast(cr_refunded_cash#9 as decimal(12,2)), 0.00)) ELSE 0.00 END)#26, sum(CASE WHEN (d_date#17 >= 2000-03-11) THEN (cs_sales_price#4 - coalesce(cast(cr_refunded_cash#9 as decimal(12,2)), 0.00)) ELSE 0.00 END)#27]
 Results [4]: [w_state#12, i_item_id#14, sum(CASE WHEN (d_date#17 < 2000-03-11) THEN (cs_sales_price#4 - coalesce(cast(cr_refunded_cash#9 as decimal(12,2)), 0.00)) ELSE 0.00 END)#26 AS sales_before#28, sum(CASE WHEN (d_date#17 >= 2000-03-11) THEN (cs_sales_price#4 - coalesce(cast(cr_refunded_cash#9 as decimal(12,2)), 0.00)) ELSE 0.00 END)#27 AS sales_after#29]
 
-(32) TakeOrderedAndProject
+(33) TakeOrderedAndProject
 Input [4]: [w_state#12, i_item_id#14, sales_before#28, sales_after#29]
 Arguments: 100, [w_state#12 ASC NULLS FIRST, i_item_id#14 ASC NULLS FIRST], [w_state#12, i_item_id#14, sales_before#28, sales_after#29]
 
 ===== Subqueries =====
 
 Subquery:1 Hosting operator id = 1 Hosting Expression = cs_sold_date_sk#5 IN dynamicpruning#6
-BroadcastExchange (36)
-+- * ColumnarToRow (35)
-   +- CometFilter (34)
-      +- CometScan parquet spark_catalog.default.date_dim (33)
+BroadcastExchange (37)
++- * ColumnarToRow (36)
+   +- CometFilter (35)
+      +- CometScan parquet spark_catalog.default.date_dim (34)
 
 
 (unknown) Scan parquet spark_catalog.default.date_dim
@@ -199,14 +204,14 @@ Location [not included in comparison]/{warehouse_dir}/date_dim]
 PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,2000-02-10), LessThanOrEqual(d_date,2000-04-10), IsNotNull(d_date_sk)]
 ReadSchema: struct<d_date_sk:int,d_date:date>
 
-(34) CometFilter
+(35) CometFilter
 Input [2]: [d_date_sk#16, d_date#17]
 Condition : (((isnotnull(d_date#17) AND (d_date#17 >= 2000-02-10)) AND (d_date#17 <= 2000-04-10)) AND isnotnull(d_date_sk#16))
 
-(35) ColumnarToRow [codegen id : 1]
+(36) ColumnarToRow [codegen id : 1]
 Input [2]: [d_date_sk#16, d_date#17]
 
-(36) BroadcastExchange
+(37) BroadcastExchange
 Input [2]: [d_date_sk#16, d_date#17]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=6]
 
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q40/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q40/simplified.txt
index 98d39c58..10e0735b 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q40/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q40/simplified.txt
@@ -1,9 +1,9 @@
 TakeOrderedAndProject [w_state,i_item_id,sales_before,sales_after]
-  WholeStageCodegen (5)
+  WholeStageCodegen (9)
     HashAggregate [w_state,i_item_id,sum,isEmpty,sum,isEmpty] [sum(CASE WHEN (d_date < 2000-03-11) THEN (cs_sales_price - coalesce(cast(cr_refunded_cash as decimal(12,2)), 0.00)) ELSE 0.00 END),sum(CASE WHEN (d_date >= 2000-03-11) THEN (cs_sales_price - coalesce(cast(cr_refunded_cash as decimal(12,2)), 0.00)) ELSE 0.00 END),sales_before,sales_after,sum,isEmpty,sum,isEmpty]
       InputAdapter
         Exchange [w_state,i_item_id] #1
-          WholeStageCodegen (4)
+          WholeStageCodegen (8)
             HashAggregate [w_state,i_item_id,d_date,cs_sales_price,cr_refunded_cash] [sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty]
               Project [cs_sales_price,cr_refunded_cash,w_state,i_item_id,d_date]
                 BroadcastHashJoin [cs_sold_date_sk,d_date_sk]
@@ -11,36 +11,46 @@ TakeOrderedAndProject [w_state,i_item_id,sales_before,sales_after]
                     BroadcastHashJoin [cs_item_sk,i_item_sk]
                       Project [cs_item_sk,cs_sales_price,cs_sold_date_sk,cr_refunded_cash,w_state]
                         BroadcastHashJoin [cs_warehouse_sk,w_warehouse_sk]
-                          ColumnarToRow
-                            InputAdapter
-                              CometProject [cs_warehouse_sk,cs_item_sk,cs_sales_price,cs_sold_date_sk,cr_refunded_cash]
-                                CometSortMergeJoin [cs_order_number,cs_item_sk,cr_order_number,cr_item_sk]
-                                  CometSort [cs_order_number,cs_item_sk]
-                                    CometExchange [cs_order_number,cs_item_sk] #2
-                                      CometFilter [cs_warehouse_sk,cs_item_sk]
-                                        CometScan parquet spark_catalog.default.catalog_sales [cs_warehouse_sk,cs_item_sk,cs_order_number,cs_sales_price,cs_sold_date_sk]
-                                          SubqueryBroadcast [d_date_sk] #1
-                                            BroadcastExchange #3
-                                              WholeStageCodegen (1)
-                                                ColumnarToRow
-                                                  InputAdapter
-                                                    CometFilter [d_date,d_date_sk]
-                                                      CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_date]
-                                  CometSort [cr_order_number,cr_item_sk]
-                                    CometExchange [cr_order_number,cr_item_sk] #4
-                                      CometProject [cr_item_sk,cr_order_number,cr_refunded_cash]
-                                        CometFilter [cr_order_number,cr_item_sk]
-                                          CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_refunded_cash,cr_returned_date_sk]
+                          Project [cs_warehouse_sk,cs_item_sk,cs_sales_price,cs_sold_date_sk,cr_refunded_cash]
+                            SortMergeJoin [cs_order_number,cs_item_sk,cr_order_number,cr_item_sk]
+                              InputAdapter
+                                WholeStageCodegen (2)
+                                  Sort [cs_order_number,cs_item_sk]
+                                    InputAdapter
+                                      Exchange [cs_order_number,cs_item_sk] #2
+                                        WholeStageCodegen (1)
+                                          ColumnarToRow
+                                            InputAdapter
+                                              CometFilter [cs_warehouse_sk,cs_item_sk]
+                                                CometScan parquet spark_catalog.default.catalog_sales [cs_warehouse_sk,cs_item_sk,cs_order_number,cs_sales_price,cs_sold_date_sk]
+                                                  SubqueryBroadcast [d_date_sk] #1
+                                                    BroadcastExchange #3
+                                                      WholeStageCodegen (1)
+                                                        ColumnarToRow
+                                                          InputAdapter
+                                                            CometFilter [d_date,d_date_sk]
+                                                              CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_date]
+                              InputAdapter
+                                WholeStageCodegen (4)
+                                  Sort [cr_order_number,cr_item_sk]
+                                    InputAdapter
+                                      Exchange [cr_order_number,cr_item_sk] #4
+                                        WholeStageCodegen (3)
+                                          ColumnarToRow
+                                            InputAdapter
+                                              CometProject [cr_item_sk,cr_order_number,cr_refunded_cash]
+                                                CometFilter [cr_order_number,cr_item_sk]
+                                                  CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_refunded_cash,cr_returned_date_sk]
                           InputAdapter
                             BroadcastExchange #5
-                              WholeStageCodegen (1)
+                              WholeStageCodegen (5)
                                 ColumnarToRow
                                   InputAdapter
                                     CometFilter [w_warehouse_sk]
                                       CometScan parquet spark_catalog.default.warehouse [w_warehouse_sk,w_state]
                       InputAdapter
                         BroadcastExchange #6
-                          WholeStageCodegen (2)
+                          WholeStageCodegen (6)
                             ColumnarToRow
                               InputAdapter
                                 CometProject [i_item_sk,i_item_id]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q41/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q41/explain.txt
index 23089907..7174e274 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q41/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q41/explain.txt
@@ -10,11 +10,11 @@ TakeOrderedAndProject (20)
                :     +- CometFilter (2)
                :        +- CometScan parquet spark_catalog.default.item (1)
                +- BroadcastExchange (14)
-                  +- * ColumnarToRow (13)
-                     +- CometProject (12)
-                        +- CometFilter (11)
-                           +- CometHashAggregate (10)
-                              +- CometExchange (9)
+                  +- * Project (13)
+                     +- * Filter (12)
+                        +- * HashAggregate (11)
+                           +- Exchange (10)
+                              +- * ColumnarToRow (9)
                                  +- CometHashAggregate (8)
                                     +- CometProject (7)
                                        +- CometFilter (6)
@@ -36,7 +36,7 @@ Condition : (((isnotnull(i_manufact_id#1) AND (i_manufact_id#1 >= 738)) AND (i_m
 Input [3]: [i_manufact_id#1, i_manufact#2, i_product_name#3]
 Arguments: [i_manufact#2, i_product_name#3], [i_manufact#2, i_product_name#3]
 
-(4) ColumnarToRow [codegen id : 2]
+(4) ColumnarToRow [codegen id : 3]
 Input [2]: [i_manufact#2, i_product_name#3]
 
 (unknown) Scan parquet spark_catalog.default.item
@@ -59,41 +59,43 @@ Input [1]: [i_manufact#5]
 Keys [1]: [i_manufact#5]
 Functions [1]: [partial_count(1)]
 
-(9) CometExchange
+(9) ColumnarToRow [codegen id : 1]
 Input [2]: [i_manufact#5, count#9]
-Arguments: hashpartitioning(i_manufact#5, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(10) CometHashAggregate
+(10) Exchange
+Input [2]: [i_manufact#5, count#9]
+Arguments: hashpartitioning(i_manufact#5, 5), ENSURE_REQUIREMENTS, [plan_id=1]
+
+(11) HashAggregate [codegen id : 2]
 Input [2]: [i_manufact#5, count#9]
 Keys [1]: [i_manufact#5]
 Functions [1]: [count(1)]
+Aggregate Attributes [1]: [count(1)#10]
+Results [2]: [count(1)#10 AS item_cnt#11, i_manufact#5]
 
-(11) CometFilter
-Input [2]: [item_cnt#10, i_manufact#5]
-Condition : (item_cnt#10 > 0)
+(12) Filter [codegen id : 2]
+Input [2]: [item_cnt#11, i_manufact#5]
+Condition : (item_cnt#11 > 0)
 
-(12) CometProject
-Input [2]: [item_cnt#10, i_manufact#5]
-Arguments: [i_manufact#5], [i_manufact#5]
-
-(13) ColumnarToRow [codegen id : 1]
-Input [1]: [i_manufact#5]
+(13) Project [codegen id : 2]
+Output [1]: [i_manufact#5]
+Input [2]: [item_cnt#11, i_manufact#5]
 
 (14) BroadcastExchange
 Input [1]: [i_manufact#5]
 Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), [plan_id=2]
 
-(15) BroadcastHashJoin [codegen id : 2]
+(15) BroadcastHashJoin [codegen id : 3]
 Left keys [1]: [i_manufact#2]
 Right keys [1]: [i_manufact#5]
 Join type: Inner
 Join condition: None
 
-(16) Project [codegen id : 2]
+(16) Project [codegen id : 3]
 Output [1]: [i_product_name#3]
 Input [3]: [i_manufact#2, i_product_name#3, i_manufact#5]
 
-(17) HashAggregate [codegen id : 2]
+(17) HashAggregate [codegen id : 3]
 Input [1]: [i_product_name#3]
 Keys [1]: [i_product_name#3]
 Functions: []
@@ -104,7 +106,7 @@ Results [1]: [i_product_name#3]
 Input [1]: [i_product_name#3]
 Arguments: hashpartitioning(i_product_name#3, 5), ENSURE_REQUIREMENTS, [plan_id=3]
 
-(19) HashAggregate [codegen id : 3]
+(19) HashAggregate [codegen id : 4]
 Input [1]: [i_product_name#3]
 Keys [1]: [i_product_name#3]
 Functions: []
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q41/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q41/simplified.txt
index 6c8ffadf..e3121706 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q41/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q41/simplified.txt
@@ -1,9 +1,9 @@
 TakeOrderedAndProject [i_product_name]
-  WholeStageCodegen (3)
+  WholeStageCodegen (4)
     HashAggregate [i_product_name]
       InputAdapter
         Exchange [i_product_name] #1
-          WholeStageCodegen (2)
+          WholeStageCodegen (3)
             HashAggregate [i_product_name]
               Project [i_product_name]
                 BroadcastHashJoin [i_manufact,i_manufact]
@@ -14,14 +14,16 @@ TakeOrderedAndProject [i_product_name]
                           CometScan parquet spark_catalog.default.item [i_manufact_id,i_manufact,i_product_name]
                   InputAdapter
                     BroadcastExchange #2
-                      WholeStageCodegen (1)
-                        ColumnarToRow
-                          InputAdapter
-                            CometProject [i_manufact]
-                              CometFilter [item_cnt]
-                                CometHashAggregate [i_manufact,count]
-                                  CometExchange [i_manufact] #3
-                                    CometHashAggregate [i_manufact]
-                                      CometProject [i_manufact]
-                                        CometFilter [i_category,i_color,i_units,i_size,i_manufact]
-                                          CometScan parquet spark_catalog.default.item [i_category,i_manufact,i_size,i_color,i_units]
+                      WholeStageCodegen (2)
+                        Project [i_manufact]
+                          Filter [item_cnt]
+                            HashAggregate [i_manufact,count] [count(1),item_cnt,count]
+                              InputAdapter
+                                Exchange [i_manufact] #3
+                                  WholeStageCodegen (1)
+                                    ColumnarToRow
+                                      InputAdapter
+                                        CometHashAggregate [i_manufact]
+                                          CometProject [i_manufact]
+                                            CometFilter [i_category,i_color,i_units,i_size,i_manufact]
+                                              CometScan parquet spark_catalog.default.item [i_category,i_manufact,i_size,i_color,i_units]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q44/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q44/explain.txt
index d7f13b27..7a7d6673 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q44/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q44/explain.txt
@@ -1,37 +1,36 @@
 == Physical Plan ==
-TakeOrderedAndProject (33)
-+- * Project (32)
-   +- * BroadcastHashJoin Inner BuildRight (31)
-      :- * Project (29)
-      :  +- * BroadcastHashJoin Inner BuildRight (28)
-      :     :- * Project (23)
-      :     :  +- * SortMergeJoin Inner (22)
+TakeOrderedAndProject (32)
++- * Project (31)
+   +- * BroadcastHashJoin Inner BuildRight (30)
+      :- * Project (28)
+      :  +- * BroadcastHashJoin Inner BuildRight (27)
+      :     :- * Project (22)
+      :     :  +- * SortMergeJoin Inner (21)
       :     :     :- * Sort (14)
       :     :     :  +- * Project (13)
       :     :     :     +- * Filter (12)
       :     :     :        +- Window (11)
-      :     :     :           +- * ColumnarToRow (10)
-      :     :     :              +- CometSort (9)
-      :     :     :                 +- CometExchange (8)
-      :     :     :                    +- CometFilter (7)
-      :     :     :                       +- CometHashAggregate (6)
-      :     :     :                          +- CometExchange (5)
+      :     :     :           +- * Sort (10)
+      :     :     :              +- Exchange (9)
+      :     :     :                 +- * Filter (8)
+      :     :     :                    +- * HashAggregate (7)
+      :     :     :                       +- Exchange (6)
+      :     :     :                          +- * ColumnarToRow (5)
       :     :     :                             +- CometHashAggregate (4)
       :     :     :                                +- CometProject (3)
       :     :     :                                   +- CometFilter (2)
       :     :     :                                      +- CometScan parquet spark_catalog.default.store_sales (1)
-      :     :     +- * Sort (21)
-      :     :        +- * Project (20)
-      :     :           +- * Filter (19)
-      :     :              +- Window (18)
-      :     :                 +- * ColumnarToRow (17)
-      :     :                    +- CometSort (16)
-      :     :                       +- ReusedExchange (15)
-      :     +- BroadcastExchange (27)
-      :        +- * ColumnarToRow (26)
-      :           +- CometFilter (25)
-      :              +- CometScan parquet spark_catalog.default.item (24)
-      +- ReusedExchange (30)
+      :     :     +- * Sort (20)
+      :     :        +- * Project (19)
+      :     :           +- * Filter (18)
+      :     :              +- Window (17)
+      :     :                 +- * Sort (16)
+      :     :                    +- ReusedExchange (15)
+      :     +- BroadcastExchange (26)
+      :        +- * ColumnarToRow (25)
+      :           +- CometFilter (24)
+      :              +- CometScan parquet spark_catalog.default.item (23)
+      +- ReusedExchange (29)
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
@@ -54,169 +53,170 @@ Input [2]: [ss_item_sk#1, ss_net_profit#3]
 Keys [1]: [ss_item_sk#1]
 Functions [1]: [partial_avg(UnscaledValue(ss_net_profit#3))]
 
-(5) CometExchange
+(5) ColumnarToRow [codegen id : 1]
 Input [3]: [ss_item_sk#1, sum#5, count#6]
-Arguments: hashpartitioning(ss_item_sk#1, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(6) CometHashAggregate
+(6) Exchange
+Input [3]: [ss_item_sk#1, sum#5, count#6]
+Arguments: hashpartitioning(ss_item_sk#1, 5), ENSURE_REQUIREMENTS, [plan_id=1]
+
+(7) HashAggregate [codegen id : 2]
 Input [3]: [ss_item_sk#1, sum#5, count#6]
 Keys [1]: [ss_item_sk#1]
 Functions [1]: [avg(UnscaledValue(ss_net_profit#3))]
+Aggregate Attributes [1]: [avg(UnscaledValue(ss_net_profit#3))#7]
+Results [2]: [ss_item_sk#1 AS item_sk#8, cast((avg(UnscaledValue(ss_net_profit#3))#7 / 100.0) as decimal(11,6)) AS rank_col#9]
 
-(7) CometFilter
-Input [2]: [item_sk#7, rank_col#8]
-Condition : (isnotnull(rank_col#8) AND (cast(rank_col#8 as decimal(13,7)) > (0.9 * Subquery scalar-subquery#9, [id=#10])))
+(8) Filter [codegen id : 2]
+Input [2]: [item_sk#8, rank_col#9]
+Condition : (isnotnull(rank_col#9) AND (cast(rank_col#9 as decimal(13,7)) > (0.9 * Subquery scalar-subquery#10, [id=#11])))
 
-(8) CometExchange
-Input [2]: [item_sk#7, rank_col#8]
-Arguments: SinglePartition, ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]
+(9) Exchange
+Input [2]: [item_sk#8, rank_col#9]
+Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=2]
 
-(9) CometSort
-Input [2]: [item_sk#7, rank_col#8]
-Arguments: [item_sk#7, rank_col#8], [rank_col#8 ASC NULLS FIRST]
-
-(10) ColumnarToRow [codegen id : 1]
-Input [2]: [item_sk#7, rank_col#8]
+(10) Sort [codegen id : 3]
+Input [2]: [item_sk#8, rank_col#9]
+Arguments: [rank_col#9 ASC NULLS FIRST], false, 0
 
 (11) Window
-Input [2]: [item_sk#7, rank_col#8]
-Arguments: [rank(rank_col#8) windowspecdefinition(rank_col#8 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS rnk#11], [rank_col#8 ASC NULLS FIRST]
-
-(12) Filter [codegen id : 2]
-Input [3]: [item_sk#7, rank_col#8, rnk#11]
-Condition : ((rnk#11 < 11) AND isnotnull(item_sk#7))
+Input [2]: [item_sk#8, rank_col#9]
+Arguments: [rank(rank_col#9) windowspecdefinition(rank_col#9 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS rnk#12], [rank_col#9 ASC NULLS FIRST]
 
-(13) Project [codegen id : 2]
-Output [2]: [item_sk#7, rnk#11]
-Input [3]: [item_sk#7, rank_col#8, rnk#11]
+(12) Filter [codegen id : 4]
+Input [3]: [item_sk#8, rank_col#9, rnk#12]
+Condition : ((rnk#12 < 11) AND isnotnull(item_sk#8))
 
-(14) Sort [codegen id : 2]
-Input [2]: [item_sk#7, rnk#11]
-Arguments: [rnk#11 ASC NULLS FIRST], false, 0
+(13) Project [codegen id : 4]
+Output [2]: [item_sk#8, rnk#12]
+Input [3]: [item_sk#8, rank_col#9, rnk#12]
 
-(15) ReusedExchange [Reuses operator id: 8]
-Output [2]: [item_sk#12, rank_col#13]
+(14) Sort [codegen id : 4]
+Input [2]: [item_sk#8, rnk#12]
+Arguments: [rnk#12 ASC NULLS FIRST], false, 0
 
-(16) CometSort
-Input [2]: [item_sk#12, rank_col#13]
-Arguments: [item_sk#12, rank_col#13], [rank_col#13 DESC NULLS LAST]
+(15) ReusedExchange [Reuses operator id: 9]
+Output [2]: [item_sk#13, rank_col#14]
 
-(17) ColumnarToRow [codegen id : 3]
-Input [2]: [item_sk#12, rank_col#13]
+(16) Sort [codegen id : 7]
+Input [2]: [item_sk#13, rank_col#14]
+Arguments: [rank_col#14 DESC NULLS LAST], false, 0
 
-(18) Window
-Input [2]: [item_sk#12, rank_col#13]
-Arguments: [rank(rank_col#13) windowspecdefinition(rank_col#13 DESC NULLS LAST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS rnk#14], [rank_col#13 DESC NULLS LAST]
+(17) Window
+Input [2]: [item_sk#13, rank_col#14]
+Arguments: [rank(rank_col#14) windowspecdefinition(rank_col#14 DESC NULLS LAST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS rnk#15], [rank_col#14 DESC NULLS LAST]
 
-(19) Filter [codegen id : 4]
-Input [3]: [item_sk#12, rank_col#13, rnk#14]
-Condition : ((rnk#14 < 11) AND isnotnull(item_sk#12))
+(18) Filter [codegen id : 8]
+Input [3]: [item_sk#13, rank_col#14, rnk#15]
+Condition : ((rnk#15 < 11) AND isnotnull(item_sk#13))
 
-(20) Project [codegen id : 4]
-Output [2]: [item_sk#12, rnk#14]
-Input [3]: [item_sk#12, rank_col#13, rnk#14]
+(19) Project [codegen id : 8]
+Output [2]: [item_sk#13, rnk#15]
+Input [3]: [item_sk#13, rank_col#14, rnk#15]
 
-(21) Sort [codegen id : 4]
-Input [2]: [item_sk#12, rnk#14]
-Arguments: [rnk#14 ASC NULLS FIRST], false, 0
+(20) Sort [codegen id : 8]
+Input [2]: [item_sk#13, rnk#15]
+Arguments: [rnk#15 ASC NULLS FIRST], false, 0
 
-(22) SortMergeJoin [codegen id : 7]
-Left keys [1]: [rnk#11]
-Right keys [1]: [rnk#14]
+(21) SortMergeJoin [codegen id : 11]
+Left keys [1]: [rnk#12]
+Right keys [1]: [rnk#15]
 Join type: Inner
 Join condition: None
 
-(23) Project [codegen id : 7]
-Output [3]: [item_sk#7, rnk#11, item_sk#12]
-Input [4]: [item_sk#7, rnk#11, item_sk#12, rnk#14]
+(22) Project [codegen id : 11]
+Output [3]: [item_sk#8, rnk#12, item_sk#13]
+Input [4]: [item_sk#8, rnk#12, item_sk#13, rnk#15]
 
 (unknown) Scan parquet spark_catalog.default.item
-Output [2]: [i_item_sk#15, i_product_name#16]
+Output [2]: [i_item_sk#16, i_product_name#17]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/item]
 PushedFilters: [IsNotNull(i_item_sk)]
 ReadSchema: struct<i_item_sk:int,i_product_name:string>
 
-(25) CometFilter
-Input [2]: [i_item_sk#15, i_product_name#16]
-Condition : isnotnull(i_item_sk#15)
+(24) CometFilter
+Input [2]: [i_item_sk#16, i_product_name#17]
+Condition : isnotnull(i_item_sk#16)
 
-(26) ColumnarToRow [codegen id : 5]
-Input [2]: [i_item_sk#15, i_product_name#16]
+(25) ColumnarToRow [codegen id : 9]
+Input [2]: [i_item_sk#16, i_product_name#17]
 
-(27) BroadcastExchange
-Input [2]: [i_item_sk#15, i_product_name#16]
+(26) BroadcastExchange
+Input [2]: [i_item_sk#16, i_product_name#17]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=3]
 
-(28) BroadcastHashJoin [codegen id : 7]
-Left keys [1]: [item_sk#7]
-Right keys [1]: [i_item_sk#15]
+(27) BroadcastHashJoin [codegen id : 11]
+Left keys [1]: [item_sk#8]
+Right keys [1]: [i_item_sk#16]
 Join type: Inner
 Join condition: None
 
-(29) Project [codegen id : 7]
-Output [3]: [rnk#11, item_sk#12, i_product_name#16]
-Input [5]: [item_sk#7, rnk#11, item_sk#12, i_item_sk#15, i_product_name#16]
+(28) Project [codegen id : 11]
+Output [3]: [rnk#12, item_sk#13, i_product_name#17]
+Input [5]: [item_sk#8, rnk#12, item_sk#13, i_item_sk#16, i_product_name#17]
 
-(30) ReusedExchange [Reuses operator id: 27]
-Output [2]: [i_item_sk#17, i_product_name#18]
+(29) ReusedExchange [Reuses operator id: 26]
+Output [2]: [i_item_sk#18, i_product_name#19]
 
-(31) BroadcastHashJoin [codegen id : 7]
-Left keys [1]: [item_sk#12]
-Right keys [1]: [i_item_sk#17]
+(30) BroadcastHashJoin [codegen id : 11]
+Left keys [1]: [item_sk#13]
+Right keys [1]: [i_item_sk#18]
 Join type: Inner
 Join condition: None
 
-(32) Project [codegen id : 7]
-Output [3]: [rnk#11, i_product_name#16 AS best_performing#19, i_product_name#18 AS worst_performing#20]
-Input [5]: [rnk#11, item_sk#12, i_product_name#16, i_item_sk#17, i_product_name#18]
+(31) Project [codegen id : 11]
+Output [3]: [rnk#12, i_product_name#17 AS best_performing#20, i_product_name#19 AS worst_performing#21]
+Input [5]: [rnk#12, item_sk#13, i_product_name#17, i_item_sk#18, i_product_name#19]
 
-(33) TakeOrderedAndProject
-Input [3]: [rnk#11, best_performing#19, worst_performing#20]
-Arguments: 100, [rnk#11 ASC NULLS FIRST], [rnk#11, best_performing#19, worst_performing#20]
+(32) TakeOrderedAndProject
+Input [3]: [rnk#12, best_performing#20, worst_performing#21]
+Arguments: 100, [rnk#12 ASC NULLS FIRST], [rnk#12, best_performing#20, worst_performing#21]
 
 ===== Subqueries =====
 
-Subquery:1 Hosting operator id = 7 Hosting Expression = Subquery scalar-subquery#9, [id=#10]
-* ColumnarToRow (40)
-+- CometHashAggregate (39)
-   +- CometExchange (38)
-      +- CometHashAggregate (37)
-         +- CometProject (36)
-            +- CometFilter (35)
-               +- CometScan parquet spark_catalog.default.store_sales (34)
+Subquery:1 Hosting operator id = 8 Hosting Expression = Subquery scalar-subquery#10, [id=#11]
+* HashAggregate (39)
++- Exchange (38)
+   +- * ColumnarToRow (37)
+      +- CometHashAggregate (36)
+         +- CometProject (35)
+            +- CometFilter (34)
+               +- CometScan parquet spark_catalog.default.store_sales (33)
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
-Output [4]: [ss_addr_sk#21, ss_store_sk#22, ss_net_profit#23, ss_sold_date_sk#24]
+Output [4]: [ss_addr_sk#22, ss_store_sk#23, ss_net_profit#24, ss_sold_date_sk#25]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/store_sales]
 PushedFilters: [IsNotNull(ss_store_sk), EqualTo(ss_store_sk,4), IsNull(ss_addr_sk)]
 ReadSchema: struct<ss_addr_sk:int,ss_store_sk:int,ss_net_profit:decimal(7,2)>
 
-(35) CometFilter
-Input [4]: [ss_addr_sk#21, ss_store_sk#22, ss_net_profit#23, ss_sold_date_sk#24]
-Condition : ((isnotnull(ss_store_sk#22) AND (ss_store_sk#22 = 4)) AND isnull(ss_addr_sk#21))
+(34) CometFilter
+Input [4]: [ss_addr_sk#22, ss_store_sk#23, ss_net_profit#24, ss_sold_date_sk#25]
+Condition : ((isnotnull(ss_store_sk#23) AND (ss_store_sk#23 = 4)) AND isnull(ss_addr_sk#22))
 
-(36) CometProject
-Input [4]: [ss_addr_sk#21, ss_store_sk#22, ss_net_profit#23, ss_sold_date_sk#24]
-Arguments: [ss_store_sk#22, ss_net_profit#23], [ss_store_sk#22, ss_net_profit#23]
+(35) CometProject
+Input [4]: [ss_addr_sk#22, ss_store_sk#23, ss_net_profit#24, ss_sold_date_sk#25]
+Arguments: [ss_store_sk#23, ss_net_profit#24], [ss_store_sk#23, ss_net_profit#24]
 
-(37) CometHashAggregate
-Input [2]: [ss_store_sk#22, ss_net_profit#23]
-Keys [1]: [ss_store_sk#22]
-Functions [1]: [partial_avg(UnscaledValue(ss_net_profit#23))]
+(36) CometHashAggregate
+Input [2]: [ss_store_sk#23, ss_net_profit#24]
+Keys [1]: [ss_store_sk#23]
+Functions [1]: [partial_avg(UnscaledValue(ss_net_profit#24))]
 
-(38) CometExchange
-Input [3]: [ss_store_sk#22, sum#25, count#26]
-Arguments: hashpartitioning(ss_store_sk#22, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=4]
+(37) ColumnarToRow [codegen id : 1]
+Input [3]: [ss_store_sk#23, sum#26, count#27]
 
-(39) CometHashAggregate
-Input [3]: [ss_store_sk#22, sum#25, count#26]
-Keys [1]: [ss_store_sk#22]
-Functions [1]: [avg(UnscaledValue(ss_net_profit#23))]
+(38) Exchange
+Input [3]: [ss_store_sk#23, sum#26, count#27]
+Arguments: hashpartitioning(ss_store_sk#23, 5), ENSURE_REQUIREMENTS, [plan_id=4]
 
-(40) ColumnarToRow [codegen id : 1]
-Input [1]: [rank_col#27]
+(39) HashAggregate [codegen id : 2]
+Input [3]: [ss_store_sk#23, sum#26, count#27]
+Keys [1]: [ss_store_sk#23]
+Functions [1]: [avg(UnscaledValue(ss_net_profit#24))]
+Aggregate Attributes [1]: [avg(UnscaledValue(ss_net_profit#24))#28]
+Results [1]: [cast((avg(UnscaledValue(ss_net_profit#24))#28 / 100.0) as decimal(11,6)) AS rank_col#29]
 
 
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q44/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q44/simplified.txt
index bc065345..701a9091 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q44/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q44/simplified.txt
@@ -1,5 +1,5 @@
 TakeOrderedAndProject [rnk,best_performing,worst_performing]
-  WholeStageCodegen (7)
+  WholeStageCodegen (11)
     Project [rnk,i_product_name,i_product_name]
       BroadcastHashJoin [item_sk,i_item_sk]
         Project [rnk,item_sk,i_product_name]
@@ -7,49 +7,54 @@ TakeOrderedAndProject [rnk,best_performing,worst_performing]
             Project [item_sk,rnk,item_sk]
               SortMergeJoin [rnk,rnk]
                 InputAdapter
-                  WholeStageCodegen (2)
+                  WholeStageCodegen (4)
                     Sort [rnk]
                       Project [item_sk,rnk]
                         Filter [rnk,item_sk]
                           InputAdapter
                             Window [rank_col]
-                              WholeStageCodegen (1)
-                                ColumnarToRow
+                              WholeStageCodegen (3)
+                                Sort [rank_col]
                                   InputAdapter
-                                    CometSort [rank_col]
-                                      CometExchange #1
-                                        CometFilter [rank_col]
+                                    Exchange #1
+                                      WholeStageCodegen (2)
+                                        Filter [rank_col]
                                           Subquery #1
-                                            WholeStageCodegen (1)
-                                              ColumnarToRow
+                                            WholeStageCodegen (2)
+                                              HashAggregate [ss_store_sk,sum,count] [avg(UnscaledValue(ss_net_profit)),rank_col,sum,count]
                                                 InputAdapter
-                                                  CometHashAggregate [ss_store_sk,sum,count]
-                                                    CometExchange [ss_store_sk] #3
-                                                      CometHashAggregate [ss_store_sk,ss_net_profit]
-                                                        CometProject [ss_store_sk,ss_net_profit]
-                                                          CometFilter [ss_store_sk,ss_addr_sk]
-                                                            CometScan parquet spark_catalog.default.store_sales [ss_addr_sk,ss_store_sk,ss_net_profit,ss_sold_date_sk]
-                                          CometHashAggregate [ss_item_sk,sum,count]
-                                            CometExchange [ss_item_sk] #2
-                                              CometHashAggregate [ss_item_sk,ss_net_profit]
-                                                CometProject [ss_item_sk,ss_net_profit]
-                                                  CometFilter [ss_store_sk]
-                                                    CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_store_sk,ss_net_profit,ss_sold_date_sk]
+                                                  Exchange [ss_store_sk] #3
+                                                    WholeStageCodegen (1)
+                                                      ColumnarToRow
+                                                        InputAdapter
+                                                          CometHashAggregate [ss_store_sk,ss_net_profit]
+                                                            CometProject [ss_store_sk,ss_net_profit]
+                                                              CometFilter [ss_store_sk,ss_addr_sk]
+                                                                CometScan parquet spark_catalog.default.store_sales [ss_addr_sk,ss_store_sk,ss_net_profit,ss_sold_date_sk]
+                                          HashAggregate [ss_item_sk,sum,count] [avg(UnscaledValue(ss_net_profit)),item_sk,rank_col,sum,count]
+                                            InputAdapter
+                                              Exchange [ss_item_sk] #2
+                                                WholeStageCodegen (1)
+                                                  ColumnarToRow
+                                                    InputAdapter
+                                                      CometHashAggregate [ss_item_sk,ss_net_profit]
+                                                        CometProject [ss_item_sk,ss_net_profit]
+                                                          CometFilter [ss_store_sk]
+                                                            CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_store_sk,ss_net_profit,ss_sold_date_sk]
                 InputAdapter
-                  WholeStageCodegen (4)
+                  WholeStageCodegen (8)
                     Sort [rnk]
                       Project [item_sk,rnk]
                         Filter [rnk,item_sk]
                           InputAdapter
                             Window [rank_col]
-                              WholeStageCodegen (3)
-                                ColumnarToRow
+                              WholeStageCodegen (7)
+                                Sort [rank_col]
                                   InputAdapter
-                                    CometSort [rank_col]
-                                      ReusedExchange [item_sk,rank_col] #1
+                                    ReusedExchange [item_sk,rank_col] #1
             InputAdapter
               BroadcastExchange #4
-                WholeStageCodegen (5)
+                WholeStageCodegen (9)
                   ColumnarToRow
                     InputAdapter
                       CometFilter [i_item_sk]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q54/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q54/explain.txt
index 00c8f9c9..5c1e750c 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q54/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q54/explain.txt
@@ -389,9 +389,9 @@ Input [1]: [d_date_sk#29]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=10]
 
 Subquery:4 Hosting operator id = 62 Hosting Expression = Subquery scalar-subquery#42, [id=#43]
-* ColumnarToRow (72)
-+- CometHashAggregate (71)
-   +- CometExchange (70)
+* HashAggregate (72)
++- Exchange (71)
+   +- * ColumnarToRow (70)
       +- CometHashAggregate (69)
          +- CometProject (68)
             +- CometFilter (67)
@@ -418,22 +418,24 @@ Input [1]: [(d_month_seq + 1)#49]
 Keys [1]: [(d_month_seq + 1)#49]
 Functions: []
 
-(70) CometExchange
+(70) ColumnarToRow [codegen id : 1]
 Input [1]: [(d_month_seq + 1)#49]
-Arguments: hashpartitioning((d_month_seq + 1)#49, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=11]
 
-(71) CometHashAggregate
+(71) Exchange
 Input [1]: [(d_month_seq + 1)#49]
-Keys [1]: [(d_month_seq + 1)#49]
-Functions: []
+Arguments: hashpartitioning((d_month_seq + 1)#49, 5), ENSURE_REQUIREMENTS, [plan_id=11]
 
-(72) ColumnarToRow [codegen id : 1]
+(72) HashAggregate [codegen id : 2]
 Input [1]: [(d_month_seq + 1)#49]
+Keys [1]: [(d_month_seq + 1)#49]
+Functions: []
+Aggregate Attributes: []
+Results [1]: [(d_month_seq + 1)#49]
 
 Subquery:5 Hosting operator id = 62 Hosting Expression = Subquery scalar-subquery#44, [id=#45]
-* ColumnarToRow (79)
-+- CometHashAggregate (78)
-   +- CometExchange (77)
+* HashAggregate (79)
++- Exchange (78)
+   +- * ColumnarToRow (77)
       +- CometHashAggregate (76)
          +- CometProject (75)
             +- CometFilter (74)
@@ -460,16 +462,18 @@ Input [1]: [(d_month_seq + 3)#53]
 Keys [1]: [(d_month_seq + 3)#53]
 Functions: []
 
-(77) CometExchange
+(77) ColumnarToRow [codegen id : 1]
 Input [1]: [(d_month_seq + 3)#53]
-Arguments: hashpartitioning((d_month_seq + 3)#53, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=12]
 
-(78) CometHashAggregate
+(78) Exchange
 Input [1]: [(d_month_seq + 3)#53]
-Keys [1]: [(d_month_seq + 3)#53]
-Functions: []
+Arguments: hashpartitioning((d_month_seq + 3)#53, 5), ENSURE_REQUIREMENTS, [plan_id=12]
 
-(79) ColumnarToRow [codegen id : 1]
+(79) HashAggregate [codegen id : 2]
 Input [1]: [(d_month_seq + 3)#53]
+Keys [1]: [(d_month_seq + 3)#53]
+Functions: []
+Aggregate Attributes: []
+Results [1]: [(d_month_seq + 3)#53]
 
 
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q54/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q54/simplified.txt
index 90604339..c1690fac 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q54/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q54/simplified.txt
@@ -79,25 +79,29 @@ TakeOrderedAndProject [segment,num_customers,segment_base]
                                                                 CometProject [d_date_sk]
                                                                   CometFilter [d_month_seq,d_date_sk]
                                                                     Subquery #3
-                                                                      WholeStageCodegen (1)
-                                                                        ColumnarToRow
+                                                                      WholeStageCodegen (2)
+                                                                        HashAggregate [(d_month_seq + 1)]
                                                                           InputAdapter
-                                                                            CometHashAggregate [(d_month_seq + 1)]
-                                                                              CometExchange [(d_month_seq + 1)] #9
-                                                                                CometHashAggregate [(d_month_seq + 1)]
-                                                                                  CometProject [d_month_seq] [(d_month_seq + 1)]
-                                                                                    CometFilter [d_year,d_moy]
-                                                                                      CometScan parquet spark_catalog.default.date_dim [d_month_seq,d_year,d_moy]
+                                                                            Exchange [(d_month_seq + 1)] #9
+                                                                              WholeStageCodegen (1)
+                                                                                ColumnarToRow
+                                                                                  InputAdapter
+                                                                                    CometHashAggregate [(d_month_seq + 1)]
+                                                                                      CometProject [d_month_seq] [(d_month_seq + 1)]
+                                                                                        CometFilter [d_year,d_moy]
+                                                                                          CometScan parquet spark_catalog.default.date_dim [d_month_seq,d_year,d_moy]
                                                                     Subquery #4
-                                                                      WholeStageCodegen (1)
-                                                                        ColumnarToRow
+                                                                      WholeStageCodegen (2)
+                                                                        HashAggregate [(d_month_seq + 3)]
                                                                           InputAdapter
-                                                                            CometHashAggregate [(d_month_seq + 3)]
-                                                                              CometExchange [(d_month_seq + 3)] #10
-                                                                                CometHashAggregate [(d_month_seq + 3)]
-                                                                                  CometProject [d_month_seq] [(d_month_seq + 3)]
-                                                                                    CometFilter [d_year,d_moy]
-                                                                                      CometScan parquet spark_catalog.default.date_dim [d_month_seq,d_year,d_moy]
+                                                                            Exchange [(d_month_seq + 3)] #10
+                                                                              WholeStageCodegen (1)
+                                                                                ColumnarToRow
+                                                                                  InputAdapter
+                                                                                    CometHashAggregate [(d_month_seq + 3)]
+                                                                                      CometProject [d_month_seq] [(d_month_seq + 3)]
+                                                                                        CometFilter [d_year,d_moy]
+                                                                                          CometScan parquet spark_catalog.default.date_dim [d_month_seq,d_year,d_moy]
                                                                     CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_month_seq]
                                     InputAdapter
                                       BroadcastExchange #11
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6/explain.txt
index 5f34aa3d..cc4720a1 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6/explain.txt
@@ -31,10 +31,10 @@ TakeOrderedAndProject (39)
                            :  +- CometFilter (20)
                            :     +- CometScan parquet spark_catalog.default.item (19)
                            +- BroadcastExchange (29)
-                              +- * ColumnarToRow (28)
-                                 +- CometFilter (27)
-                                    +- CometHashAggregate (26)
-                                       +- CometExchange (25)
+                              +- * Filter (28)
+                                 +- * HashAggregate (27)
+                                    +- Exchange (26)
+                                       +- * ColumnarToRow (25)
                                           +- CometHashAggregate (24)
                                              +- CometFilter (23)
                                                 +- CometScan parquet spark_catalog.default.item (22)
@@ -51,7 +51,7 @@ ReadSchema: struct<ca_address_sk:int,ca_state:string>
 Input [2]: [ca_address_sk#1, ca_state#2]
 Condition : isnotnull(ca_address_sk#1)
 
-(3) ColumnarToRow [codegen id : 6]
+(3) ColumnarToRow [codegen id : 7]
 Input [2]: [ca_address_sk#1, ca_state#2]
 
 (unknown) Scan parquet spark_catalog.default.customer
@@ -72,13 +72,13 @@ Input [2]: [c_customer_sk#3, c_current_addr_sk#4]
 Input [2]: [c_customer_sk#3, c_current_addr_sk#4]
 Arguments: HashedRelationBroadcastMode(List(cast(input[1, int, false] as bigint)),false), [plan_id=1]
 
-(8) BroadcastHashJoin [codegen id : 6]
+(8) BroadcastHashJoin [codegen id : 7]
 Left keys [1]: [ca_address_sk#1]
 Right keys [1]: [c_current_addr_sk#4]
 Join type: Inner
 Join condition: None
 
-(9) Project [codegen id : 6]
+(9) Project [codegen id : 7]
 Output [2]: [ca_state#2, c_customer_sk#3]
 Input [4]: [ca_address_sk#1, ca_state#2, c_customer_sk#3, c_current_addr_sk#4]
 
@@ -101,26 +101,26 @@ Input [3]: [ss_item_sk#5, ss_customer_sk#6, ss_sold_date_sk#7]
 Input [3]: [ss_item_sk#5, ss_customer_sk#6, ss_sold_date_sk#7]
 Arguments: HashedRelationBroadcastMode(List(cast(input[1, int, false] as bigint)),false), [plan_id=2]
 
-(14) BroadcastHashJoin [codegen id : 6]
+(14) BroadcastHashJoin [codegen id : 7]
 Left keys [1]: [c_customer_sk#3]
 Right keys [1]: [ss_customer_sk#6]
 Join type: Inner
 Join condition: None
 
-(15) Project [codegen id : 6]
+(15) Project [codegen id : 7]
 Output [3]: [ca_state#2, ss_item_sk#5, ss_sold_date_sk#7]
 Input [5]: [ca_state#2, c_customer_sk#3, ss_item_sk#5, ss_customer_sk#6, ss_sold_date_sk#7]
 
 (16) ReusedExchange [Reuses operator id: 44]
 Output [1]: [d_date_sk#9]
 
-(17) BroadcastHashJoin [codegen id : 6]
+(17) BroadcastHashJoin [codegen id : 7]
 Left keys [1]: [ss_sold_date_sk#7]
 Right keys [1]: [d_date_sk#9]
 Join type: Inner
 Join condition: None
 
-(18) Project [codegen id : 6]
+(18) Project [codegen id : 7]
 Output [2]: [ca_state#2, ss_item_sk#5]
 Input [4]: [ca_state#2, ss_item_sk#5, ss_sold_date_sk#7, d_date_sk#9]
 
@@ -135,7 +135,7 @@ ReadSchema: struct<i_item_sk:int,i_current_price:decimal(7,2),i_category:string>
 Input [3]: [i_item_sk#10, i_current_price#11, i_category#12]
 Condition : ((isnotnull(i_current_price#11) AND isnotnull(i_category#12)) AND isnotnull(i_item_sk#10))
 
-(21) ColumnarToRow [codegen id : 5]
+(21) ColumnarToRow [codegen id : 6]
 Input [3]: [i_item_sk#10, i_current_price#11, i_category#12]
 
 (unknown) Scan parquet spark_catalog.default.item
@@ -154,75 +154,77 @@ Input [2]: [i_current_price#13, i_category#14]
 Keys [1]: [i_category#14]
 Functions [1]: [partial_avg(UnscaledValue(i_current_price#13))]
 
-(25) CometExchange
+(25) ColumnarToRow [codegen id : 4]
 Input [3]: [i_category#14, sum#15, count#16]
-Arguments: hashpartitioning(i_category#14, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]
 
-(26) CometHashAggregate
+(26) Exchange
+Input [3]: [i_category#14, sum#15, count#16]
+Arguments: hashpartitioning(i_category#14, 5), ENSURE_REQUIREMENTS, [plan_id=3]
+
+(27) HashAggregate [codegen id : 5]
 Input [3]: [i_category#14, sum#15, count#16]
 Keys [1]: [i_category#14]
 Functions [1]: [avg(UnscaledValue(i_current_price#13))]
+Aggregate Attributes [1]: [avg(UnscaledValue(i_current_price#13))#17]
+Results [2]: [cast((avg(UnscaledValue(i_current_price#13))#17 / 100.0) as decimal(11,6)) AS avg(i_current_price)#18, i_category#14]
 
-(27) CometFilter
-Input [2]: [avg(i_current_price)#17, i_category#14]
-Condition : isnotnull(avg(i_current_price)#17)
-
-(28) ColumnarToRow [codegen id : 4]
-Input [2]: [avg(i_current_price)#17, i_category#14]
+(28) Filter [codegen id : 5]
+Input [2]: [avg(i_current_price)#18, i_category#14]
+Condition : isnotnull(avg(i_current_price)#18)
 
 (29) BroadcastExchange
-Input [2]: [avg(i_current_price)#17, i_category#14]
+Input [2]: [avg(i_current_price)#18, i_category#14]
 Arguments: HashedRelationBroadcastMode(List(input[1, string, true]),false), [plan_id=4]
 
-(30) BroadcastHashJoin [codegen id : 5]
+(30) BroadcastHashJoin [codegen id : 6]
 Left keys [1]: [i_category#12]
 Right keys [1]: [i_category#14]
 Join type: Inner
-Join condition: (cast(i_current_price#11 as decimal(14,7)) > (1.2 * avg(i_current_price)#17))
+Join condition: (cast(i_current_price#11 as decimal(14,7)) > (1.2 * avg(i_current_price)#18))
 
-(31) Project [codegen id : 5]
+(31) Project [codegen id : 6]
 Output [1]: [i_item_sk#10]
-Input [5]: [i_item_sk#10, i_current_price#11, i_category#12, avg(i_current_price)#17, i_category#14]
+Input [5]: [i_item_sk#10, i_current_price#11, i_category#12, avg(i_current_price)#18, i_category#14]
 
 (32) BroadcastExchange
 Input [1]: [i_item_sk#10]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=5]
 
-(33) BroadcastHashJoin [codegen id : 6]
+(33) BroadcastHashJoin [codegen id : 7]
 Left keys [1]: [ss_item_sk#5]
 Right keys [1]: [i_item_sk#10]
 Join type: Inner
 Join condition: None
 
-(34) Project [codegen id : 6]
+(34) Project [codegen id : 7]
 Output [1]: [ca_state#2]
 Input [3]: [ca_state#2, ss_item_sk#5, i_item_sk#10]
 
-(35) HashAggregate [codegen id : 6]
+(35) HashAggregate [codegen id : 7]
 Input [1]: [ca_state#2]
 Keys [1]: [ca_state#2]
 Functions [1]: [partial_count(1)]
-Aggregate Attributes [1]: [count#18]
-Results [2]: [ca_state#2, count#19]
+Aggregate Attributes [1]: [count#19]
+Results [2]: [ca_state#2, count#20]
 
 (36) Exchange
-Input [2]: [ca_state#2, count#19]
+Input [2]: [ca_state#2, count#20]
 Arguments: hashpartitioning(ca_state#2, 5), ENSURE_REQUIREMENTS, [plan_id=6]
 
-(37) HashAggregate [codegen id : 7]
-Input [2]: [ca_state#2, count#19]
+(37) HashAggregate [codegen id : 8]
+Input [2]: [ca_state#2, count#20]
 Keys [1]: [ca_state#2]
 Functions [1]: [count(1)]
-Aggregate Attributes [1]: [count(1)#20]
-Results [2]: [ca_state#2 AS state#21, count(1)#20 AS cnt#22]
+Aggregate Attributes [1]: [count(1)#21]
+Results [2]: [ca_state#2 AS state#22, count(1)#21 AS cnt#23]
 
-(38) Filter [codegen id : 7]
-Input [2]: [state#21, cnt#22]
-Condition : (cnt#22 >= 10)
+(38) Filter [codegen id : 8]
+Input [2]: [state#22, cnt#23]
+Condition : (cnt#23 >= 10)
 
 (39) TakeOrderedAndProject
-Input [2]: [state#21, cnt#22]
-Arguments: 100, [cnt#22 ASC NULLS FIRST], [state#21, cnt#22]
+Input [2]: [state#22, cnt#23]
+Arguments: 100, [cnt#23 ASC NULLS FIRST], [state#22, cnt#23]
 
 ===== Subqueries =====
 
@@ -235,18 +237,18 @@ BroadcastExchange (44)
 
 
 (unknown) Scan parquet spark_catalog.default.date_dim
-Output [2]: [d_date_sk#9, d_month_seq#23]
+Output [2]: [d_date_sk#9, d_month_seq#24]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/date_dim]
 PushedFilters: [IsNotNull(d_month_seq), IsNotNull(d_date_sk)]
 ReadSchema: struct<d_date_sk:int,d_month_seq:int>
 
 (41) CometFilter
-Input [2]: [d_date_sk#9, d_month_seq#23]
-Condition : ((isnotnull(d_month_seq#23) AND (d_month_seq#23 = Subquery scalar-subquery#24, [id=#25])) AND isnotnull(d_date_sk#9))
+Input [2]: [d_date_sk#9, d_month_seq#24]
+Condition : ((isnotnull(d_month_seq#24) AND (d_month_seq#24 = Subquery scalar-subquery#25, [id=#26])) AND isnotnull(d_date_sk#9))
 
 (42) CometProject
-Input [2]: [d_date_sk#9, d_month_seq#23]
+Input [2]: [d_date_sk#9, d_month_seq#24]
 Arguments: [d_date_sk#9], [d_date_sk#9]
 
 (43) ColumnarToRow [codegen id : 1]
@@ -256,10 +258,10 @@ Input [1]: [d_date_sk#9]
 Input [1]: [d_date_sk#9]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=7]
 
-Subquery:2 Hosting operator id = 41 Hosting Expression = Subquery scalar-subquery#24, [id=#25]
-* ColumnarToRow (51)
-+- CometHashAggregate (50)
-   +- CometExchange (49)
+Subquery:2 Hosting operator id = 41 Hosting Expression = Subquery scalar-subquery#25, [id=#26]
+* HashAggregate (51)
++- Exchange (50)
+   +- * ColumnarToRow (49)
       +- CometHashAggregate (48)
          +- CometProject (47)
             +- CometFilter (46)
@@ -267,35 +269,37 @@ Subquery:2 Hosting operator id = 41 Hosting Expression = Subquery scalar-subquer
 
 
 (unknown) Scan parquet spark_catalog.default.date_dim
-Output [3]: [d_month_seq#26, d_year#27, d_moy#28]
+Output [3]: [d_month_seq#27, d_year#28, d_moy#29]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/date_dim]
 PushedFilters: [IsNotNull(d_year), IsNotNull(d_moy), EqualTo(d_year,2000), EqualTo(d_moy,1)]
 ReadSchema: struct<d_month_seq:int,d_year:int,d_moy:int>
 
 (46) CometFilter
-Input [3]: [d_month_seq#26, d_year#27, d_moy#28]
-Condition : (((isnotnull(d_year#27) AND isnotnull(d_moy#28)) AND (d_year#27 = 2000)) AND (d_moy#28 = 1))
+Input [3]: [d_month_seq#27, d_year#28, d_moy#29]
+Condition : (((isnotnull(d_year#28) AND isnotnull(d_moy#29)) AND (d_year#28 = 2000)) AND (d_moy#29 = 1))
 
 (47) CometProject
-Input [3]: [d_month_seq#26, d_year#27, d_moy#28]
-Arguments: [d_month_seq#26], [d_month_seq#26]
+Input [3]: [d_month_seq#27, d_year#28, d_moy#29]
+Arguments: [d_month_seq#27], [d_month_seq#27]
 
 (48) CometHashAggregate
-Input [1]: [d_month_seq#26]
-Keys [1]: [d_month_seq#26]
+Input [1]: [d_month_seq#27]
+Keys [1]: [d_month_seq#27]
 Functions: []
 
-(49) CometExchange
-Input [1]: [d_month_seq#26]
-Arguments: hashpartitioning(d_month_seq#26, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=8]
+(49) ColumnarToRow [codegen id : 1]
+Input [1]: [d_month_seq#27]
 
-(50) CometHashAggregate
-Input [1]: [d_month_seq#26]
-Keys [1]: [d_month_seq#26]
-Functions: []
+(50) Exchange
+Input [1]: [d_month_seq#27]
+Arguments: hashpartitioning(d_month_seq#27, 5), ENSURE_REQUIREMENTS, [plan_id=8]
 
-(51) ColumnarToRow [codegen id : 1]
-Input [1]: [d_month_seq#26]
+(51) HashAggregate [codegen id : 2]
+Input [1]: [d_month_seq#27]
+Keys [1]: [d_month_seq#27]
+Functions: []
+Aggregate Attributes: []
+Results [1]: [d_month_seq#27]
 
 
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6/simplified.txt
index 24a40f80..fc6d5d01 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6/simplified.txt
@@ -1,10 +1,10 @@
 TakeOrderedAndProject [cnt,state]
-  WholeStageCodegen (7)
+  WholeStageCodegen (8)
     Filter [cnt]
       HashAggregate [ca_state,count] [count(1),state,cnt,count]
         InputAdapter
           Exchange [ca_state] #1
-            WholeStageCodegen (6)
+            WholeStageCodegen (7)
               HashAggregate [ca_state] [count,count]
                 Project [ca_state]
                   BroadcastHashJoin [ss_item_sk,i_item_sk]
@@ -40,21 +40,23 @@ TakeOrderedAndProject [cnt,state]
                                                     CometProject [d_date_sk]
                                                       CometFilter [d_month_seq,d_date_sk]
                                                         Subquery #2
-                                                          WholeStageCodegen (1)
-                                                            ColumnarToRow
+                                                          WholeStageCodegen (2)
+                                                            HashAggregate [d_month_seq]
                                                               InputAdapter
-                                                                CometHashAggregate [d_month_seq]
-                                                                  CometExchange [d_month_seq] #5
-                                                                    CometHashAggregate [d_month_seq]
-                                                                      CometProject [d_month_seq]
-                                                                        CometFilter [d_year,d_moy]
-                                                                          CometScan parquet spark_catalog.default.date_dim [d_month_seq,d_year,d_moy]
+                                                                Exchange [d_month_seq] #5
+                                                                  WholeStageCodegen (1)
+                                                                    ColumnarToRow
+                                                                      InputAdapter
+                                                                        CometHashAggregate [d_month_seq]
+                                                                          CometProject [d_month_seq]
+                                                                            CometFilter [d_year,d_moy]
+                                                                              CometScan parquet spark_catalog.default.date_dim [d_month_seq,d_year,d_moy]
                                                         CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_month_seq]
                         InputAdapter
                           ReusedExchange [d_date_sk] #4
                     InputAdapter
                       BroadcastExchange #6
-                        WholeStageCodegen (5)
+                        WholeStageCodegen (6)
                           Project [i_item_sk]
                             BroadcastHashJoin [i_category,i_category,i_current_price,avg(i_current_price)]
                               ColumnarToRow
@@ -63,12 +65,14 @@ TakeOrderedAndProject [cnt,state]
                                     CometScan parquet spark_catalog.default.item [i_item_sk,i_current_price,i_category]
                               InputAdapter
                                 BroadcastExchange #7
-                                  WholeStageCodegen (4)
-                                    ColumnarToRow
-                                      InputAdapter
-                                        CometFilter [avg(i_current_price)]
-                                          CometHashAggregate [i_category,sum,count]
-                                            CometExchange [i_category] #8
-                                              CometHashAggregate [i_category,i_current_price]
-                                                CometFilter [i_category]
-                                                  CometScan parquet spark_catalog.default.item [i_current_price,i_category]
+                                  WholeStageCodegen (5)
+                                    Filter [avg(i_current_price)]
+                                      HashAggregate [i_category,sum,count] [avg(UnscaledValue(i_current_price)),avg(i_current_price),sum,count]
+                                        InputAdapter
+                                          Exchange [i_category] #8
+                                            WholeStageCodegen (4)
+                                              ColumnarToRow
+                                                InputAdapter
+                                                  CometHashAggregate [i_category,i_current_price]
+                                                    CometFilter [i_category]
+                                                      CometScan parquet spark_catalog.default.item [i_current_price,i_category]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q64/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q64/explain.txt
index c21eda6b..a6f95716 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q64/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q64/explain.txt
@@ -1,183 +1,185 @@
 == Physical Plan ==
-* Sort (179)
-+- Exchange (178)
-   +- * Project (177)
-      +- * SortMergeJoin Inner (176)
-         :- * Sort (108)
-         :  +- Exchange (107)
-         :     +- * HashAggregate (106)
-         :        +- * HashAggregate (105)
-         :           +- * Project (104)
-         :              +- * BroadcastHashJoin Inner BuildRight (103)
-         :                 :- * Project (97)
-         :                 :  +- * BroadcastHashJoin Inner BuildRight (96)
-         :                 :     :- * Project (94)
-         :                 :     :  +- * BroadcastHashJoin Inner BuildRight (93)
-         :                 :     :     :- * Project (88)
-         :                 :     :     :  +- * BroadcastHashJoin Inner BuildRight (87)
-         :                 :     :     :     :- * Project (85)
-         :                 :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (84)
-         :                 :     :     :     :     :- * Project (79)
-         :                 :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (78)
-         :                 :     :     :     :     :     :- * Project (76)
-         :                 :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (75)
-         :                 :     :     :     :     :     :     :- * Project (70)
-         :                 :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (69)
-         :                 :     :     :     :     :     :     :     :- * Project (64)
-         :                 :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (63)
-         :                 :     :     :     :     :     :     :     :     :- * Project (61)
-         :                 :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (60)
-         :                 :     :     :     :     :     :     :     :     :     :- * Project (55)
-         :                 :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (54)
-         :                 :     :     :     :     :     :     :     :     :     :     :- * Project (52)
-         :                 :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (51)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :- * Project (46)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (45)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :- * Project (40)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (39)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :- * Project (34)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (33)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :- * ColumnarToRow (31)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :  +- CometProject (30)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     +- CometSortMergeJoin (29)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :- CometSort (10)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :  +- CometExchange (9)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :     +- CometProject (8)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :        +- CometBroadcastHashJoin (7)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :           :- CometBroadcastExchange (3)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :           :  +- CometFilter (2)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :           :     +- CometScan parquet spark_catalog.default.store_sales (1)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :           +- CometProject (6)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :              +- CometFilter (5)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :                 +- CometScan parquet spark_catalog.default.store_returns (4)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        +- CometSort (28)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :           +- CometProject (27)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              +- CometFilter (26)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                 +- CometHashAggregate (25)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                    +- CometExchange (24)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                       +- CometHashAggregate (23)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                          +- CometProject (22)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                             +- CometSortMergeJoin (21)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                :- CometSort (15)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                :  +- CometExchange (14)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                :     +- CometProject (13)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                :        +- CometFilter (12)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                :           +- CometScan parquet spark_catalog.default.catalog_sales (11)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                +- CometSort (20)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                   +- CometExchange (19)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                      +- CometProject (18)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                         +- CometFilter (17)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                            +- CometScan parquet spark_catalog.default.catalog_returns (16)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (32)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     +- BroadcastExchange (38)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :        +- * ColumnarToRow (37)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :           +- CometFilter (36)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.store (35)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :     +- BroadcastExchange (44)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :        +- * ColumnarToRow (43)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :           +- CometFilter (42)
-         :                 :     :     :     :     :     :     :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.customer (41)
-         :                 :     :     :     :     :     :     :     :     :     :     :     +- BroadcastExchange (50)
-         :                 :     :     :     :     :     :     :     :     :     :     :        +- * ColumnarToRow (49)
-         :                 :     :     :     :     :     :     :     :     :     :     :           +- CometFilter (48)
-         :                 :     :     :     :     :     :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.date_dim (47)
-         :                 :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (53)
-         :                 :     :     :     :     :     :     :     :     :     +- BroadcastExchange (59)
-         :                 :     :     :     :     :     :     :     :     :        +- * ColumnarToRow (58)
-         :                 :     :     :     :     :     :     :     :     :           +- CometFilter (57)
-         :                 :     :     :     :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.customer_demographics (56)
-         :                 :     :     :     :     :     :     :     :     +- ReusedExchange (62)
-         :                 :     :     :     :     :     :     :     +- BroadcastExchange (68)
-         :                 :     :     :     :     :     :     :        +- * ColumnarToRow (67)
-         :                 :     :     :     :     :     :     :           +- CometFilter (66)
-         :                 :     :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.promotion (65)
-         :                 :     :     :     :     :     :     +- BroadcastExchange (74)
-         :                 :     :     :     :     :     :        +- * ColumnarToRow (73)
-         :                 :     :     :     :     :     :           +- CometFilter (72)
-         :                 :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.household_demographics (71)
-         :                 :     :     :     :     :     +- ReusedExchange (77)
-         :                 :     :     :     :     +- BroadcastExchange (83)
-         :                 :     :     :     :        +- * ColumnarToRow (82)
-         :                 :     :     :     :           +- CometFilter (81)
-         :                 :     :     :     :              +- CometScan parquet spark_catalog.default.customer_address (80)
-         :                 :     :     :     +- ReusedExchange (86)
-         :                 :     :     +- BroadcastExchange (92)
-         :                 :     :        +- * ColumnarToRow (91)
-         :                 :     :           +- CometFilter (90)
-         :                 :     :              +- CometScan parquet spark_catalog.default.income_band (89)
-         :                 :     +- ReusedExchange (95)
-         :                 +- BroadcastExchange (102)
-         :                    +- * ColumnarToRow (101)
-         :                       +- CometProject (100)
-         :                          +- CometFilter (99)
-         :                             +- CometScan parquet spark_catalog.default.item (98)
-         +- * Sort (175)
-            +- Exchange (174)
-               +- * HashAggregate (173)
-                  +- * HashAggregate (172)
-                     +- * Project (171)
-                        +- * BroadcastHashJoin Inner BuildRight (170)
-                           :- * Project (168)
-                           :  +- * BroadcastHashJoin Inner BuildRight (167)
-                           :     :- * Project (165)
-                           :     :  +- * BroadcastHashJoin Inner BuildRight (164)
-                           :     :     :- * Project (162)
-                           :     :     :  +- * BroadcastHashJoin Inner BuildRight (161)
-                           :     :     :     :- * Project (159)
-                           :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (158)
-                           :     :     :     :     :- * Project (156)
-                           :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (155)
-                           :     :     :     :     :     :- * Project (153)
-                           :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (152)
-                           :     :     :     :     :     :     :- * Project (150)
-                           :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (149)
-                           :     :     :     :     :     :     :     :- * Project (147)
-                           :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (146)
-                           :     :     :     :     :     :     :     :     :- * Project (144)
-                           :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (143)
-                           :     :     :     :     :     :     :     :     :     :- * Project (141)
-                           :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (140)
-                           :     :     :     :     :     :     :     :     :     :     :- * Project (138)
-                           :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (137)
-                           :     :     :     :     :     :     :     :     :     :     :     :- * Project (135)
-                           :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (134)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :- * Project (132)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (131)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :- * Project (129)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (128)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :- * ColumnarToRow (126)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :  +- CometProject (125)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     +- CometSortMergeJoin (124)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :- CometSort (118)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :  +- CometExchange (117)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :     +- CometProject (116)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :        +- CometBroadcastHashJoin (115)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :           :- CometBroadcastExchange (111)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :           :  +- CometFilter (110)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :           :     +- CometScan parquet spark_catalog.default.store_sales (109)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :           +- CometProject (114)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :              +- CometFilter (113)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        :                 +- CometScan parquet spark_catalog.default.store_returns (112)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        +- CometSort (123)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :           +- CometProject (122)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              +- CometFilter (121)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                 +- CometHashAggregate (120)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                    +- ReusedExchange (119)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (127)
-                           :     :     :     :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (130)
-                           :     :     :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (133)
-                           :     :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (136)
-                           :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (139)
-                           :     :     :     :     :     :     :     :     :     +- ReusedExchange (142)
-                           :     :     :     :     :     :     :     :     +- ReusedExchange (145)
-                           :     :     :     :     :     :     :     +- ReusedExchange (148)
-                           :     :     :     :     :     :     +- ReusedExchange (151)
-                           :     :     :     :     :     +- ReusedExchange (154)
-                           :     :     :     :     +- ReusedExchange (157)
-                           :     :     :     +- ReusedExchange (160)
-                           :     :     +- ReusedExchange (163)
-                           :     +- ReusedExchange (166)
-                           +- ReusedExchange (169)
+* Sort (181)
++- Exchange (180)
+   +- * Project (179)
+      +- * SortMergeJoin Inner (178)
+         :- * Sort (110)
+         :  +- Exchange (109)
+         :     +- * HashAggregate (108)
+         :        +- * HashAggregate (107)
+         :           +- * Project (106)
+         :              +- * BroadcastHashJoin Inner BuildRight (105)
+         :                 :- * Project (99)
+         :                 :  +- * BroadcastHashJoin Inner BuildRight (98)
+         :                 :     :- * Project (96)
+         :                 :     :  +- * BroadcastHashJoin Inner BuildRight (95)
+         :                 :     :     :- * Project (90)
+         :                 :     :     :  +- * BroadcastHashJoin Inner BuildRight (89)
+         :                 :     :     :     :- * Project (87)
+         :                 :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (86)
+         :                 :     :     :     :     :- * Project (81)
+         :                 :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (80)
+         :                 :     :     :     :     :     :- * Project (78)
+         :                 :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (77)
+         :                 :     :     :     :     :     :     :- * Project (72)
+         :                 :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (71)
+         :                 :     :     :     :     :     :     :     :- * Project (66)
+         :                 :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (65)
+         :                 :     :     :     :     :     :     :     :     :- * Project (63)
+         :                 :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (62)
+         :                 :     :     :     :     :     :     :     :     :     :- * Project (57)
+         :                 :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (56)
+         :                 :     :     :     :     :     :     :     :     :     :     :- * Project (54)
+         :                 :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (53)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :- * Project (48)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (47)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :- * Project (42)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (41)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :- * Project (36)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (35)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :- * Project (33)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :  +- * SortMergeJoin Inner (32)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :- * Sort (11)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :  +- Exchange (10)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     +- * ColumnarToRow (9)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        +- CometProject (8)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :           +- CometBroadcastHashJoin (7)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              :- CometBroadcastExchange (3)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              :  +- CometFilter (2)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              :     +- CometScan parquet spark_catalog.default.store_sales (1)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              +- CometProject (6)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                 +- CometFilter (5)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                    +- CometScan parquet spark_catalog.default.store_returns (4)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     +- * Sort (31)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        +- * Project (30)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :           +- * Filter (29)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              +- * HashAggregate (28)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                 +- Exchange (27)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                    +- * HashAggregate (26)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                       +- * Project (25)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                          +- * SortMergeJoin Inner (24)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                             :- * Sort (17)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                             :  +- Exchange (16)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                             :     +- * ColumnarToRow (15)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                             :        +- CometProject (14)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                             :           +- CometFilter (13)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                             :              +- CometScan parquet spark_catalog.default.catalog_sales (12)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                             +- * Sort (23)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                +- Exchange (22)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                   +- * ColumnarToRow (21)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                      +- CometProject (20)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                         +- CometFilter (19)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                            +- CometScan parquet spark_catalog.default.catalog_returns (18)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (34)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :     +- BroadcastExchange (40)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :        +- * ColumnarToRow (39)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :           +- CometFilter (38)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.store (37)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :     +- BroadcastExchange (46)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :        +- * ColumnarToRow (45)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :           +- CometFilter (44)
+         :                 :     :     :     :     :     :     :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.customer (43)
+         :                 :     :     :     :     :     :     :     :     :     :     :     +- BroadcastExchange (52)
+         :                 :     :     :     :     :     :     :     :     :     :     :        +- * ColumnarToRow (51)
+         :                 :     :     :     :     :     :     :     :     :     :     :           +- CometFilter (50)
+         :                 :     :     :     :     :     :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.date_dim (49)
+         :                 :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (55)
+         :                 :     :     :     :     :     :     :     :     :     +- BroadcastExchange (61)
+         :                 :     :     :     :     :     :     :     :     :        +- * ColumnarToRow (60)
+         :                 :     :     :     :     :     :     :     :     :           +- CometFilter (59)
+         :                 :     :     :     :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.customer_demographics (58)
+         :                 :     :     :     :     :     :     :     :     +- ReusedExchange (64)
+         :                 :     :     :     :     :     :     :     +- BroadcastExchange (70)
+         :                 :     :     :     :     :     :     :        +- * ColumnarToRow (69)
+         :                 :     :     :     :     :     :     :           +- CometFilter (68)
+         :                 :     :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.promotion (67)
+         :                 :     :     :     :     :     :     +- BroadcastExchange (76)
+         :                 :     :     :     :     :     :        +- * ColumnarToRow (75)
+         :                 :     :     :     :     :     :           +- CometFilter (74)
+         :                 :     :     :     :     :     :              +- CometScan parquet spark_catalog.default.household_demographics (73)
+         :                 :     :     :     :     :     +- ReusedExchange (79)
+         :                 :     :     :     :     +- BroadcastExchange (85)
+         :                 :     :     :     :        +- * ColumnarToRow (84)
+         :                 :     :     :     :           +- CometFilter (83)
+         :                 :     :     :     :              +- CometScan parquet spark_catalog.default.customer_address (82)
+         :                 :     :     :     +- ReusedExchange (88)
+         :                 :     :     +- BroadcastExchange (94)
+         :                 :     :        +- * ColumnarToRow (93)
+         :                 :     :           +- CometFilter (92)
+         :                 :     :              +- CometScan parquet spark_catalog.default.income_band (91)
+         :                 :     +- ReusedExchange (97)
+         :                 +- BroadcastExchange (104)
+         :                    +- * ColumnarToRow (103)
+         :                       +- CometProject (102)
+         :                          +- CometFilter (101)
+         :                             +- CometScan parquet spark_catalog.default.item (100)
+         +- * Sort (177)
+            +- Exchange (176)
+               +- * HashAggregate (175)
+                  +- * HashAggregate (174)
+                     +- * Project (173)
+                        +- * BroadcastHashJoin Inner BuildRight (172)
+                           :- * Project (170)
+                           :  +- * BroadcastHashJoin Inner BuildRight (169)
+                           :     :- * Project (167)
+                           :     :  +- * BroadcastHashJoin Inner BuildRight (166)
+                           :     :     :- * Project (164)
+                           :     :     :  +- * BroadcastHashJoin Inner BuildRight (163)
+                           :     :     :     :- * Project (161)
+                           :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (160)
+                           :     :     :     :     :- * Project (158)
+                           :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (157)
+                           :     :     :     :     :     :- * Project (155)
+                           :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (154)
+                           :     :     :     :     :     :     :- * Project (152)
+                           :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (151)
+                           :     :     :     :     :     :     :     :- * Project (149)
+                           :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (148)
+                           :     :     :     :     :     :     :     :     :- * Project (146)
+                           :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (145)
+                           :     :     :     :     :     :     :     :     :     :- * Project (143)
+                           :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (142)
+                           :     :     :     :     :     :     :     :     :     :     :- * Project (140)
+                           :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (139)
+                           :     :     :     :     :     :     :     :     :     :     :     :- * Project (137)
+                           :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (136)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :- * Project (134)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (133)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :- * Project (131)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (130)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :- * Project (128)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :  +- * SortMergeJoin Inner (127)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :- * Sort (121)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :  +- Exchange (120)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     +- * ColumnarToRow (119)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        +- CometProject (118)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :           +- CometBroadcastHashJoin (117)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              :- CometBroadcastExchange (113)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              :  +- CometFilter (112)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              :     +- CometScan parquet spark_catalog.default.store_sales (111)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              +- CometProject (116)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                 +- CometFilter (115)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                    +- CometScan parquet spark_catalog.default.store_returns (114)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     +- * Sort (126)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :        +- * Project (125)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :           +- * Filter (124)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :              +- * HashAggregate (123)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                 +- ReusedExchange (122)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (129)
+                           :     :     :     :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (132)
+                           :     :     :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (135)
+                           :     :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (138)
+                           :     :     :     :     :     :     :     :     :     :     +- ReusedExchange (141)
+                           :     :     :     :     :     :     :     :     :     +- ReusedExchange (144)
+                           :     :     :     :     :     :     :     :     +- ReusedExchange (147)
+                           :     :     :     :     :     :     :     +- ReusedExchange (150)
+                           :     :     :     :     :     :     +- ReusedExchange (153)
+                           :     :     :     :     :     +- ReusedExchange (156)
+                           :     :     :     :     +- ReusedExchange (159)
+                           :     :     :     +- ReusedExchange (162)
+                           :     :     +- ReusedExchange (165)
+                           :     +- ReusedExchange (168)
+                           +- ReusedExchange (171)
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
@@ -220,13 +222,16 @@ Arguments: [ss_item_sk#1, ss_ticket_number#8], [sr_item_sk#14, sr_ticket_number#
 Input [14]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_ticket_number#8, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12, sr_item_sk#14, sr_ticket_number#15]
 Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12], [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12]
 
-(9) CometExchange
+(9) ColumnarToRow [codegen id : 1]
 Input [11]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12]
-Arguments: hashpartitioning(ss_item_sk#1, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(10) CometSort
+(10) Exchange
 Input [11]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12], [ss_item_sk#1 ASC NULLS FIRST]
+Arguments: hashpartitioning(ss_item_sk#1, 5), ENSURE_REQUIREMENTS, [plan_id=1]
+
+(11) Sort [codegen id : 2]
+Input [11]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12]
+Arguments: [ss_item_sk#1 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.catalog_sales
 Output [4]: [cs_item_sk#17, cs_order_number#18, cs_ext_list_price#19, cs_sold_date_sk#20]
@@ -235,21 +240,24 @@ Location [not included in comparison]/{warehouse_dir}/catalog_sales]
 PushedFilters: [IsNotNull(cs_item_sk), IsNotNull(cs_order_number)]
 ReadSchema: struct<cs_item_sk:int,cs_order_number:int,cs_ext_list_price:decimal(7,2)>
 
-(12) CometFilter
+(13) CometFilter
 Input [4]: [cs_item_sk#17, cs_order_number#18, cs_ext_list_price#19, cs_sold_date_sk#20]
 Condition : (isnotnull(cs_item_sk#17) AND isnotnull(cs_order_number#18))
 
-(13) CometProject
+(14) CometProject
 Input [4]: [cs_item_sk#17, cs_order_number#18, cs_ext_list_price#19, cs_sold_date_sk#20]
 Arguments: [cs_item_sk#17, cs_order_number#18, cs_ext_list_price#19], [cs_item_sk#17, cs_order_number#18, cs_ext_list_price#19]
 
-(14) CometExchange
+(15) ColumnarToRow [codegen id : 3]
 Input [3]: [cs_item_sk#17, cs_order_number#18, cs_ext_list_price#19]
-Arguments: hashpartitioning(cs_item_sk#17, cs_order_number#18, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]
 
-(15) CometSort
+(16) Exchange
 Input [3]: [cs_item_sk#17, cs_order_number#18, cs_ext_list_price#19]
-Arguments: [cs_item_sk#17, cs_order_number#18, cs_ext_list_price#19], [cs_item_sk#17 ASC NULLS FIRST, cs_order_number#18 ASC NULLS FIRST]
+Arguments: hashpartitioning(cs_item_sk#17, cs_order_number#18, 5), ENSURE_REQUIREMENTS, [plan_id=2]
+
+(17) Sort [codegen id : 4]
+Input [3]: [cs_item_sk#17, cs_order_number#18, cs_ext_list_price#19]
+Arguments: [cs_item_sk#17 ASC NULLS FIRST, cs_order_number#18 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.catalog_returns
 Output [6]: [cr_item_sk#21, cr_order_number#22, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25, cr_returned_date_sk#26]
@@ -258,790 +266,799 @@ Location [not included in comparison]/{warehouse_dir}/catalog_returns]
 PushedFilters: [IsNotNull(cr_item_sk), IsNotNull(cr_order_number)]
 ReadSchema: struct<cr_item_sk:int,cr_order_number:int,cr_refunded_cash:decimal(7,2),cr_reversed_charge:decimal(7,2),cr_store_credit:decimal(7,2)>
 
-(17) CometFilter
+(19) CometFilter
 Input [6]: [cr_item_sk#21, cr_order_number#22, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25, cr_returned_date_sk#26]
 Condition : (isnotnull(cr_item_sk#21) AND isnotnull(cr_order_number#22))
 
-(18) CometProject
+(20) CometProject
 Input [6]: [cr_item_sk#21, cr_order_number#22, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25, cr_returned_date_sk#26]
 Arguments: [cr_item_sk#21, cr_order_number#22, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25], [cr_item_sk#21, cr_order_number#22, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25]
 
-(19) CometExchange
+(21) ColumnarToRow [codegen id : 5]
 Input [5]: [cr_item_sk#21, cr_order_number#22, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25]
-Arguments: hashpartitioning(cr_item_sk#21, cr_order_number#22, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]
 
-(20) CometSort
+(22) Exchange
 Input [5]: [cr_item_sk#21, cr_order_number#22, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25]
-Arguments: [cr_item_sk#21, cr_order_number#22, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25], [cr_item_sk#21 ASC NULLS FIRST, cr_order_number#22 ASC NULLS FIRST]
+Arguments: hashpartitioning(cr_item_sk#21, cr_order_number#22, 5), ENSURE_REQUIREMENTS, [plan_id=3]
 
-(21) CometSortMergeJoin
-Left output [3]: [cs_item_sk#17, cs_order_number#18, cs_ext_list_price#19]
-Right output [5]: [cr_item_sk#21, cr_order_number#22, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25]
-Arguments: [cs_item_sk#17, cs_order_number#18], [cr_item_sk#21, cr_order_number#22], Inner
+(23) Sort [codegen id : 6]
+Input [5]: [cr_item_sk#21, cr_order_number#22, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25]
+Arguments: [cr_item_sk#21 ASC NULLS FIRST, cr_order_number#22 ASC NULLS FIRST], false, 0
 
-(22) CometProject
+(24) SortMergeJoin [codegen id : 7]
+Left keys [2]: [cs_item_sk#17, cs_order_number#18]
+Right keys [2]: [cr_item_sk#21, cr_order_number#22]
+Join type: Inner
+Join condition: None
+
+(25) Project [codegen id : 7]
+Output [5]: [cs_item_sk#17, cs_ext_list_price#19, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25]
 Input [8]: [cs_item_sk#17, cs_order_number#18, cs_ext_list_price#19, cr_item_sk#21, cr_order_number#22, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25]
-Arguments: [cs_item_sk#17, cs_ext_list_price#19, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25], [cs_item_sk#17, cs_ext_list_price#19, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25]
 
-(23) CometHashAggregate
+(26) HashAggregate [codegen id : 7]
 Input [5]: [cs_item_sk#17, cs_ext_list_price#19, cr_refunded_cash#23, cr_reversed_charge#24, cr_store_credit#25]
 Keys [1]: [cs_item_sk#17]
 Functions [2]: [partial_sum(UnscaledValue(cs_ext_list_price#19)), partial_sum(((cr_refunded_cash#23 + cr_reversed_charge#24) + cr_store_credit#25))]
+Aggregate Attributes [3]: [sum#27, sum#28, isEmpty#29]
+Results [4]: [cs_item_sk#17, sum#30, sum#31, isEmpty#32]
 
-(24) CometExchange
-Input [4]: [cs_item_sk#17, sum#27, sum#28, isEmpty#29]
-Arguments: hashpartitioning(cs_item_sk#17, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=4]
+(27) Exchange
+Input [4]: [cs_item_sk#17, sum#30, sum#31, isEmpty#32]
+Arguments: hashpartitioning(cs_item_sk#17, 5), ENSURE_REQUIREMENTS, [plan_id=4]
 
-(25) CometHashAggregate
-Input [4]: [cs_item_sk#17, sum#27, sum#28, isEmpty#29]
+(28) HashAggregate [codegen id : 8]
+Input [4]: [cs_item_sk#17, sum#30, sum#31, isEmpty#32]
 Keys [1]: [cs_item_sk#17]
 Functions [2]: [sum(UnscaledValue(cs_ext_list_price#19)), sum(((cr_refunded_cash#23 + cr_reversed_charge#24) + cr_store_credit#25))]
+Aggregate Attributes [2]: [sum(UnscaledValue(cs_ext_list_price#19))#33, sum(((cr_refunded_cash#23 + cr_reversed_charge#24) + cr_store_credit#25))#34]
+Results [3]: [cs_item_sk#17, MakeDecimal(sum(UnscaledValue(cs_ext_list_price#19))#33,17,2) AS sale#35, sum(((cr_refunded_cash#23 + cr_reversed_charge#24) + cr_store_credit#25))#34 AS refund#36]
 
-(26) CometFilter
-Input [3]: [cs_item_sk#17, sale#30, refund#31]
-Condition : ((isnotnull(sale#30) AND isnotnull(refund#31)) AND (cast(sale#30 as decimal(21,2)) > (2 * refund#31)))
+(29) Filter [codegen id : 8]
+Input [3]: [cs_item_sk#17, sale#35, refund#36]
+Condition : ((isnotnull(sale#35) AND isnotnull(refund#36)) AND (cast(sale#35 as decimal(21,2)) > (2 * refund#36)))
 
-(27) CometProject
-Input [3]: [cs_item_sk#17, sale#30, refund#31]
-Arguments: [cs_item_sk#17], [cs_item_sk#17]
+(30) Project [codegen id : 8]
+Output [1]: [cs_item_sk#17]
+Input [3]: [cs_item_sk#17, sale#35, refund#36]
 
-(28) CometSort
+(31) Sort [codegen id : 8]
 Input [1]: [cs_item_sk#17]
-Arguments: [cs_item_sk#17], [cs_item_sk#17 ASC NULLS FIRST]
+Arguments: [cs_item_sk#17 ASC NULLS FIRST], false, 0
 
-(29) CometSortMergeJoin
-Left output [11]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12]
-Right output [1]: [cs_item_sk#17]
-Arguments: [ss_item_sk#1], [cs_item_sk#17], Inner
+(32) SortMergeJoin [codegen id : 24]
+Left keys [1]: [ss_item_sk#1]
+Right keys [1]: [cs_item_sk#17]
+Join type: Inner
+Join condition: None
 
-(30) CometProject
+(33) Project [codegen id : 24]
+Output [11]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12]
 Input [12]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12, cs_item_sk#17]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12], [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12]
-
-(31) ColumnarToRow [codegen id : 16]
-Input [11]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12]
 
-(32) ReusedExchange [Reuses operator id: 183]
-Output [2]: [d_date_sk#32, d_year#33]
+(34) ReusedExchange [Reuses operator id: 185]
+Output [2]: [d_date_sk#37, d_year#38]
 
-(33) BroadcastHashJoin [codegen id : 16]
+(35) BroadcastHashJoin [codegen id : 24]
 Left keys [1]: [ss_sold_date_sk#12]
-Right keys [1]: [d_date_sk#32]
+Right keys [1]: [d_date_sk#37]
 Join type: Inner
 Join condition: None
 
-(34) Project [codegen id : 16]
-Output [11]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33]
-Input [13]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12, d_date_sk#32, d_year#33]
+(36) Project [codegen id : 24]
+Output [11]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38]
+Input [13]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, ss_sold_date_sk#12, d_date_sk#37, d_year#38]
 
 (unknown) Scan parquet spark_catalog.default.store
-Output [3]: [s_store_sk#34, s_store_name#35, s_zip#36]
+Output [3]: [s_store_sk#39, s_store_name#40, s_zip#41]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/store]
 PushedFilters: [IsNotNull(s_store_sk), IsNotNull(s_store_name), IsNotNull(s_zip)]
 ReadSchema: struct<s_store_sk:int,s_store_name:string,s_zip:string>
 
-(36) CometFilter
-Input [3]: [s_store_sk#34, s_store_name#35, s_zip#36]
-Condition : ((isnotnull(s_store_sk#34) AND isnotnull(s_store_name#35)) AND isnotnull(s_zip#36))
+(38) CometFilter
+Input [3]: [s_store_sk#39, s_store_name#40, s_zip#41]
+Condition : ((isnotnull(s_store_sk#39) AND isnotnull(s_store_name#40)) AND isnotnull(s_zip#41))
 
-(37) ColumnarToRow [codegen id : 2]
-Input [3]: [s_store_sk#34, s_store_name#35, s_zip#36]
+(39) ColumnarToRow [codegen id : 10]
+Input [3]: [s_store_sk#39, s_store_name#40, s_zip#41]
 
-(38) BroadcastExchange
-Input [3]: [s_store_sk#34, s_store_name#35, s_zip#36]
+(40) BroadcastExchange
+Input [3]: [s_store_sk#39, s_store_name#40, s_zip#41]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=5]
 
-(39) BroadcastHashJoin [codegen id : 16]
+(41) BroadcastHashJoin [codegen id : 24]
 Left keys [1]: [ss_store_sk#6]
-Right keys [1]: [s_store_sk#34]
+Right keys [1]: [s_store_sk#39]
 Join type: Inner
 Join condition: None
 
-(40) Project [codegen id : 16]
-Output [12]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36]
-Input [14]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_sk#34, s_store_name#35, s_zip#36]
+(42) Project [codegen id : 24]
+Output [12]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41]
+Input [14]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_store_sk#6, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_sk#39, s_store_name#40, s_zip#41]
 
 (unknown) Scan parquet spark_catalog.default.customer
-Output [6]: [c_customer_sk#37, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, c_first_shipto_date_sk#41, c_first_sales_date_sk#42]
+Output [6]: [c_customer_sk#42, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, c_first_shipto_date_sk#46, c_first_sales_date_sk#47]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/customer]
 PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_first_sales_date_sk), IsNotNull(c_first_shipto_date_sk), IsNotNull(c_current_cdemo_sk), IsNotNull(c_current_hdemo_sk), IsNotNull(c_current_addr_sk)]
 ReadSchema: struct<c_customer_sk:int,c_current_cdemo_sk:int,c_current_hdemo_sk:int,c_current_addr_sk:int,c_first_shipto_date_sk:int,c_first_sales_date_sk:int>
 
-(42) CometFilter
-Input [6]: [c_customer_sk#37, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, c_first_shipto_date_sk#41, c_first_sales_date_sk#42]
-Condition : (((((isnotnull(c_customer_sk#37) AND isnotnull(c_first_sales_date_sk#42)) AND isnotnull(c_first_shipto_date_sk#41)) AND isnotnull(c_current_cdemo_sk#38)) AND isnotnull(c_current_hdemo_sk#39)) AND isnotnull(c_current_addr_sk#40))
+(44) CometFilter
+Input [6]: [c_customer_sk#42, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, c_first_shipto_date_sk#46, c_first_sales_date_sk#47]
+Condition : (((((isnotnull(c_customer_sk#42) AND isnotnull(c_first_sales_date_sk#47)) AND isnotnull(c_first_shipto_date_sk#46)) AND isnotnull(c_current_cdemo_sk#43)) AND isnotnull(c_current_hdemo_sk#44)) AND isnotnull(c_current_addr_sk#45))
 
-(43) ColumnarToRow [codegen id : 3]
-Input [6]: [c_customer_sk#37, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, c_first_shipto_date_sk#41, c_first_sales_date_sk#42]
+(45) ColumnarToRow [codegen id : 11]
+Input [6]: [c_customer_sk#42, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, c_first_shipto_date_sk#46, c_first_sales_date_sk#47]
 
-(44) BroadcastExchange
-Input [6]: [c_customer_sk#37, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, c_first_shipto_date_sk#41, c_first_sales_date_sk#42]
+(46) BroadcastExchange
+Input [6]: [c_customer_sk#42, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, c_first_shipto_date_sk#46, c_first_sales_date_sk#47]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=6]
 
-(45) BroadcastHashJoin [codegen id : 16]
+(47) BroadcastHashJoin [codegen id : 24]
 Left keys [1]: [ss_customer_sk#2]
-Right keys [1]: [c_customer_sk#37]
+Right keys [1]: [c_customer_sk#42]
 Join type: Inner
 Join condition: None
 
-(46) Project [codegen id : 16]
-Output [16]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, c_first_shipto_date_sk#41, c_first_sales_date_sk#42]
-Input [18]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_customer_sk#37, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, c_first_shipto_date_sk#41, c_first_sales_date_sk#42]
+(48) Project [codegen id : 24]
+Output [16]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, c_first_shipto_date_sk#46, c_first_sales_date_sk#47]
+Input [18]: [ss_item_sk#1, ss_customer_sk#2, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_customer_sk#42, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, c_first_shipto_date_sk#46, c_first_sales_date_sk#47]
 
 (unknown) Scan parquet spark_catalog.default.date_dim
-Output [2]: [d_date_sk#43, d_year#44]
+Output [2]: [d_date_sk#48, d_year#49]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/date_dim]
 PushedFilters: [IsNotNull(d_date_sk)]
 ReadSchema: struct<d_date_sk:int,d_year:int>
 
-(48) CometFilter
-Input [2]: [d_date_sk#43, d_year#44]
-Condition : isnotnull(d_date_sk#43)
+(50) CometFilter
+Input [2]: [d_date_sk#48, d_year#49]
+Condition : isnotnull(d_date_sk#48)
 
-(49) ColumnarToRow [codegen id : 4]
-Input [2]: [d_date_sk#43, d_year#44]
+(51) ColumnarToRow [codegen id : 12]
+Input [2]: [d_date_sk#48, d_year#49]
 
-(50) BroadcastExchange
-Input [2]: [d_date_sk#43, d_year#44]
+(52) BroadcastExchange
+Input [2]: [d_date_sk#48, d_year#49]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=7]
 
-(51) BroadcastHashJoin [codegen id : 16]
-Left keys [1]: [c_first_sales_date_sk#42]
-Right keys [1]: [d_date_sk#43]
+(53) BroadcastHashJoin [codegen id : 24]
+Left keys [1]: [c_first_sales_date_sk#47]
+Right keys [1]: [d_date_sk#48]
 Join type: Inner
 Join condition: None
 
-(52) Project [codegen id : 16]
-Output [16]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, c_first_shipto_date_sk#41, d_year#44]
-Input [18]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, c_first_shipto_date_sk#41, c_first_sales_date_sk#42, d_date_sk#43, d_year#44]
+(54) Project [codegen id : 24]
+Output [16]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, c_first_shipto_date_sk#46, d_year#49]
+Input [18]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, c_first_shipto_date_sk#46, c_first_sales_date_sk#47, d_date_sk#48, d_year#49]
 
-(53) ReusedExchange [Reuses operator id: 50]
-Output [2]: [d_date_sk#45, d_year#46]
+(55) ReusedExchange [Reuses operator id: 52]
+Output [2]: [d_date_sk#50, d_year#51]
 
-(54) BroadcastHashJoin [codegen id : 16]
-Left keys [1]: [c_first_shipto_date_sk#41]
-Right keys [1]: [d_date_sk#45]
+(56) BroadcastHashJoin [codegen id : 24]
+Left keys [1]: [c_first_shipto_date_sk#46]
+Right keys [1]: [d_date_sk#50]
 Join type: Inner
 Join condition: None
 
-(55) Project [codegen id : 16]
-Output [16]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, d_year#44, d_year#46]
-Input [18]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, c_first_shipto_date_sk#41, d_year#44, d_date_sk#45, d_year#46]
+(57) Project [codegen id : 24]
+Output [16]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, d_year#49, d_year#51]
+Input [18]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, c_first_shipto_date_sk#46, d_year#49, d_date_sk#50, d_year#51]
 
 (unknown) Scan parquet spark_catalog.default.customer_demographics
-Output [2]: [cd_demo_sk#47, cd_marital_status#48]
+Output [2]: [cd_demo_sk#52, cd_marital_status#53]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/customer_demographics]
 PushedFilters: [IsNotNull(cd_demo_sk), IsNotNull(cd_marital_status)]
 ReadSchema: struct<cd_demo_sk:int,cd_marital_status:string>
 
-(57) CometFilter
-Input [2]: [cd_demo_sk#47, cd_marital_status#48]
-Condition : (isnotnull(cd_demo_sk#47) AND isnotnull(cd_marital_status#48))
+(59) CometFilter
+Input [2]: [cd_demo_sk#52, cd_marital_status#53]
+Condition : (isnotnull(cd_demo_sk#52) AND isnotnull(cd_marital_status#53))
 
-(58) ColumnarToRow [codegen id : 6]
-Input [2]: [cd_demo_sk#47, cd_marital_status#48]
+(60) ColumnarToRow [codegen id : 14]
+Input [2]: [cd_demo_sk#52, cd_marital_status#53]
 
-(59) BroadcastExchange
-Input [2]: [cd_demo_sk#47, cd_marital_status#48]
+(61) BroadcastExchange
+Input [2]: [cd_demo_sk#52, cd_marital_status#53]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=8]
 
-(60) BroadcastHashJoin [codegen id : 16]
+(62) BroadcastHashJoin [codegen id : 24]
 Left keys [1]: [ss_cdemo_sk#3]
-Right keys [1]: [cd_demo_sk#47]
+Right keys [1]: [cd_demo_sk#52]
 Join type: Inner
 Join condition: None
 
-(61) Project [codegen id : 16]
-Output [16]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, d_year#44, d_year#46, cd_marital_status#48]
-Input [18]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, d_year#44, d_year#46, cd_demo_sk#47, cd_marital_status#48]
+(63) Project [codegen id : 24]
+Output [16]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, d_year#49, d_year#51, cd_marital_status#53]
+Input [18]: [ss_item_sk#1, ss_cdemo_sk#3, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, d_year#49, d_year#51, cd_demo_sk#52, cd_marital_status#53]
 
-(62) ReusedExchange [Reuses operator id: 59]
-Output [2]: [cd_demo_sk#49, cd_marital_status#50]
+(64) ReusedExchange [Reuses operator id: 61]
+Output [2]: [cd_demo_sk#54, cd_marital_status#55]
 
-(63) BroadcastHashJoin [codegen id : 16]
-Left keys [1]: [c_current_cdemo_sk#38]
-Right keys [1]: [cd_demo_sk#49]
+(65) BroadcastHashJoin [codegen id : 24]
+Left keys [1]: [c_current_cdemo_sk#43]
+Right keys [1]: [cd_demo_sk#54]
 Join type: Inner
-Join condition: NOT (cd_marital_status#48 = cd_marital_status#50)
+Join condition: NOT (cd_marital_status#53 = cd_marital_status#55)
 
-(64) Project [codegen id : 16]
-Output [14]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_hdemo_sk#39, c_current_addr_sk#40, d_year#44, d_year#46]
-Input [18]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_cdemo_sk#38, c_current_hdemo_sk#39, c_current_addr_sk#40, d_year#44, d_year#46, cd_marital_status#48, cd_demo_sk#49, cd_marital_status#50]
+(66) Project [codegen id : 24]
+Output [14]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_hdemo_sk#44, c_current_addr_sk#45, d_year#49, d_year#51]
+Input [18]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_cdemo_sk#43, c_current_hdemo_sk#44, c_current_addr_sk#45, d_year#49, d_year#51, cd_marital_status#53, cd_demo_sk#54, cd_marital_status#55]
 
 (unknown) Scan parquet spark_catalog.default.promotion
-Output [1]: [p_promo_sk#51]
+Output [1]: [p_promo_sk#56]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/promotion]
 PushedFilters: [IsNotNull(p_promo_sk)]
 ReadSchema: struct<p_promo_sk:int>
 
-(66) CometFilter
-Input [1]: [p_promo_sk#51]
-Condition : isnotnull(p_promo_sk#51)
+(68) CometFilter
+Input [1]: [p_promo_sk#56]
+Condition : isnotnull(p_promo_sk#56)
 
-(67) ColumnarToRow [codegen id : 8]
-Input [1]: [p_promo_sk#51]
+(69) ColumnarToRow [codegen id : 16]
+Input [1]: [p_promo_sk#56]
 
-(68) BroadcastExchange
-Input [1]: [p_promo_sk#51]
+(70) BroadcastExchange
+Input [1]: [p_promo_sk#56]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=9]
 
-(69) BroadcastHashJoin [codegen id : 16]
+(71) BroadcastHashJoin [codegen id : 24]
 Left keys [1]: [ss_promo_sk#7]
-Right keys [1]: [p_promo_sk#51]
+Right keys [1]: [p_promo_sk#56]
 Join type: Inner
 Join condition: None
 
-(70) Project [codegen id : 16]
-Output [13]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_hdemo_sk#39, c_current_addr_sk#40, d_year#44, d_year#46]
-Input [15]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_hdemo_sk#39, c_current_addr_sk#40, d_year#44, d_year#46, p_promo_sk#51]
+(72) Project [codegen id : 24]
+Output [13]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_hdemo_sk#44, c_current_addr_sk#45, d_year#49, d_year#51]
+Input [15]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_promo_sk#7, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_hdemo_sk#44, c_current_addr_sk#45, d_year#49, d_year#51, p_promo_sk#56]
 
 (unknown) Scan parquet spark_catalog.default.household_demographics
-Output [2]: [hd_demo_sk#52, hd_income_band_sk#53]
+Output [2]: [hd_demo_sk#57, hd_income_band_sk#58]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/household_demographics]
 PushedFilters: [IsNotNull(hd_demo_sk), IsNotNull(hd_income_band_sk)]
 ReadSchema: struct<hd_demo_sk:int,hd_income_band_sk:int>
 
-(72) CometFilter
-Input [2]: [hd_demo_sk#52, hd_income_band_sk#53]
-Condition : (isnotnull(hd_demo_sk#52) AND isnotnull(hd_income_band_sk#53))
+(74) CometFilter
+Input [2]: [hd_demo_sk#57, hd_income_band_sk#58]
+Condition : (isnotnull(hd_demo_sk#57) AND isnotnull(hd_income_band_sk#58))
 
-(73) ColumnarToRow [codegen id : 9]
-Input [2]: [hd_demo_sk#52, hd_income_band_sk#53]
+(75) ColumnarToRow [codegen id : 17]
+Input [2]: [hd_demo_sk#57, hd_income_band_sk#58]
 
-(74) BroadcastExchange
-Input [2]: [hd_demo_sk#52, hd_income_band_sk#53]
+(76) BroadcastExchange
+Input [2]: [hd_demo_sk#57, hd_income_band_sk#58]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=10]
 
-(75) BroadcastHashJoin [codegen id : 16]
+(77) BroadcastHashJoin [codegen id : 24]
 Left keys [1]: [ss_hdemo_sk#4]
-Right keys [1]: [hd_demo_sk#52]
+Right keys [1]: [hd_demo_sk#57]
 Join type: Inner
 Join condition: None
 
-(76) Project [codegen id : 16]
-Output [13]: [ss_item_sk#1, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_hdemo_sk#39, c_current_addr_sk#40, d_year#44, d_year#46, hd_income_band_sk#53]
-Input [15]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_hdemo_sk#39, c_current_addr_sk#40, d_year#44, d_year#46, hd_demo_sk#52, hd_income_band_sk#53]
+(78) Project [codegen id : 24]
+Output [13]: [ss_item_sk#1, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_hdemo_sk#44, c_current_addr_sk#45, d_year#49, d_year#51, hd_income_band_sk#58]
+Input [15]: [ss_item_sk#1, ss_hdemo_sk#4, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_hdemo_sk#44, c_current_addr_sk#45, d_year#49, d_year#51, hd_demo_sk#57, hd_income_band_sk#58]
 
-(77) ReusedExchange [Reuses operator id: 74]
-Output [2]: [hd_demo_sk#54, hd_income_band_sk#55]
+(79) ReusedExchange [Reuses operator id: 76]
+Output [2]: [hd_demo_sk#59, hd_income_band_sk#60]
 
-(78) BroadcastHashJoin [codegen id : 16]
-Left keys [1]: [c_current_hdemo_sk#39]
-Right keys [1]: [hd_demo_sk#54]
+(80) BroadcastHashJoin [codegen id : 24]
+Left keys [1]: [c_current_hdemo_sk#44]
+Right keys [1]: [hd_demo_sk#59]
 Join type: Inner
 Join condition: None
 
-(79) Project [codegen id : 16]
-Output [13]: [ss_item_sk#1, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_addr_sk#40, d_year#44, d_year#46, hd_income_band_sk#53, hd_income_band_sk#55]
-Input [15]: [ss_item_sk#1, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_hdemo_sk#39, c_current_addr_sk#40, d_year#44, d_year#46, hd_income_band_sk#53, hd_demo_sk#54, hd_income_band_sk#55]
+(81) Project [codegen id : 24]
+Output [13]: [ss_item_sk#1, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_addr_sk#45, d_year#49, d_year#51, hd_income_band_sk#58, hd_income_band_sk#60]
+Input [15]: [ss_item_sk#1, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_hdemo_sk#44, c_current_addr_sk#45, d_year#49, d_year#51, hd_income_band_sk#58, hd_demo_sk#59, hd_income_band_sk#60]
 
 (unknown) Scan parquet spark_catalog.default.customer_address
-Output [5]: [ca_address_sk#56, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60]
+Output [5]: [ca_address_sk#61, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/customer_address]
 PushedFilters: [IsNotNull(ca_address_sk)]
 ReadSchema: struct<ca_address_sk:int,ca_street_number:string,ca_street_name:string,ca_city:string,ca_zip:string>
 
-(81) CometFilter
-Input [5]: [ca_address_sk#56, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60]
-Condition : isnotnull(ca_address_sk#56)
+(83) CometFilter
+Input [5]: [ca_address_sk#61, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65]
+Condition : isnotnull(ca_address_sk#61)
 
-(82) ColumnarToRow [codegen id : 11]
-Input [5]: [ca_address_sk#56, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60]
+(84) ColumnarToRow [codegen id : 19]
+Input [5]: [ca_address_sk#61, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65]
 
-(83) BroadcastExchange
-Input [5]: [ca_address_sk#56, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60]
+(85) BroadcastExchange
+Input [5]: [ca_address_sk#61, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=11]
 
-(84) BroadcastHashJoin [codegen id : 16]
+(86) BroadcastHashJoin [codegen id : 24]
 Left keys [1]: [ss_addr_sk#5]
-Right keys [1]: [ca_address_sk#56]
+Right keys [1]: [ca_address_sk#61]
 Join type: Inner
 Join condition: None
 
-(85) Project [codegen id : 16]
-Output [16]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_addr_sk#40, d_year#44, d_year#46, hd_income_band_sk#53, hd_income_band_sk#55, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60]
-Input [18]: [ss_item_sk#1, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_addr_sk#40, d_year#44, d_year#46, hd_income_band_sk#53, hd_income_band_sk#55, ca_address_sk#56, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60]
+(87) Project [codegen id : 24]
+Output [16]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_addr_sk#45, d_year#49, d_year#51, hd_income_band_sk#58, hd_income_band_sk#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65]
+Input [18]: [ss_item_sk#1, ss_addr_sk#5, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_addr_sk#45, d_year#49, d_year#51, hd_income_band_sk#58, hd_income_band_sk#60, ca_address_sk#61, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65]
 
-(86) ReusedExchange [Reuses operator id: 83]
-Output [5]: [ca_address_sk#61, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65]
+(88) ReusedExchange [Reuses operator id: 85]
+Output [5]: [ca_address_sk#66, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70]
 
-(87) BroadcastHashJoin [codegen id : 16]
-Left keys [1]: [c_current_addr_sk#40]
-Right keys [1]: [ca_address_sk#61]
+(89) BroadcastHashJoin [codegen id : 24]
+Left keys [1]: [c_current_addr_sk#45]
+Right keys [1]: [ca_address_sk#66]
 Join type: Inner
 Join condition: None
 
-(88) Project [codegen id : 16]
-Output [19]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, d_year#44, d_year#46, hd_income_band_sk#53, hd_income_band_sk#55, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65]
-Input [21]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, c_current_addr_sk#40, d_year#44, d_year#46, hd_income_band_sk#53, hd_income_band_sk#55, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_address_sk#61, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65]
+(90) Project [codegen id : 24]
+Output [19]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, d_year#49, d_year#51, hd_income_band_sk#58, hd_income_band_sk#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70]
+Input [21]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, c_current_addr_sk#45, d_year#49, d_year#51, hd_income_band_sk#58, hd_income_band_sk#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_address_sk#66, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70]
 
 (unknown) Scan parquet spark_catalog.default.income_band
-Output [1]: [ib_income_band_sk#66]
+Output [1]: [ib_income_band_sk#71]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/income_band]
 PushedFilters: [IsNotNull(ib_income_band_sk)]
 ReadSchema: struct<ib_income_band_sk:int>
 
-(90) CometFilter
-Input [1]: [ib_income_band_sk#66]
-Condition : isnotnull(ib_income_band_sk#66)
+(92) CometFilter
+Input [1]: [ib_income_band_sk#71]
+Condition : isnotnull(ib_income_band_sk#71)
 
-(91) ColumnarToRow [codegen id : 13]
-Input [1]: [ib_income_band_sk#66]
+(93) ColumnarToRow [codegen id : 21]
+Input [1]: [ib_income_band_sk#71]
 
-(92) BroadcastExchange
-Input [1]: [ib_income_band_sk#66]
+(94) BroadcastExchange
+Input [1]: [ib_income_band_sk#71]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=12]
 
-(93) BroadcastHashJoin [codegen id : 16]
-Left keys [1]: [hd_income_band_sk#53]
-Right keys [1]: [ib_income_band_sk#66]
+(95) BroadcastHashJoin [codegen id : 24]
+Left keys [1]: [hd_income_band_sk#58]
+Right keys [1]: [ib_income_band_sk#71]
 Join type: Inner
 Join condition: None
 
-(94) Project [codegen id : 16]
-Output [18]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, d_year#44, d_year#46, hd_income_band_sk#55, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65]
-Input [20]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, d_year#44, d_year#46, hd_income_band_sk#53, hd_income_band_sk#55, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ib_income_band_sk#66]
+(96) Project [codegen id : 24]
+Output [18]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, d_year#49, d_year#51, hd_income_band_sk#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70]
+Input [20]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, d_year#49, d_year#51, hd_income_band_sk#58, hd_income_band_sk#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70, ib_income_band_sk#71]
 
-(95) ReusedExchange [Reuses operator id: 92]
-Output [1]: [ib_income_band_sk#67]
+(97) ReusedExchange [Reuses operator id: 94]
+Output [1]: [ib_income_band_sk#72]
 
-(96) BroadcastHashJoin [codegen id : 16]
-Left keys [1]: [hd_income_band_sk#55]
-Right keys [1]: [ib_income_band_sk#67]
+(98) BroadcastHashJoin [codegen id : 24]
+Left keys [1]: [hd_income_band_sk#60]
+Right keys [1]: [ib_income_band_sk#72]
 Join type: Inner
 Join condition: None
 
-(97) Project [codegen id : 16]
-Output [17]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, d_year#44, d_year#46, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65]
-Input [19]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, d_year#44, d_year#46, hd_income_band_sk#55, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ib_income_band_sk#67]
+(99) Project [codegen id : 24]
+Output [17]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, d_year#49, d_year#51, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70]
+Input [19]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, d_year#49, d_year#51, hd_income_band_sk#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70, ib_income_band_sk#72]
 
 (unknown) Scan parquet spark_catalog.default.item
-Output [4]: [i_item_sk#68, i_current_price#69, i_color#70, i_product_name#71]
+Output [4]: [i_item_sk#73, i_current_price#74, i_color#75, i_product_name#76]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/item]
 PushedFilters: [IsNotNull(i_current_price), In(i_color, [burlywood           ,floral              ,indian              ,medium              ,purple              ,spring              ]), GreaterThanOrEqual(i_current_price,64.00), LessThanOrEqual(i_current_price,74.00), GreaterThanOrEqual(i_current_price,65.00), LessThanOrEqual(i_current_price,79.00), IsNotNull(i_item_sk)]
 ReadSchema: struct<i_item_sk:int,i_current_price:decimal(7,2),i_color:string,i_product_name:string>
 
-(99) CometFilter
-Input [4]: [i_item_sk#68, i_current_price#69, i_color#70, i_product_name#71]
-Condition : ((((((isnotnull(i_current_price#69) AND i_color#70 IN (purple              ,burlywood           ,indian              ,spring              ,floral              ,medium              )) AND (i_current_price#69 >= 64.00)) AND (i_current_price#69 <= 74.00)) AND (i_current_price#69 >= 65.00)) AND (i_current_price#69 <= 79.00)) AND isnotnull(i_item_sk#68))
+(101) CometFilter
+Input [4]: [i_item_sk#73, i_current_price#74, i_color#75, i_product_name#76]
+Condition : ((((((isnotnull(i_current_price#74) AND i_color#75 IN (purple              ,burlywood           ,indian              ,spring              ,floral              ,medium              )) AND (i_current_price#74 >= 64.00)) AND (i_current_price#74 <= 74.00)) AND (i_current_price#74 >= 65.00)) AND (i_current_price#74 <= 79.00)) AND isnotnull(i_item_sk#73))
 
-(100) CometProject
-Input [4]: [i_item_sk#68, i_current_price#69, i_color#70, i_product_name#71]
-Arguments: [i_item_sk#68, i_product_name#71], [i_item_sk#68, i_product_name#71]
+(102) CometProject
+Input [4]: [i_item_sk#73, i_current_price#74, i_color#75, i_product_name#76]
+Arguments: [i_item_sk#73, i_product_name#76], [i_item_sk#73, i_product_name#76]
 
-(101) ColumnarToRow [codegen id : 15]
-Input [2]: [i_item_sk#68, i_product_name#71]
+(103) ColumnarToRow [codegen id : 23]
+Input [2]: [i_item_sk#73, i_product_name#76]
 
-(102) BroadcastExchange
-Input [2]: [i_item_sk#68, i_product_name#71]
+(104) BroadcastExchange
+Input [2]: [i_item_sk#73, i_product_name#76]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=13]
 
-(103) BroadcastHashJoin [codegen id : 16]
+(105) BroadcastHashJoin [codegen id : 24]
 Left keys [1]: [ss_item_sk#1]
-Right keys [1]: [i_item_sk#68]
+Right keys [1]: [i_item_sk#73]
 Join type: Inner
 Join condition: None
 
-(104) Project [codegen id : 16]
-Output [18]: [ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, d_year#44, d_year#46, s_store_name#35, s_zip#36, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, i_item_sk#68, i_product_name#71]
-Input [19]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, s_store_name#35, s_zip#36, d_year#44, d_year#46, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, i_item_sk#68, i_product_name#71]
+(106) Project [codegen id : 24]
+Output [18]: [ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, d_year#49, d_year#51, s_store_name#40, s_zip#41, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70, i_item_sk#73, i_product_name#76]
+Input [19]: [ss_item_sk#1, ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, s_store_name#40, s_zip#41, d_year#49, d_year#51, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70, i_item_sk#73, i_product_name#76]
 
-(105) HashAggregate [codegen id : 16]
-Input [18]: [ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#33, d_year#44, d_year#46, s_store_name#35, s_zip#36, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, i_item_sk#68, i_product_name#71]
-Keys [15]: [i_product_name#71, i_item_sk#68, s_store_name#35, s_zip#36, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, d_year#33, d_year#44, d_year#46]
+(107) HashAggregate [codegen id : 24]
+Input [18]: [ss_wholesale_cost#9, ss_list_price#10, ss_coupon_amt#11, d_year#38, d_year#49, d_year#51, s_store_name#40, s_zip#41, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70, i_item_sk#73, i_product_name#76]
+Keys [15]: [i_product_name#76, i_item_sk#73, s_store_name#40, s_zip#41, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70, d_year#38, d_year#49, d_year#51]
 Functions [4]: [partial_count(1), partial_sum(UnscaledValue(ss_wholesale_cost#9)), partial_sum(UnscaledValue(ss_list_price#10)), partial_sum(UnscaledValue(ss_coupon_amt#11))]
-Aggregate Attributes [4]: [count#72, sum#73, sum#74, sum#75]
-Results [19]: [i_product_name#71, i_item_sk#68, s_store_name#35, s_zip#36, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, d_year#33, d_year#44, d_year#46, count#76, sum#77, sum#78, sum#79]
+Aggregate Attributes [4]: [count#77, sum#78, sum#79, sum#80]
+Results [19]: [i_product_name#76, i_item_sk#73, s_store_name#40, s_zip#41, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70, d_year#38, d_year#49, d_year#51, count#81, sum#82, sum#83, sum#84]
 
-(106) HashAggregate [codegen id : 16]
-Input [19]: [i_product_name#71, i_item_sk#68, s_store_name#35, s_zip#36, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, d_year#33, d_year#44, d_year#46, count#76, sum#77, sum#78, sum#79]
-Keys [15]: [i_product_name#71, i_item_sk#68, s_store_name#35, s_zip#36, ca_street_number#57, ca_street_name#58, ca_city#59, ca_zip#60, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, d_year#33, d_year#44, d_year#46]
+(108) HashAggregate [codegen id : 24]
+Input [19]: [i_product_name#76, i_item_sk#73, s_store_name#40, s_zip#41, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70, d_year#38, d_year#49, d_year#51, count#81, sum#82, sum#83, sum#84]
+Keys [15]: [i_product_name#76, i_item_sk#73, s_store_name#40, s_zip#41, ca_street_number#62, ca_street_name#63, ca_city#64, ca_zip#65, ca_street_number#67, ca_street_name#68, ca_city#69, ca_zip#70, d_year#38, d_year#49, d_year#51]
 Functions [4]: [count(1), sum(UnscaledValue(ss_wholesale_cost#9)), sum(UnscaledValue(ss_list_price#10)), sum(UnscaledValue(ss_coupon_amt#11))]
-Aggregate Attributes [4]: [count(1)#80, sum(UnscaledValue(ss_wholesale_cost#9))#81, sum(UnscaledValue(ss_list_price#10))#82, sum(UnscaledValue(ss_coupon_amt#11))#83]
-Results [17]: [i_product_name#71 AS product_name#84, i_item_sk#68 AS item_sk#85, s_store_name#35 AS store_name#86, s_zip#36 AS store_zip#87, ca_street_number#57 AS b_street_number#88, ca_street_name#58 AS b_streen_name#89, ca_city#59 AS b_city#90, ca_zip#60 AS b_zip#91, ca_street_number#62 AS c_street_number#92, ca_street_name#63 AS c_street_name#93, ca_city#64 AS c_city#94, ca_zip#65 AS c_zip#95, d_year#33 AS syear#96, count(1)#80 AS cnt#97, MakeDecimal(sum(UnscaledValue(ss_wholesale_co [...]
+Aggregate Attributes [4]: [count(1)#85, sum(UnscaledValue(ss_wholesale_cost#9))#86, sum(UnscaledValue(ss_list_price#10))#87, sum(UnscaledValue(ss_coupon_amt#11))#88]
+Results [17]: [i_product_name#76 AS product_name#89, i_item_sk#73 AS item_sk#90, s_store_name#40 AS store_name#91, s_zip#41 AS store_zip#92, ca_street_number#62 AS b_street_number#93, ca_street_name#63 AS b_streen_name#94, ca_city#64 AS b_city#95, ca_zip#65 AS b_zip#96, ca_street_number#67 AS c_street_number#97, ca_street_name#68 AS c_street_name#98, ca_city#69 AS c_city#99, ca_zip#70 AS c_zip#100, d_year#38 AS syear#101, count(1)#85 AS cnt#102, MakeDecimal(sum(UnscaledValue(ss_wholesale [...]
 
-(107) Exchange
-Input [17]: [product_name#84, item_sk#85, store_name#86, store_zip#87, b_street_number#88, b_streen_name#89, b_city#90, b_zip#91, c_street_number#92, c_street_name#93, c_city#94, c_zip#95, syear#96, cnt#97, s1#98, s2#99, s3#100]
-Arguments: hashpartitioning(item_sk#85, store_name#86, store_zip#87, 5), ENSURE_REQUIREMENTS, [plan_id=14]
+(109) Exchange
+Input [17]: [product_name#89, item_sk#90, store_name#91, store_zip#92, b_street_number#93, b_streen_name#94, b_city#95, b_zip#96, c_street_number#97, c_street_name#98, c_city#99, c_zip#100, syear#101, cnt#102, s1#103, s2#104, s3#105]
+Arguments: hashpartitioning(item_sk#90, store_name#91, store_zip#92, 5), ENSURE_REQUIREMENTS, [plan_id=14]
 
-(108) Sort [codegen id : 17]
-Input [17]: [product_name#84, item_sk#85, store_name#86, store_zip#87, b_street_number#88, b_streen_name#89, b_city#90, b_zip#91, c_street_number#92, c_street_name#93, c_city#94, c_zip#95, syear#96, cnt#97, s1#98, s2#99, s3#100]
-Arguments: [item_sk#85 ASC NULLS FIRST, store_name#86 ASC NULLS FIRST, store_zip#87 ASC NULLS FIRST], false, 0
+(110) Sort [codegen id : 25]
+Input [17]: [product_name#89, item_sk#90, store_name#91, store_zip#92, b_street_number#93, b_streen_name#94, b_city#95, b_zip#96, c_street_number#97, c_street_name#98, c_city#99, c_zip#100, syear#101, cnt#102, s1#103, s2#104, s3#105]
+Arguments: [item_sk#90 ASC NULLS FIRST, store_name#91 ASC NULLS FIRST, store_zip#92 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.store_sales
-Output [12]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_ticket_number#108, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112]
+Output [12]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_ticket_number#113, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117]
 Batched: true
 Location: InMemoryFileIndex []
-PartitionFilters: [isnotnull(ss_sold_date_sk#112), dynamicpruningexpression(ss_sold_date_sk#112 IN dynamicpruning#113)]
+PartitionFilters: [isnotnull(ss_sold_date_sk#117), dynamicpruningexpression(ss_sold_date_sk#117 IN dynamicpruning#118)]
 PushedFilters: [IsNotNull(ss_item_sk), IsNotNull(ss_ticket_number), IsNotNull(ss_store_sk), IsNotNull(ss_customer_sk), IsNotNull(ss_cdemo_sk), IsNotNull(ss_promo_sk), IsNotNull(ss_hdemo_sk), IsNotNull(ss_addr_sk)]
 ReadSchema: struct<ss_item_sk:int,ss_customer_sk:int,ss_cdemo_sk:int,ss_hdemo_sk:int,ss_addr_sk:int,ss_store_sk:int,ss_promo_sk:int,ss_ticket_number:int,ss_wholesale_cost:decimal(7,2),ss_list_price:decimal(7,2),ss_coupon_amt:decimal(7,2)>
 
-(110) CometFilter
-Input [12]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_ticket_number#108, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112]
-Condition : (((((((isnotnull(ss_item_sk#101) AND isnotnull(ss_ticket_number#108)) AND isnotnull(ss_store_sk#106)) AND isnotnull(ss_customer_sk#102)) AND isnotnull(ss_cdemo_sk#103)) AND isnotnull(ss_promo_sk#107)) AND isnotnull(ss_hdemo_sk#104)) AND isnotnull(ss_addr_sk#105))
+(112) CometFilter
+Input [12]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_ticket_number#113, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117]
+Condition : (((((((isnotnull(ss_item_sk#106) AND isnotnull(ss_ticket_number#113)) AND isnotnull(ss_store_sk#111)) AND isnotnull(ss_customer_sk#107)) AND isnotnull(ss_cdemo_sk#108)) AND isnotnull(ss_promo_sk#112)) AND isnotnull(ss_hdemo_sk#109)) AND isnotnull(ss_addr_sk#110))
 
-(111) CometBroadcastExchange
-Input [12]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_ticket_number#108, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112]
-Arguments: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_ticket_number#108, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112]
+(113) CometBroadcastExchange
+Input [12]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_ticket_number#113, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117]
+Arguments: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_ticket_number#113, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117]
 
 (unknown) Scan parquet spark_catalog.default.store_returns
-Output [3]: [sr_item_sk#114, sr_ticket_number#115, sr_returned_date_sk#116]
+Output [3]: [sr_item_sk#119, sr_ticket_number#120, sr_returned_date_sk#121]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/store_returns]
 PushedFilters: [IsNotNull(sr_item_sk), IsNotNull(sr_ticket_number)]
 ReadSchema: struct<sr_item_sk:int,sr_ticket_number:int>
 
-(113) CometFilter
-Input [3]: [sr_item_sk#114, sr_ticket_number#115, sr_returned_date_sk#116]
-Condition : (isnotnull(sr_item_sk#114) AND isnotnull(sr_ticket_number#115))
-
-(114) CometProject
-Input [3]: [sr_item_sk#114, sr_ticket_number#115, sr_returned_date_sk#116]
-Arguments: [sr_item_sk#114, sr_ticket_number#115], [sr_item_sk#114, sr_ticket_number#115]
-
-(115) CometBroadcastHashJoin
-Left output [12]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_ticket_number#108, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112]
-Right output [2]: [sr_item_sk#114, sr_ticket_number#115]
-Arguments: [ss_item_sk#101, ss_ticket_number#108], [sr_item_sk#114, sr_ticket_number#115], Inner
+(115) CometFilter
+Input [3]: [sr_item_sk#119, sr_ticket_number#120, sr_returned_date_sk#121]
+Condition : (isnotnull(sr_item_sk#119) AND isnotnull(sr_ticket_number#120))
 
 (116) CometProject
-Input [14]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_ticket_number#108, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112, sr_item_sk#114, sr_ticket_number#115]
-Arguments: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112], [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112]
-
-(117) CometExchange
-Input [11]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112]
-Arguments: hashpartitioning(ss_item_sk#101, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=15]
-
-(118) CometSort
-Input [11]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112]
-Arguments: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112], [ss_item_sk#101 ASC NULLS FIRST]
-
-(119) ReusedExchange [Reuses operator id: 24]
-Output [4]: [cs_item_sk#117, sum#118, sum#119, isEmpty#120]
-
-(120) CometHashAggregate
-Input [4]: [cs_item_sk#117, sum#118, sum#119, isEmpty#120]
-Keys [1]: [cs_item_sk#117]
-Functions [2]: [sum(UnscaledValue(cs_ext_list_price#121)), sum(((cr_refunded_cash#122 + cr_reversed_charge#123) + cr_store_credit#124))]
-
-(121) CometFilter
-Input [3]: [cs_item_sk#117, sale#30, refund#31]
-Condition : ((isnotnull(sale#30) AND isnotnull(refund#31)) AND (cast(sale#30 as decimal(21,2)) > (2 * refund#31)))
-
-(122) CometProject
-Input [3]: [cs_item_sk#117, sale#30, refund#31]
-Arguments: [cs_item_sk#117], [cs_item_sk#117]
-
-(123) CometSort
-Input [1]: [cs_item_sk#117]
-Arguments: [cs_item_sk#117], [cs_item_sk#117 ASC NULLS FIRST]
-
-(124) CometSortMergeJoin
-Left output [11]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112]
-Right output [1]: [cs_item_sk#117]
-Arguments: [ss_item_sk#101], [cs_item_sk#117], Inner
-
-(125) CometProject
-Input [12]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112, cs_item_sk#117]
-Arguments: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112], [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112]
+Input [3]: [sr_item_sk#119, sr_ticket_number#120, sr_returned_date_sk#121]
+Arguments: [sr_item_sk#119, sr_ticket_number#120], [sr_item_sk#119, sr_ticket_number#120]
+
+(117) CometBroadcastHashJoin
+Left output [12]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_ticket_number#113, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117]
+Right output [2]: [sr_item_sk#119, sr_ticket_number#120]
+Arguments: [ss_item_sk#106, ss_ticket_number#113], [sr_item_sk#119, sr_ticket_number#120], Inner
+
+(118) CometProject
+Input [14]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_ticket_number#113, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117, sr_item_sk#119, sr_ticket_number#120]
+Arguments: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117], [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117]
+
+(119) ColumnarToRow [codegen id : 26]
+Input [11]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117]
+
+(120) Exchange
+Input [11]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117]
+Arguments: hashpartitioning(ss_item_sk#106, 5), ENSURE_REQUIREMENTS, [plan_id=15]
+
+(121) Sort [codegen id : 27]
+Input [11]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117]
+Arguments: [ss_item_sk#106 ASC NULLS FIRST], false, 0
+
+(122) ReusedExchange [Reuses operator id: 27]
+Output [4]: [cs_item_sk#122, sum#123, sum#124, isEmpty#125]
+
+(123) HashAggregate [codegen id : 33]
+Input [4]: [cs_item_sk#122, sum#123, sum#124, isEmpty#125]
+Keys [1]: [cs_item_sk#122]
+Functions [2]: [sum(UnscaledValue(cs_ext_list_price#126)), sum(((cr_refunded_cash#127 + cr_reversed_charge#128) + cr_store_credit#129))]
+Aggregate Attributes [2]: [sum(UnscaledValue(cs_ext_list_price#126))#33, sum(((cr_refunded_cash#127 + cr_reversed_charge#128) + cr_store_credit#129))#34]
+Results [3]: [cs_item_sk#122, MakeDecimal(sum(UnscaledValue(cs_ext_list_price#126))#33,17,2) AS sale#35, sum(((cr_refunded_cash#127 + cr_reversed_charge#128) + cr_store_credit#129))#34 AS refund#36]
+
+(124) Filter [codegen id : 33]
+Input [3]: [cs_item_sk#122, sale#35, refund#36]
+Condition : ((isnotnull(sale#35) AND isnotnull(refund#36)) AND (cast(sale#35 as decimal(21,2)) > (2 * refund#36)))
+
+(125) Project [codegen id : 33]
+Output [1]: [cs_item_sk#122]
+Input [3]: [cs_item_sk#122, sale#35, refund#36]
+
+(126) Sort [codegen id : 33]
+Input [1]: [cs_item_sk#122]
+Arguments: [cs_item_sk#122 ASC NULLS FIRST], false, 0
+
+(127) SortMergeJoin [codegen id : 49]
+Left keys [1]: [ss_item_sk#106]
+Right keys [1]: [cs_item_sk#122]
+Join type: Inner
+Join condition: None
 
-(126) ColumnarToRow [codegen id : 33]
-Input [11]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112]
+(128) Project [codegen id : 49]
+Output [11]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117]
+Input [12]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117, cs_item_sk#122]
 
-(127) ReusedExchange [Reuses operator id: 187]
-Output [2]: [d_date_sk#125, d_year#126]
+(129) ReusedExchange [Reuses operator id: 189]
+Output [2]: [d_date_sk#130, d_year#131]
 
-(128) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [ss_sold_date_sk#112]
-Right keys [1]: [d_date_sk#125]
+(130) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [ss_sold_date_sk#117]
+Right keys [1]: [d_date_sk#130]
 Join type: Inner
 Join condition: None
 
-(129) Project [codegen id : 33]
-Output [11]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126]
-Input [13]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, ss_sold_date_sk#112, d_date_sk#125, d_year#126]
+(131) Project [codegen id : 49]
+Output [11]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131]
+Input [13]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, ss_sold_date_sk#117, d_date_sk#130, d_year#131]
 
-(130) ReusedExchange [Reuses operator id: 38]
-Output [3]: [s_store_sk#127, s_store_name#128, s_zip#129]
+(132) ReusedExchange [Reuses operator id: 40]
+Output [3]: [s_store_sk#132, s_store_name#133, s_zip#134]
 
-(131) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [ss_store_sk#106]
-Right keys [1]: [s_store_sk#127]
+(133) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [ss_store_sk#111]
+Right keys [1]: [s_store_sk#132]
 Join type: Inner
 Join condition: None
 
-(132) Project [codegen id : 33]
-Output [12]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129]
-Input [14]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_store_sk#106, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_sk#127, s_store_name#128, s_zip#129]
+(134) Project [codegen id : 49]
+Output [12]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134]
+Input [14]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_store_sk#111, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_sk#132, s_store_name#133, s_zip#134]
 
-(133) ReusedExchange [Reuses operator id: 44]
-Output [6]: [c_customer_sk#130, c_current_cdemo_sk#131, c_current_hdemo_sk#132, c_current_addr_sk#133, c_first_shipto_date_sk#134, c_first_sales_date_sk#135]
+(135) ReusedExchange [Reuses operator id: 46]
+Output [6]: [c_customer_sk#135, c_current_cdemo_sk#136, c_current_hdemo_sk#137, c_current_addr_sk#138, c_first_shipto_date_sk#139, c_first_sales_date_sk#140]
 
-(134) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [ss_customer_sk#102]
-Right keys [1]: [c_customer_sk#130]
+(136) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [ss_customer_sk#107]
+Right keys [1]: [c_customer_sk#135]
 Join type: Inner
 Join condition: None
 
-(135) Project [codegen id : 33]
-Output [16]: [ss_item_sk#101, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_cdemo_sk#131, c_current_hdemo_sk#132, c_current_addr_sk#133, c_first_shipto_date_sk#134, c_first_sales_date_sk#135]
-Input [18]: [ss_item_sk#101, ss_customer_sk#102, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_customer_sk#130, c_current_cdemo_sk#131, c_current_hdemo_sk#132, c_current_addr_sk#133, c_first_shipto_date_sk#134, c_first_sales_date_sk#135]
+(137) Project [codegen id : 49]
+Output [16]: [ss_item_sk#106, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_cdemo_sk#136, c_current_hdemo_sk#137, c_current_addr_sk#138, c_first_shipto_date_sk#139, c_first_sales_date_sk#140]
+Input [18]: [ss_item_sk#106, ss_customer_sk#107, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_customer_sk#135, c_current_cdemo_sk#136, c_current_hdemo_sk#137, c_current_addr_sk#138, c_first_shipto_date_sk#139, c_first_sales_date_sk#140]
 
-(136) ReusedExchange [Reuses operator id: 50]
-Output [2]: [d_date_sk#136, d_year#137]
+(138) ReusedExchange [Reuses operator id: 52]
+Output [2]: [d_date_sk#141, d_year#142]
 
-(137) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [c_first_sales_date_sk#135]
-Right keys [1]: [d_date_sk#136]
+(139) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [c_first_sales_date_sk#140]
+Right keys [1]: [d_date_sk#141]
 Join type: Inner
 Join condition: None
 
-(138) Project [codegen id : 33]
-Output [16]: [ss_item_sk#101, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_cdemo_sk#131, c_current_hdemo_sk#132, c_current_addr_sk#133, c_first_shipto_date_sk#134, d_year#137]
-Input [18]: [ss_item_sk#101, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_cdemo_sk#131, c_current_hdemo_sk#132, c_current_addr_sk#133, c_first_shipto_date_sk#134, c_first_sales_date_sk#135, d_date_sk#136, d_year#137]
+(140) Project [codegen id : 49]
+Output [16]: [ss_item_sk#106, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_cdemo_sk#136, c_current_hdemo_sk#137, c_current_addr_sk#138, c_first_shipto_date_sk#139, d_year#142]
+Input [18]: [ss_item_sk#106, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_cdemo_sk#136, c_current_hdemo_sk#137, c_current_addr_sk#138, c_first_shipto_date_sk#139, c_first_sales_date_sk#140, d_date_sk#141, d_year#142]
 
-(139) ReusedExchange [Reuses operator id: 50]
-Output [2]: [d_date_sk#138, d_year#139]
+(141) ReusedExchange [Reuses operator id: 52]
+Output [2]: [d_date_sk#143, d_year#144]
 
-(140) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [c_first_shipto_date_sk#134]
-Right keys [1]: [d_date_sk#138]
+(142) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [c_first_shipto_date_sk#139]
+Right keys [1]: [d_date_sk#143]
 Join type: Inner
 Join condition: None
 
-(141) Project [codegen id : 33]
-Output [16]: [ss_item_sk#101, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_cdemo_sk#131, c_current_hdemo_sk#132, c_current_addr_sk#133, d_year#137, d_year#139]
-Input [18]: [ss_item_sk#101, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_cdemo_sk#131, c_current_hdemo_sk#132, c_current_addr_sk#133, c_first_shipto_date_sk#134, d_year#137, d_date_sk#138, d_year#139]
+(143) Project [codegen id : 49]
+Output [16]: [ss_item_sk#106, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_cdemo_sk#136, c_current_hdemo_sk#137, c_current_addr_sk#138, d_year#142, d_year#144]
+Input [18]: [ss_item_sk#106, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_cdemo_sk#136, c_current_hdemo_sk#137, c_current_addr_sk#138, c_first_shipto_date_sk#139, d_year#142, d_date_sk#143, d_year#144]
 
-(142) ReusedExchange [Reuses operator id: 59]
-Output [2]: [cd_demo_sk#140, cd_marital_status#141]
+(144) ReusedExchange [Reuses operator id: 61]
+Output [2]: [cd_demo_sk#145, cd_marital_status#146]
 
-(143) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [ss_cdemo_sk#103]
-Right keys [1]: [cd_demo_sk#140]
+(145) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [ss_cdemo_sk#108]
+Right keys [1]: [cd_demo_sk#145]
 Join type: Inner
 Join condition: None
 
-(144) Project [codegen id : 33]
-Output [16]: [ss_item_sk#101, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_cdemo_sk#131, c_current_hdemo_sk#132, c_current_addr_sk#133, d_year#137, d_year#139, cd_marital_status#141]
-Input [18]: [ss_item_sk#101, ss_cdemo_sk#103, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_cdemo_sk#131, c_current_hdemo_sk#132, c_current_addr_sk#133, d_year#137, d_year#139, cd_demo_sk#140, cd_marital_status#141]
+(146) Project [codegen id : 49]
+Output [16]: [ss_item_sk#106, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_cdemo_sk#136, c_current_hdemo_sk#137, c_current_addr_sk#138, d_year#142, d_year#144, cd_marital_status#146]
+Input [18]: [ss_item_sk#106, ss_cdemo_sk#108, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_cdemo_sk#136, c_current_hdemo_sk#137, c_current_addr_sk#138, d_year#142, d_year#144, cd_demo_sk#145, cd_marital_status#146]
 
-(145) ReusedExchange [Reuses operator id: 59]
-Output [2]: [cd_demo_sk#142, cd_marital_status#143]
+(147) ReusedExchange [Reuses operator id: 61]
+Output [2]: [cd_demo_sk#147, cd_marital_status#148]
 
-(146) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [c_current_cdemo_sk#131]
-Right keys [1]: [cd_demo_sk#142]
+(148) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [c_current_cdemo_sk#136]
+Right keys [1]: [cd_demo_sk#147]
 Join type: Inner
-Join condition: NOT (cd_marital_status#141 = cd_marital_status#143)
+Join condition: NOT (cd_marital_status#146 = cd_marital_status#148)
 
-(147) Project [codegen id : 33]
-Output [14]: [ss_item_sk#101, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_hdemo_sk#132, c_current_addr_sk#133, d_year#137, d_year#139]
-Input [18]: [ss_item_sk#101, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_cdemo_sk#131, c_current_hdemo_sk#132, c_current_addr_sk#133, d_year#137, d_year#139, cd_marital_status#141, cd_demo_sk#142, cd_marital_status#143]
+(149) Project [codegen id : 49]
+Output [14]: [ss_item_sk#106, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_hdemo_sk#137, c_current_addr_sk#138, d_year#142, d_year#144]
+Input [18]: [ss_item_sk#106, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_cdemo_sk#136, c_current_hdemo_sk#137, c_current_addr_sk#138, d_year#142, d_year#144, cd_marital_status#146, cd_demo_sk#147, cd_marital_status#148]
 
-(148) ReusedExchange [Reuses operator id: 68]
-Output [1]: [p_promo_sk#144]
+(150) ReusedExchange [Reuses operator id: 70]
+Output [1]: [p_promo_sk#149]
 
-(149) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [ss_promo_sk#107]
-Right keys [1]: [p_promo_sk#144]
+(151) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [ss_promo_sk#112]
+Right keys [1]: [p_promo_sk#149]
 Join type: Inner
 Join condition: None
 
-(150) Project [codegen id : 33]
-Output [13]: [ss_item_sk#101, ss_hdemo_sk#104, ss_addr_sk#105, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_hdemo_sk#132, c_current_addr_sk#133, d_year#137, d_year#139]
-Input [15]: [ss_item_sk#101, ss_hdemo_sk#104, ss_addr_sk#105, ss_promo_sk#107, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_hdemo_sk#132, c_current_addr_sk#133, d_year#137, d_year#139, p_promo_sk#144]
+(152) Project [codegen id : 49]
+Output [13]: [ss_item_sk#106, ss_hdemo_sk#109, ss_addr_sk#110, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_hdemo_sk#137, c_current_addr_sk#138, d_year#142, d_year#144]
+Input [15]: [ss_item_sk#106, ss_hdemo_sk#109, ss_addr_sk#110, ss_promo_sk#112, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_hdemo_sk#137, c_current_addr_sk#138, d_year#142, d_year#144, p_promo_sk#149]
 
-(151) ReusedExchange [Reuses operator id: 74]
-Output [2]: [hd_demo_sk#145, hd_income_band_sk#146]
+(153) ReusedExchange [Reuses operator id: 76]
+Output [2]: [hd_demo_sk#150, hd_income_band_sk#151]
 
-(152) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [ss_hdemo_sk#104]
-Right keys [1]: [hd_demo_sk#145]
+(154) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [ss_hdemo_sk#109]
+Right keys [1]: [hd_demo_sk#150]
 Join type: Inner
 Join condition: None
 
-(153) Project [codegen id : 33]
-Output [13]: [ss_item_sk#101, ss_addr_sk#105, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_hdemo_sk#132, c_current_addr_sk#133, d_year#137, d_year#139, hd_income_band_sk#146]
-Input [15]: [ss_item_sk#101, ss_hdemo_sk#104, ss_addr_sk#105, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_hdemo_sk#132, c_current_addr_sk#133, d_year#137, d_year#139, hd_demo_sk#145, hd_income_band_sk#146]
+(155) Project [codegen id : 49]
+Output [13]: [ss_item_sk#106, ss_addr_sk#110, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_hdemo_sk#137, c_current_addr_sk#138, d_year#142, d_year#144, hd_income_band_sk#151]
+Input [15]: [ss_item_sk#106, ss_hdemo_sk#109, ss_addr_sk#110, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_hdemo_sk#137, c_current_addr_sk#138, d_year#142, d_year#144, hd_demo_sk#150, hd_income_band_sk#151]
 
-(154) ReusedExchange [Reuses operator id: 74]
-Output [2]: [hd_demo_sk#147, hd_income_band_sk#148]
+(156) ReusedExchange [Reuses operator id: 76]
+Output [2]: [hd_demo_sk#152, hd_income_band_sk#153]
 
-(155) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [c_current_hdemo_sk#132]
-Right keys [1]: [hd_demo_sk#147]
+(157) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [c_current_hdemo_sk#137]
+Right keys [1]: [hd_demo_sk#152]
 Join type: Inner
 Join condition: None
 
-(156) Project [codegen id : 33]
-Output [13]: [ss_item_sk#101, ss_addr_sk#105, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_addr_sk#133, d_year#137, d_year#139, hd_income_band_sk#146, hd_income_band_sk#148]
-Input [15]: [ss_item_sk#101, ss_addr_sk#105, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_hdemo_sk#132, c_current_addr_sk#133, d_year#137, d_year#139, hd_income_band_sk#146, hd_demo_sk#147, hd_income_band_sk#148]
+(158) Project [codegen id : 49]
+Output [13]: [ss_item_sk#106, ss_addr_sk#110, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_addr_sk#138, d_year#142, d_year#144, hd_income_band_sk#151, hd_income_band_sk#153]
+Input [15]: [ss_item_sk#106, ss_addr_sk#110, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_hdemo_sk#137, c_current_addr_sk#138, d_year#142, d_year#144, hd_income_band_sk#151, hd_demo_sk#152, hd_income_band_sk#153]
 
-(157) ReusedExchange [Reuses operator id: 83]
-Output [5]: [ca_address_sk#149, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153]
+(159) ReusedExchange [Reuses operator id: 85]
+Output [5]: [ca_address_sk#154, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158]
 
-(158) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [ss_addr_sk#105]
-Right keys [1]: [ca_address_sk#149]
+(160) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [ss_addr_sk#110]
+Right keys [1]: [ca_address_sk#154]
 Join type: Inner
 Join condition: None
 
-(159) Project [codegen id : 33]
-Output [16]: [ss_item_sk#101, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_addr_sk#133, d_year#137, d_year#139, hd_income_band_sk#146, hd_income_band_sk#148, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153]
-Input [18]: [ss_item_sk#101, ss_addr_sk#105, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_addr_sk#133, d_year#137, d_year#139, hd_income_band_sk#146, hd_income_band_sk#148, ca_address_sk#149, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153]
+(161) Project [codegen id : 49]
+Output [16]: [ss_item_sk#106, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_addr_sk#138, d_year#142, d_year#144, hd_income_band_sk#151, hd_income_band_sk#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158]
+Input [18]: [ss_item_sk#106, ss_addr_sk#110, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_addr_sk#138, d_year#142, d_year#144, hd_income_band_sk#151, hd_income_band_sk#153, ca_address_sk#154, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158]
 
-(160) ReusedExchange [Reuses operator id: 83]
-Output [5]: [ca_address_sk#154, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158]
+(162) ReusedExchange [Reuses operator id: 85]
+Output [5]: [ca_address_sk#159, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163]
 
-(161) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [c_current_addr_sk#133]
-Right keys [1]: [ca_address_sk#154]
+(163) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [c_current_addr_sk#138]
+Right keys [1]: [ca_address_sk#159]
 Join type: Inner
 Join condition: None
 
-(162) Project [codegen id : 33]
-Output [19]: [ss_item_sk#101, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, d_year#137, d_year#139, hd_income_band_sk#146, hd_income_band_sk#148, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158]
-Input [21]: [ss_item_sk#101, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, c_current_addr_sk#133, d_year#137, d_year#139, hd_income_band_sk#146, hd_income_band_sk#148, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_address_sk#154, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158]
+(164) Project [codegen id : 49]
+Output [19]: [ss_item_sk#106, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, d_year#142, d_year#144, hd_income_band_sk#151, hd_income_band_sk#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163]
+Input [21]: [ss_item_sk#106, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, c_current_addr_sk#138, d_year#142, d_year#144, hd_income_band_sk#151, hd_income_band_sk#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_address_sk#159, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163]
 
-(163) ReusedExchange [Reuses operator id: 92]
-Output [1]: [ib_income_band_sk#159]
+(165) ReusedExchange [Reuses operator id: 94]
+Output [1]: [ib_income_band_sk#164]
 
-(164) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [hd_income_band_sk#146]
-Right keys [1]: [ib_income_band_sk#159]
+(166) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [hd_income_band_sk#151]
+Right keys [1]: [ib_income_band_sk#164]
 Join type: Inner
 Join condition: None
 
-(165) Project [codegen id : 33]
-Output [18]: [ss_item_sk#101, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, d_year#137, d_year#139, hd_income_band_sk#148, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158]
-Input [20]: [ss_item_sk#101, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, d_year#137, d_year#139, hd_income_band_sk#146, hd_income_band_sk#148, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ib_income_band_sk#159]
+(167) Project [codegen id : 49]
+Output [18]: [ss_item_sk#106, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, d_year#142, d_year#144, hd_income_band_sk#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163]
+Input [20]: [ss_item_sk#106, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, d_year#142, d_year#144, hd_income_band_sk#151, hd_income_band_sk#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163, ib_income_band_sk#164]
 
-(166) ReusedExchange [Reuses operator id: 92]
-Output [1]: [ib_income_band_sk#160]
+(168) ReusedExchange [Reuses operator id: 94]
+Output [1]: [ib_income_band_sk#165]
 
-(167) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [hd_income_band_sk#148]
-Right keys [1]: [ib_income_band_sk#160]
+(169) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [hd_income_band_sk#153]
+Right keys [1]: [ib_income_band_sk#165]
 Join type: Inner
 Join condition: None
 
-(168) Project [codegen id : 33]
-Output [17]: [ss_item_sk#101, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, d_year#137, d_year#139, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158]
-Input [19]: [ss_item_sk#101, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, d_year#137, d_year#139, hd_income_band_sk#148, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ib_income_band_sk#160]
+(170) Project [codegen id : 49]
+Output [17]: [ss_item_sk#106, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, d_year#142, d_year#144, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163]
+Input [19]: [ss_item_sk#106, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, d_year#142, d_year#144, hd_income_band_sk#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163, ib_income_band_sk#165]
 
-(169) ReusedExchange [Reuses operator id: 102]
-Output [2]: [i_item_sk#161, i_product_name#162]
+(171) ReusedExchange [Reuses operator id: 104]
+Output [2]: [i_item_sk#166, i_product_name#167]
 
-(170) BroadcastHashJoin [codegen id : 33]
-Left keys [1]: [ss_item_sk#101]
-Right keys [1]: [i_item_sk#161]
+(172) BroadcastHashJoin [codegen id : 49]
+Left keys [1]: [ss_item_sk#106]
+Right keys [1]: [i_item_sk#166]
 Join type: Inner
 Join condition: None
 
-(171) Project [codegen id : 33]
-Output [18]: [ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, d_year#137, d_year#139, s_store_name#128, s_zip#129, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, i_item_sk#161, i_product_name#162]
-Input [19]: [ss_item_sk#101, ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, s_store_name#128, s_zip#129, d_year#137, d_year#139, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, i_item_sk#161, i_product_name#162]
-
-(172) HashAggregate [codegen id : 33]
-Input [18]: [ss_wholesale_cost#109, ss_list_price#110, ss_coupon_amt#111, d_year#126, d_year#137, d_year#139, s_store_name#128, s_zip#129, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, i_item_sk#161, i_product_name#162]
-Keys [15]: [i_product_name#162, i_item_sk#161, s_store_name#128, s_zip#129, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, d_year#126, d_year#137, d_year#139]
-Functions [4]: [partial_count(1), partial_sum(UnscaledValue(ss_wholesale_cost#109)), partial_sum(UnscaledValue(ss_list_price#110)), partial_sum(UnscaledValue(ss_coupon_amt#111))]
-Aggregate Attributes [4]: [count#72, sum#163, sum#164, sum#165]
-Results [19]: [i_product_name#162, i_item_sk#161, s_store_name#128, s_zip#129, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, d_year#126, d_year#137, d_year#139, count#76, sum#166, sum#167, sum#168]
-
-(173) HashAggregate [codegen id : 33]
-Input [19]: [i_product_name#162, i_item_sk#161, s_store_name#128, s_zip#129, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, d_year#126, d_year#137, d_year#139, count#76, sum#166, sum#167, sum#168]
-Keys [15]: [i_product_name#162, i_item_sk#161, s_store_name#128, s_zip#129, ca_street_number#150, ca_street_name#151, ca_city#152, ca_zip#153, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, d_year#126, d_year#137, d_year#139]
-Functions [4]: [count(1), sum(UnscaledValue(ss_wholesale_cost#109)), sum(UnscaledValue(ss_list_price#110)), sum(UnscaledValue(ss_coupon_amt#111))]
-Aggregate Attributes [4]: [count(1)#80, sum(UnscaledValue(ss_wholesale_cost#109))#81, sum(UnscaledValue(ss_list_price#110))#82, sum(UnscaledValue(ss_coupon_amt#111))#83]
-Results [8]: [i_item_sk#161 AS item_sk#169, s_store_name#128 AS store_name#170, s_zip#129 AS store_zip#171, d_year#126 AS syear#172, count(1)#80 AS cnt#173, MakeDecimal(sum(UnscaledValue(ss_wholesale_cost#109))#81,17,2) AS s1#174, MakeDecimal(sum(UnscaledValue(ss_list_price#110))#82,17,2) AS s2#175, MakeDecimal(sum(UnscaledValue(ss_coupon_amt#111))#83,17,2) AS s3#176]
-
-(174) Exchange
-Input [8]: [item_sk#169, store_name#170, store_zip#171, syear#172, cnt#173, s1#174, s2#175, s3#176]
-Arguments: hashpartitioning(item_sk#169, store_name#170, store_zip#171, 5), ENSURE_REQUIREMENTS, [plan_id=16]
-
-(175) Sort [codegen id : 34]
-Input [8]: [item_sk#169, store_name#170, store_zip#171, syear#172, cnt#173, s1#174, s2#175, s3#176]
-Arguments: [item_sk#169 ASC NULLS FIRST, store_name#170 ASC NULLS FIRST, store_zip#171 ASC NULLS FIRST], false, 0
-
-(176) SortMergeJoin [codegen id : 35]
-Left keys [3]: [item_sk#85, store_name#86, store_zip#87]
-Right keys [3]: [item_sk#169, store_name#170, store_zip#171]
+(173) Project [codegen id : 49]
+Output [18]: [ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, d_year#142, d_year#144, s_store_name#133, s_zip#134, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163, i_item_sk#166, i_product_name#167]
+Input [19]: [ss_item_sk#106, ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, s_store_name#133, s_zip#134, d_year#142, d_year#144, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163, i_item_sk#166, i_product_name#167]
+
+(174) HashAggregate [codegen id : 49]
+Input [18]: [ss_wholesale_cost#114, ss_list_price#115, ss_coupon_amt#116, d_year#131, d_year#142, d_year#144, s_store_name#133, s_zip#134, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163, i_item_sk#166, i_product_name#167]
+Keys [15]: [i_product_name#167, i_item_sk#166, s_store_name#133, s_zip#134, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163, d_year#131, d_year#142, d_year#144]
+Functions [4]: [partial_count(1), partial_sum(UnscaledValue(ss_wholesale_cost#114)), partial_sum(UnscaledValue(ss_list_price#115)), partial_sum(UnscaledValue(ss_coupon_amt#116))]
+Aggregate Attributes [4]: [count#77, sum#168, sum#169, sum#170]
+Results [19]: [i_product_name#167, i_item_sk#166, s_store_name#133, s_zip#134, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163, d_year#131, d_year#142, d_year#144, count#81, sum#171, sum#172, sum#173]
+
+(175) HashAggregate [codegen id : 49]
+Input [19]: [i_product_name#167, i_item_sk#166, s_store_name#133, s_zip#134, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163, d_year#131, d_year#142, d_year#144, count#81, sum#171, sum#172, sum#173]
+Keys [15]: [i_product_name#167, i_item_sk#166, s_store_name#133, s_zip#134, ca_street_number#155, ca_street_name#156, ca_city#157, ca_zip#158, ca_street_number#160, ca_street_name#161, ca_city#162, ca_zip#163, d_year#131, d_year#142, d_year#144]
+Functions [4]: [count(1), sum(UnscaledValue(ss_wholesale_cost#114)), sum(UnscaledValue(ss_list_price#115)), sum(UnscaledValue(ss_coupon_amt#116))]
+Aggregate Attributes [4]: [count(1)#85, sum(UnscaledValue(ss_wholesale_cost#114))#86, sum(UnscaledValue(ss_list_price#115))#87, sum(UnscaledValue(ss_coupon_amt#116))#88]
+Results [8]: [i_item_sk#166 AS item_sk#174, s_store_name#133 AS store_name#175, s_zip#134 AS store_zip#176, d_year#131 AS syear#177, count(1)#85 AS cnt#178, MakeDecimal(sum(UnscaledValue(ss_wholesale_cost#114))#86,17,2) AS s1#179, MakeDecimal(sum(UnscaledValue(ss_list_price#115))#87,17,2) AS s2#180, MakeDecimal(sum(UnscaledValue(ss_coupon_amt#116))#88,17,2) AS s3#181]
+
+(176) Exchange
+Input [8]: [item_sk#174, store_name#175, store_zip#176, syear#177, cnt#178, s1#179, s2#180, s3#181]
+Arguments: hashpartitioning(item_sk#174, store_name#175, store_zip#176, 5), ENSURE_REQUIREMENTS, [plan_id=16]
+
+(177) Sort [codegen id : 50]
+Input [8]: [item_sk#174, store_name#175, store_zip#176, syear#177, cnt#178, s1#179, s2#180, s3#181]
+Arguments: [item_sk#174 ASC NULLS FIRST, store_name#175 ASC NULLS FIRST, store_zip#176 ASC NULLS FIRST], false, 0
+
+(178) SortMergeJoin [codegen id : 51]
+Left keys [3]: [item_sk#90, store_name#91, store_zip#92]
+Right keys [3]: [item_sk#174, store_name#175, store_zip#176]
 Join type: Inner
-Join condition: (cnt#173 <= cnt#97)
+Join condition: (cnt#178 <= cnt#102)
 
-(177) Project [codegen id : 35]
-Output [21]: [product_name#84, store_name#86, store_zip#87, b_street_number#88, b_streen_name#89, b_city#90, b_zip#91, c_street_number#92, c_street_name#93, c_city#94, c_zip#95, syear#96, cnt#97, s1#98, s2#99, s3#100, s1#174, s2#175, s3#176, syear#172, cnt#173]
-Input [25]: [product_name#84, item_sk#85, store_name#86, store_zip#87, b_street_number#88, b_streen_name#89, b_city#90, b_zip#91, c_street_number#92, c_street_name#93, c_city#94, c_zip#95, syear#96, cnt#97, s1#98, s2#99, s3#100, item_sk#169, store_name#170, store_zip#171, syear#172, cnt#173, s1#174, s2#175, s3#176]
+(179) Project [codegen id : 51]
+Output [21]: [product_name#89, store_name#91, store_zip#92, b_street_number#93, b_streen_name#94, b_city#95, b_zip#96, c_street_number#97, c_street_name#98, c_city#99, c_zip#100, syear#101, cnt#102, s1#103, s2#104, s3#105, s1#179, s2#180, s3#181, syear#177, cnt#178]
+Input [25]: [product_name#89, item_sk#90, store_name#91, store_zip#92, b_street_number#93, b_streen_name#94, b_city#95, b_zip#96, c_street_number#97, c_street_name#98, c_city#99, c_zip#100, syear#101, cnt#102, s1#103, s2#104, s3#105, item_sk#174, store_name#175, store_zip#176, syear#177, cnt#178, s1#179, s2#180, s3#181]
 
-(178) Exchange
-Input [21]: [product_name#84, store_name#86, store_zip#87, b_street_number#88, b_streen_name#89, b_city#90, b_zip#91, c_street_number#92, c_street_name#93, c_city#94, c_zip#95, syear#96, cnt#97, s1#98, s2#99, s3#100, s1#174, s2#175, s3#176, syear#172, cnt#173]
-Arguments: rangepartitioning(product_name#84 ASC NULLS FIRST, store_name#86 ASC NULLS FIRST, cnt#173 ASC NULLS FIRST, 5), ENSURE_REQUIREMENTS, [plan_id=17]
+(180) Exchange
+Input [21]: [product_name#89, store_name#91, store_zip#92, b_street_number#93, b_streen_name#94, b_city#95, b_zip#96, c_street_number#97, c_street_name#98, c_city#99, c_zip#100, syear#101, cnt#102, s1#103, s2#104, s3#105, s1#179, s2#180, s3#181, syear#177, cnt#178]
+Arguments: rangepartitioning(product_name#89 ASC NULLS FIRST, store_name#91 ASC NULLS FIRST, cnt#178 ASC NULLS FIRST, 5), ENSURE_REQUIREMENTS, [plan_id=17]
 
-(179) Sort [codegen id : 36]
-Input [21]: [product_name#84, store_name#86, store_zip#87, b_street_number#88, b_streen_name#89, b_city#90, b_zip#91, c_street_number#92, c_street_name#93, c_city#94, c_zip#95, syear#96, cnt#97, s1#98, s2#99, s3#100, s1#174, s2#175, s3#176, syear#172, cnt#173]
-Arguments: [product_name#84 ASC NULLS FIRST, store_name#86 ASC NULLS FIRST, cnt#173 ASC NULLS FIRST], true, 0
+(181) Sort [codegen id : 52]
+Input [21]: [product_name#89, store_name#91, store_zip#92, b_street_number#93, b_streen_name#94, b_city#95, b_zip#96, c_street_number#97, c_street_name#98, c_city#99, c_zip#100, syear#101, cnt#102, s1#103, s2#104, s3#105, s1#179, s2#180, s3#181, syear#177, cnt#178]
+Arguments: [product_name#89 ASC NULLS FIRST, store_name#91 ASC NULLS FIRST, cnt#178 ASC NULLS FIRST], true, 0
 
 ===== Subqueries =====
 
 Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#12 IN dynamicpruning#13
-BroadcastExchange (183)
-+- * ColumnarToRow (182)
-   +- CometFilter (181)
-      +- CometScan parquet spark_catalog.default.date_dim (180)
+BroadcastExchange (185)
++- * ColumnarToRow (184)
+   +- CometFilter (183)
+      +- CometScan parquet spark_catalog.default.date_dim (182)
 
 
 (unknown) Scan parquet spark_catalog.default.date_dim
-Output [2]: [d_date_sk#32, d_year#33]
+Output [2]: [d_date_sk#37, d_year#38]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/date_dim]
 PushedFilters: [IsNotNull(d_year), EqualTo(d_year,1999), IsNotNull(d_date_sk)]
 ReadSchema: struct<d_date_sk:int,d_year:int>
 
-(181) CometFilter
-Input [2]: [d_date_sk#32, d_year#33]
-Condition : ((isnotnull(d_year#33) AND (d_year#33 = 1999)) AND isnotnull(d_date_sk#32))
+(183) CometFilter
+Input [2]: [d_date_sk#37, d_year#38]
+Condition : ((isnotnull(d_year#38) AND (d_year#38 = 1999)) AND isnotnull(d_date_sk#37))
 
-(182) ColumnarToRow [codegen id : 1]
-Input [2]: [d_date_sk#32, d_year#33]
+(184) ColumnarToRow [codegen id : 1]
+Input [2]: [d_date_sk#37, d_year#38]
 
-(183) BroadcastExchange
-Input [2]: [d_date_sk#32, d_year#33]
+(185) BroadcastExchange
+Input [2]: [d_date_sk#37, d_year#38]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=18]
 
-Subquery:2 Hosting operator id = 109 Hosting Expression = ss_sold_date_sk#112 IN dynamicpruning#113
-BroadcastExchange (187)
-+- * ColumnarToRow (186)
-   +- CometFilter (185)
-      +- CometScan parquet spark_catalog.default.date_dim (184)
+Subquery:2 Hosting operator id = 111 Hosting Expression = ss_sold_date_sk#117 IN dynamicpruning#118
+BroadcastExchange (189)
++- * ColumnarToRow (188)
+   +- CometFilter (187)
+      +- CometScan parquet spark_catalog.default.date_dim (186)
 
 
 (unknown) Scan parquet spark_catalog.default.date_dim
-Output [2]: [d_date_sk#125, d_year#126]
+Output [2]: [d_date_sk#130, d_year#131]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/date_dim]
 PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2000), IsNotNull(d_date_sk)]
 ReadSchema: struct<d_date_sk:int,d_year:int>
 
-(185) CometFilter
-Input [2]: [d_date_sk#125, d_year#126]
-Condition : ((isnotnull(d_year#126) AND (d_year#126 = 2000)) AND isnotnull(d_date_sk#125))
+(187) CometFilter
+Input [2]: [d_date_sk#130, d_year#131]
+Condition : ((isnotnull(d_year#131) AND (d_year#131 = 2000)) AND isnotnull(d_date_sk#130))
 
-(186) ColumnarToRow [codegen id : 1]
-Input [2]: [d_date_sk#125, d_year#126]
+(188) ColumnarToRow [codegen id : 1]
+Input [2]: [d_date_sk#130, d_year#131]
 
-(187) BroadcastExchange
-Input [2]: [d_date_sk#125, d_year#126]
+(189) BroadcastExchange
+Input [2]: [d_date_sk#130, d_year#131]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=19]
 
 
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q64/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q64/simplified.txt
index eda7db4e..d972e008 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q64/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q64/simplified.txt
@@ -1,16 +1,16 @@
-WholeStageCodegen (36)
+WholeStageCodegen (52)
   Sort [product_name,store_name,cnt]
     InputAdapter
       Exchange [product_name,store_name,cnt] #1
-        WholeStageCodegen (35)
+        WholeStageCodegen (51)
           Project [product_name,store_name,store_zip,b_street_number,b_streen_name,b_city,b_zip,c_street_number,c_street_name,c_city,c_zip,syear,cnt,s1,s2,s3,s1,s2,s3,syear,cnt]
             SortMergeJoin [item_sk,store_name,store_zip,item_sk,store_name,store_zip,cnt,cnt]
               InputAdapter
-                WholeStageCodegen (17)
+                WholeStageCodegen (25)
                   Sort [item_sk,store_name,store_zip]
                     InputAdapter
                       Exchange [item_sk,store_name,store_zip] #2
-                        WholeStageCodegen (16)
+                        WholeStageCodegen (24)
                           HashAggregate [i_product_name,i_item_sk,s_store_name,s_zip,ca_street_number,ca_street_name,ca_city,ca_zip,ca_street_number,ca_street_name,ca_city,ca_zip,d_year,d_year,d_year,count,sum,sum,sum] [count(1),sum(UnscaledValue(ss_wholesale_cost)),sum(UnscaledValue(ss_list_price)),sum(UnscaledValue(ss_coupon_amt)),product_name,item_sk,store_name,store_zip,b_street_number,b_streen_name,b_city,b_zip,c_street_number,c_street_name,c_city,c_zip,syear,cnt,s1,s2,s3,count,sum, [...]
                             HashAggregate [i_product_name,i_item_sk,s_store_name,s_zip,ca_street_number,ca_street_name,ca_city,ca_zip,ca_street_number,ca_street_name,ca_city,ca_zip,d_year,d_year,d_year,ss_wholesale_cost,ss_list_price,ss_coupon_amt] [count,sum,sum,sum,count,sum,sum,sum]
                               Project [ss_wholesale_cost,ss_list_price,ss_coupon_amt,d_year,d_year,d_year,s_store_name,s_zip,ca_street_number,ca_street_name,ca_city,ca_zip,ca_street_number,ca_street_name,ca_city,ca_zip,i_item_sk,i_product_name]
@@ -43,64 +43,84 @@ WholeStageCodegen (36)
                                                                                     BroadcastHashJoin [ss_store_sk,s_store_sk]
                                                                                       Project [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_wholesale_cost,ss_list_price,ss_coupon_amt,d_year]
                                                                                         BroadcastHashJoin [ss_sold_date_sk,d_date_sk]
-                                                                                          ColumnarToRow
-                                                                                            InputAdapter
-                                                                                              CometProject [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
-                                                                                                CometSortMergeJoin [ss_item_sk,cs_item_sk]
-                                                                                                  CometSort [ss_item_sk]
-                                                                                                    CometExchange [ss_item_sk] #3
-                                                                                                      CometProject [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
-                                                                                                        CometBroadcastHashJoin [ss_item_sk,ss_ticket_number,sr_item_sk,sr_ticket_number]
-                                                                                                          CometBroadcastExchange #4
-                                                                                                            CometFilter [ss_item_sk,ss_ticket_number,ss_store_sk,ss_customer_sk,ss_cdemo_sk,ss_promo_sk,ss_hdemo_sk,ss_addr_sk]
-                                                                                                              CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_ticket_number,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
-                                                                                                                SubqueryBroadcast [d_date_sk] #1
-                                                                                                                  BroadcastExchange #5
-                                                                                                                    WholeStageCodegen (1)
-                                                                                                                      ColumnarToRow
-                                                                                                                        InputAdapter
-                                                                                                                          CometFilter [d_year,d_date_sk]
-                                                                                                                            CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_year]
-                                                                                                          CometProject [sr_item_sk,sr_ticket_number]
-                                                                                                            CometFilter [sr_item_sk,sr_ticket_number]
-                                                                                                              CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_returned_date_sk]
-                                                                                                  CometSort [cs_item_sk]
-                                                                                                    CometProject [cs_item_sk]
-                                                                                                      CometFilter [sale,refund]
-                                                                                                        CometHashAggregate [cs_item_sk,sum,sum,isEmpty]
-                                                                                                          CometExchange [cs_item_sk] #6
-                                                                                                            CometHashAggregate [cs_item_sk,cs_ext_list_price,cr_refunded_cash,cr_reversed_charge,cr_store_credit]
-                                                                                                              CometProject [cs_item_sk,cs_ext_list_price,cr_refunded_cash,cr_reversed_charge,cr_store_credit]
-                                                                                                                CometSortMergeJoin [cs_item_sk,cs_order_number,cr_item_sk,cr_order_number]
-                                                                                                                  CometSort [cs_item_sk,cs_order_number]
-                                                                                                                    CometExchange [cs_item_sk,cs_order_number] #7
-                                                                                                                      CometProject [cs_item_sk,cs_order_number,cs_ext_list_price]
-                                                                                                                        CometFilter [cs_item_sk,cs_order_number]
-                                                                                                                          CometScan parquet spark_catalog.default.catalog_sales [cs_item_sk,cs_order_number,cs_ext_list_price,cs_sold_date_sk]
-                                                                                                                  CometSort [cr_item_sk,cr_order_number]
-                                                                                                                    CometExchange [cr_item_sk,cr_order_number] #8
-                                                                                                                      CometProject [cr_item_sk,cr_order_number,cr_refunded_cash,cr_reversed_charge,cr_store_credit]
-                                                                                                                        CometFilter [cr_item_sk,cr_order_number]
-                                                                                                                          CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_refunded_cash,cr_reversed_charge,cr_store_credit,cr_returned_date_sk]
+                                                                                          Project [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                                                                                            SortMergeJoin [ss_item_sk,cs_item_sk]
+                                                                                              InputAdapter
+                                                                                                WholeStageCodegen (2)
+                                                                                                  Sort [ss_item_sk]
+                                                                                                    InputAdapter
+                                                                                                      Exchange [ss_item_sk] #3
+                                                                                                        WholeStageCodegen (1)
+                                                                                                          ColumnarToRow
+                                                                                                            InputAdapter
+                                                                                                              CometProject [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                                                                                                                CometBroadcastHashJoin [ss_item_sk,ss_ticket_number,sr_item_sk,sr_ticket_number]
+                                                                                                                  CometBroadcastExchange #4
+                                                                                                                    CometFilter [ss_item_sk,ss_ticket_number,ss_store_sk,ss_customer_sk,ss_cdemo_sk,ss_promo_sk,ss_hdemo_sk,ss_addr_sk]
+                                                                                                                      CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_ticket_number,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                                                                                                                        SubqueryBroadcast [d_date_sk] #1
+                                                                                                                          BroadcastExchange #5
+                                                                                                                            WholeStageCodegen (1)
+                                                                                                                              ColumnarToRow
+                                                                                                                                InputAdapter
+                                                                                                                                  CometFilter [d_year,d_date_sk]
+                                                                                                                                    CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_year]
+                                                                                                                  CometProject [sr_item_sk,sr_ticket_number]
+                                                                                                                    CometFilter [sr_item_sk,sr_ticket_number]
+                                                                                                                      CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_returned_date_sk]
+                                                                                              InputAdapter
+                                                                                                WholeStageCodegen (8)
+                                                                                                  Sort [cs_item_sk]
+                                                                                                    Project [cs_item_sk]
+                                                                                                      Filter [sale,refund]
+                                                                                                        HashAggregate [cs_item_sk,sum,sum,isEmpty] [sum(UnscaledValue(cs_ext_list_price)),sum(((cr_refunded_cash + cr_reversed_charge) + cr_store_credit)),sale,refund,sum,sum,isEmpty]
+                                                                                                          InputAdapter
+                                                                                                            Exchange [cs_item_sk] #6
+                                                                                                              WholeStageCodegen (7)
+                                                                                                                HashAggregate [cs_item_sk,cs_ext_list_price,cr_refunded_cash,cr_reversed_charge,cr_store_credit] [sum,sum,isEmpty,sum,sum,isEmpty]
+                                                                                                                  Project [cs_item_sk,cs_ext_list_price,cr_refunded_cash,cr_reversed_charge,cr_store_credit]
+                                                                                                                    SortMergeJoin [cs_item_sk,cs_order_number,cr_item_sk,cr_order_number]
+                                                                                                                      InputAdapter
+                                                                                                                        WholeStageCodegen (4)
+                                                                                                                          Sort [cs_item_sk,cs_order_number]
+                                                                                                                            InputAdapter
+                                                                                                                              Exchange [cs_item_sk,cs_order_number] #7
+                                                                                                                                WholeStageCodegen (3)
+                                                                                                                                  ColumnarToRow
+                                                                                                                                    InputAdapter
+                                                                                                                                      CometProject [cs_item_sk,cs_order_number,cs_ext_list_price]
+                                                                                                                                        CometFilter [cs_item_sk,cs_order_number]
+                                                                                                                                          CometScan parquet spark_catalog.default.catalog_sales [cs_item_sk,cs_order_number,cs_ext_list_price,cs_sold_date_sk]
+                                                                                                                      InputAdapter
+                                                                                                                        WholeStageCodegen (6)
+                                                                                                                          Sort [cr_item_sk,cr_order_number]
+                                                                                                                            InputAdapter
+                                                                                                                              Exchange [cr_item_sk,cr_order_number] #8
+                                                                                                                                WholeStageCodegen (5)
+                                                                                                                                  ColumnarToRow
+                                                                                                                                    InputAdapter
+                                                                                                                                      CometProject [cr_item_sk,cr_order_number,cr_refunded_cash,cr_reversed_charge,cr_store_credit]
+                                                                                                                                        CometFilter [cr_item_sk,cr_order_number]
+                                                                                                                                          CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_refunded_cash,cr_reversed_charge,cr_store_credit,cr_returned_date_sk]
                                                                                           InputAdapter
                                                                                             ReusedExchange [d_date_sk,d_year] #5
                                                                                       InputAdapter
                                                                                         BroadcastExchange #9
-                                                                                          WholeStageCodegen (2)
+                                                                                          WholeStageCodegen (10)
                                                                                             ColumnarToRow
                                                                                               InputAdapter
                                                                                                 CometFilter [s_store_sk,s_store_name,s_zip]
                                                                                                   CometScan parquet spark_catalog.default.store [s_store_sk,s_store_name,s_zip]
                                                                                   InputAdapter
                                                                                     BroadcastExchange #10
-                                                                                      WholeStageCodegen (3)
+                                                                                      WholeStageCodegen (11)
                                                                                         ColumnarToRow
                                                                                           InputAdapter
                                                                                             CometFilter [c_customer_sk,c_first_sales_date_sk,c_first_shipto_date_sk,c_current_cdemo_sk,c_current_hdemo_sk,c_current_addr_sk]
                                                                                               CometScan parquet spark_catalog.default.customer [c_customer_sk,c_current_cdemo_sk,c_current_hdemo_sk,c_current_addr_sk,c_first_shipto_date_sk,c_first_sales_date_sk]
                                                                               InputAdapter
                                                                                 BroadcastExchange #11
-                                                                                  WholeStageCodegen (4)
+                                                                                  WholeStageCodegen (12)
                                                                                     ColumnarToRow
                                                                                       InputAdapter
                                                                                         CometFilter [d_date_sk]
@@ -109,7 +129,7 @@ WholeStageCodegen (36)
                                                                             ReusedExchange [d_date_sk,d_year] #11
                                                                       InputAdapter
                                                                         BroadcastExchange #12
-                                                                          WholeStageCodegen (6)
+                                                                          WholeStageCodegen (14)
                                                                             ColumnarToRow
                                                                               InputAdapter
                                                                                 CometFilter [cd_demo_sk,cd_marital_status]
@@ -118,14 +138,14 @@ WholeStageCodegen (36)
                                                                     ReusedExchange [cd_demo_sk,cd_marital_status] #12
                                                               InputAdapter
                                                                 BroadcastExchange #13
-                                                                  WholeStageCodegen (8)
+                                                                  WholeStageCodegen (16)
                                                                     ColumnarToRow
                                                                       InputAdapter
                                                                         CometFilter [p_promo_sk]
                                                                           CometScan parquet spark_catalog.default.promotion [p_promo_sk]
                                                           InputAdapter
                                                             BroadcastExchange #14
-                                                              WholeStageCodegen (9)
+                                                              WholeStageCodegen (17)
                                                                 ColumnarToRow
                                                                   InputAdapter
                                                                     CometFilter [hd_demo_sk,hd_income_band_sk]
@@ -134,7 +154,7 @@ WholeStageCodegen (36)
                                                         ReusedExchange [hd_demo_sk,hd_income_band_sk] #14
                                                   InputAdapter
                                                     BroadcastExchange #15
-                                                      WholeStageCodegen (11)
+                                                      WholeStageCodegen (19)
                                                         ColumnarToRow
                                                           InputAdapter
                                                             CometFilter [ca_address_sk]
@@ -143,7 +163,7 @@ WholeStageCodegen (36)
                                                 ReusedExchange [ca_address_sk,ca_street_number,ca_street_name,ca_city,ca_zip] #15
                                           InputAdapter
                                             BroadcastExchange #16
-                                              WholeStageCodegen (13)
+                                              WholeStageCodegen (21)
                                                 ColumnarToRow
                                                   InputAdapter
                                                     CometFilter [ib_income_band_sk]
@@ -152,18 +172,18 @@ WholeStageCodegen (36)
                                         ReusedExchange [ib_income_band_sk] #16
                                   InputAdapter
                                     BroadcastExchange #17
-                                      WholeStageCodegen (15)
+                                      WholeStageCodegen (23)
                                         ColumnarToRow
                                           InputAdapter
                                             CometProject [i_item_sk,i_product_name]
                                               CometFilter [i_current_price,i_color,i_item_sk]
                                                 CometScan parquet spark_catalog.default.item [i_item_sk,i_current_price,i_color,i_product_name]
               InputAdapter
-                WholeStageCodegen (34)
+                WholeStageCodegen (50)
                   Sort [item_sk,store_name,store_zip]
                     InputAdapter
                       Exchange [item_sk,store_name,store_zip] #18
-                        WholeStageCodegen (33)
+                        WholeStageCodegen (49)
                           HashAggregate [i_product_name,i_item_sk,s_store_name,s_zip,ca_street_number,ca_street_name,ca_city,ca_zip,ca_street_number,ca_street_name,ca_city,ca_zip,d_year,d_year,d_year,count,sum,sum,sum] [count(1),sum(UnscaledValue(ss_wholesale_cost)),sum(UnscaledValue(ss_list_price)),sum(UnscaledValue(ss_coupon_amt)),item_sk,store_name,store_zip,syear,cnt,s1,s2,s3,count,sum,sum,sum]
                             HashAggregate [i_product_name,i_item_sk,s_store_name,s_zip,ca_street_number,ca_street_name,ca_city,ca_zip,ca_street_number,ca_street_name,ca_city,ca_zip,d_year,d_year,d_year,ss_wholesale_cost,ss_list_price,ss_coupon_amt] [count,sum,sum,sum,count,sum,sum,sum]
                               Project [ss_wholesale_cost,ss_list_price,ss_coupon_amt,d_year,d_year,d_year,s_store_name,s_zip,ca_street_number,ca_street_name,ca_city,ca_zip,ca_street_number,ca_street_name,ca_city,ca_zip,i_item_sk,i_product_name]
@@ -196,32 +216,39 @@ WholeStageCodegen (36)
                                                                                     BroadcastHashJoin [ss_store_sk,s_store_sk]
                                                                                       Project [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_wholesale_cost,ss_list_price,ss_coupon_amt,d_year]
                                                                                         BroadcastHashJoin [ss_sold_date_sk,d_date_sk]
-                                                                                          ColumnarToRow
-                                                                                            InputAdapter
-                                                                                              CometProject [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
-                                                                                                CometSortMergeJoin [ss_item_sk,cs_item_sk]
-                                                                                                  CometSort [ss_item_sk]
-                                                                                                    CometExchange [ss_item_sk] #19
-                                                                                                      CometProject [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
-                                                                                                        CometBroadcastHashJoin [ss_item_sk,ss_ticket_number,sr_item_sk,sr_ticket_number]
-                                                                                                          CometBroadcastExchange #20
-                                                                                                            CometFilter [ss_item_sk,ss_ticket_number,ss_store_sk,ss_customer_sk,ss_cdemo_sk,ss_promo_sk,ss_hdemo_sk,ss_addr_sk]
-                                                                                                              CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_ticket_number,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
-                                                                                                                SubqueryBroadcast [d_date_sk] #2
-                                                                                                                  BroadcastExchange #21
-                                                                                                                    WholeStageCodegen (1)
-                                                                                                                      ColumnarToRow
-                                                                                                                        InputAdapter
-                                                                                                                          CometFilter [d_year,d_date_sk]
-                                                                                                                            CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_year]
-                                                                                                          CometProject [sr_item_sk,sr_ticket_number]
-                                                                                                            CometFilter [sr_item_sk,sr_ticket_number]
-                                                                                                              CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_returned_date_sk]
-                                                                                                  CometSort [cs_item_sk]
-                                                                                                    CometProject [cs_item_sk]
-                                                                                                      CometFilter [sale,refund]
-                                                                                                        CometHashAggregate [cs_item_sk,sum,sum,isEmpty]
-                                                                                                          ReusedExchange [cs_item_sk,sum,sum,isEmpty] #6
+                                                                                          Project [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                                                                                            SortMergeJoin [ss_item_sk,cs_item_sk]
+                                                                                              InputAdapter
+                                                                                                WholeStageCodegen (27)
+                                                                                                  Sort [ss_item_sk]
+                                                                                                    InputAdapter
+                                                                                                      Exchange [ss_item_sk] #19
+                                                                                                        WholeStageCodegen (26)
+                                                                                                          ColumnarToRow
+                                                                                                            InputAdapter
+                                                                                                              CometProject [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                                                                                                                CometBroadcastHashJoin [ss_item_sk,ss_ticket_number,sr_item_sk,sr_ticket_number]
+                                                                                                                  CometBroadcastExchange #20
+                                                                                                                    CometFilter [ss_item_sk,ss_ticket_number,ss_store_sk,ss_customer_sk,ss_cdemo_sk,ss_promo_sk,ss_hdemo_sk,ss_addr_sk]
+                                                                                                                      CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_cdemo_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_promo_sk,ss_ticket_number,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk]
+                                                                                                                        SubqueryBroadcast [d_date_sk] #2
+                                                                                                                          BroadcastExchange #21
+                                                                                                                            WholeStageCodegen (1)
+                                                                                                                              ColumnarToRow
+                                                                                                                                InputAdapter
+                                                                                                                                  CometFilter [d_year,d_date_sk]
+                                                                                                                                    CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_year]
+                                                                                                                  CometProject [sr_item_sk,sr_ticket_number]
+                                                                                                                    CometFilter [sr_item_sk,sr_ticket_number]
+                                                                                                                      CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_returned_date_sk]
+                                                                                              InputAdapter
+                                                                                                WholeStageCodegen (33)
+                                                                                                  Sort [cs_item_sk]
+                                                                                                    Project [cs_item_sk]
+                                                                                                      Filter [sale,refund]
+                                                                                                        HashAggregate [cs_item_sk,sum,sum,isEmpty] [sum(UnscaledValue(cs_ext_list_price)),sum(((cr_refunded_cash + cr_reversed_charge) + cr_store_credit)),sale,refund,sum,sum,isEmpty]
+                                                                                                          InputAdapter
+                                                                                                            ReusedExchange [cs_item_sk,sum,sum,isEmpty] #6
                                                                                           InputAdapter
                                                                                             ReusedExchange [d_date_sk,d_year] #21
                                                                                       InputAdapter
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q72/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q72/explain.txt
index c0d1f949..e55a0ca1 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q72/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q72/explain.txt
@@ -63,9 +63,9 @@ TakeOrderedAndProject (70)
                :              +- * ColumnarToRow (53)
                :                 +- CometFilter (52)
                :                    +- CometScan parquet spark_catalog.default.promotion (51)
-               +- * ColumnarToRow (64)
-                  +- CometSort (63)
-                     +- CometExchange (62)
+               +- * Sort (64)
+                  +- Exchange (63)
+                     +- * ColumnarToRow (62)
                         +- CometProject (61)
                            +- CometFilter (60)
                               +- CometScan parquet spark_catalog.default.catalog_returns (59)
@@ -355,28 +355,28 @@ Condition : (isnotnull(cr_item_sk#30) AND isnotnull(cr_order_number#31))
 Input [3]: [cr_item_sk#30, cr_order_number#31, cr_returned_date_sk#32]
 Arguments: [cr_item_sk#30, cr_order_number#31], [cr_item_sk#30, cr_order_number#31]
 
-(62) CometExchange
+(62) ColumnarToRow [codegen id : 12]
 Input [2]: [cr_item_sk#30, cr_order_number#31]
-Arguments: hashpartitioning(cr_item_sk#30, cr_order_number#31, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=10]
 
-(63) CometSort
+(63) Exchange
 Input [2]: [cr_item_sk#30, cr_order_number#31]
-Arguments: [cr_item_sk#30, cr_order_number#31], [cr_item_sk#30 ASC NULLS FIRST, cr_order_number#31 ASC NULLS FIRST]
+Arguments: hashpartitioning(cr_item_sk#30, cr_order_number#31, 5), ENSURE_REQUIREMENTS, [plan_id=10]
 
-(64) ColumnarToRow [codegen id : 12]
+(64) Sort [codegen id : 13]
 Input [2]: [cr_item_sk#30, cr_order_number#31]
+Arguments: [cr_item_sk#30 ASC NULLS FIRST, cr_order_number#31 ASC NULLS FIRST], false, 0
 
-(65) SortMergeJoin [codegen id : 13]
+(65) SortMergeJoin [codegen id : 14]
 Left keys [2]: [cs_item_sk#4, cs_order_number#6]
 Right keys [2]: [cr_item_sk#30, cr_order_number#31]
 Join type: LeftOuter
 Join condition: None
 
-(66) Project [codegen id : 13]
+(66) Project [codegen id : 14]
 Output [3]: [w_warehouse_name#15, i_item_desc#17, d_week_seq#24]
 Input [7]: [cs_item_sk#4, cs_order_number#6, w_warehouse_name#15, i_item_desc#17, d_week_seq#24, cr_item_sk#30, cr_order_number#31]
 
-(67) HashAggregate [codegen id : 13]
+(67) HashAggregate [codegen id : 14]
 Input [3]: [w_warehouse_name#15, i_item_desc#17, d_week_seq#24]
 Keys [3]: [i_item_desc#17, w_warehouse_name#15, d_week_seq#24]
 Functions [1]: [partial_count(1)]
@@ -387,7 +387,7 @@ Results [4]: [i_item_desc#17, w_warehouse_name#15, d_week_seq#24, count#34]
 Input [4]: [i_item_desc#17, w_warehouse_name#15, d_week_seq#24, count#34]
 Arguments: hashpartitioning(i_item_desc#17, w_warehouse_name#15, d_week_seq#24, 5), ENSURE_REQUIREMENTS, [plan_id=11]
 
-(69) HashAggregate [codegen id : 14]
+(69) HashAggregate [codegen id : 15]
 Input [4]: [i_item_desc#17, w_warehouse_name#15, d_week_seq#24, count#34]
 Keys [3]: [i_item_desc#17, w_warehouse_name#15, d_week_seq#24]
 Functions [1]: [count(1)]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q72/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q72/simplified.txt
index 5eb8ea52..17fc9dee 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q72/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q72/simplified.txt
@@ -1,9 +1,9 @@
 TakeOrderedAndProject [total_cnt,i_item_desc,w_warehouse_name,d_week_seq,no_promo,promo]
-  WholeStageCodegen (14)
+  WholeStageCodegen (15)
     HashAggregate [i_item_desc,w_warehouse_name,d_week_seq,count] [count(1),no_promo,promo,total_cnt,count]
       InputAdapter
         Exchange [i_item_desc,w_warehouse_name,d_week_seq] #1
-          WholeStageCodegen (13)
+          WholeStageCodegen (14)
             HashAggregate [i_item_desc,w_warehouse_name,d_week_seq] [count,count]
               Project [w_warehouse_name,i_item_desc,d_week_seq]
                 SortMergeJoin [cs_item_sk,cs_order_number,cr_item_sk,cr_order_number]
@@ -104,11 +104,13 @@ TakeOrderedAndProject [total_cnt,i_item_desc,w_warehouse_name,d_week_seq,no_prom
                                             CometFilter [p_promo_sk]
                                               CometScan parquet spark_catalog.default.promotion [p_promo_sk]
                   InputAdapter
-                    WholeStageCodegen (12)
-                      ColumnarToRow
+                    WholeStageCodegen (13)
+                      Sort [cr_item_sk,cr_order_number]
                         InputAdapter
-                          CometSort [cr_item_sk,cr_order_number]
-                            CometExchange [cr_item_sk,cr_order_number] #12
-                              CometProject [cr_item_sk,cr_order_number]
-                                CometFilter [cr_item_sk,cr_order_number]
-                                  CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_returned_date_sk]
+                          Exchange [cr_item_sk,cr_order_number] #12
+                            WholeStageCodegen (12)
+                              ColumnarToRow
+                                InputAdapter
+                                  CometProject [cr_item_sk,cr_order_number]
+                                    CometFilter [cr_item_sk,cr_order_number]
+                                      CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_returned_date_sk]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q75/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q75/explain.txt
index 3a29db88..0ff759f3 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q75/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q75/explain.txt
@@ -1,7 +1,7 @@
 == Physical Plan ==
-TakeOrderedAndProject (132)
-+- * Project (131)
-   +- * SortMergeJoin Inner (130)
+TakeOrderedAndProject (129)
++- * Project (128)
+   +- * SortMergeJoin Inner (127)
       :- * Sort (71)
       :  +- Exchange (70)
       :     +- * Filter (69)
@@ -29,9 +29,9 @@ TakeOrderedAndProject (132)
       :                             :     :           :              +- CometFilter (5)
       :                             :     :           :                 +- CometScan parquet spark_catalog.default.item (4)
       :                             :     :           +- ReusedExchange (11)
-      :                             :     +- * ColumnarToRow (21)
-      :                             :        +- CometSort (20)
-      :                             :           +- CometExchange (19)
+      :                             :     +- * Sort (21)
+      :                             :        +- Exchange (20)
+      :                             :           +- * ColumnarToRow (19)
       :                             :              +- CometProject (18)
       :                             :                 +- CometFilter (17)
       :                             :                    +- CometScan parquet spark_catalog.default.catalog_returns (16)
@@ -48,9 +48,9 @@ TakeOrderedAndProject (132)
       :                             :     :           :     :     +- CometScan parquet spark_catalog.default.store_sales (24)
       :                             :     :           :     +- ReusedExchange (27)
       :                             :     :           +- ReusedExchange (30)
-      :                             :     +- * ColumnarToRow (40)
-      :                             :        +- CometSort (39)
-      :                             :           +- CometExchange (38)
+      :                             :     +- * Sort (40)
+      :                             :        +- Exchange (39)
+      :                             :           +- * ColumnarToRow (38)
       :                             :              +- CometProject (37)
       :                             :                 +- CometFilter (36)
       :                             :                    +- CometScan parquet spark_catalog.default.store_returns (35)
@@ -67,24 +67,24 @@ TakeOrderedAndProject (132)
       :                                   :           :     :     +- CometScan parquet spark_catalog.default.web_sales (43)
       :                                   :           :     +- ReusedExchange (46)
       :                                   :           +- ReusedExchange (49)
-      :                                   +- * ColumnarToRow (59)
-      :                                      +- CometSort (58)
-      :                                         +- CometExchange (57)
+      :                                   +- * Sort (59)
+      :                                      +- Exchange (58)
+      :                                         +- * ColumnarToRow (57)
       :                                            +- CometProject (56)
       :                                               +- CometFilter (55)
       :                                                  +- CometScan parquet spark_catalog.default.web_returns (54)
-      +- * Sort (129)
-         +- Exchange (128)
-            +- * Filter (127)
-               +- * HashAggregate (126)
-                  +- Exchange (125)
-                     +- * HashAggregate (124)
-                        +- * HashAggregate (123)
-                           +- Exchange (122)
-                              +- * HashAggregate (121)
-                                 +- Union (120)
-                                    :- * Project (87)
-                                    :  +- * SortMergeJoin LeftOuter (86)
+      +- * Sort (126)
+         +- Exchange (125)
+            +- * Filter (124)
+               +- * HashAggregate (123)
+                  +- Exchange (122)
+                     +- * HashAggregate (121)
+                        +- * HashAggregate (120)
+                           +- Exchange (119)
+                              +- * HashAggregate (118)
+                                 +- Union (117)
+                                    :- * Project (86)
+                                    :  +- * SortMergeJoin LeftOuter (85)
                                     :     :- * Sort (82)
                                     :     :  +- Exchange (81)
                                     :     :     +- * Project (80)
@@ -96,41 +96,38 @@ TakeOrderedAndProject (132)
                                     :     :           :     :     +- CometScan parquet spark_catalog.default.catalog_sales (72)
                                     :     :           :     +- ReusedExchange (75)
                                     :     :           +- ReusedExchange (78)
-                                    :     +- * ColumnarToRow (85)
-                                    :        +- CometSort (84)
-                                    :           +- ReusedExchange (83)
-                                    :- * Project (103)
-                                    :  +- * SortMergeJoin LeftOuter (102)
-                                    :     :- * Sort (98)
-                                    :     :  +- Exchange (97)
-                                    :     :     +- * Project (96)
-                                    :     :        +- * BroadcastHashJoin Inner BuildRight (95)
-                                    :     :           :- * Project (93)
-                                    :     :           :  +- * BroadcastHashJoin Inner BuildRight (92)
-                                    :     :           :     :- * ColumnarToRow (90)
-                                    :     :           :     :  +- CometFilter (89)
-                                    :     :           :     :     +- CometScan parquet spark_catalog.default.store_sales (88)
-                                    :     :           :     +- ReusedExchange (91)
-                                    :     :           +- ReusedExchange (94)
-                                    :     +- * ColumnarToRow (101)
-                                    :        +- CometSort (100)
-                                    :           +- ReusedExchange (99)
-                                    +- * Project (119)
-                                       +- * SortMergeJoin LeftOuter (118)
-                                          :- * Sort (114)
-                                          :  +- Exchange (113)
-                                          :     +- * Project (112)
-                                          :        +- * BroadcastHashJoin Inner BuildRight (111)
-                                          :           :- * Project (109)
-                                          :           :  +- * BroadcastHashJoin Inner BuildRight (108)
-                                          :           :     :- * ColumnarToRow (106)
-                                          :           :     :  +- CometFilter (105)
-                                          :           :     :     +- CometScan parquet spark_catalog.default.web_sales (104)
-                                          :           :     +- ReusedExchange (107)
-                                          :           +- ReusedExchange (110)
-                                          +- * ColumnarToRow (117)
-                                             +- CometSort (116)
-                                                +- ReusedExchange (115)
+                                    :     +- * Sort (84)
+                                    :        +- ReusedExchange (83)
+                                    :- * Project (101)
+                                    :  +- * SortMergeJoin LeftOuter (100)
+                                    :     :- * Sort (97)
+                                    :     :  +- Exchange (96)
+                                    :     :     +- * Project (95)
+                                    :     :        +- * BroadcastHashJoin Inner BuildRight (94)
+                                    :     :           :- * Project (92)
+                                    :     :           :  +- * BroadcastHashJoin Inner BuildRight (91)
+                                    :     :           :     :- * ColumnarToRow (89)
+                                    :     :           :     :  +- CometFilter (88)
+                                    :     :           :     :     +- CometScan parquet spark_catalog.default.store_sales (87)
+                                    :     :           :     +- ReusedExchange (90)
+                                    :     :           +- ReusedExchange (93)
+                                    :     +- * Sort (99)
+                                    :        +- ReusedExchange (98)
+                                    +- * Project (116)
+                                       +- * SortMergeJoin LeftOuter (115)
+                                          :- * Sort (112)
+                                          :  +- Exchange (111)
+                                          :     +- * Project (110)
+                                          :        +- * BroadcastHashJoin Inner BuildRight (109)
+                                          :           :- * Project (107)
+                                          :           :  +- * BroadcastHashJoin Inner BuildRight (106)
+                                          :           :     :- * ColumnarToRow (104)
+                                          :           :     :  +- CometFilter (103)
+                                          :           :     :     +- CometScan parquet spark_catalog.default.web_sales (102)
+                                          :           :     +- ReusedExchange (105)
+                                          :           +- ReusedExchange (108)
+                                          +- * Sort (114)
+                                             +- ReusedExchange (113)
 
 
 (unknown) Scan parquet spark_catalog.default.catalog_sales
@@ -180,7 +177,7 @@ Join condition: None
 Output [9]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, cs_sold_date_sk#5, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]
 Input [10]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, cs_sold_date_sk#5, i_item_sk#7, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]
 
-(11) ReusedExchange [Reuses operator id: 136]
+(11) ReusedExchange [Reuses operator id: 133]
 Output [2]: [d_date_sk#13, d_year#14]
 
 (12) BroadcastHashJoin [codegen id : 3]
@@ -216,24 +213,24 @@ Condition : (isnotnull(cr_order_number#16) AND isnotnull(cr_item_sk#15))
 Input [5]: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18, cr_returned_date_sk#19]
 Arguments: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18], [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18]
 
-(19) CometExchange
+(19) ColumnarToRow [codegen id : 5]
 Input [4]: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18]
-Arguments: hashpartitioning(cr_order_number#16, cr_item_sk#15, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]
 
-(20) CometSort
+(20) Exchange
 Input [4]: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18]
-Arguments: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18], [cr_order_number#16 ASC NULLS FIRST, cr_item_sk#15 ASC NULLS FIRST]
+Arguments: hashpartitioning(cr_order_number#16, cr_item_sk#15, 5), ENSURE_REQUIREMENTS, [plan_id=3]
 
-(21) ColumnarToRow [codegen id : 5]
+(21) Sort [codegen id : 6]
 Input [4]: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18]
+Arguments: [cr_order_number#16 ASC NULLS FIRST, cr_item_sk#15 ASC NULLS FIRST], false, 0
 
-(22) SortMergeJoin [codegen id : 6]
+(22) SortMergeJoin [codegen id : 7]
 Left keys [2]: [cs_order_number#2, cs_item_sk#1]
 Right keys [2]: [cr_order_number#16, cr_item_sk#15]
 Join type: LeftOuter
 Join condition: None
 
-(23) Project [codegen id : 6]
+(23) Project [codegen id : 7]
 Output [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, (cs_quantity#3 - coalesce(cr_return_quantity#17, 0)) AS sales_cnt#20, (cs_ext_sales_price#4 - coalesce(cr_return_amount#18, 0.00)) AS sales_amt#21]
 Input [13]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, d_year#14, cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18]
 
@@ -249,32 +246,32 @@ ReadSchema: struct<ss_item_sk:int,ss_ticket_number:int,ss_quantity:int,ss_ext_sa
 Input [5]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, ss_sold_date_sk#26]
 Condition : isnotnull(ss_item_sk#22)
 
-(26) ColumnarToRow [codegen id : 9]
+(26) ColumnarToRow [codegen id : 10]
 Input [5]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, ss_sold_date_sk#26]
 
 (27) ReusedExchange [Reuses operator id: 8]
 Output [5]: [i_item_sk#28, i_brand_id#29, i_class_id#30, i_category_id#31, i_manufact_id#32]
 
-(28) BroadcastHashJoin [codegen id : 9]
+(28) BroadcastHashJoin [codegen id : 10]
 Left keys [1]: [ss_item_sk#22]
 Right keys [1]: [i_item_sk#28]
 Join type: Inner
 Join condition: None
 
-(29) Project [codegen id : 9]
+(29) Project [codegen id : 10]
 Output [9]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, ss_sold_date_sk#26, i_brand_id#29, i_class_id#30, i_category_id#31, i_manufact_id#32]
 Input [10]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, ss_sold_date_sk#26, i_item_sk#28, i_brand_id#29, i_class_id#30, i_category_id#31, i_manufact_id#32]
 
-(30) ReusedExchange [Reuses operator id: 136]
+(30) ReusedExchange [Reuses operator id: 133]
 Output [2]: [d_date_sk#33, d_year#34]
 
-(31) BroadcastHashJoin [codegen id : 9]
+(31) BroadcastHashJoin [codegen id : 10]
 Left keys [1]: [ss_sold_date_sk#26]
 Right keys [1]: [d_date_sk#33]
 Join type: Inner
 Join condition: None
 
-(32) Project [codegen id : 9]
+(32) Project [codegen id : 10]
 Output [9]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, i_brand_id#29, i_class_id#30, i_category_id#31, i_manufact_id#32, d_year#34]
 Input [11]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, ss_sold_date_sk#26, i_brand_id#29, i_class_id#30, i_category_id#31, i_manufact_id#32, d_date_sk#33, d_year#34]
 
@@ -282,7 +279,7 @@ Input [11]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_pr
 Input [9]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, i_brand_id#29, i_class_id#30, i_category_id#31, i_manufact_id#32, d_year#34]
 Arguments: hashpartitioning(ss_ticket_number#23, ss_item_sk#22, 5), ENSURE_REQUIREMENTS, [plan_id=4]
 
-(34) Sort [codegen id : 10]
+(34) Sort [codegen id : 11]
 Input [9]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, i_brand_id#29, i_class_id#30, i_category_id#31, i_manufact_id#32, d_year#34]
 Arguments: [ss_ticket_number#23 ASC NULLS FIRST, ss_item_sk#22 ASC NULLS FIRST], false, 0
 
@@ -301,24 +298,24 @@ Condition : (isnotnull(sr_ticket_number#36) AND isnotnull(sr_item_sk#35))
 Input [5]: [sr_item_sk#35, sr_ticket_number#36, sr_return_quantity#37, sr_return_amt#38, sr_returned_date_sk#39]
 Arguments: [sr_item_sk#35, sr_ticket_number#36, sr_return_quantity#37, sr_return_amt#38], [sr_item_sk#35, sr_ticket_number#36, sr_return_quantity#37, sr_return_amt#38]
 
-(38) CometExchange
+(38) ColumnarToRow [codegen id : 12]
 Input [4]: [sr_item_sk#35, sr_ticket_number#36, sr_return_quantity#37, sr_return_amt#38]
-Arguments: hashpartitioning(sr_ticket_number#36, sr_item_sk#35, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=5]
 
-(39) CometSort
+(39) Exchange
 Input [4]: [sr_item_sk#35, sr_ticket_number#36, sr_return_quantity#37, sr_return_amt#38]
-Arguments: [sr_item_sk#35, sr_ticket_number#36, sr_return_quantity#37, sr_return_amt#38], [sr_ticket_number#36 ASC NULLS FIRST, sr_item_sk#35 ASC NULLS FIRST]
+Arguments: hashpartitioning(sr_ticket_number#36, sr_item_sk#35, 5), ENSURE_REQUIREMENTS, [plan_id=5]
 
-(40) ColumnarToRow [codegen id : 11]
+(40) Sort [codegen id : 13]
 Input [4]: [sr_item_sk#35, sr_ticket_number#36, sr_return_quantity#37, sr_return_amt#38]
+Arguments: [sr_ticket_number#36 ASC NULLS FIRST, sr_item_sk#35 ASC NULLS FIRST], false, 0
 
-(41) SortMergeJoin [codegen id : 12]
+(41) SortMergeJoin [codegen id : 14]
 Left keys [2]: [ss_ticket_number#23, ss_item_sk#22]
 Right keys [2]: [sr_ticket_number#36, sr_item_sk#35]
 Join type: LeftOuter
 Join condition: None
 
-(42) Project [codegen id : 12]
+(42) Project [codegen id : 14]
 Output [7]: [d_year#34, i_brand_id#29, i_class_id#30, i_category_id#31, i_manufact_id#32, (ss_quantity#24 - coalesce(sr_return_quantity#37, 0)) AS sales_cnt#40, (ss_ext_sales_price#25 - coalesce(sr_return_amt#38, 0.00)) AS sales_amt#41]
 Input [13]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, i_brand_id#29, i_class_id#30, i_category_id#31, i_manufact_id#32, d_year#34, sr_item_sk#35, sr_ticket_number#36, sr_return_quantity#37, sr_return_amt#38]
 
@@ -334,32 +331,32 @@ ReadSchema: struct<ws_item_sk:int,ws_order_number:int,ws_quantity:int,ws_ext_sal
 Input [5]: [ws_item_sk#42, ws_order_number#43, ws_quantity#44, ws_ext_sales_price#45, ws_sold_date_sk#46]
 Condition : isnotnull(ws_item_sk#42)
 
-(45) ColumnarToRow [codegen id : 15]
+(45) ColumnarToRow [codegen id : 17]
 Input [5]: [ws_item_sk#42, ws_order_number#43, ws_quantity#44, ws_ext_sales_price#45, ws_sold_date_sk#46]
 
 (46) ReusedExchange [Reuses operator id: 8]
 Output [5]: [i_item_sk#48, i_brand_id#49, i_class_id#50, i_category_id#51, i_manufact_id#52]
 
-(47) BroadcastHashJoin [codegen id : 15]
+(47) BroadcastHashJoin [codegen id : 17]
 Left keys [1]: [ws_item_sk#42]
 Right keys [1]: [i_item_sk#48]
 Join type: Inner
 Join condition: None
 
-(48) Project [codegen id : 15]
+(48) Project [codegen id : 17]
 Output [9]: [ws_item_sk#42, ws_order_number#43, ws_quantity#44, ws_ext_sales_price#45, ws_sold_date_sk#46, i_brand_id#49, i_class_id#50, i_category_id#51, i_manufact_id#52]
 Input [10]: [ws_item_sk#42, ws_order_number#43, ws_quantity#44, ws_ext_sales_price#45, ws_sold_date_sk#46, i_item_sk#48, i_brand_id#49, i_class_id#50, i_category_id#51, i_manufact_id#52]
 
-(49) ReusedExchange [Reuses operator id: 136]
+(49) ReusedExchange [Reuses operator id: 133]
 Output [2]: [d_date_sk#53, d_year#54]
 
-(50) BroadcastHashJoin [codegen id : 15]
+(50) BroadcastHashJoin [codegen id : 17]
 Left keys [1]: [ws_sold_date_sk#46]
 Right keys [1]: [d_date_sk#53]
 Join type: Inner
 Join condition: None
 
-(51) Project [codegen id : 15]
+(51) Project [codegen id : 17]
 Output [9]: [ws_item_sk#42, ws_order_number#43, ws_quantity#44, ws_ext_sales_price#45, i_brand_id#49, i_class_id#50, i_category_id#51, i_manufact_id#52, d_year#54]
 Input [11]: [ws_item_sk#42, ws_order_number#43, ws_quantity#44, ws_ext_sales_price#45, ws_sold_date_sk#46, i_brand_id#49, i_class_id#50, i_category_id#51, i_manufact_id#52, d_date_sk#53, d_year#54]
 
@@ -367,7 +364,7 @@ Input [11]: [ws_item_sk#42, ws_order_number#43, ws_quantity#44, ws_ext_sales_pri
 Input [9]: [ws_item_sk#42, ws_order_number#43, ws_quantity#44, ws_ext_sales_price#45, i_brand_id#49, i_class_id#50, i_category_id#51, i_manufact_id#52, d_year#54]
 Arguments: hashpartitioning(ws_order_number#43, ws_item_sk#42, 5), ENSURE_REQUIREMENTS, [plan_id=6]
 
-(53) Sort [codegen id : 16]
+(53) Sort [codegen id : 18]
 Input [9]: [ws_item_sk#42, ws_order_number#43, ws_quantity#44, ws_ext_sales_price#45, i_brand_id#49, i_class_id#50, i_category_id#51, i_manufact_id#52, d_year#54]
 Arguments: [ws_order_number#43 ASC NULLS FIRST, ws_item_sk#42 ASC NULLS FIRST], false, 0
 
@@ -386,30 +383,30 @@ Condition : (isnotnull(wr_order_number#56) AND isnotnull(wr_item_sk#55))
 Input [5]: [wr_item_sk#55, wr_order_number#56, wr_return_quantity#57, wr_return_amt#58, wr_returned_date_sk#59]
 Arguments: [wr_item_sk#55, wr_order_number#56, wr_return_quantity#57, wr_return_amt#58], [wr_item_sk#55, wr_order_number#56, wr_return_quantity#57, wr_return_amt#58]
 
-(57) CometExchange
+(57) ColumnarToRow [codegen id : 19]
 Input [4]: [wr_item_sk#55, wr_order_number#56, wr_return_quantity#57, wr_return_amt#58]
-Arguments: hashpartitioning(wr_order_number#56, wr_item_sk#55, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=7]
 
-(58) CometSort
+(58) Exchange
 Input [4]: [wr_item_sk#55, wr_order_number#56, wr_return_quantity#57, wr_return_amt#58]
-Arguments: [wr_item_sk#55, wr_order_number#56, wr_return_quantity#57, wr_return_amt#58], [wr_order_number#56 ASC NULLS FIRST, wr_item_sk#55 ASC NULLS FIRST]
+Arguments: hashpartitioning(wr_order_number#56, wr_item_sk#55, 5), ENSURE_REQUIREMENTS, [plan_id=7]
 
-(59) ColumnarToRow [codegen id : 17]
+(59) Sort [codegen id : 20]
 Input [4]: [wr_item_sk#55, wr_order_number#56, wr_return_quantity#57, wr_return_amt#58]
+Arguments: [wr_order_number#56 ASC NULLS FIRST, wr_item_sk#55 ASC NULLS FIRST], false, 0
 
-(60) SortMergeJoin [codegen id : 18]
+(60) SortMergeJoin [codegen id : 21]
 Left keys [2]: [ws_order_number#43, ws_item_sk#42]
 Right keys [2]: [wr_order_number#56, wr_item_sk#55]
 Join type: LeftOuter
 Join condition: None
 
-(61) Project [codegen id : 18]
+(61) Project [codegen id : 21]
 Output [7]: [d_year#54, i_brand_id#49, i_class_id#50, i_category_id#51, i_manufact_id#52, (ws_quantity#44 - coalesce(wr_return_quantity#57, 0)) AS sales_cnt#60, (ws_ext_sales_price#45 - coalesce(wr_return_amt#58, 0.00)) AS sales_amt#61]
 Input [13]: [ws_item_sk#42, ws_order_number#43, ws_quantity#44, ws_ext_sales_price#45, i_brand_id#49, i_class_id#50, i_category_id#51, i_manufact_id#52, d_year#54, wr_item_sk#55, wr_order_number#56, wr_return_quantity#57, wr_return_amt#58]
 
 (62) Union
 
-(63) HashAggregate [codegen id : 19]
+(63) HashAggregate [codegen id : 22]
 Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
 Keys [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
 Functions: []
@@ -420,14 +417,14 @@ Results [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufac
 Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
 Arguments: hashpartitioning(d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21, 5), ENSURE_REQUIREMENTS, [plan_id=8]
 
-(65) HashAggregate [codegen id : 20]
+(65) HashAggregate [codegen id : 23]
 Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
 Keys [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
 Functions: []
 Aggregate Attributes: []
 Results [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
 
-(66) HashAggregate [codegen id : 20]
+(66) HashAggregate [codegen id : 23]
 Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
 Keys [5]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]
 Functions [2]: [partial_sum(sales_cnt#20), partial_sum(UnscaledValue(sales_amt#21))]
@@ -438,14 +435,14 @@ Results [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufac
 Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sum#64, sum#65]
 Arguments: hashpartitioning(d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, 5), ENSURE_REQUIREMENTS, [plan_id=9]
 
-(68) HashAggregate [codegen id : 21]
+(68) HashAggregate [codegen id : 24]
 Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sum#64, sum#65]
 Keys [5]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]
 Functions [2]: [sum(sales_cnt#20), sum(UnscaledValue(sales_amt#21))]
 Aggregate Attributes [2]: [sum(sales_cnt#20)#66, sum(UnscaledValue(sales_amt#21))#67]
 Results [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sum(sales_cnt#20)#66 AS sales_cnt#68, MakeDecimal(sum(UnscaledValue(sales_amt#21))#67,18,2) AS sales_amt#69]
 
-(69) Filter [codegen id : 21]
+(69) Filter [codegen id : 24]
 Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#68, sales_amt#69]
 Condition : isnotnull(sales_cnt#68)
 
@@ -453,7 +450,7 @@ Condition : isnotnull(sales_cnt#68)
 Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#68, sales_amt#69]
 Arguments: hashpartitioning(i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, 5), ENSURE_REQUIREMENTS, [plan_id=10]
 
-(71) Sort [codegen id : 22]
+(71) Sort [codegen id : 25]
 Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#68, sales_amt#69]
 Arguments: [i_brand_id#8 ASC NULLS FIRST, i_class_id#9 ASC NULLS FIRST, i_category_id#10 ASC NULLS FIRST, i_manufact_id#12 ASC NULLS FIRST], false, 0
 
@@ -469,32 +466,32 @@ ReadSchema: struct<cs_item_sk:int,cs_order_number:int,cs_quantity:int,cs_ext_sal
 Input [5]: [cs_item_sk#70, cs_order_number#71, cs_quantity#72, cs_ext_sales_price#73, cs_sold_date_sk#74]
 Condition : isnotnull(cs_item_sk#70)
 
-(74) ColumnarToRow [codegen id : 25]
+(74) ColumnarToRow [codegen id : 28]
 Input [5]: [cs_item_sk#70, cs_order_number#71, cs_quantity#72, cs_ext_sales_price#73, cs_sold_date_sk#74]
 
 (75) ReusedExchange [Reuses operator id: 8]
 Output [5]: [i_item_sk#76, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80]
 
-(76) BroadcastHashJoin [codegen id : 25]
+(76) BroadcastHashJoin [codegen id : 28]
 Left keys [1]: [cs_item_sk#70]
 Right keys [1]: [i_item_sk#76]
 Join type: Inner
 Join condition: None
 
-(77) Project [codegen id : 25]
+(77) Project [codegen id : 28]
 Output [9]: [cs_item_sk#70, cs_order_number#71, cs_quantity#72, cs_ext_sales_price#73, cs_sold_date_sk#74, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80]
 Input [10]: [cs_item_sk#70, cs_order_number#71, cs_quantity#72, cs_ext_sales_price#73, cs_sold_date_sk#74, i_item_sk#76, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80]
 
-(78) ReusedExchange [Reuses operator id: 140]
+(78) ReusedExchange [Reuses operator id: 137]
 Output [2]: [d_date_sk#81, d_year#82]
 
-(79) BroadcastHashJoin [codegen id : 25]
+(79) BroadcastHashJoin [codegen id : 28]
 Left keys [1]: [cs_sold_date_sk#74]
 Right keys [1]: [d_date_sk#81]
 Join type: Inner
 Join condition: None
 
-(80) Project [codegen id : 25]
+(80) Project [codegen id : 28]
 Output [9]: [cs_item_sk#70, cs_order_number#71, cs_quantity#72, cs_ext_sales_price#73, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, d_year#82]
 Input [11]: [cs_item_sk#70, cs_order_number#71, cs_quantity#72, cs_ext_sales_price#73, cs_sold_date_sk#74, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, d_date_sk#81, d_year#82]
 
@@ -502,27 +499,24 @@ Input [11]: [cs_item_sk#70, cs_order_number#71, cs_quantity#72, cs_ext_sales_pri
 Input [9]: [cs_item_sk#70, cs_order_number#71, cs_quantity#72, cs_ext_sales_price#73, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, d_year#82]
 Arguments: hashpartitioning(cs_order_number#71, cs_item_sk#70, 5), ENSURE_REQUIREMENTS, [plan_id=11]
 
-(82) Sort [codegen id : 26]
+(82) Sort [codegen id : 29]
 Input [9]: [cs_item_sk#70, cs_order_number#71, cs_quantity#72, cs_ext_sales_price#73, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, d_year#82]
 Arguments: [cs_order_number#71 ASC NULLS FIRST, cs_item_sk#70 ASC NULLS FIRST], false, 0
 
-(83) ReusedExchange [Reuses operator id: 19]
+(83) ReusedExchange [Reuses operator id: 20]
 Output [4]: [cr_item_sk#83, cr_order_number#84, cr_return_quantity#85, cr_return_amount#86]
 
-(84) CometSort
+(84) Sort [codegen id : 31]
 Input [4]: [cr_item_sk#83, cr_order_number#84, cr_return_quantity#85, cr_return_amount#86]
-Arguments: [cr_item_sk#83, cr_order_number#84, cr_return_quantity#85, cr_return_amount#86], [cr_order_number#84 ASC NULLS FIRST, cr_item_sk#83 ASC NULLS FIRST]
+Arguments: [cr_order_number#84 ASC NULLS FIRST, cr_item_sk#83 ASC NULLS FIRST], false, 0
 
-(85) ColumnarToRow [codegen id : 27]
-Input [4]: [cr_item_sk#83, cr_order_number#84, cr_return_quantity#85, cr_return_amount#86]
-
-(86) SortMergeJoin [codegen id : 28]
+(85) SortMergeJoin [codegen id : 32]
 Left keys [2]: [cs_order_number#71, cs_item_sk#70]
 Right keys [2]: [cr_order_number#84, cr_item_sk#83]
 Join type: LeftOuter
 Join condition: None
 
-(87) Project [codegen id : 28]
+(86) Project [codegen id : 32]
 Output [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, (cs_quantity#72 - coalesce(cr_return_quantity#85, 0)) AS sales_cnt#20, (cs_ext_sales_price#73 - coalesce(cr_return_amount#86, 0.00)) AS sales_amt#21]
 Input [13]: [cs_item_sk#70, cs_order_number#71, cs_quantity#72, cs_ext_sales_price#73, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, d_year#82, cr_item_sk#83, cr_order_number#84, cr_return_quantity#85, cr_return_amount#86]
 
@@ -534,64 +528,61 @@ PartitionFilters: [isnotnull(ss_sold_date_sk#91), dynamicpruningexpression(ss_so
 PushedFilters: [IsNotNull(ss_item_sk)]
 ReadSchema: struct<ss_item_sk:int,ss_ticket_number:int,ss_quantity:int,ss_ext_sales_price:decimal(7,2)>
 
-(89) CometFilter
+(88) CometFilter
 Input [5]: [ss_item_sk#87, ss_ticket_number#88, ss_quantity#89, ss_ext_sales_price#90, ss_sold_date_sk#91]
 Condition : isnotnull(ss_item_sk#87)
 
-(90) ColumnarToRow [codegen id : 31]
+(89) ColumnarToRow [codegen id : 35]
 Input [5]: [ss_item_sk#87, ss_ticket_number#88, ss_quantity#89, ss_ext_sales_price#90, ss_sold_date_sk#91]
 
-(91) ReusedExchange [Reuses operator id: 8]
+(90) ReusedExchange [Reuses operator id: 8]
 Output [5]: [i_item_sk#93, i_brand_id#94, i_class_id#95, i_category_id#96, i_manufact_id#97]
 
-(92) BroadcastHashJoin [codegen id : 31]
+(91) BroadcastHashJoin [codegen id : 35]
 Left keys [1]: [ss_item_sk#87]
 Right keys [1]: [i_item_sk#93]
 Join type: Inner
 Join condition: None
 
-(93) Project [codegen id : 31]
+(92) Project [codegen id : 35]
 Output [9]: [ss_item_sk#87, ss_ticket_number#88, ss_quantity#89, ss_ext_sales_price#90, ss_sold_date_sk#91, i_brand_id#94, i_class_id#95, i_category_id#96, i_manufact_id#97]
 Input [10]: [ss_item_sk#87, ss_ticket_number#88, ss_quantity#89, ss_ext_sales_price#90, ss_sold_date_sk#91, i_item_sk#93, i_brand_id#94, i_class_id#95, i_category_id#96, i_manufact_id#97]
 
-(94) ReusedExchange [Reuses operator id: 140]
+(93) ReusedExchange [Reuses operator id: 137]
 Output [2]: [d_date_sk#98, d_year#99]
 
-(95) BroadcastHashJoin [codegen id : 31]
+(94) BroadcastHashJoin [codegen id : 35]
 Left keys [1]: [ss_sold_date_sk#91]
 Right keys [1]: [d_date_sk#98]
 Join type: Inner
 Join condition: None
 
-(96) Project [codegen id : 31]
+(95) Project [codegen id : 35]
 Output [9]: [ss_item_sk#87, ss_ticket_number#88, ss_quantity#89, ss_ext_sales_price#90, i_brand_id#94, i_class_id#95, i_category_id#96, i_manufact_id#97, d_year#99]
 Input [11]: [ss_item_sk#87, ss_ticket_number#88, ss_quantity#89, ss_ext_sales_price#90, ss_sold_date_sk#91, i_brand_id#94, i_class_id#95, i_category_id#96, i_manufact_id#97, d_date_sk#98, d_year#99]
 
-(97) Exchange
+(96) Exchange
 Input [9]: [ss_item_sk#87, ss_ticket_number#88, ss_quantity#89, ss_ext_sales_price#90, i_brand_id#94, i_class_id#95, i_category_id#96, i_manufact_id#97, d_year#99]
 Arguments: hashpartitioning(ss_ticket_number#88, ss_item_sk#87, 5), ENSURE_REQUIREMENTS, [plan_id=12]
 
-(98) Sort [codegen id : 32]
+(97) Sort [codegen id : 36]
 Input [9]: [ss_item_sk#87, ss_ticket_number#88, ss_quantity#89, ss_ext_sales_price#90, i_brand_id#94, i_class_id#95, i_category_id#96, i_manufact_id#97, d_year#99]
 Arguments: [ss_ticket_number#88 ASC NULLS FIRST, ss_item_sk#87 ASC NULLS FIRST], false, 0
 
-(99) ReusedExchange [Reuses operator id: 38]
+(98) ReusedExchange [Reuses operator id: 39]
 Output [4]: [sr_item_sk#100, sr_ticket_number#101, sr_return_quantity#102, sr_return_amt#103]
 
-(100) CometSort
+(99) Sort [codegen id : 38]
 Input [4]: [sr_item_sk#100, sr_ticket_number#101, sr_return_quantity#102, sr_return_amt#103]
-Arguments: [sr_item_sk#100, sr_ticket_number#101, sr_return_quantity#102, sr_return_amt#103], [sr_ticket_number#101 ASC NULLS FIRST, sr_item_sk#100 ASC NULLS FIRST]
+Arguments: [sr_ticket_number#101 ASC NULLS FIRST, sr_item_sk#100 ASC NULLS FIRST], false, 0
 
-(101) ColumnarToRow [codegen id : 33]
-Input [4]: [sr_item_sk#100, sr_ticket_number#101, sr_return_quantity#102, sr_return_amt#103]
-
-(102) SortMergeJoin [codegen id : 34]
+(100) SortMergeJoin [codegen id : 39]
 Left keys [2]: [ss_ticket_number#88, ss_item_sk#87]
 Right keys [2]: [sr_ticket_number#101, sr_item_sk#100]
 Join type: LeftOuter
 Join condition: None
 
-(103) Project [codegen id : 34]
+(101) Project [codegen id : 39]
 Output [7]: [d_year#99, i_brand_id#94, i_class_id#95, i_category_id#96, i_manufact_id#97, (ss_quantity#89 - coalesce(sr_return_quantity#102, 0)) AS sales_cnt#40, (ss_ext_sales_price#90 - coalesce(sr_return_amt#103, 0.00)) AS sales_amt#41]
 Input [13]: [ss_item_sk#87, ss_ticket_number#88, ss_quantity#89, ss_ext_sales_price#90, i_brand_id#94, i_class_id#95, i_category_id#96, i_manufact_id#97, d_year#99, sr_item_sk#100, sr_ticket_number#101, sr_return_quantity#102, sr_return_amt#103]
 
@@ -603,138 +594,135 @@ PartitionFilters: [isnotnull(ws_sold_date_sk#108), dynamicpruningexpression(ws_s
 PushedFilters: [IsNotNull(ws_item_sk)]
 ReadSchema: struct<ws_item_sk:int,ws_order_number:int,ws_quantity:int,ws_ext_sales_price:decimal(7,2)>
 
-(105) CometFilter
+(103) CometFilter
 Input [5]: [ws_item_sk#104, ws_order_number#105, ws_quantity#106, ws_ext_sales_price#107, ws_sold_date_sk#108]
 Condition : isnotnull(ws_item_sk#104)
 
-(106) ColumnarToRow [codegen id : 37]
+(104) ColumnarToRow [codegen id : 42]
 Input [5]: [ws_item_sk#104, ws_order_number#105, ws_quantity#106, ws_ext_sales_price#107, ws_sold_date_sk#108]
 
-(107) ReusedExchange [Reuses operator id: 8]
+(105) ReusedExchange [Reuses operator id: 8]
 Output [5]: [i_item_sk#110, i_brand_id#111, i_class_id#112, i_category_id#113, i_manufact_id#114]
 
-(108) BroadcastHashJoin [codegen id : 37]
+(106) BroadcastHashJoin [codegen id : 42]
 Left keys [1]: [ws_item_sk#104]
 Right keys [1]: [i_item_sk#110]
 Join type: Inner
 Join condition: None
 
-(109) Project [codegen id : 37]
+(107) Project [codegen id : 42]
 Output [9]: [ws_item_sk#104, ws_order_number#105, ws_quantity#106, ws_ext_sales_price#107, ws_sold_date_sk#108, i_brand_id#111, i_class_id#112, i_category_id#113, i_manufact_id#114]
 Input [10]: [ws_item_sk#104, ws_order_number#105, ws_quantity#106, ws_ext_sales_price#107, ws_sold_date_sk#108, i_item_sk#110, i_brand_id#111, i_class_id#112, i_category_id#113, i_manufact_id#114]
 
-(110) ReusedExchange [Reuses operator id: 140]
+(108) ReusedExchange [Reuses operator id: 137]
 Output [2]: [d_date_sk#115, d_year#116]
 
-(111) BroadcastHashJoin [codegen id : 37]
+(109) BroadcastHashJoin [codegen id : 42]
 Left keys [1]: [ws_sold_date_sk#108]
 Right keys [1]: [d_date_sk#115]
 Join type: Inner
 Join condition: None
 
-(112) Project [codegen id : 37]
+(110) Project [codegen id : 42]
 Output [9]: [ws_item_sk#104, ws_order_number#105, ws_quantity#106, ws_ext_sales_price#107, i_brand_id#111, i_class_id#112, i_category_id#113, i_manufact_id#114, d_year#116]
 Input [11]: [ws_item_sk#104, ws_order_number#105, ws_quantity#106, ws_ext_sales_price#107, ws_sold_date_sk#108, i_brand_id#111, i_class_id#112, i_category_id#113, i_manufact_id#114, d_date_sk#115, d_year#116]
 
-(113) Exchange
+(111) Exchange
 Input [9]: [ws_item_sk#104, ws_order_number#105, ws_quantity#106, ws_ext_sales_price#107, i_brand_id#111, i_class_id#112, i_category_id#113, i_manufact_id#114, d_year#116]
 Arguments: hashpartitioning(ws_order_number#105, ws_item_sk#104, 5), ENSURE_REQUIREMENTS, [plan_id=13]
 
-(114) Sort [codegen id : 38]
+(112) Sort [codegen id : 43]
 Input [9]: [ws_item_sk#104, ws_order_number#105, ws_quantity#106, ws_ext_sales_price#107, i_brand_id#111, i_class_id#112, i_category_id#113, i_manufact_id#114, d_year#116]
 Arguments: [ws_order_number#105 ASC NULLS FIRST, ws_item_sk#104 ASC NULLS FIRST], false, 0
 
-(115) ReusedExchange [Reuses operator id: 57]
+(113) ReusedExchange [Reuses operator id: 58]
 Output [4]: [wr_item_sk#117, wr_order_number#118, wr_return_quantity#119, wr_return_amt#120]
 
-(116) CometSort
-Input [4]: [wr_item_sk#117, wr_order_number#118, wr_return_quantity#119, wr_return_amt#120]
-Arguments: [wr_item_sk#117, wr_order_number#118, wr_return_quantity#119, wr_return_amt#120], [wr_order_number#118 ASC NULLS FIRST, wr_item_sk#117 ASC NULLS FIRST]
-
-(117) ColumnarToRow [codegen id : 39]
+(114) Sort [codegen id : 45]
 Input [4]: [wr_item_sk#117, wr_order_number#118, wr_return_quantity#119, wr_return_amt#120]
+Arguments: [wr_order_number#118 ASC NULLS FIRST, wr_item_sk#117 ASC NULLS FIRST], false, 0
 
-(118) SortMergeJoin [codegen id : 40]
+(115) SortMergeJoin [codegen id : 46]
 Left keys [2]: [ws_order_number#105, ws_item_sk#104]
 Right keys [2]: [wr_order_number#118, wr_item_sk#117]
 Join type: LeftOuter
 Join condition: None
 
-(119) Project [codegen id : 40]
+(116) Project [codegen id : 46]
 Output [7]: [d_year#116, i_brand_id#111, i_class_id#112, i_category_id#113, i_manufact_id#114, (ws_quantity#106 - coalesce(wr_return_quantity#119, 0)) AS sales_cnt#60, (ws_ext_sales_price#107 - coalesce(wr_return_amt#120, 0.00)) AS sales_amt#61]
 Input [13]: [ws_item_sk#104, ws_order_number#105, ws_quantity#106, ws_ext_sales_price#107, i_brand_id#111, i_class_id#112, i_category_id#113, i_manufact_id#114, d_year#116, wr_item_sk#117, wr_order_number#118, wr_return_quantity#119, wr_return_amt#120]
 
-(120) Union
+(117) Union
 
-(121) HashAggregate [codegen id : 41]
+(118) HashAggregate [codegen id : 47]
 Input [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#20, sales_amt#21]
 Keys [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#20, sales_amt#21]
 Functions: []
 Aggregate Attributes: []
 Results [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#20, sales_amt#21]
 
-(122) Exchange
+(119) Exchange
 Input [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#20, sales_amt#21]
 Arguments: hashpartitioning(d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#20, sales_amt#21, 5), ENSURE_REQUIREMENTS, [plan_id=14]
 
-(123) HashAggregate [codegen id : 42]
+(120) HashAggregate [codegen id : 48]
 Input [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#20, sales_amt#21]
 Keys [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#20, sales_amt#21]
 Functions: []
 Aggregate Attributes: []
 Results [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#20, sales_amt#21]
 
-(124) HashAggregate [codegen id : 42]
+(121) HashAggregate [codegen id : 48]
 Input [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#20, sales_amt#21]
 Keys [5]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80]
 Functions [2]: [partial_sum(sales_cnt#20), partial_sum(UnscaledValue(sales_amt#21))]
 Aggregate Attributes [2]: [sum#62, sum#121]
 Results [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sum#64, sum#122]
 
-(125) Exchange
+(122) Exchange
 Input [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sum#64, sum#122]
 Arguments: hashpartitioning(d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, 5), ENSURE_REQUIREMENTS, [plan_id=15]
 
-(126) HashAggregate [codegen id : 43]
+(123) HashAggregate [codegen id : 49]
 Input [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sum#64, sum#122]
 Keys [5]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80]
 Functions [2]: [sum(sales_cnt#20), sum(UnscaledValue(sales_amt#21))]
 Aggregate Attributes [2]: [sum(sales_cnt#20)#66, sum(UnscaledValue(sales_amt#21))#67]
 Results [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sum(sales_cnt#20)#66 AS sales_cnt#123, MakeDecimal(sum(UnscaledValue(sales_amt#21))#67,18,2) AS sales_amt#124]
 
-(127) Filter [codegen id : 43]
+(124) Filter [codegen id : 49]
 Input [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#123, sales_amt#124]
 Condition : isnotnull(sales_cnt#123)
 
-(128) Exchange
+(125) Exchange
 Input [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#123, sales_amt#124]
 Arguments: hashpartitioning(i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, 5), ENSURE_REQUIREMENTS, [plan_id=16]
 
-(129) Sort [codegen id : 44]
+(126) Sort [codegen id : 50]
 Input [7]: [d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#123, sales_amt#124]
 Arguments: [i_brand_id#77 ASC NULLS FIRST, i_class_id#78 ASC NULLS FIRST, i_category_id#79 ASC NULLS FIRST, i_manufact_id#80 ASC NULLS FIRST], false, 0
 
-(130) SortMergeJoin [codegen id : 45]
+(127) SortMergeJoin [codegen id : 51]
 Left keys [4]: [i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]
 Right keys [4]: [i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80]
 Join type: Inner
 Join condition: ((cast(sales_cnt#68 as decimal(17,2)) / cast(sales_cnt#123 as decimal(17,2))) < 0.90000000000000000000)
 
-(131) Project [codegen id : 45]
+(128) Project [codegen id : 51]
 Output [10]: [d_year#82 AS prev_year#125, d_year#14 AS year#126, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#123 AS prev_yr_cnt#127, sales_cnt#68 AS curr_yr_cnt#128, (sales_cnt#68 - sales_cnt#123) AS sales_cnt_diff#129, (sales_amt#69 - sales_amt#124) AS sales_amt_diff#130]
 Input [14]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#68, sales_amt#69, d_year#82, i_brand_id#77, i_class_id#78, i_category_id#79, i_manufact_id#80, sales_cnt#123, sales_amt#124]
 
-(132) TakeOrderedAndProject
+(129) TakeOrderedAndProject
 Input [10]: [prev_year#125, year#126, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, prev_yr_cnt#127, curr_yr_cnt#128, sales_cnt_diff#129, sales_amt_diff#130]
 Arguments: 100, [sales_cnt_diff#129 ASC NULLS FIRST], [prev_year#125, year#126, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, prev_yr_cnt#127, curr_yr_cnt#128, sales_cnt_diff#129, sales_amt_diff#130]
 
 ===== Subqueries =====
 
 Subquery:1 Hosting operator id = 1 Hosting Expression = cs_sold_date_sk#5 IN dynamicpruning#6
-BroadcastExchange (136)
-+- * ColumnarToRow (135)
-   +- CometFilter (134)
-      +- CometScan parquet spark_catalog.default.date_dim (133)
+BroadcastExchange (133)
++- * ColumnarToRow (132)
+   +- CometFilter (131)
+      +- CometScan parquet spark_catalog.default.date_dim (130)
 
 
 (unknown) Scan parquet spark_catalog.default.date_dim
@@ -744,14 +732,14 @@ Location [not included in comparison]/{warehouse_dir}/date_dim]
 PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2002), IsNotNull(d_date_sk)]
 ReadSchema: struct<d_date_sk:int,d_year:int>
 
-(134) CometFilter
+(131) CometFilter
 Input [2]: [d_date_sk#13, d_year#14]
 Condition : ((isnotnull(d_year#14) AND (d_year#14 = 2002)) AND isnotnull(d_date_sk#13))
 
-(135) ColumnarToRow [codegen id : 1]
+(132) ColumnarToRow [codegen id : 1]
 Input [2]: [d_date_sk#13, d_year#14]
 
-(136) BroadcastExchange
+(133) BroadcastExchange
 Input [2]: [d_date_sk#13, d_year#14]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=17]
 
@@ -760,10 +748,10 @@ Subquery:2 Hosting operator id = 24 Hosting Expression = ss_sold_date_sk#26 IN d
 Subquery:3 Hosting operator id = 43 Hosting Expression = ws_sold_date_sk#46 IN dynamicpruning#6
 
 Subquery:4 Hosting operator id = 72 Hosting Expression = cs_sold_date_sk#74 IN dynamicpruning#75
-BroadcastExchange (140)
-+- * ColumnarToRow (139)
-   +- CometFilter (138)
-      +- CometScan parquet spark_catalog.default.date_dim (137)
+BroadcastExchange (137)
++- * ColumnarToRow (136)
+   +- CometFilter (135)
+      +- CometScan parquet spark_catalog.default.date_dim (134)
 
 
 (unknown) Scan parquet spark_catalog.default.date_dim
@@ -773,19 +761,19 @@ Location [not included in comparison]/{warehouse_dir}/date_dim]
 PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2001), IsNotNull(d_date_sk)]
 ReadSchema: struct<d_date_sk:int,d_year:int>
 
-(138) CometFilter
+(135) CometFilter
 Input [2]: [d_date_sk#81, d_year#82]
 Condition : ((isnotnull(d_year#82) AND (d_year#82 = 2001)) AND isnotnull(d_date_sk#81))
 
-(139) ColumnarToRow [codegen id : 1]
+(136) ColumnarToRow [codegen id : 1]
 Input [2]: [d_date_sk#81, d_year#82]
 
-(140) BroadcastExchange
+(137) BroadcastExchange
 Input [2]: [d_date_sk#81, d_year#82]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=18]
 
-Subquery:5 Hosting operator id = 88 Hosting Expression = ss_sold_date_sk#91 IN dynamicpruning#75
+Subquery:5 Hosting operator id = 87 Hosting Expression = ss_sold_date_sk#91 IN dynamicpruning#75
 
-Subquery:6 Hosting operator id = 104 Hosting Expression = ws_sold_date_sk#108 IN dynamicpruning#75
+Subquery:6 Hosting operator id = 102 Hosting Expression = ws_sold_date_sk#108 IN dynamicpruning#75
 
 
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q75/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q75/simplified.txt
index 837398c8..44bcabcd 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q75/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q75/simplified.txt
@@ -1,27 +1,27 @@
 TakeOrderedAndProject [sales_cnt_diff,prev_year,year,i_brand_id,i_class_id,i_category_id,i_manufact_id,prev_yr_cnt,curr_yr_cnt,sales_amt_diff]
-  WholeStageCodegen (45)
+  WholeStageCodegen (51)
     Project [d_year,d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,sales_cnt,sales_cnt,sales_amt,sales_amt]
       SortMergeJoin [i_brand_id,i_class_id,i_category_id,i_manufact_id,i_brand_id,i_class_id,i_category_id,i_manufact_id,sales_cnt,sales_cnt]
         InputAdapter
-          WholeStageCodegen (22)
+          WholeStageCodegen (25)
             Sort [i_brand_id,i_class_id,i_category_id,i_manufact_id]
               InputAdapter
                 Exchange [i_brand_id,i_class_id,i_category_id,i_manufact_id] #1
-                  WholeStageCodegen (21)
+                  WholeStageCodegen (24)
                     Filter [sales_cnt]
                       HashAggregate [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,sum,sum] [sum(sales_cnt),sum(UnscaledValue(sales_amt)),sales_cnt,sales_amt,sum,sum]
                         InputAdapter
                           Exchange [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id] #2
-                            WholeStageCodegen (20)
+                            WholeStageCodegen (23)
                               HashAggregate [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,sales_cnt,sales_amt] [sum,sum,sum,sum]
                                 HashAggregate [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,sales_cnt,sales_amt]
                                   InputAdapter
                                     Exchange [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,sales_cnt,sales_amt] #3
-                                      WholeStageCodegen (19)
+                                      WholeStageCodegen (22)
                                         HashAggregate [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,sales_cnt,sales_amt]
                                           InputAdapter
                                             Union
-                                              WholeStageCodegen (6)
+                                              WholeStageCodegen (7)
                                                 Project [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,cs_quantity,cr_return_quantity,cs_ext_sales_price,cr_return_amount]
                                                   SortMergeJoin [cs_order_number,cs_item_sk,cr_order_number,cr_item_sk]
                                                     InputAdapter
@@ -56,23 +56,25 @@ TakeOrderedAndProject [sales_cnt_diff,prev_year,year,i_brand_id,i_class_id,i_cat
                                                                     InputAdapter
                                                                       ReusedExchange [d_date_sk,d_year] #5
                                                     InputAdapter
-                                                      WholeStageCodegen (5)
-                                                        ColumnarToRow
+                                                      WholeStageCodegen (6)
+                                                        Sort [cr_order_number,cr_item_sk]
                                                           InputAdapter
-                                                            CometSort [cr_order_number,cr_item_sk]
-                                                              CometExchange [cr_order_number,cr_item_sk] #7
-                                                                CometProject [cr_item_sk,cr_order_number,cr_return_quantity,cr_return_amount]
-                                                                  CometFilter [cr_order_number,cr_item_sk]
-                                                                    CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_return_quantity,cr_return_amount,cr_returned_date_sk]
-                                              WholeStageCodegen (12)
+                                                            Exchange [cr_order_number,cr_item_sk] #7
+                                                              WholeStageCodegen (5)
+                                                                ColumnarToRow
+                                                                  InputAdapter
+                                                                    CometProject [cr_item_sk,cr_order_number,cr_return_quantity,cr_return_amount]
+                                                                      CometFilter [cr_order_number,cr_item_sk]
+                                                                        CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_return_quantity,cr_return_amount,cr_returned_date_sk]
+                                              WholeStageCodegen (14)
                                                 Project [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,ss_quantity,sr_return_quantity,ss_ext_sales_price,sr_return_amt]
                                                   SortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
                                                     InputAdapter
-                                                      WholeStageCodegen (10)
+                                                      WholeStageCodegen (11)
                                                         Sort [ss_ticket_number,ss_item_sk]
                                                           InputAdapter
                                                             Exchange [ss_ticket_number,ss_item_sk] #8
-                                                              WholeStageCodegen (9)
+                                                              WholeStageCodegen (10)
                                                                 Project [ss_item_sk,ss_ticket_number,ss_quantity,ss_ext_sales_price,i_brand_id,i_class_id,i_category_id,i_manufact_id,d_year]
                                                                   BroadcastHashJoin [ss_sold_date_sk,d_date_sk]
                                                                     Project [ss_item_sk,ss_ticket_number,ss_quantity,ss_ext_sales_price,ss_sold_date_sk,i_brand_id,i_class_id,i_category_id,i_manufact_id]
@@ -87,23 +89,25 @@ TakeOrderedAndProject [sales_cnt_diff,prev_year,year,i_brand_id,i_class_id,i_cat
                                                                     InputAdapter
                                                                       ReusedExchange [d_date_sk,d_year] #5
                                                     InputAdapter
-                                                      WholeStageCodegen (11)
-                                                        ColumnarToRow
+                                                      WholeStageCodegen (13)
+                                                        Sort [sr_ticket_number,sr_item_sk]
                                                           InputAdapter
-                                                            CometSort [sr_ticket_number,sr_item_sk]
-                                                              CometExchange [sr_ticket_number,sr_item_sk] #9
-                                                                CometProject [sr_item_sk,sr_ticket_number,sr_return_quantity,sr_return_amt]
-                                                                  CometFilter [sr_ticket_number,sr_item_sk]
-                                                                    CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_return_quantity,sr_return_amt,sr_returned_date_sk]
-                                              WholeStageCodegen (18)
+                                                            Exchange [sr_ticket_number,sr_item_sk] #9
+                                                              WholeStageCodegen (12)
+                                                                ColumnarToRow
+                                                                  InputAdapter
+                                                                    CometProject [sr_item_sk,sr_ticket_number,sr_return_quantity,sr_return_amt]
+                                                                      CometFilter [sr_ticket_number,sr_item_sk]
+                                                                        CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_return_quantity,sr_return_amt,sr_returned_date_sk]
+                                              WholeStageCodegen (21)
                                                 Project [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,ws_quantity,wr_return_quantity,ws_ext_sales_price,wr_return_amt]
                                                   SortMergeJoin [ws_order_number,ws_item_sk,wr_order_number,wr_item_sk]
                                                     InputAdapter
-                                                      WholeStageCodegen (16)
+                                                      WholeStageCodegen (18)
                                                         Sort [ws_order_number,ws_item_sk]
                                                           InputAdapter
                                                             Exchange [ws_order_number,ws_item_sk] #10
-                                                              WholeStageCodegen (15)
+                                                              WholeStageCodegen (17)
                                                                 Project [ws_item_sk,ws_order_number,ws_quantity,ws_ext_sales_price,i_brand_id,i_class_id,i_category_id,i_manufact_id,d_year]
                                                                   BroadcastHashJoin [ws_sold_date_sk,d_date_sk]
                                                                     Project [ws_item_sk,ws_order_number,ws_quantity,ws_ext_sales_price,ws_sold_date_sk,i_brand_id,i_class_id,i_category_id,i_manufact_id]
@@ -118,42 +122,44 @@ TakeOrderedAndProject [sales_cnt_diff,prev_year,year,i_brand_id,i_class_id,i_cat
                                                                     InputAdapter
                                                                       ReusedExchange [d_date_sk,d_year] #5
                                                     InputAdapter
-                                                      WholeStageCodegen (17)
-                                                        ColumnarToRow
+                                                      WholeStageCodegen (20)
+                                                        Sort [wr_order_number,wr_item_sk]
                                                           InputAdapter
-                                                            CometSort [wr_order_number,wr_item_sk]
-                                                              CometExchange [wr_order_number,wr_item_sk] #11
-                                                                CometProject [wr_item_sk,wr_order_number,wr_return_quantity,wr_return_amt]
-                                                                  CometFilter [wr_order_number,wr_item_sk]
-                                                                    CometScan parquet spark_catalog.default.web_returns [wr_item_sk,wr_order_number,wr_return_quantity,wr_return_amt,wr_returned_date_sk]
+                                                            Exchange [wr_order_number,wr_item_sk] #11
+                                                              WholeStageCodegen (19)
+                                                                ColumnarToRow
+                                                                  InputAdapter
+                                                                    CometProject [wr_item_sk,wr_order_number,wr_return_quantity,wr_return_amt]
+                                                                      CometFilter [wr_order_number,wr_item_sk]
+                                                                        CometScan parquet spark_catalog.default.web_returns [wr_item_sk,wr_order_number,wr_return_quantity,wr_return_amt,wr_returned_date_sk]
         InputAdapter
-          WholeStageCodegen (44)
+          WholeStageCodegen (50)
             Sort [i_brand_id,i_class_id,i_category_id,i_manufact_id]
               InputAdapter
                 Exchange [i_brand_id,i_class_id,i_category_id,i_manufact_id] #12
-                  WholeStageCodegen (43)
+                  WholeStageCodegen (49)
                     Filter [sales_cnt]
                       HashAggregate [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,sum,sum] [sum(sales_cnt),sum(UnscaledValue(sales_amt)),sales_cnt,sales_amt,sum,sum]
                         InputAdapter
                           Exchange [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id] #13
-                            WholeStageCodegen (42)
+                            WholeStageCodegen (48)
                               HashAggregate [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,sales_cnt,sales_amt] [sum,sum,sum,sum]
                                 HashAggregate [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,sales_cnt,sales_amt]
                                   InputAdapter
                                     Exchange [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,sales_cnt,sales_amt] #14
-                                      WholeStageCodegen (41)
+                                      WholeStageCodegen (47)
                                         HashAggregate [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,sales_cnt,sales_amt]
                                           InputAdapter
                                             Union
-                                              WholeStageCodegen (28)
+                                              WholeStageCodegen (32)
                                                 Project [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,cs_quantity,cr_return_quantity,cs_ext_sales_price,cr_return_amount]
                                                   SortMergeJoin [cs_order_number,cs_item_sk,cr_order_number,cr_item_sk]
                                                     InputAdapter
-                                                      WholeStageCodegen (26)
+                                                      WholeStageCodegen (29)
                                                         Sort [cs_order_number,cs_item_sk]
                                                           InputAdapter
                                                             Exchange [cs_order_number,cs_item_sk] #15
-                                                              WholeStageCodegen (25)
+                                                              WholeStageCodegen (28)
                                                                 Project [cs_item_sk,cs_order_number,cs_quantity,cs_ext_sales_price,i_brand_id,i_class_id,i_category_id,i_manufact_id,d_year]
                                                                   BroadcastHashJoin [cs_sold_date_sk,d_date_sk]
                                                                     Project [cs_item_sk,cs_order_number,cs_quantity,cs_ext_sales_price,cs_sold_date_sk,i_brand_id,i_class_id,i_category_id,i_manufact_id]
@@ -174,20 +180,19 @@ TakeOrderedAndProject [sales_cnt_diff,prev_year,year,i_brand_id,i_class_id,i_cat
                                                                     InputAdapter
                                                                       ReusedExchange [d_date_sk,d_year] #16
                                                     InputAdapter
-                                                      WholeStageCodegen (27)
-                                                        ColumnarToRow
+                                                      WholeStageCodegen (31)
+                                                        Sort [cr_order_number,cr_item_sk]
                                                           InputAdapter
-                                                            CometSort [cr_order_number,cr_item_sk]
-                                                              ReusedExchange [cr_item_sk,cr_order_number,cr_return_quantity,cr_return_amount] #7
-                                              WholeStageCodegen (34)
+                                                            ReusedExchange [cr_item_sk,cr_order_number,cr_return_quantity,cr_return_amount] #7
+                                              WholeStageCodegen (39)
                                                 Project [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,ss_quantity,sr_return_quantity,ss_ext_sales_price,sr_return_amt]
                                                   SortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
                                                     InputAdapter
-                                                      WholeStageCodegen (32)
+                                                      WholeStageCodegen (36)
                                                         Sort [ss_ticket_number,ss_item_sk]
                                                           InputAdapter
                                                             Exchange [ss_ticket_number,ss_item_sk] #17
-                                                              WholeStageCodegen (31)
+                                                              WholeStageCodegen (35)
                                                                 Project [ss_item_sk,ss_ticket_number,ss_quantity,ss_ext_sales_price,i_brand_id,i_class_id,i_category_id,i_manufact_id,d_year]
                                                                   BroadcastHashJoin [ss_sold_date_sk,d_date_sk]
                                                                     Project [ss_item_sk,ss_ticket_number,ss_quantity,ss_ext_sales_price,ss_sold_date_sk,i_brand_id,i_class_id,i_category_id,i_manufact_id]
@@ -202,20 +207,19 @@ TakeOrderedAndProject [sales_cnt_diff,prev_year,year,i_brand_id,i_class_id,i_cat
                                                                     InputAdapter
                                                                       ReusedExchange [d_date_sk,d_year] #16
                                                     InputAdapter
-                                                      WholeStageCodegen (33)
-                                                        ColumnarToRow
+                                                      WholeStageCodegen (38)
+                                                        Sort [sr_ticket_number,sr_item_sk]
                                                           InputAdapter
-                                                            CometSort [sr_ticket_number,sr_item_sk]
-                                                              ReusedExchange [sr_item_sk,sr_ticket_number,sr_return_quantity,sr_return_amt] #9
-                                              WholeStageCodegen (40)
+                                                            ReusedExchange [sr_item_sk,sr_ticket_number,sr_return_quantity,sr_return_amt] #9
+                                              WholeStageCodegen (46)
                                                 Project [d_year,i_brand_id,i_class_id,i_category_id,i_manufact_id,ws_quantity,wr_return_quantity,ws_ext_sales_price,wr_return_amt]
                                                   SortMergeJoin [ws_order_number,ws_item_sk,wr_order_number,wr_item_sk]
                                                     InputAdapter
-                                                      WholeStageCodegen (38)
+                                                      WholeStageCodegen (43)
                                                         Sort [ws_order_number,ws_item_sk]
                                                           InputAdapter
                                                             Exchange [ws_order_number,ws_item_sk] #18
-                                                              WholeStageCodegen (37)
+                                                              WholeStageCodegen (42)
                                                                 Project [ws_item_sk,ws_order_number,ws_quantity,ws_ext_sales_price,i_brand_id,i_class_id,i_category_id,i_manufact_id,d_year]
                                                                   BroadcastHashJoin [ws_sold_date_sk,d_date_sk]
                                                                     Project [ws_item_sk,ws_order_number,ws_quantity,ws_ext_sales_price,ws_sold_date_sk,i_brand_id,i_class_id,i_category_id,i_manufact_id]
@@ -230,8 +234,7 @@ TakeOrderedAndProject [sales_cnt_diff,prev_year,year,i_brand_id,i_class_id,i_cat
                                                                     InputAdapter
                                                                       ReusedExchange [d_date_sk,d_year] #16
                                                     InputAdapter
-                                                      WholeStageCodegen (39)
-                                                        ColumnarToRow
+                                                      WholeStageCodegen (45)
+                                                        Sort [wr_order_number,wr_item_sk]
                                                           InputAdapter
-                                                            CometSort [wr_order_number,wr_item_sk]
-                                                              ReusedExchange [wr_item_sk,wr_order_number,wr_return_quantity,wr_return_amt] #11
+                                                            ReusedExchange [wr_item_sk,wr_order_number,wr_return_quantity,wr_return_amt] #11
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q78/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q78/explain.txt
index caab9216..d9e4b80d 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q78/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q78/explain.txt
@@ -1,71 +1,74 @@
 == Physical Plan ==
-TakeOrderedAndProject (67)
-+- * Project (66)
-   +- * SortMergeJoin Inner (65)
-      :- * Project (43)
-      :  +- * SortMergeJoin Inner (42)
-      :     :- * Sort (20)
-      :     :  +- * HashAggregate (19)
-      :     :     +- Exchange (18)
-      :     :        +- * HashAggregate (17)
-      :     :           +- * Project (16)
-      :     :              +- * BroadcastHashJoin Inner BuildRight (15)
-      :     :                 :- * ColumnarToRow (13)
-      :     :                 :  +- CometProject (12)
-      :     :                 :     +- CometFilter (11)
-      :     :                 :        +- CometSortMergeJoin (10)
-      :     :                 :           :- CometSort (4)
-      :     :                 :           :  +- CometExchange (3)
-      :     :                 :           :     +- CometFilter (2)
-      :     :                 :           :        +- CometScan parquet spark_catalog.default.store_sales (1)
-      :     :                 :           +- CometSort (9)
-      :     :                 :              +- CometExchange (8)
-      :     :                 :                 +- CometProject (7)
-      :     :                 :                    +- CometFilter (6)
-      :     :                 :                       +- CometScan parquet spark_catalog.default.store_returns (5)
-      :     :                 +- ReusedExchange (14)
-      :     +- * Sort (41)
-      :        +- * Filter (40)
-      :           +- * HashAggregate (39)
-      :              +- Exchange (38)
-      :                 +- * HashAggregate (37)
-      :                    +- * Project (36)
-      :                       +- * BroadcastHashJoin Inner BuildRight (35)
-      :                          :- * ColumnarToRow (33)
-      :                          :  +- CometProject (32)
-      :                          :     +- CometFilter (31)
-      :                          :        +- CometSortMergeJoin (30)
-      :                          :           :- CometSort (24)
-      :                          :           :  +- CometExchange (23)
-      :                          :           :     +- CometFilter (22)
-      :                          :           :        +- CometScan parquet spark_catalog.default.web_sales (21)
-      :                          :           +- CometSort (29)
-      :                          :              +- CometExchange (28)
-      :                          :                 +- CometProject (27)
-      :                          :                    +- CometFilter (26)
-      :                          :                       +- CometScan parquet spark_catalog.default.web_returns (25)
-      :                          +- ReusedExchange (34)
-      +- * Sort (64)
-         +- * Filter (63)
-            +- * HashAggregate (62)
-               +- Exchange (61)
-                  +- * HashAggregate (60)
-                     +- * Project (59)
-                        +- * BroadcastHashJoin Inner BuildRight (58)
-                           :- * ColumnarToRow (56)
-                           :  +- CometProject (55)
-                           :     +- CometFilter (54)
-                           :        +- CometSortMergeJoin (53)
-                           :           :- CometSort (47)
-                           :           :  +- CometExchange (46)
-                           :           :     +- CometFilter (45)
-                           :           :        +- CometScan parquet spark_catalog.default.catalog_sales (44)
-                           :           +- CometSort (52)
-                           :              +- CometExchange (51)
-                           :                 +- CometProject (50)
-                           :                    +- CometFilter (49)
-                           :                       +- CometScan parquet spark_catalog.default.catalog_returns (48)
-                           +- ReusedExchange (57)
+TakeOrderedAndProject (70)
++- * Project (69)
+   +- * SortMergeJoin Inner (68)
+      :- * Project (45)
+      :  +- * SortMergeJoin Inner (44)
+      :     :- * Sort (21)
+      :     :  +- * HashAggregate (20)
+      :     :     +- Exchange (19)
+      :     :        +- * HashAggregate (18)
+      :     :           +- * Project (17)
+      :     :              +- * BroadcastHashJoin Inner BuildRight (16)
+      :     :                 :- * Project (14)
+      :     :                 :  +- * Filter (13)
+      :     :                 :     +- * SortMergeJoin LeftOuter (12)
+      :     :                 :        :- * Sort (5)
+      :     :                 :        :  +- Exchange (4)
+      :     :                 :        :     +- * ColumnarToRow (3)
+      :     :                 :        :        +- CometFilter (2)
+      :     :                 :        :           +- CometScan parquet spark_catalog.default.store_sales (1)
+      :     :                 :        +- * Sort (11)
+      :     :                 :           +- Exchange (10)
+      :     :                 :              +- * ColumnarToRow (9)
+      :     :                 :                 +- CometProject (8)
+      :     :                 :                    +- CometFilter (7)
+      :     :                 :                       +- CometScan parquet spark_catalog.default.store_returns (6)
+      :     :                 +- ReusedExchange (15)
+      :     +- * Sort (43)
+      :        +- * Filter (42)
+      :           +- * HashAggregate (41)
+      :              +- Exchange (40)
+      :                 +- * HashAggregate (39)
+      :                    +- * Project (38)
+      :                       +- * BroadcastHashJoin Inner BuildRight (37)
+      :                          :- * Project (35)
+      :                          :  +- * Filter (34)
+      :                          :     +- * SortMergeJoin LeftOuter (33)
+      :                          :        :- * Sort (26)
+      :                          :        :  +- Exchange (25)
+      :                          :        :     +- * ColumnarToRow (24)
+      :                          :        :        +- CometFilter (23)
+      :                          :        :           +- CometScan parquet spark_catalog.default.web_sales (22)
+      :                          :        +- * Sort (32)
+      :                          :           +- Exchange (31)
+      :                          :              +- * ColumnarToRow (30)
+      :                          :                 +- CometProject (29)
+      :                          :                    +- CometFilter (28)
+      :                          :                       +- CometScan parquet spark_catalog.default.web_returns (27)
+      :                          +- ReusedExchange (36)
+      +- * Sort (67)
+         +- * Filter (66)
+            +- * HashAggregate (65)
+               +- Exchange (64)
+                  +- * HashAggregate (63)
+                     +- * Project (62)
+                        +- * BroadcastHashJoin Inner BuildRight (61)
+                           :- * Project (59)
+                           :  +- * Filter (58)
+                           :     +- * SortMergeJoin LeftOuter (57)
+                           :        :- * Sort (50)
+                           :        :  +- Exchange (49)
+                           :        :     +- * ColumnarToRow (48)
+                           :        :        +- CometFilter (47)
+                           :        :           +- CometScan parquet spark_catalog.default.catalog_sales (46)
+                           :        +- * Sort (56)
+                           :           +- Exchange (55)
+                           :              +- * ColumnarToRow (54)
+                           :                 +- CometProject (53)
+                           :                    +- CometFilter (52)
+                           :                       +- CometScan parquet spark_catalog.default.catalog_returns (51)
+                           +- ReusedExchange (60)
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
@@ -80,13 +83,16 @@ ReadSchema: struct<ss_item_sk:int,ss_customer_sk:int,ss_ticket_number:int,ss_qua
 Input [7]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7]
 Condition : (isnotnull(ss_item_sk#1) AND isnotnull(ss_customer_sk#2))
 
-(3) CometExchange
+(3) ColumnarToRow [codegen id : 1]
 Input [7]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7]
-Arguments: hashpartitioning(ss_ticket_number#3, ss_item_sk#1, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(4) CometSort
+(4) Exchange
 Input [7]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7], [ss_ticket_number#3 ASC NULLS FIRST, ss_item_sk#1 ASC NULLS FIRST]
+Arguments: hashpartitioning(ss_ticket_number#3, ss_item_sk#1, 5), ENSURE_REQUIREMENTS, [plan_id=1]
+
+(5) Sort [codegen id : 2]
+Input [7]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7]
+Arguments: [ss_ticket_number#3 ASC NULLS FIRST, ss_item_sk#1 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.store_returns
 Output [3]: [sr_item_sk#9, sr_ticket_number#10, sr_returned_date_sk#11]
@@ -95,70 +101,71 @@ Location [not included in comparison]/{warehouse_dir}/store_returns]
 PushedFilters: [IsNotNull(sr_ticket_number), IsNotNull(sr_item_sk)]
 ReadSchema: struct<sr_item_sk:int,sr_ticket_number:int>
 
-(6) CometFilter
+(7) CometFilter
 Input [3]: [sr_item_sk#9, sr_ticket_number#10, sr_returned_date_sk#11]
 Condition : (isnotnull(sr_ticket_number#10) AND isnotnull(sr_item_sk#9))
 
-(7) CometProject
+(8) CometProject
 Input [3]: [sr_item_sk#9, sr_ticket_number#10, sr_returned_date_sk#11]
 Arguments: [sr_item_sk#9, sr_ticket_number#10], [sr_item_sk#9, sr_ticket_number#10]
 
-(8) CometExchange
+(9) ColumnarToRow [codegen id : 3]
 Input [2]: [sr_item_sk#9, sr_ticket_number#10]
-Arguments: hashpartitioning(sr_ticket_number#10, sr_item_sk#9, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]
 
-(9) CometSort
+(10) Exchange
 Input [2]: [sr_item_sk#9, sr_ticket_number#10]
-Arguments: [sr_item_sk#9, sr_ticket_number#10], [sr_ticket_number#10 ASC NULLS FIRST, sr_item_sk#9 ASC NULLS FIRST]
+Arguments: hashpartitioning(sr_ticket_number#10, sr_item_sk#9, 5), ENSURE_REQUIREMENTS, [plan_id=2]
 
-(10) CometSortMergeJoin
-Left output [7]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7]
-Right output [2]: [sr_item_sk#9, sr_ticket_number#10]
-Arguments: [ss_ticket_number#3, ss_item_sk#1], [sr_ticket_number#10, sr_item_sk#9], LeftOuter
+(11) Sort [codegen id : 4]
+Input [2]: [sr_item_sk#9, sr_ticket_number#10]
+Arguments: [sr_ticket_number#10 ASC NULLS FIRST, sr_item_sk#9 ASC NULLS FIRST], false, 0
+
+(12) SortMergeJoin [codegen id : 6]
+Left keys [2]: [ss_ticket_number#3, ss_item_sk#1]
+Right keys [2]: [sr_ticket_number#10, sr_item_sk#9]
+Join type: LeftOuter
+Join condition: None
 
-(11) CometFilter
+(13) Filter [codegen id : 6]
 Input [9]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7, sr_item_sk#9, sr_ticket_number#10]
 Condition : isnull(sr_ticket_number#10)
 
-(12) CometProject
+(14) Project [codegen id : 6]
+Output [6]: [ss_item_sk#1, ss_customer_sk#2, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7]
 Input [9]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7, sr_item_sk#9, sr_ticket_number#10]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7], [ss_item_sk#1, ss_customer_sk#2, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7]
 
-(13) ColumnarToRow [codegen id : 2]
-Input [6]: [ss_item_sk#1, ss_customer_sk#2, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7]
-
-(14) ReusedExchange [Reuses operator id: 71]
+(15) ReusedExchange [Reuses operator id: 74]
 Output [2]: [d_date_sk#12, d_year#13]
 
-(15) BroadcastHashJoin [codegen id : 2]
+(16) BroadcastHashJoin [codegen id : 6]
 Left keys [1]: [ss_sold_date_sk#7]
 Right keys [1]: [d_date_sk#12]
 Join type: Inner
 Join condition: None
 
-(16) Project [codegen id : 2]
+(17) Project [codegen id : 6]
 Output [6]: [ss_item_sk#1, ss_customer_sk#2, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, d_year#13]
 Input [8]: [ss_item_sk#1, ss_customer_sk#2, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, ss_sold_date_sk#7, d_date_sk#12, d_year#13]
 
-(17) HashAggregate [codegen id : 2]
+(18) HashAggregate [codegen id : 6]
 Input [6]: [ss_item_sk#1, ss_customer_sk#2, ss_quantity#4, ss_wholesale_cost#5, ss_sales_price#6, d_year#13]
 Keys [3]: [d_year#13, ss_item_sk#1, ss_customer_sk#2]
 Functions [3]: [partial_sum(ss_quantity#4), partial_sum(UnscaledValue(ss_wholesale_cost#5)), partial_sum(UnscaledValue(ss_sales_price#6))]
 Aggregate Attributes [3]: [sum#14, sum#15, sum#16]
 Results [6]: [d_year#13, ss_item_sk#1, ss_customer_sk#2, sum#17, sum#18, sum#19]
 
-(18) Exchange
+(19) Exchange
 Input [6]: [d_year#13, ss_item_sk#1, ss_customer_sk#2, sum#17, sum#18, sum#19]
 Arguments: hashpartitioning(d_year#13, ss_item_sk#1, ss_customer_sk#2, 5), ENSURE_REQUIREMENTS, [plan_id=3]
 
-(19) HashAggregate [codegen id : 3]
+(20) HashAggregate [codegen id : 7]
 Input [6]: [d_year#13, ss_item_sk#1, ss_customer_sk#2, sum#17, sum#18, sum#19]
 Keys [3]: [d_year#13, ss_item_sk#1, ss_customer_sk#2]
 Functions [3]: [sum(ss_quantity#4), sum(UnscaledValue(ss_wholesale_cost#5)), sum(UnscaledValue(ss_sales_price#6))]
 Aggregate Attributes [3]: [sum(ss_quantity#4)#20, sum(UnscaledValue(ss_wholesale_cost#5))#21, sum(UnscaledValue(ss_sales_price#6))#22]
 Results [6]: [d_year#13 AS ss_sold_year#23, ss_item_sk#1, ss_customer_sk#2, sum(ss_quantity#4)#20 AS ss_qty#24, MakeDecimal(sum(UnscaledValue(ss_wholesale_cost#5))#21,17,2) AS ss_wc#25, MakeDecimal(sum(UnscaledValue(ss_sales_price#6))#22,17,2) AS ss_sp#26]
 
-(20) Sort [codegen id : 3]
+(21) Sort [codegen id : 7]
 Input [6]: [ss_sold_year#23, ss_item_sk#1, ss_customer_sk#2, ss_qty#24, ss_wc#25, ss_sp#26]
 Arguments: [ss_sold_year#23 ASC NULLS FIRST, ss_item_sk#1 ASC NULLS FIRST, ss_customer_sk#2 ASC NULLS FIRST], false, 0
 
@@ -170,17 +177,20 @@ PartitionFilters: [isnotnull(ws_sold_date_sk#33), dynamicpruningexpression(ws_so
 PushedFilters: [IsNotNull(ws_item_sk), IsNotNull(ws_bill_customer_sk)]
 ReadSchema: struct<ws_item_sk:int,ws_bill_customer_sk:int,ws_order_number:int,ws_quantity:int,ws_wholesale_cost:decimal(7,2),ws_sales_price:decimal(7,2)>
 
-(22) CometFilter
+(23) CometFilter
 Input [7]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_order_number#29, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33]
 Condition : (isnotnull(ws_item_sk#27) AND isnotnull(ws_bill_customer_sk#28))
 
-(23) CometExchange
+(24) ColumnarToRow [codegen id : 8]
+Input [7]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_order_number#29, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33]
+
+(25) Exchange
 Input [7]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_order_number#29, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33]
-Arguments: hashpartitioning(ws_order_number#29, ws_item_sk#27, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=4]
+Arguments: hashpartitioning(ws_order_number#29, ws_item_sk#27, 5), ENSURE_REQUIREMENTS, [plan_id=4]
 
-(24) CometSort
+(26) Sort [codegen id : 9]
 Input [7]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_order_number#29, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33]
-Arguments: [ws_item_sk#27, ws_bill_customer_sk#28, ws_order_number#29, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33], [ws_order_number#29 ASC NULLS FIRST, ws_item_sk#27 ASC NULLS FIRST]
+Arguments: [ws_order_number#29 ASC NULLS FIRST, ws_item_sk#27 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.web_returns
 Output [3]: [wr_item_sk#35, wr_order_number#36, wr_returned_date_sk#37]
@@ -189,84 +199,85 @@ Location [not included in comparison]/{warehouse_dir}/web_returns]
 PushedFilters: [IsNotNull(wr_order_number), IsNotNull(wr_item_sk)]
 ReadSchema: struct<wr_item_sk:int,wr_order_number:int>
 
-(26) CometFilter
+(28) CometFilter
 Input [3]: [wr_item_sk#35, wr_order_number#36, wr_returned_date_sk#37]
 Condition : (isnotnull(wr_order_number#36) AND isnotnull(wr_item_sk#35))
 
-(27) CometProject
+(29) CometProject
 Input [3]: [wr_item_sk#35, wr_order_number#36, wr_returned_date_sk#37]
 Arguments: [wr_item_sk#35, wr_order_number#36], [wr_item_sk#35, wr_order_number#36]
 
-(28) CometExchange
+(30) ColumnarToRow [codegen id : 10]
+Input [2]: [wr_item_sk#35, wr_order_number#36]
+
+(31) Exchange
 Input [2]: [wr_item_sk#35, wr_order_number#36]
-Arguments: hashpartitioning(wr_order_number#36, wr_item_sk#35, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=5]
+Arguments: hashpartitioning(wr_order_number#36, wr_item_sk#35, 5), ENSURE_REQUIREMENTS, [plan_id=5]
 
-(29) CometSort
+(32) Sort [codegen id : 11]
 Input [2]: [wr_item_sk#35, wr_order_number#36]
-Arguments: [wr_item_sk#35, wr_order_number#36], [wr_order_number#36 ASC NULLS FIRST, wr_item_sk#35 ASC NULLS FIRST]
+Arguments: [wr_order_number#36 ASC NULLS FIRST, wr_item_sk#35 ASC NULLS FIRST], false, 0
 
-(30) CometSortMergeJoin
-Left output [7]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_order_number#29, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33]
-Right output [2]: [wr_item_sk#35, wr_order_number#36]
-Arguments: [ws_order_number#29, ws_item_sk#27], [wr_order_number#36, wr_item_sk#35], LeftOuter
+(33) SortMergeJoin [codegen id : 13]
+Left keys [2]: [ws_order_number#29, ws_item_sk#27]
+Right keys [2]: [wr_order_number#36, wr_item_sk#35]
+Join type: LeftOuter
+Join condition: None
 
-(31) CometFilter
+(34) Filter [codegen id : 13]
 Input [9]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_order_number#29, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33, wr_item_sk#35, wr_order_number#36]
 Condition : isnull(wr_order_number#36)
 
-(32) CometProject
+(35) Project [codegen id : 13]
+Output [6]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33]
 Input [9]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_order_number#29, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33, wr_item_sk#35, wr_order_number#36]
-Arguments: [ws_item_sk#27, ws_bill_customer_sk#28, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33], [ws_item_sk#27, ws_bill_customer_sk#28, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33]
-
-(33) ColumnarToRow [codegen id : 5]
-Input [6]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33]
 
-(34) ReusedExchange [Reuses operator id: 71]
+(36) ReusedExchange [Reuses operator id: 74]
 Output [2]: [d_date_sk#38, d_year#39]
 
-(35) BroadcastHashJoin [codegen id : 5]
+(37) BroadcastHashJoin [codegen id : 13]
 Left keys [1]: [ws_sold_date_sk#33]
 Right keys [1]: [d_date_sk#38]
 Join type: Inner
 Join condition: None
 
-(36) Project [codegen id : 5]
+(38) Project [codegen id : 13]
 Output [6]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, d_year#39]
 Input [8]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, ws_sold_date_sk#33, d_date_sk#38, d_year#39]
 
-(37) HashAggregate [codegen id : 5]
+(39) HashAggregate [codegen id : 13]
 Input [6]: [ws_item_sk#27, ws_bill_customer_sk#28, ws_quantity#30, ws_wholesale_cost#31, ws_sales_price#32, d_year#39]
 Keys [3]: [d_year#39, ws_item_sk#27, ws_bill_customer_sk#28]
 Functions [3]: [partial_sum(ws_quantity#30), partial_sum(UnscaledValue(ws_wholesale_cost#31)), partial_sum(UnscaledValue(ws_sales_price#32))]
 Aggregate Attributes [3]: [sum#40, sum#41, sum#42]
 Results [6]: [d_year#39, ws_item_sk#27, ws_bill_customer_sk#28, sum#43, sum#44, sum#45]
 
-(38) Exchange
+(40) Exchange
 Input [6]: [d_year#39, ws_item_sk#27, ws_bill_customer_sk#28, sum#43, sum#44, sum#45]
 Arguments: hashpartitioning(d_year#39, ws_item_sk#27, ws_bill_customer_sk#28, 5), ENSURE_REQUIREMENTS, [plan_id=6]
 
-(39) HashAggregate [codegen id : 6]
+(41) HashAggregate [codegen id : 14]
 Input [6]: [d_year#39, ws_item_sk#27, ws_bill_customer_sk#28, sum#43, sum#44, sum#45]
 Keys [3]: [d_year#39, ws_item_sk#27, ws_bill_customer_sk#28]
 Functions [3]: [sum(ws_quantity#30), sum(UnscaledValue(ws_wholesale_cost#31)), sum(UnscaledValue(ws_sales_price#32))]
 Aggregate Attributes [3]: [sum(ws_quantity#30)#46, sum(UnscaledValue(ws_wholesale_cost#31))#47, sum(UnscaledValue(ws_sales_price#32))#48]
 Results [6]: [d_year#39 AS ws_sold_year#49, ws_item_sk#27, ws_bill_customer_sk#28 AS ws_customer_sk#50, sum(ws_quantity#30)#46 AS ws_qty#51, MakeDecimal(sum(UnscaledValue(ws_wholesale_cost#31))#47,17,2) AS ws_wc#52, MakeDecimal(sum(UnscaledValue(ws_sales_price#32))#48,17,2) AS ws_sp#53]
 
-(40) Filter [codegen id : 6]
+(42) Filter [codegen id : 14]
 Input [6]: [ws_sold_year#49, ws_item_sk#27, ws_customer_sk#50, ws_qty#51, ws_wc#52, ws_sp#53]
 Condition : (coalesce(ws_qty#51, 0) > 0)
 
-(41) Sort [codegen id : 6]
+(43) Sort [codegen id : 14]
 Input [6]: [ws_sold_year#49, ws_item_sk#27, ws_customer_sk#50, ws_qty#51, ws_wc#52, ws_sp#53]
 Arguments: [ws_sold_year#49 ASC NULLS FIRST, ws_item_sk#27 ASC NULLS FIRST, ws_customer_sk#50 ASC NULLS FIRST], false, 0
 
-(42) SortMergeJoin [codegen id : 7]
+(44) SortMergeJoin [codegen id : 15]
 Left keys [3]: [ss_sold_year#23, ss_item_sk#1, ss_customer_sk#2]
 Right keys [3]: [ws_sold_year#49, ws_item_sk#27, ws_customer_sk#50]
 Join type: Inner
 Join condition: None
 
-(43) Project [codegen id : 7]
+(45) Project [codegen id : 15]
 Output [9]: [ss_sold_year#23, ss_item_sk#1, ss_customer_sk#2, ss_qty#24, ss_wc#25, ss_sp#26, ws_qty#51, ws_wc#52, ws_sp#53]
 Input [12]: [ss_sold_year#23, ss_item_sk#1, ss_customer_sk#2, ss_qty#24, ss_wc#25, ss_sp#26, ws_sold_year#49, ws_item_sk#27, ws_customer_sk#50, ws_qty#51, ws_wc#52, ws_sp#53]
 
@@ -278,17 +289,20 @@ PartitionFilters: [isnotnull(cs_sold_date_sk#60), dynamicpruningexpression(cs_so
 PushedFilters: [IsNotNull(cs_item_sk), IsNotNull(cs_bill_customer_sk)]
 ReadSchema: struct<cs_bill_customer_sk:int,cs_item_sk:int,cs_order_number:int,cs_quantity:int,cs_wholesale_cost:decimal(7,2),cs_sales_price:decimal(7,2)>
 
-(45) CometFilter
+(47) CometFilter
 Input [7]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_order_number#56, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60]
 Condition : (isnotnull(cs_item_sk#55) AND isnotnull(cs_bill_customer_sk#54))
 
-(46) CometExchange
+(48) ColumnarToRow [codegen id : 16]
+Input [7]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_order_number#56, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60]
+
+(49) Exchange
 Input [7]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_order_number#56, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60]
-Arguments: hashpartitioning(cs_order_number#56, cs_item_sk#55, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=7]
+Arguments: hashpartitioning(cs_order_number#56, cs_item_sk#55, 5), ENSURE_REQUIREMENTS, [plan_id=7]
 
-(47) CometSort
+(50) Sort [codegen id : 17]
 Input [7]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_order_number#56, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60]
-Arguments: [cs_bill_customer_sk#54, cs_item_sk#55, cs_order_number#56, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60], [cs_order_number#56 ASC NULLS FIRST, cs_item_sk#55 ASC NULLS FIRST]
+Arguments: [cs_order_number#56 ASC NULLS FIRST, cs_item_sk#55 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.catalog_returns
 Output [3]: [cr_item_sk#62, cr_order_number#63, cr_returned_date_sk#64]
@@ -297,98 +311,99 @@ Location [not included in comparison]/{warehouse_dir}/catalog_returns]
 PushedFilters: [IsNotNull(cr_order_number), IsNotNull(cr_item_sk)]
 ReadSchema: struct<cr_item_sk:int,cr_order_number:int>
 
-(49) CometFilter
+(52) CometFilter
 Input [3]: [cr_item_sk#62, cr_order_number#63, cr_returned_date_sk#64]
 Condition : (isnotnull(cr_order_number#63) AND isnotnull(cr_item_sk#62))
 
-(50) CometProject
+(53) CometProject
 Input [3]: [cr_item_sk#62, cr_order_number#63, cr_returned_date_sk#64]
 Arguments: [cr_item_sk#62, cr_order_number#63], [cr_item_sk#62, cr_order_number#63]
 
-(51) CometExchange
+(54) ColumnarToRow [codegen id : 18]
 Input [2]: [cr_item_sk#62, cr_order_number#63]
-Arguments: hashpartitioning(cr_order_number#63, cr_item_sk#62, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=8]
 
-(52) CometSort
+(55) Exchange
 Input [2]: [cr_item_sk#62, cr_order_number#63]
-Arguments: [cr_item_sk#62, cr_order_number#63], [cr_order_number#63 ASC NULLS FIRST, cr_item_sk#62 ASC NULLS FIRST]
+Arguments: hashpartitioning(cr_order_number#63, cr_item_sk#62, 5), ENSURE_REQUIREMENTS, [plan_id=8]
 
-(53) CometSortMergeJoin
-Left output [7]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_order_number#56, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60]
-Right output [2]: [cr_item_sk#62, cr_order_number#63]
-Arguments: [cs_order_number#56, cs_item_sk#55], [cr_order_number#63, cr_item_sk#62], LeftOuter
+(56) Sort [codegen id : 19]
+Input [2]: [cr_item_sk#62, cr_order_number#63]
+Arguments: [cr_order_number#63 ASC NULLS FIRST, cr_item_sk#62 ASC NULLS FIRST], false, 0
+
+(57) SortMergeJoin [codegen id : 21]
+Left keys [2]: [cs_order_number#56, cs_item_sk#55]
+Right keys [2]: [cr_order_number#63, cr_item_sk#62]
+Join type: LeftOuter
+Join condition: None
 
-(54) CometFilter
+(58) Filter [codegen id : 21]
 Input [9]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_order_number#56, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60, cr_item_sk#62, cr_order_number#63]
 Condition : isnull(cr_order_number#63)
 
-(55) CometProject
+(59) Project [codegen id : 21]
+Output [6]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60]
 Input [9]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_order_number#56, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60, cr_item_sk#62, cr_order_number#63]
-Arguments: [cs_bill_customer_sk#54, cs_item_sk#55, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60], [cs_bill_customer_sk#54, cs_item_sk#55, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60]
-
-(56) ColumnarToRow [codegen id : 9]
-Input [6]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60]
 
-(57) ReusedExchange [Reuses operator id: 71]
+(60) ReusedExchange [Reuses operator id: 74]
 Output [2]: [d_date_sk#65, d_year#66]
 
-(58) BroadcastHashJoin [codegen id : 9]
+(61) BroadcastHashJoin [codegen id : 21]
 Left keys [1]: [cs_sold_date_sk#60]
 Right keys [1]: [d_date_sk#65]
 Join type: Inner
 Join condition: None
 
-(59) Project [codegen id : 9]
+(62) Project [codegen id : 21]
 Output [6]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, d_year#66]
 Input [8]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, cs_sold_date_sk#60, d_date_sk#65, d_year#66]
 
-(60) HashAggregate [codegen id : 9]
+(63) HashAggregate [codegen id : 21]
 Input [6]: [cs_bill_customer_sk#54, cs_item_sk#55, cs_quantity#57, cs_wholesale_cost#58, cs_sales_price#59, d_year#66]
 Keys [3]: [d_year#66, cs_item_sk#55, cs_bill_customer_sk#54]
 Functions [3]: [partial_sum(cs_quantity#57), partial_sum(UnscaledValue(cs_wholesale_cost#58)), partial_sum(UnscaledValue(cs_sales_price#59))]
 Aggregate Attributes [3]: [sum#67, sum#68, sum#69]
 Results [6]: [d_year#66, cs_item_sk#55, cs_bill_customer_sk#54, sum#70, sum#71, sum#72]
 
-(61) Exchange
+(64) Exchange
 Input [6]: [d_year#66, cs_item_sk#55, cs_bill_customer_sk#54, sum#70, sum#71, sum#72]
 Arguments: hashpartitioning(d_year#66, cs_item_sk#55, cs_bill_customer_sk#54, 5), ENSURE_REQUIREMENTS, [plan_id=9]
 
-(62) HashAggregate [codegen id : 10]
+(65) HashAggregate [codegen id : 22]
 Input [6]: [d_year#66, cs_item_sk#55, cs_bill_customer_sk#54, sum#70, sum#71, sum#72]
 Keys [3]: [d_year#66, cs_item_sk#55, cs_bill_customer_sk#54]
 Functions [3]: [sum(cs_quantity#57), sum(UnscaledValue(cs_wholesale_cost#58)), sum(UnscaledValue(cs_sales_price#59))]
 Aggregate Attributes [3]: [sum(cs_quantity#57)#73, sum(UnscaledValue(cs_wholesale_cost#58))#74, sum(UnscaledValue(cs_sales_price#59))#75]
 Results [6]: [d_year#66 AS cs_sold_year#76, cs_item_sk#55, cs_bill_customer_sk#54 AS cs_customer_sk#77, sum(cs_quantity#57)#73 AS cs_qty#78, MakeDecimal(sum(UnscaledValue(cs_wholesale_cost#58))#74,17,2) AS cs_wc#79, MakeDecimal(sum(UnscaledValue(cs_sales_price#59))#75,17,2) AS cs_sp#80]
 
-(63) Filter [codegen id : 10]
+(66) Filter [codegen id : 22]
 Input [6]: [cs_sold_year#76, cs_item_sk#55, cs_customer_sk#77, cs_qty#78, cs_wc#79, cs_sp#80]
 Condition : (coalesce(cs_qty#78, 0) > 0)
 
-(64) Sort [codegen id : 10]
+(67) Sort [codegen id : 22]
 Input [6]: [cs_sold_year#76, cs_item_sk#55, cs_customer_sk#77, cs_qty#78, cs_wc#79, cs_sp#80]
 Arguments: [cs_sold_year#76 ASC NULLS FIRST, cs_item_sk#55 ASC NULLS FIRST, cs_customer_sk#77 ASC NULLS FIRST], false, 0
 
-(65) SortMergeJoin [codegen id : 11]
+(68) SortMergeJoin [codegen id : 23]
 Left keys [3]: [ss_sold_year#23, ss_item_sk#1, ss_customer_sk#2]
 Right keys [3]: [cs_sold_year#76, cs_item_sk#55, cs_customer_sk#77]
 Join type: Inner
 Join condition: None
 
-(66) Project [codegen id : 11]
+(69) Project [codegen id : 23]
 Output [12]: [round((cast(ss_qty#24 as double) / cast(coalesce((ws_qty#51 + cs_qty#78), 1) as double)), 2) AS ratio#81, ss_qty#24 AS store_qty#82, ss_wc#25 AS store_wholesale_cost#83, ss_sp#26 AS store_sales_price#84, (coalesce(ws_qty#51, 0) + coalesce(cs_qty#78, 0)) AS other_chan_qty#85, (coalesce(ws_wc#52, 0.00) + coalesce(cs_wc#79, 0.00)) AS other_chan_wholesale_cost#86, (coalesce(ws_sp#53, 0.00) + coalesce(cs_sp#80, 0.00)) AS other_chan_sales_price#87, ss_qty#24, ss_wc#25, ss_sp#26,  [...]
 Input [15]: [ss_sold_year#23, ss_item_sk#1, ss_customer_sk#2, ss_qty#24, ss_wc#25, ss_sp#26, ws_qty#51, ws_wc#52, ws_sp#53, cs_sold_year#76, cs_item_sk#55, cs_customer_sk#77, cs_qty#78, cs_wc#79, cs_sp#80]
 
-(67) TakeOrderedAndProject
+(70) TakeOrderedAndProject
 Input [12]: [ratio#81, store_qty#82, store_wholesale_cost#83, store_sales_price#84, other_chan_qty#85, other_chan_wholesale_cost#86, other_chan_sales_price#87, ss_qty#24, ss_wc#25, ss_sp#26, ws_qty#51, cs_qty#78]
 Arguments: 100, [ratio#81 ASC NULLS FIRST, ss_qty#24 DESC NULLS LAST, ss_wc#25 DESC NULLS LAST, ss_sp#26 DESC NULLS LAST, other_chan_qty#85 ASC NULLS FIRST, other_chan_wholesale_cost#86 ASC NULLS FIRST, other_chan_sales_price#87 ASC NULLS FIRST, round((cast(ss_qty#24 as double) / cast(coalesce((ws_qty#51 + cs_qty#78), 1) as double)), 2) ASC NULLS FIRST], [ratio#81, store_qty#82, store_wholesale_cost#83, store_sales_price#84, other_chan_qty#85, other_chan_wholesale_cost#86, other_chan_sal [...]
 
 ===== Subqueries =====
 
 Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#7 IN dynamicpruning#8
-BroadcastExchange (71)
-+- * ColumnarToRow (70)
-   +- CometFilter (69)
-      +- CometScan parquet spark_catalog.default.date_dim (68)
+BroadcastExchange (74)
++- * ColumnarToRow (73)
+   +- CometFilter (72)
+      +- CometScan parquet spark_catalog.default.date_dim (71)
 
 
 (unknown) Scan parquet spark_catalog.default.date_dim
@@ -398,19 +413,19 @@ Location [not included in comparison]/{warehouse_dir}/date_dim]
 PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2000), IsNotNull(d_date_sk)]
 ReadSchema: struct<d_date_sk:int,d_year:int>
 
-(69) CometFilter
+(72) CometFilter
 Input [2]: [d_date_sk#12, d_year#13]
 Condition : ((isnotnull(d_year#13) AND (d_year#13 = 2000)) AND isnotnull(d_date_sk#12))
 
-(70) ColumnarToRow [codegen id : 1]
+(73) ColumnarToRow [codegen id : 1]
 Input [2]: [d_date_sk#12, d_year#13]
 
-(71) BroadcastExchange
+(74) BroadcastExchange
 Input [2]: [d_date_sk#12, d_year#13]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=10]
 
-Subquery:2 Hosting operator id = 21 Hosting Expression = ws_sold_date_sk#33 IN dynamicpruning#8
+Subquery:2 Hosting operator id = 22 Hosting Expression = ws_sold_date_sk#33 IN dynamicpruning#8
 
-Subquery:3 Hosting operator id = 44 Hosting Expression = cs_sold_date_sk#60 IN dynamicpruning#8
+Subquery:3 Hosting operator id = 46 Hosting Expression = cs_sold_date_sk#60 IN dynamicpruning#8
 
 
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q78/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q78/simplified.txt
index 7b351afc..280687e3 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q78/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q78/simplified.txt
@@ -1,97 +1,127 @@
 TakeOrderedAndProject [ratio,ss_qty,ss_wc,ss_sp,other_chan_qty,other_chan_wholesale_cost,other_chan_sales_price,ws_qty,cs_qty,store_qty,store_wholesale_cost,store_sales_price]
-  WholeStageCodegen (11)
+  WholeStageCodegen (23)
     Project [ss_qty,ws_qty,cs_qty,ss_wc,ss_sp,ws_wc,cs_wc,ws_sp,cs_sp]
       SortMergeJoin [ss_sold_year,ss_item_sk,ss_customer_sk,cs_sold_year,cs_item_sk,cs_customer_sk]
         InputAdapter
-          WholeStageCodegen (7)
+          WholeStageCodegen (15)
             Project [ss_sold_year,ss_item_sk,ss_customer_sk,ss_qty,ss_wc,ss_sp,ws_qty,ws_wc,ws_sp]
               SortMergeJoin [ss_sold_year,ss_item_sk,ss_customer_sk,ws_sold_year,ws_item_sk,ws_customer_sk]
                 InputAdapter
-                  WholeStageCodegen (3)
+                  WholeStageCodegen (7)
                     Sort [ss_sold_year,ss_item_sk,ss_customer_sk]
                       HashAggregate [d_year,ss_item_sk,ss_customer_sk,sum,sum,sum] [sum(ss_quantity),sum(UnscaledValue(ss_wholesale_cost)),sum(UnscaledValue(ss_sales_price)),ss_sold_year,ss_qty,ss_wc,ss_sp,sum,sum,sum]
                         InputAdapter
                           Exchange [d_year,ss_item_sk,ss_customer_sk] #1
-                            WholeStageCodegen (2)
+                            WholeStageCodegen (6)
                               HashAggregate [d_year,ss_item_sk,ss_customer_sk,ss_quantity,ss_wholesale_cost,ss_sales_price] [sum,sum,sum,sum,sum,sum]
                                 Project [ss_item_sk,ss_customer_sk,ss_quantity,ss_wholesale_cost,ss_sales_price,d_year]
                                   BroadcastHashJoin [ss_sold_date_sk,d_date_sk]
-                                    ColumnarToRow
-                                      InputAdapter
-                                        CometProject [ss_item_sk,ss_customer_sk,ss_quantity,ss_wholesale_cost,ss_sales_price,ss_sold_date_sk]
-                                          CometFilter [sr_ticket_number]
-                                            CometSortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
-                                              CometSort [ss_ticket_number,ss_item_sk]
-                                                CometExchange [ss_ticket_number,ss_item_sk] #2
-                                                  CometFilter [ss_item_sk,ss_customer_sk]
-                                                    CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_ticket_number,ss_quantity,ss_wholesale_cost,ss_sales_price,ss_sold_date_sk]
-                                                      SubqueryBroadcast [d_date_sk] #1
-                                                        BroadcastExchange #3
-                                                          WholeStageCodegen (1)
-                                                            ColumnarToRow
-                                                              InputAdapter
-                                                                CometFilter [d_year,d_date_sk]
-                                                                  CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_year]
-                                              CometSort [sr_ticket_number,sr_item_sk]
-                                                CometExchange [sr_ticket_number,sr_item_sk] #4
-                                                  CometProject [sr_item_sk,sr_ticket_number]
-                                                    CometFilter [sr_ticket_number,sr_item_sk]
-                                                      CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_returned_date_sk]
+                                    Project [ss_item_sk,ss_customer_sk,ss_quantity,ss_wholesale_cost,ss_sales_price,ss_sold_date_sk]
+                                      Filter [sr_ticket_number]
+                                        SortMergeJoin [ss_ticket_number,ss_item_sk,sr_ticket_number,sr_item_sk]
+                                          InputAdapter
+                                            WholeStageCodegen (2)
+                                              Sort [ss_ticket_number,ss_item_sk]
+                                                InputAdapter
+                                                  Exchange [ss_ticket_number,ss_item_sk] #2
+                                                    WholeStageCodegen (1)
+                                                      ColumnarToRow
+                                                        InputAdapter
+                                                          CometFilter [ss_item_sk,ss_customer_sk]
+                                                            CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_ticket_number,ss_quantity,ss_wholesale_cost,ss_sales_price,ss_sold_date_sk]
+                                                              SubqueryBroadcast [d_date_sk] #1
+                                                                BroadcastExchange #3
+                                                                  WholeStageCodegen (1)
+                                                                    ColumnarToRow
+                                                                      InputAdapter
+                                                                        CometFilter [d_year,d_date_sk]
+                                                                          CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_year]
+                                          InputAdapter
+                                            WholeStageCodegen (4)
+                                              Sort [sr_ticket_number,sr_item_sk]
+                                                InputAdapter
+                                                  Exchange [sr_ticket_number,sr_item_sk] #4
+                                                    WholeStageCodegen (3)
+                                                      ColumnarToRow
+                                                        InputAdapter
+                                                          CometProject [sr_item_sk,sr_ticket_number]
+                                                            CometFilter [sr_ticket_number,sr_item_sk]
+                                                              CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_returned_date_sk]
                                     InputAdapter
                                       ReusedExchange [d_date_sk,d_year] #3
                 InputAdapter
-                  WholeStageCodegen (6)
+                  WholeStageCodegen (14)
                     Sort [ws_sold_year,ws_item_sk,ws_customer_sk]
                       Filter [ws_qty]
                         HashAggregate [d_year,ws_item_sk,ws_bill_customer_sk,sum,sum,sum] [sum(ws_quantity),sum(UnscaledValue(ws_wholesale_cost)),sum(UnscaledValue(ws_sales_price)),ws_sold_year,ws_customer_sk,ws_qty,ws_wc,ws_sp,sum,sum,sum]
                           InputAdapter
                             Exchange [d_year,ws_item_sk,ws_bill_customer_sk] #5
-                              WholeStageCodegen (5)
+                              WholeStageCodegen (13)
                                 HashAggregate [d_year,ws_item_sk,ws_bill_customer_sk,ws_quantity,ws_wholesale_cost,ws_sales_price] [sum,sum,sum,sum,sum,sum]
                                   Project [ws_item_sk,ws_bill_customer_sk,ws_quantity,ws_wholesale_cost,ws_sales_price,d_year]
                                     BroadcastHashJoin [ws_sold_date_sk,d_date_sk]
-                                      ColumnarToRow
-                                        InputAdapter
-                                          CometProject [ws_item_sk,ws_bill_customer_sk,ws_quantity,ws_wholesale_cost,ws_sales_price,ws_sold_date_sk]
-                                            CometFilter [wr_order_number]
-                                              CometSortMergeJoin [ws_order_number,ws_item_sk,wr_order_number,wr_item_sk]
-                                                CometSort [ws_order_number,ws_item_sk]
-                                                  CometExchange [ws_order_number,ws_item_sk] #6
-                                                    CometFilter [ws_item_sk,ws_bill_customer_sk]
-                                                      CometScan parquet spark_catalog.default.web_sales [ws_item_sk,ws_bill_customer_sk,ws_order_number,ws_quantity,ws_wholesale_cost,ws_sales_price,ws_sold_date_sk]
-                                                        ReusedSubquery [d_date_sk] #1
-                                                CometSort [wr_order_number,wr_item_sk]
-                                                  CometExchange [wr_order_number,wr_item_sk] #7
-                                                    CometProject [wr_item_sk,wr_order_number]
-                                                      CometFilter [wr_order_number,wr_item_sk]
-                                                        CometScan parquet spark_catalog.default.web_returns [wr_item_sk,wr_order_number,wr_returned_date_sk]
+                                      Project [ws_item_sk,ws_bill_customer_sk,ws_quantity,ws_wholesale_cost,ws_sales_price,ws_sold_date_sk]
+                                        Filter [wr_order_number]
+                                          SortMergeJoin [ws_order_number,ws_item_sk,wr_order_number,wr_item_sk]
+                                            InputAdapter
+                                              WholeStageCodegen (9)
+                                                Sort [ws_order_number,ws_item_sk]
+                                                  InputAdapter
+                                                    Exchange [ws_order_number,ws_item_sk] #6
+                                                      WholeStageCodegen (8)
+                                                        ColumnarToRow
+                                                          InputAdapter
+                                                            CometFilter [ws_item_sk,ws_bill_customer_sk]
+                                                              CometScan parquet spark_catalog.default.web_sales [ws_item_sk,ws_bill_customer_sk,ws_order_number,ws_quantity,ws_wholesale_cost,ws_sales_price,ws_sold_date_sk]
+                                                                ReusedSubquery [d_date_sk] #1
+                                            InputAdapter
+                                              WholeStageCodegen (11)
+                                                Sort [wr_order_number,wr_item_sk]
+                                                  InputAdapter
+                                                    Exchange [wr_order_number,wr_item_sk] #7
+                                                      WholeStageCodegen (10)
+                                                        ColumnarToRow
+                                                          InputAdapter
+                                                            CometProject [wr_item_sk,wr_order_number]
+                                                              CometFilter [wr_order_number,wr_item_sk]
+                                                                CometScan parquet spark_catalog.default.web_returns [wr_item_sk,wr_order_number,wr_returned_date_sk]
                                       InputAdapter
                                         ReusedExchange [d_date_sk,d_year] #3
         InputAdapter
-          WholeStageCodegen (10)
+          WholeStageCodegen (22)
             Sort [cs_sold_year,cs_item_sk,cs_customer_sk]
               Filter [cs_qty]
                 HashAggregate [d_year,cs_item_sk,cs_bill_customer_sk,sum,sum,sum] [sum(cs_quantity),sum(UnscaledValue(cs_wholesale_cost)),sum(UnscaledValue(cs_sales_price)),cs_sold_year,cs_customer_sk,cs_qty,cs_wc,cs_sp,sum,sum,sum]
                   InputAdapter
                     Exchange [d_year,cs_item_sk,cs_bill_customer_sk] #8
-                      WholeStageCodegen (9)
+                      WholeStageCodegen (21)
                         HashAggregate [d_year,cs_item_sk,cs_bill_customer_sk,cs_quantity,cs_wholesale_cost,cs_sales_price] [sum,sum,sum,sum,sum,sum]
                           Project [cs_bill_customer_sk,cs_item_sk,cs_quantity,cs_wholesale_cost,cs_sales_price,d_year]
                             BroadcastHashJoin [cs_sold_date_sk,d_date_sk]
-                              ColumnarToRow
-                                InputAdapter
-                                  CometProject [cs_bill_customer_sk,cs_item_sk,cs_quantity,cs_wholesale_cost,cs_sales_price,cs_sold_date_sk]
-                                    CometFilter [cr_order_number]
-                                      CometSortMergeJoin [cs_order_number,cs_item_sk,cr_order_number,cr_item_sk]
-                                        CometSort [cs_order_number,cs_item_sk]
-                                          CometExchange [cs_order_number,cs_item_sk] #9
-                                            CometFilter [cs_item_sk,cs_bill_customer_sk]
-                                              CometScan parquet spark_catalog.default.catalog_sales [cs_bill_customer_sk,cs_item_sk,cs_order_number,cs_quantity,cs_wholesale_cost,cs_sales_price,cs_sold_date_sk]
-                                                ReusedSubquery [d_date_sk] #1
-                                        CometSort [cr_order_number,cr_item_sk]
-                                          CometExchange [cr_order_number,cr_item_sk] #10
-                                            CometProject [cr_item_sk,cr_order_number]
-                                              CometFilter [cr_order_number,cr_item_sk]
-                                                CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_returned_date_sk]
+                              Project [cs_bill_customer_sk,cs_item_sk,cs_quantity,cs_wholesale_cost,cs_sales_price,cs_sold_date_sk]
+                                Filter [cr_order_number]
+                                  SortMergeJoin [cs_order_number,cs_item_sk,cr_order_number,cr_item_sk]
+                                    InputAdapter
+                                      WholeStageCodegen (17)
+                                        Sort [cs_order_number,cs_item_sk]
+                                          InputAdapter
+                                            Exchange [cs_order_number,cs_item_sk] #9
+                                              WholeStageCodegen (16)
+                                                ColumnarToRow
+                                                  InputAdapter
+                                                    CometFilter [cs_item_sk,cs_bill_customer_sk]
+                                                      CometScan parquet spark_catalog.default.catalog_sales [cs_bill_customer_sk,cs_item_sk,cs_order_number,cs_quantity,cs_wholesale_cost,cs_sales_price,cs_sold_date_sk]
+                                                        ReusedSubquery [d_date_sk] #1
+                                    InputAdapter
+                                      WholeStageCodegen (19)
+                                        Sort [cr_order_number,cr_item_sk]
+                                          InputAdapter
+                                            Exchange [cr_order_number,cr_item_sk] #10
+                                              WholeStageCodegen (18)
+                                                ColumnarToRow
+                                                  InputAdapter
+                                                    CometProject [cr_item_sk,cr_order_number]
+                                                      CometFilter [cr_order_number,cr_item_sk]
+                                                        CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_returned_date_sk]
                               InputAdapter
                                 ReusedExchange [d_date_sk,d_year] #3
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80/explain.txt
index dfd123a1..338f8608 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80/explain.txt
@@ -1,108 +1,111 @@
 == Physical Plan ==
-TakeOrderedAndProject (104)
-+- * HashAggregate (103)
-   +- Exchange (102)
-      +- * HashAggregate (101)
-         +- * Expand (100)
-            +- Union (99)
-               :- * HashAggregate (38)
-               :  +- Exchange (37)
-               :     +- * HashAggregate (36)
-               :        +- * Project (35)
-               :           +- * BroadcastHashJoin Inner BuildRight (34)
-               :              :- * Project (28)
-               :              :  +- * BroadcastHashJoin Inner BuildRight (27)
-               :              :     :- * Project (21)
-               :              :     :  +- * BroadcastHashJoin Inner BuildRight (20)
-               :              :     :     :- * Project (15)
-               :              :     :     :  +- * BroadcastHashJoin Inner BuildRight (14)
-               :              :     :     :     :- * ColumnarToRow (12)
-               :              :     :     :     :  +- CometProject (11)
-               :              :     :     :     :     +- CometSortMergeJoin (10)
-               :              :     :     :     :        :- CometSort (4)
-               :              :     :     :     :        :  +- CometExchange (3)
-               :              :     :     :     :        :     +- CometFilter (2)
-               :              :     :     :     :        :        +- CometScan parquet spark_catalog.default.store_sales (1)
-               :              :     :     :     :        +- CometSort (9)
-               :              :     :     :     :           +- CometExchange (8)
-               :              :     :     :     :              +- CometProject (7)
-               :              :     :     :     :                 +- CometFilter (6)
-               :              :     :     :     :                    +- CometScan parquet spark_catalog.default.store_returns (5)
-               :              :     :     :     +- ReusedExchange (13)
-               :              :     :     +- BroadcastExchange (19)
-               :              :     :        +- * ColumnarToRow (18)
-               :              :     :           +- CometFilter (17)
-               :              :     :              +- CometScan parquet spark_catalog.default.store (16)
-               :              :     +- BroadcastExchange (26)
-               :              :        +- * ColumnarToRow (25)
-               :              :           +- CometProject (24)
-               :              :              +- CometFilter (23)
-               :              :                 +- CometScan parquet spark_catalog.default.item (22)
-               :              +- BroadcastExchange (33)
-               :                 +- * ColumnarToRow (32)
-               :                    +- CometProject (31)
-               :                       +- CometFilter (30)
-               :                          +- CometScan parquet spark_catalog.default.promotion (29)
-               :- * HashAggregate (68)
-               :  +- Exchange (67)
-               :     +- * HashAggregate (66)
-               :        +- * Project (65)
-               :           +- * BroadcastHashJoin Inner BuildRight (64)
-               :              :- * Project (62)
-               :              :  +- * BroadcastHashJoin Inner BuildRight (61)
-               :              :     :- * Project (59)
-               :              :     :  +- * BroadcastHashJoin Inner BuildRight (58)
-               :              :     :     :- * Project (53)
-               :              :     :     :  +- * BroadcastHashJoin Inner BuildRight (52)
-               :              :     :     :     :- * ColumnarToRow (50)
-               :              :     :     :     :  +- CometProject (49)
-               :              :     :     :     :     +- CometSortMergeJoin (48)
-               :              :     :     :     :        :- CometSort (42)
-               :              :     :     :     :        :  +- CometExchange (41)
-               :              :     :     :     :        :     +- CometFilter (40)
-               :              :     :     :     :        :        +- CometScan parquet spark_catalog.default.catalog_sales (39)
-               :              :     :     :     :        +- CometSort (47)
-               :              :     :     :     :           +- CometExchange (46)
-               :              :     :     :     :              +- CometProject (45)
-               :              :     :     :     :                 +- CometFilter (44)
-               :              :     :     :     :                    +- CometScan parquet spark_catalog.default.catalog_returns (43)
-               :              :     :     :     +- ReusedExchange (51)
-               :              :     :     +- BroadcastExchange (57)
-               :              :     :        +- * ColumnarToRow (56)
-               :              :     :           +- CometFilter (55)
-               :              :     :              +- CometScan parquet spark_catalog.default.catalog_page (54)
-               :              :     +- ReusedExchange (60)
-               :              +- ReusedExchange (63)
-               +- * HashAggregate (98)
-                  +- Exchange (97)
-                     +- * HashAggregate (96)
-                        +- * Project (95)
-                           +- * BroadcastHashJoin Inner BuildRight (94)
-                              :- * Project (92)
-                              :  +- * BroadcastHashJoin Inner BuildRight (91)
-                              :     :- * Project (89)
-                              :     :  +- * BroadcastHashJoin Inner BuildRight (88)
-                              :     :     :- * Project (83)
-                              :     :     :  +- * BroadcastHashJoin Inner BuildRight (82)
-                              :     :     :     :- * ColumnarToRow (80)
-                              :     :     :     :  +- CometProject (79)
-                              :     :     :     :     +- CometSortMergeJoin (78)
-                              :     :     :     :        :- CometSort (72)
-                              :     :     :     :        :  +- CometExchange (71)
-                              :     :     :     :        :     +- CometFilter (70)
-                              :     :     :     :        :        +- CometScan parquet spark_catalog.default.web_sales (69)
-                              :     :     :     :        +- CometSort (77)
-                              :     :     :     :           +- CometExchange (76)
-                              :     :     :     :              +- CometProject (75)
-                              :     :     :     :                 +- CometFilter (74)
-                              :     :     :     :                    +- CometScan parquet spark_catalog.default.web_returns (73)
-                              :     :     :     +- ReusedExchange (81)
-                              :     :     +- BroadcastExchange (87)
-                              :     :        +- * ColumnarToRow (86)
-                              :     :           +- CometFilter (85)
-                              :     :              +- CometScan parquet spark_catalog.default.web_site (84)
-                              :     +- ReusedExchange (90)
-                              +- ReusedExchange (93)
+TakeOrderedAndProject (107)
++- * HashAggregate (106)
+   +- Exchange (105)
+      +- * HashAggregate (104)
+         +- * Expand (103)
+            +- Union (102)
+               :- * HashAggregate (39)
+               :  +- Exchange (38)
+               :     +- * HashAggregate (37)
+               :        +- * Project (36)
+               :           +- * BroadcastHashJoin Inner BuildRight (35)
+               :              :- * Project (29)
+               :              :  +- * BroadcastHashJoin Inner BuildRight (28)
+               :              :     :- * Project (22)
+               :              :     :  +- * BroadcastHashJoin Inner BuildRight (21)
+               :              :     :     :- * Project (16)
+               :              :     :     :  +- * BroadcastHashJoin Inner BuildRight (15)
+               :              :     :     :     :- * Project (13)
+               :              :     :     :     :  +- * SortMergeJoin LeftOuter (12)
+               :              :     :     :     :     :- * Sort (5)
+               :              :     :     :     :     :  +- Exchange (4)
+               :              :     :     :     :     :     +- * ColumnarToRow (3)
+               :              :     :     :     :     :        +- CometFilter (2)
+               :              :     :     :     :     :           +- CometScan parquet spark_catalog.default.store_sales (1)
+               :              :     :     :     :     +- * Sort (11)
+               :              :     :     :     :        +- Exchange (10)
+               :              :     :     :     :           +- * ColumnarToRow (9)
+               :              :     :     :     :              +- CometProject (8)
+               :              :     :     :     :                 +- CometFilter (7)
+               :              :     :     :     :                    +- CometScan parquet spark_catalog.default.store_returns (6)
+               :              :     :     :     +- ReusedExchange (14)
+               :              :     :     +- BroadcastExchange (20)
+               :              :     :        +- * ColumnarToRow (19)
+               :              :     :           +- CometFilter (18)
+               :              :     :              +- CometScan parquet spark_catalog.default.store (17)
+               :              :     +- BroadcastExchange (27)
+               :              :        +- * ColumnarToRow (26)
+               :              :           +- CometProject (25)
+               :              :              +- CometFilter (24)
+               :              :                 +- CometScan parquet spark_catalog.default.item (23)
+               :              +- BroadcastExchange (34)
+               :                 +- * ColumnarToRow (33)
+               :                    +- CometProject (32)
+               :                       +- CometFilter (31)
+               :                          +- CometScan parquet spark_catalog.default.promotion (30)
+               :- * HashAggregate (70)
+               :  +- Exchange (69)
+               :     +- * HashAggregate (68)
+               :        +- * Project (67)
+               :           +- * BroadcastHashJoin Inner BuildRight (66)
+               :              :- * Project (64)
+               :              :  +- * BroadcastHashJoin Inner BuildRight (63)
+               :              :     :- * Project (61)
+               :              :     :  +- * BroadcastHashJoin Inner BuildRight (60)
+               :              :     :     :- * Project (55)
+               :              :     :     :  +- * BroadcastHashJoin Inner BuildRight (54)
+               :              :     :     :     :- * Project (52)
+               :              :     :     :     :  +- * SortMergeJoin LeftOuter (51)
+               :              :     :     :     :     :- * Sort (44)
+               :              :     :     :     :     :  +- Exchange (43)
+               :              :     :     :     :     :     +- * ColumnarToRow (42)
+               :              :     :     :     :     :        +- CometFilter (41)
+               :              :     :     :     :     :           +- CometScan parquet spark_catalog.default.catalog_sales (40)
+               :              :     :     :     :     +- * Sort (50)
+               :              :     :     :     :        +- Exchange (49)
+               :              :     :     :     :           +- * ColumnarToRow (48)
+               :              :     :     :     :              +- CometProject (47)
+               :              :     :     :     :                 +- CometFilter (46)
+               :              :     :     :     :                    +- CometScan parquet spark_catalog.default.catalog_returns (45)
+               :              :     :     :     +- ReusedExchange (53)
+               :              :     :     +- BroadcastExchange (59)
+               :              :     :        +- * ColumnarToRow (58)
+               :              :     :           +- CometFilter (57)
+               :              :     :              +- CometScan parquet spark_catalog.default.catalog_page (56)
+               :              :     +- ReusedExchange (62)
+               :              +- ReusedExchange (65)
+               +- * HashAggregate (101)
+                  +- Exchange (100)
+                     +- * HashAggregate (99)
+                        +- * Project (98)
+                           +- * BroadcastHashJoin Inner BuildRight (97)
+                              :- * Project (95)
+                              :  +- * BroadcastHashJoin Inner BuildRight (94)
+                              :     :- * Project (92)
+                              :     :  +- * BroadcastHashJoin Inner BuildRight (91)
+                              :     :     :- * Project (86)
+                              :     :     :  +- * BroadcastHashJoin Inner BuildRight (85)
+                              :     :     :     :- * Project (83)
+                              :     :     :     :  +- * SortMergeJoin LeftOuter (82)
+                              :     :     :     :     :- * Sort (75)
+                              :     :     :     :     :  +- Exchange (74)
+                              :     :     :     :     :     +- * ColumnarToRow (73)
+                              :     :     :     :     :        +- CometFilter (72)
+                              :     :     :     :     :           +- CometScan parquet spark_catalog.default.web_sales (71)
+                              :     :     :     :     +- * Sort (81)
+                              :     :     :     :        +- Exchange (80)
+                              :     :     :     :           +- * ColumnarToRow (79)
+                              :     :     :     :              +- CometProject (78)
+                              :     :     :     :                 +- CometFilter (77)
+                              :     :     :     :                    +- CometScan parquet spark_catalog.default.web_returns (76)
+                              :     :     :     +- ReusedExchange (84)
+                              :     :     +- BroadcastExchange (90)
+                              :     :        +- * ColumnarToRow (89)
+                              :     :           +- CometFilter (88)
+                              :     :              +- CometScan parquet spark_catalog.default.web_site (87)
+                              :     +- ReusedExchange (93)
+                              +- ReusedExchange (96)
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
@@ -117,13 +120,16 @@ ReadSchema: struct<ss_item_sk:int,ss_store_sk:int,ss_promo_sk:int,ss_ticket_numb
 Input [7]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ticket_number#4, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7]
 Condition : ((isnotnull(ss_store_sk#2) AND isnotnull(ss_item_sk#1)) AND isnotnull(ss_promo_sk#3))
 
-(3) CometExchange
+(3) ColumnarToRow [codegen id : 1]
 Input [7]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ticket_number#4, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7]
-Arguments: hashpartitioning(ss_item_sk#1, ss_ticket_number#4, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(4) CometSort
+(4) Exchange
 Input [7]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ticket_number#4, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7]
-Arguments: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ticket_number#4, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7], [ss_item_sk#1 ASC NULLS FIRST, ss_ticket_number#4 ASC NULLS FIRST]
+Arguments: hashpartitioning(ss_item_sk#1, ss_ticket_number#4, 5), ENSURE_REQUIREMENTS, [plan_id=1]
+
+(5) Sort [codegen id : 2]
+Input [7]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ticket_number#4, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7]
+Arguments: [ss_item_sk#1 ASC NULLS FIRST, ss_ticket_number#4 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.store_returns
 Output [5]: [sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12, sr_returned_date_sk#13]
@@ -132,44 +138,45 @@ Location [not included in comparison]/{warehouse_dir}/store_returns]
 PushedFilters: [IsNotNull(sr_item_sk), IsNotNull(sr_ticket_number)]
 ReadSchema: struct<sr_item_sk:int,sr_ticket_number:int,sr_return_amt:decimal(7,2),sr_net_loss:decimal(7,2)>
 
-(6) CometFilter
+(7) CometFilter
 Input [5]: [sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12, sr_returned_date_sk#13]
 Condition : (isnotnull(sr_item_sk#9) AND isnotnull(sr_ticket_number#10))
 
-(7) CometProject
+(8) CometProject
 Input [5]: [sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12, sr_returned_date_sk#13]
 Arguments: [sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12], [sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12]
 
-(8) CometExchange
+(9) ColumnarToRow [codegen id : 3]
 Input [4]: [sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12]
-Arguments: hashpartitioning(sr_item_sk#9, sr_ticket_number#10, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]
 
-(9) CometSort
+(10) Exchange
 Input [4]: [sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12]
-Arguments: [sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12], [sr_item_sk#9 ASC NULLS FIRST, sr_ticket_number#10 ASC NULLS FIRST]
+Arguments: hashpartitioning(sr_item_sk#9, sr_ticket_number#10, 5), ENSURE_REQUIREMENTS, [plan_id=2]
 
-(10) CometSortMergeJoin
-Left output [7]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ticket_number#4, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7]
-Right output [4]: [sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12]
-Arguments: [ss_item_sk#1, ss_ticket_number#4], [sr_item_sk#9, sr_ticket_number#10], LeftOuter
+(11) Sort [codegen id : 4]
+Input [4]: [sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12]
+Arguments: [sr_item_sk#9 ASC NULLS FIRST, sr_ticket_number#10 ASC NULLS FIRST], false, 0
 
-(11) CometProject
-Input [11]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ticket_number#4, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12]
-Arguments: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#11, sr_net_loss#12], [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#11, sr_net_loss#12]
+(12) SortMergeJoin [codegen id : 9]
+Left keys [2]: [ss_item_sk#1, ss_ticket_number#4]
+Right keys [2]: [sr_item_sk#9, sr_ticket_number#10]
+Join type: LeftOuter
+Join condition: None
 
-(12) ColumnarToRow [codegen id : 5]
-Input [8]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#11, sr_net_loss#12]
+(13) Project [codegen id : 9]
+Output [8]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#11, sr_net_loss#12]
+Input [11]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ticket_number#4, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_item_sk#9, sr_ticket_number#10, sr_return_amt#11, sr_net_loss#12]
 
-(13) ReusedExchange [Reuses operator id: 109]
+(14) ReusedExchange [Reuses operator id: 112]
 Output [1]: [d_date_sk#14]
 
-(14) BroadcastHashJoin [codegen id : 5]
+(15) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_sold_date_sk#7]
 Right keys [1]: [d_date_sk#14]
 Join type: Inner
 Join condition: None
 
-(15) Project [codegen id : 5]
+(16) Project [codegen id : 9]
 Output [7]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#11, sr_net_loss#12]
 Input [9]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#11, sr_net_loss#12, d_date_sk#14]
 
@@ -180,24 +187,24 @@ Location [not included in comparison]/{warehouse_dir}/store]
 PushedFilters: [IsNotNull(s_store_sk)]
 ReadSchema: struct<s_store_sk:int,s_store_id:string>
 
-(17) CometFilter
+(18) CometFilter
 Input [2]: [s_store_sk#15, s_store_id#16]
 Condition : isnotnull(s_store_sk#15)
 
-(18) ColumnarToRow [codegen id : 2]
+(19) ColumnarToRow [codegen id : 6]
 Input [2]: [s_store_sk#15, s_store_id#16]
 
-(19) BroadcastExchange
+(20) BroadcastExchange
 Input [2]: [s_store_sk#15, s_store_id#16]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=3]
 
-(20) BroadcastHashJoin [codegen id : 5]
+(21) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_store_sk#2]
 Right keys [1]: [s_store_sk#15]
 Join type: Inner
 Join condition: None
 
-(21) Project [codegen id : 5]
+(22) Project [codegen id : 9]
 Output [7]: [ss_item_sk#1, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#11, sr_net_loss#12, s_store_id#16]
 Input [9]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#11, sr_net_loss#12, s_store_sk#15, s_store_id#16]
 
@@ -208,28 +215,28 @@ Location [not included in comparison]/{warehouse_dir}/item]
 PushedFilters: [IsNotNull(i_current_price), GreaterThan(i_current_price,50.00), IsNotNull(i_item_sk)]
 ReadSchema: struct<i_item_sk:int,i_current_price:decimal(7,2)>
 
-(23) CometFilter
+(24) CometFilter
 Input [2]: [i_item_sk#17, i_current_price#18]
 Condition : ((isnotnull(i_current_price#18) AND (i_current_price#18 > 50.00)) AND isnotnull(i_item_sk#17))
 
-(24) CometProject
+(25) CometProject
 Input [2]: [i_item_sk#17, i_current_price#18]
 Arguments: [i_item_sk#17], [i_item_sk#17]
 
-(25) ColumnarToRow [codegen id : 3]
+(26) ColumnarToRow [codegen id : 7]
 Input [1]: [i_item_sk#17]
 
-(26) BroadcastExchange
+(27) BroadcastExchange
 Input [1]: [i_item_sk#17]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=4]
 
-(27) BroadcastHashJoin [codegen id : 5]
+(28) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_item_sk#1]
 Right keys [1]: [i_item_sk#17]
 Join type: Inner
 Join condition: None
 
-(28) Project [codegen id : 5]
+(29) Project [codegen id : 9]
 Output [6]: [ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#11, sr_net_loss#12, s_store_id#16]
 Input [8]: [ss_item_sk#1, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#11, sr_net_loss#12, s_store_id#16, i_item_sk#17]
 
@@ -240,43 +247,43 @@ Location [not included in comparison]/{warehouse_dir}/promotion]
 PushedFilters: [IsNotNull(p_channel_tv), EqualTo(p_channel_tv,N), IsNotNull(p_promo_sk)]
 ReadSchema: struct<p_promo_sk:int,p_channel_tv:string>
 
-(30) CometFilter
+(31) CometFilter
 Input [2]: [p_promo_sk#19, p_channel_tv#20]
 Condition : ((isnotnull(p_channel_tv#20) AND (p_channel_tv#20 = N)) AND isnotnull(p_promo_sk#19))
 
-(31) CometProject
+(32) CometProject
 Input [2]: [p_promo_sk#19, p_channel_tv#20]
 Arguments: [p_promo_sk#19], [p_promo_sk#19]
 
-(32) ColumnarToRow [codegen id : 4]
+(33) ColumnarToRow [codegen id : 8]
 Input [1]: [p_promo_sk#19]
 
-(33) BroadcastExchange
+(34) BroadcastExchange
 Input [1]: [p_promo_sk#19]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=5]
 
-(34) BroadcastHashJoin [codegen id : 5]
+(35) BroadcastHashJoin [codegen id : 9]
 Left keys [1]: [ss_promo_sk#3]
 Right keys [1]: [p_promo_sk#19]
 Join type: Inner
 Join condition: None
 
-(35) Project [codegen id : 5]
+(36) Project [codegen id : 9]
 Output [5]: [ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#11, sr_net_loss#12, s_store_id#16]
 Input [7]: [ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#11, sr_net_loss#12, s_store_id#16, p_promo_sk#19]
 
-(36) HashAggregate [codegen id : 5]
+(37) HashAggregate [codegen id : 9]
 Input [5]: [ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#11, sr_net_loss#12, s_store_id#16]
 Keys [1]: [s_store_id#16]
 Functions [3]: [partial_sum(UnscaledValue(ss_ext_sales_price#5)), partial_sum(coalesce(cast(sr_return_amt#11 as decimal(12,2)), 0.00)), partial_sum((ss_net_profit#6 - coalesce(cast(sr_net_loss#12 as decimal(12,2)), 0.00)))]
 Aggregate Attributes [5]: [sum#21, sum#22, isEmpty#23, sum#24, isEmpty#25]
 Results [6]: [s_store_id#16, sum#26, sum#27, isEmpty#28, sum#29, isEmpty#30]
 
-(37) Exchange
+(38) Exchange
 Input [6]: [s_store_id#16, sum#26, sum#27, isEmpty#28, sum#29, isEmpty#30]
 Arguments: hashpartitioning(s_store_id#16, 5), ENSURE_REQUIREMENTS, [plan_id=6]
 
-(38) HashAggregate [codegen id : 6]
+(39) HashAggregate [codegen id : 10]
 Input [6]: [s_store_id#16, sum#26, sum#27, isEmpty#28, sum#29, isEmpty#30]
 Keys [1]: [s_store_id#16]
 Functions [3]: [sum(UnscaledValue(ss_ext_sales_price#5)), sum(coalesce(cast(sr_return_amt#11 as decimal(12,2)), 0.00)), sum((ss_net_profit#6 - coalesce(cast(sr_net_loss#12 as decimal(12,2)), 0.00)))]
@@ -291,17 +298,20 @@ PartitionFilters: [isnotnull(cs_sold_date_sk#45), dynamicpruningexpression(cs_so
 PushedFilters: [IsNotNull(cs_catalog_page_sk), IsNotNull(cs_item_sk), IsNotNull(cs_promo_sk)]
 ReadSchema: struct<cs_catalog_page_sk:int,cs_item_sk:int,cs_promo_sk:int,cs_order_number:int,cs_ext_sales_price:decimal(7,2),cs_net_profit:decimal(7,2)>
 
-(40) CometFilter
+(41) CometFilter
 Input [7]: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_order_number#42, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45]
 Condition : ((isnotnull(cs_catalog_page_sk#39) AND isnotnull(cs_item_sk#40)) AND isnotnull(cs_promo_sk#41))
 
-(41) CometExchange
+(42) ColumnarToRow [codegen id : 11]
+Input [7]: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_order_number#42, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45]
+
+(43) Exchange
 Input [7]: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_order_number#42, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45]
-Arguments: hashpartitioning(cs_item_sk#40, cs_order_number#42, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=7]
+Arguments: hashpartitioning(cs_item_sk#40, cs_order_number#42, 5), ENSURE_REQUIREMENTS, [plan_id=7]
 
-(42) CometSort
+(44) Sort [codegen id : 12]
 Input [7]: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_order_number#42, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45]
-Arguments: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_order_number#42, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45], [cs_item_sk#40 ASC NULLS FIRST, cs_order_number#42 ASC NULLS FIRST]
+Arguments: [cs_item_sk#40 ASC NULLS FIRST, cs_order_number#42 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.catalog_returns
 Output [5]: [cr_item_sk#47, cr_order_number#48, cr_return_amount#49, cr_net_loss#50, cr_returned_date_sk#51]
@@ -310,44 +320,45 @@ Location [not included in comparison]/{warehouse_dir}/catalog_returns]
 PushedFilters: [IsNotNull(cr_item_sk), IsNotNull(cr_order_number)]
 ReadSchema: struct<cr_item_sk:int,cr_order_number:int,cr_return_amount:decimal(7,2),cr_net_loss:decimal(7,2)>
 
-(44) CometFilter
+(46) CometFilter
 Input [5]: [cr_item_sk#47, cr_order_number#48, cr_return_amount#49, cr_net_loss#50, cr_returned_date_sk#51]
 Condition : (isnotnull(cr_item_sk#47) AND isnotnull(cr_order_number#48))
 
-(45) CometProject
+(47) CometProject
 Input [5]: [cr_item_sk#47, cr_order_number#48, cr_return_amount#49, cr_net_loss#50, cr_returned_date_sk#51]
 Arguments: [cr_item_sk#47, cr_order_number#48, cr_return_amount#49, cr_net_loss#50], [cr_item_sk#47, cr_order_number#48, cr_return_amount#49, cr_net_loss#50]
 
-(46) CometExchange
+(48) ColumnarToRow [codegen id : 13]
+Input [4]: [cr_item_sk#47, cr_order_number#48, cr_return_amount#49, cr_net_loss#50]
+
+(49) Exchange
 Input [4]: [cr_item_sk#47, cr_order_number#48, cr_return_amount#49, cr_net_loss#50]
-Arguments: hashpartitioning(cr_item_sk#47, cr_order_number#48, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=8]
+Arguments: hashpartitioning(cr_item_sk#47, cr_order_number#48, 5), ENSURE_REQUIREMENTS, [plan_id=8]
 
-(47) CometSort
+(50) Sort [codegen id : 14]
 Input [4]: [cr_item_sk#47, cr_order_number#48, cr_return_amount#49, cr_net_loss#50]
-Arguments: [cr_item_sk#47, cr_order_number#48, cr_return_amount#49, cr_net_loss#50], [cr_item_sk#47 ASC NULLS FIRST, cr_order_number#48 ASC NULLS FIRST]
+Arguments: [cr_item_sk#47 ASC NULLS FIRST, cr_order_number#48 ASC NULLS FIRST], false, 0
 
-(48) CometSortMergeJoin
-Left output [7]: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_order_number#42, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45]
-Right output [4]: [cr_item_sk#47, cr_order_number#48, cr_return_amount#49, cr_net_loss#50]
-Arguments: [cs_item_sk#40, cs_order_number#42], [cr_item_sk#47, cr_order_number#48], LeftOuter
+(51) SortMergeJoin [codegen id : 19]
+Left keys [2]: [cs_item_sk#40, cs_order_number#42]
+Right keys [2]: [cr_item_sk#47, cr_order_number#48]
+Join type: LeftOuter
+Join condition: None
 
-(49) CometProject
+(52) Project [codegen id : 19]
+Output [8]: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45, cr_return_amount#49, cr_net_loss#50]
 Input [11]: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_order_number#42, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45, cr_item_sk#47, cr_order_number#48, cr_return_amount#49, cr_net_loss#50]
-Arguments: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45, cr_return_amount#49, cr_net_loss#50], [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45, cr_return_amount#49, cr_net_loss#50]
-
-(50) ColumnarToRow [codegen id : 11]
-Input [8]: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45, cr_return_amount#49, cr_net_loss#50]
 
-(51) ReusedExchange [Reuses operator id: 109]
+(53) ReusedExchange [Reuses operator id: 112]
 Output [1]: [d_date_sk#52]
 
-(52) BroadcastHashJoin [codegen id : 11]
+(54) BroadcastHashJoin [codegen id : 19]
 Left keys [1]: [cs_sold_date_sk#45]
 Right keys [1]: [d_date_sk#52]
 Join type: Inner
 Join condition: None
 
-(53) Project [codegen id : 11]
+(55) Project [codegen id : 19]
 Output [7]: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_ext_sales_price#43, cs_net_profit#44, cr_return_amount#49, cr_net_loss#50]
 Input [9]: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_ext_sales_price#43, cs_net_profit#44, cs_sold_date_sk#45, cr_return_amount#49, cr_net_loss#50, d_date_sk#52]
 
@@ -358,65 +369,65 @@ Location [not included in comparison]/{warehouse_dir}/catalog_page]
 PushedFilters: [IsNotNull(cp_catalog_page_sk)]
 ReadSchema: struct<cp_catalog_page_sk:int,cp_catalog_page_id:string>
 
-(55) CometFilter
+(57) CometFilter
 Input [2]: [cp_catalog_page_sk#53, cp_catalog_page_id#54]
 Condition : isnotnull(cp_catalog_page_sk#53)
 
-(56) ColumnarToRow [codegen id : 8]
+(58) ColumnarToRow [codegen id : 16]
 Input [2]: [cp_catalog_page_sk#53, cp_catalog_page_id#54]
 
-(57) BroadcastExchange
+(59) BroadcastExchange
 Input [2]: [cp_catalog_page_sk#53, cp_catalog_page_id#54]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=9]
 
-(58) BroadcastHashJoin [codegen id : 11]
+(60) BroadcastHashJoin [codegen id : 19]
 Left keys [1]: [cs_catalog_page_sk#39]
 Right keys [1]: [cp_catalog_page_sk#53]
 Join type: Inner
 Join condition: None
 
-(59) Project [codegen id : 11]
+(61) Project [codegen id : 19]
 Output [7]: [cs_item_sk#40, cs_promo_sk#41, cs_ext_sales_price#43, cs_net_profit#44, cr_return_amount#49, cr_net_loss#50, cp_catalog_page_id#54]
 Input [9]: [cs_catalog_page_sk#39, cs_item_sk#40, cs_promo_sk#41, cs_ext_sales_price#43, cs_net_profit#44, cr_return_amount#49, cr_net_loss#50, cp_catalog_page_sk#53, cp_catalog_page_id#54]
 
-(60) ReusedExchange [Reuses operator id: 26]
+(62) ReusedExchange [Reuses operator id: 27]
 Output [1]: [i_item_sk#55]
 
-(61) BroadcastHashJoin [codegen id : 11]
+(63) BroadcastHashJoin [codegen id : 19]
 Left keys [1]: [cs_item_sk#40]
 Right keys [1]: [i_item_sk#55]
 Join type: Inner
 Join condition: None
 
-(62) Project [codegen id : 11]
+(64) Project [codegen id : 19]
 Output [6]: [cs_promo_sk#41, cs_ext_sales_price#43, cs_net_profit#44, cr_return_amount#49, cr_net_loss#50, cp_catalog_page_id#54]
 Input [8]: [cs_item_sk#40, cs_promo_sk#41, cs_ext_sales_price#43, cs_net_profit#44, cr_return_amount#49, cr_net_loss#50, cp_catalog_page_id#54, i_item_sk#55]
 
-(63) ReusedExchange [Reuses operator id: 33]
+(65) ReusedExchange [Reuses operator id: 34]
 Output [1]: [p_promo_sk#56]
 
-(64) BroadcastHashJoin [codegen id : 11]
+(66) BroadcastHashJoin [codegen id : 19]
 Left keys [1]: [cs_promo_sk#41]
 Right keys [1]: [p_promo_sk#56]
 Join type: Inner
 Join condition: None
 
-(65) Project [codegen id : 11]
+(67) Project [codegen id : 19]
 Output [5]: [cs_ext_sales_price#43, cs_net_profit#44, cr_return_amount#49, cr_net_loss#50, cp_catalog_page_id#54]
 Input [7]: [cs_promo_sk#41, cs_ext_sales_price#43, cs_net_profit#44, cr_return_amount#49, cr_net_loss#50, cp_catalog_page_id#54, p_promo_sk#56]
 
-(66) HashAggregate [codegen id : 11]
+(68) HashAggregate [codegen id : 19]
 Input [5]: [cs_ext_sales_price#43, cs_net_profit#44, cr_return_amount#49, cr_net_loss#50, cp_catalog_page_id#54]
 Keys [1]: [cp_catalog_page_id#54]
 Functions [3]: [partial_sum(UnscaledValue(cs_ext_sales_price#43)), partial_sum(coalesce(cast(cr_return_amount#49 as decimal(12,2)), 0.00)), partial_sum((cs_net_profit#44 - coalesce(cast(cr_net_loss#50 as decimal(12,2)), 0.00)))]
 Aggregate Attributes [5]: [sum#57, sum#58, isEmpty#59, sum#60, isEmpty#61]
 Results [6]: [cp_catalog_page_id#54, sum#62, sum#63, isEmpty#64, sum#65, isEmpty#66]
 
-(67) Exchange
+(69) Exchange
 Input [6]: [cp_catalog_page_id#54, sum#62, sum#63, isEmpty#64, sum#65, isEmpty#66]
 Arguments: hashpartitioning(cp_catalog_page_id#54, 5), ENSURE_REQUIREMENTS, [plan_id=10]
 
-(68) HashAggregate [codegen id : 12]
+(70) HashAggregate [codegen id : 20]
 Input [6]: [cp_catalog_page_id#54, sum#62, sum#63, isEmpty#64, sum#65, isEmpty#66]
 Keys [1]: [cp_catalog_page_id#54]
 Functions [3]: [sum(UnscaledValue(cs_ext_sales_price#43)), sum(coalesce(cast(cr_return_amount#49 as decimal(12,2)), 0.00)), sum((cs_net_profit#44 - coalesce(cast(cr_net_loss#50 as decimal(12,2)), 0.00)))]
@@ -431,17 +442,20 @@ PartitionFilters: [isnotnull(ws_sold_date_sk#81), dynamicpruningexpression(ws_so
 PushedFilters: [IsNotNull(ws_web_site_sk), IsNotNull(ws_item_sk), IsNotNull(ws_promo_sk)]
 ReadSchema: struct<ws_item_sk:int,ws_web_site_sk:int,ws_promo_sk:int,ws_order_number:int,ws_ext_sales_price:decimal(7,2),ws_net_profit:decimal(7,2)>
 
-(70) CometFilter
+(72) CometFilter
 Input [7]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_order_number#78, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81]
 Condition : ((isnotnull(ws_web_site_sk#76) AND isnotnull(ws_item_sk#75)) AND isnotnull(ws_promo_sk#77))
 
-(71) CometExchange
+(73) ColumnarToRow [codegen id : 21]
+Input [7]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_order_number#78, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81]
+
+(74) Exchange
 Input [7]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_order_number#78, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81]
-Arguments: hashpartitioning(ws_item_sk#75, ws_order_number#78, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=11]
+Arguments: hashpartitioning(ws_item_sk#75, ws_order_number#78, 5), ENSURE_REQUIREMENTS, [plan_id=11]
 
-(72) CometSort
+(75) Sort [codegen id : 22]
 Input [7]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_order_number#78, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81]
-Arguments: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_order_number#78, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81], [ws_item_sk#75 ASC NULLS FIRST, ws_order_number#78 ASC NULLS FIRST]
+Arguments: [ws_item_sk#75 ASC NULLS FIRST, ws_order_number#78 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.web_returns
 Output [5]: [wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87]
@@ -450,44 +464,45 @@ Location [not included in comparison]/{warehouse_dir}/web_returns]
 PushedFilters: [IsNotNull(wr_item_sk), IsNotNull(wr_order_number)]
 ReadSchema: struct<wr_item_sk:int,wr_order_number:int,wr_return_amt:decimal(7,2),wr_net_loss:decimal(7,2)>
 
-(74) CometFilter
+(77) CometFilter
 Input [5]: [wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87]
 Condition : (isnotnull(wr_item_sk#83) AND isnotnull(wr_order_number#84))
 
-(75) CometProject
+(78) CometProject
 Input [5]: [wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87]
 Arguments: [wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86], [wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86]
 
-(76) CometExchange
+(79) ColumnarToRow [codegen id : 23]
 Input [4]: [wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86]
-Arguments: hashpartitioning(wr_item_sk#83, wr_order_number#84, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=12]
 
-(77) CometSort
+(80) Exchange
 Input [4]: [wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86]
-Arguments: [wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86], [wr_item_sk#83 ASC NULLS FIRST, wr_order_number#84 ASC NULLS FIRST]
+Arguments: hashpartitioning(wr_item_sk#83, wr_order_number#84, 5), ENSURE_REQUIREMENTS, [plan_id=12]
 
-(78) CometSortMergeJoin
-Left output [7]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_order_number#78, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81]
-Right output [4]: [wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86]
-Arguments: [ws_item_sk#75, ws_order_number#78], [wr_item_sk#83, wr_order_number#84], LeftOuter
+(81) Sort [codegen id : 24]
+Input [4]: [wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86]
+Arguments: [wr_item_sk#83 ASC NULLS FIRST, wr_order_number#84 ASC NULLS FIRST], false, 0
 
-(79) CometProject
-Input [11]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_order_number#78, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81, wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86]
-Arguments: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81, wr_return_amt#85, wr_net_loss#86], [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81, wr_return_amt#85, wr_net_loss#86]
+(82) SortMergeJoin [codegen id : 29]
+Left keys [2]: [ws_item_sk#75, ws_order_number#78]
+Right keys [2]: [wr_item_sk#83, wr_order_number#84]
+Join type: LeftOuter
+Join condition: None
 
-(80) ColumnarToRow [codegen id : 17]
-Input [8]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81, wr_return_amt#85, wr_net_loss#86]
+(83) Project [codegen id : 29]
+Output [8]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81, wr_return_amt#85, wr_net_loss#86]
+Input [11]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_order_number#78, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81, wr_item_sk#83, wr_order_number#84, wr_return_amt#85, wr_net_loss#86]
 
-(81) ReusedExchange [Reuses operator id: 109]
+(84) ReusedExchange [Reuses operator id: 112]
 Output [1]: [d_date_sk#88]
 
-(82) BroadcastHashJoin [codegen id : 17]
+(85) BroadcastHashJoin [codegen id : 29]
 Left keys [1]: [ws_sold_date_sk#81]
 Right keys [1]: [d_date_sk#88]
 Join type: Inner
 Join condition: None
 
-(83) Project [codegen id : 17]
+(86) Project [codegen id : 29]
 Output [7]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_ext_sales_price#79, ws_net_profit#80, wr_return_amt#85, wr_net_loss#86]
 Input [9]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81, wr_return_amt#85, wr_net_loss#86, d_date_sk#88]
 
@@ -498,107 +513,107 @@ Location [not included in comparison]/{warehouse_dir}/web_site]
 PushedFilters: [IsNotNull(web_site_sk)]
 ReadSchema: struct<web_site_sk:int,web_site_id:string>
 
-(85) CometFilter
+(88) CometFilter
 Input [2]: [web_site_sk#89, web_site_id#90]
 Condition : isnotnull(web_site_sk#89)
 
-(86) ColumnarToRow [codegen id : 14]
+(89) ColumnarToRow [codegen id : 26]
 Input [2]: [web_site_sk#89, web_site_id#90]
 
-(87) BroadcastExchange
+(90) BroadcastExchange
 Input [2]: [web_site_sk#89, web_site_id#90]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=13]
 
-(88) BroadcastHashJoin [codegen id : 17]
+(91) BroadcastHashJoin [codegen id : 29]
 Left keys [1]: [ws_web_site_sk#76]
 Right keys [1]: [web_site_sk#89]
 Join type: Inner
 Join condition: None
 
-(89) Project [codegen id : 17]
+(92) Project [codegen id : 29]
 Output [7]: [ws_item_sk#75, ws_promo_sk#77, ws_ext_sales_price#79, ws_net_profit#80, wr_return_amt#85, wr_net_loss#86, web_site_id#90]
 Input [9]: [ws_item_sk#75, ws_web_site_sk#76, ws_promo_sk#77, ws_ext_sales_price#79, ws_net_profit#80, wr_return_amt#85, wr_net_loss#86, web_site_sk#89, web_site_id#90]
 
-(90) ReusedExchange [Reuses operator id: 26]
+(93) ReusedExchange [Reuses operator id: 27]
 Output [1]: [i_item_sk#91]
 
-(91) BroadcastHashJoin [codegen id : 17]
+(94) BroadcastHashJoin [codegen id : 29]
 Left keys [1]: [ws_item_sk#75]
 Right keys [1]: [i_item_sk#91]
 Join type: Inner
 Join condition: None
 
-(92) Project [codegen id : 17]
+(95) Project [codegen id : 29]
 Output [6]: [ws_promo_sk#77, ws_ext_sales_price#79, ws_net_profit#80, wr_return_amt#85, wr_net_loss#86, web_site_id#90]
 Input [8]: [ws_item_sk#75, ws_promo_sk#77, ws_ext_sales_price#79, ws_net_profit#80, wr_return_amt#85, wr_net_loss#86, web_site_id#90, i_item_sk#91]
 
-(93) ReusedExchange [Reuses operator id: 33]
+(96) ReusedExchange [Reuses operator id: 34]
 Output [1]: [p_promo_sk#92]
 
-(94) BroadcastHashJoin [codegen id : 17]
+(97) BroadcastHashJoin [codegen id : 29]
 Left keys [1]: [ws_promo_sk#77]
 Right keys [1]: [p_promo_sk#92]
 Join type: Inner
 Join condition: None
 
-(95) Project [codegen id : 17]
+(98) Project [codegen id : 29]
 Output [5]: [ws_ext_sales_price#79, ws_net_profit#80, wr_return_amt#85, wr_net_loss#86, web_site_id#90]
 Input [7]: [ws_promo_sk#77, ws_ext_sales_price#79, ws_net_profit#80, wr_return_amt#85, wr_net_loss#86, web_site_id#90, p_promo_sk#92]
 
-(96) HashAggregate [codegen id : 17]
+(99) HashAggregate [codegen id : 29]
 Input [5]: [ws_ext_sales_price#79, ws_net_profit#80, wr_return_amt#85, wr_net_loss#86, web_site_id#90]
 Keys [1]: [web_site_id#90]
 Functions [3]: [partial_sum(UnscaledValue(ws_ext_sales_price#79)), partial_sum(coalesce(cast(wr_return_amt#85 as decimal(12,2)), 0.00)), partial_sum((ws_net_profit#80 - coalesce(cast(wr_net_loss#86 as decimal(12,2)), 0.00)))]
 Aggregate Attributes [5]: [sum#93, sum#94, isEmpty#95, sum#96, isEmpty#97]
 Results [6]: [web_site_id#90, sum#98, sum#99, isEmpty#100, sum#101, isEmpty#102]
 
-(97) Exchange
+(100) Exchange
 Input [6]: [web_site_id#90, sum#98, sum#99, isEmpty#100, sum#101, isEmpty#102]
 Arguments: hashpartitioning(web_site_id#90, 5), ENSURE_REQUIREMENTS, [plan_id=14]
 
-(98) HashAggregate [codegen id : 18]
+(101) HashAggregate [codegen id : 30]
 Input [6]: [web_site_id#90, sum#98, sum#99, isEmpty#100, sum#101, isEmpty#102]
 Keys [1]: [web_site_id#90]
 Functions [3]: [sum(UnscaledValue(ws_ext_sales_price#79)), sum(coalesce(cast(wr_return_amt#85 as decimal(12,2)), 0.00)), sum((ws_net_profit#80 - coalesce(cast(wr_net_loss#86 as decimal(12,2)), 0.00)))]
 Aggregate Attributes [3]: [sum(UnscaledValue(ws_ext_sales_price#79))#103, sum(coalesce(cast(wr_return_amt#85 as decimal(12,2)), 0.00))#104, sum((ws_net_profit#80 - coalesce(cast(wr_net_loss#86 as decimal(12,2)), 0.00)))#105]
 Results [5]: [MakeDecimal(sum(UnscaledValue(ws_ext_sales_price#79))#103,17,2) AS sales#106, sum(coalesce(cast(wr_return_amt#85 as decimal(12,2)), 0.00))#104 AS returns#107, sum((ws_net_profit#80 - coalesce(cast(wr_net_loss#86 as decimal(12,2)), 0.00)))#105 AS profit#108, web channel AS channel#109, concat(web_site, web_site_id#90) AS id#110]
 
-(99) Union
+(102) Union
 
-(100) Expand [codegen id : 19]
+(103) Expand [codegen id : 31]
 Input [5]: [sales#34, returns#35, profit#36, channel#37, id#38]
 Arguments: [[sales#34, returns#35, profit#36, channel#37, id#38, 0], [sales#34, returns#35, profit#36, channel#37, null, 1], [sales#34, returns#35, profit#36, null, null, 3]], [sales#34, returns#35, profit#36, channel#111, id#112, spark_grouping_id#113]
 
-(101) HashAggregate [codegen id : 19]
+(104) HashAggregate [codegen id : 31]
 Input [6]: [sales#34, returns#35, profit#36, channel#111, id#112, spark_grouping_id#113]
 Keys [3]: [channel#111, id#112, spark_grouping_id#113]
 Functions [3]: [partial_sum(sales#34), partial_sum(returns#35), partial_sum(profit#36)]
 Aggregate Attributes [6]: [sum#114, isEmpty#115, sum#116, isEmpty#117, sum#118, isEmpty#119]
 Results [9]: [channel#111, id#112, spark_grouping_id#113, sum#120, isEmpty#121, sum#122, isEmpty#123, sum#124, isEmpty#125]
 
-(102) Exchange
+(105) Exchange
 Input [9]: [channel#111, id#112, spark_grouping_id#113, sum#120, isEmpty#121, sum#122, isEmpty#123, sum#124, isEmpty#125]
 Arguments: hashpartitioning(channel#111, id#112, spark_grouping_id#113, 5), ENSURE_REQUIREMENTS, [plan_id=15]
 
-(103) HashAggregate [codegen id : 20]
+(106) HashAggregate [codegen id : 32]
 Input [9]: [channel#111, id#112, spark_grouping_id#113, sum#120, isEmpty#121, sum#122, isEmpty#123, sum#124, isEmpty#125]
 Keys [3]: [channel#111, id#112, spark_grouping_id#113]
 Functions [3]: [sum(sales#34), sum(returns#35), sum(profit#36)]
 Aggregate Attributes [3]: [sum(sales#34)#126, sum(returns#35)#127, sum(profit#36)#128]
 Results [5]: [channel#111, id#112, sum(sales#34)#126 AS sales#129, sum(returns#35)#127 AS returns#130, sum(profit#36)#128 AS profit#131]
 
-(104) TakeOrderedAndProject
+(107) TakeOrderedAndProject
 Input [5]: [channel#111, id#112, sales#129, returns#130, profit#131]
 Arguments: 100, [channel#111 ASC NULLS FIRST, id#112 ASC NULLS FIRST], [channel#111, id#112, sales#129, returns#130, profit#131]
 
 ===== Subqueries =====
 
 Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#7 IN dynamicpruning#8
-BroadcastExchange (109)
-+- * ColumnarToRow (108)
-   +- CometProject (107)
-      +- CometFilter (106)
-         +- CometScan parquet spark_catalog.default.date_dim (105)
+BroadcastExchange (112)
++- * ColumnarToRow (111)
+   +- CometProject (110)
+      +- CometFilter (109)
+         +- CometScan parquet spark_catalog.default.date_dim (108)
 
 
 (unknown) Scan parquet spark_catalog.default.date_dim
@@ -608,23 +623,23 @@ Location [not included in comparison]/{warehouse_dir}/date_dim]
 PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,2000-08-23), LessThanOrEqual(d_date,2000-09-22), IsNotNull(d_date_sk)]
 ReadSchema: struct<d_date_sk:int,d_date:date>
 
-(106) CometFilter
+(109) CometFilter
 Input [2]: [d_date_sk#14, d_date#132]
 Condition : (((isnotnull(d_date#132) AND (d_date#132 >= 2000-08-23)) AND (d_date#132 <= 2000-09-22)) AND isnotnull(d_date_sk#14))
 
-(107) CometProject
+(110) CometProject
 Input [2]: [d_date_sk#14, d_date#132]
 Arguments: [d_date_sk#14], [d_date_sk#14]
 
-(108) ColumnarToRow [codegen id : 1]
+(111) ColumnarToRow [codegen id : 1]
 Input [1]: [d_date_sk#14]
 
-(109) BroadcastExchange
+(112) BroadcastExchange
 Input [1]: [d_date_sk#14]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=16]
 
-Subquery:2 Hosting operator id = 39 Hosting Expression = cs_sold_date_sk#45 IN dynamicpruning#8
+Subquery:2 Hosting operator id = 40 Hosting Expression = cs_sold_date_sk#45 IN dynamicpruning#8
 
-Subquery:3 Hosting operator id = 69 Hosting Expression = ws_sold_date_sk#81 IN dynamicpruning#8
+Subquery:3 Hosting operator id = 71 Hosting Expression = ws_sold_date_sk#81 IN dynamicpruning#8
 
 
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80/simplified.txt
index 8fc66cbe..7e257bdc 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80/simplified.txt
@@ -1,18 +1,18 @@
 TakeOrderedAndProject [channel,id,sales,returns,profit]
-  WholeStageCodegen (20)
+  WholeStageCodegen (32)
     HashAggregate [channel,id,spark_grouping_id,sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty]
       InputAdapter
         Exchange [channel,id,spark_grouping_id] #1
-          WholeStageCodegen (19)
+          WholeStageCodegen (31)
             HashAggregate [channel,id,spark_grouping_id,sales,returns,profit] [sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty]
               Expand [sales,returns,profit,channel,id]
                 InputAdapter
                   Union
-                    WholeStageCodegen (6)
+                    WholeStageCodegen (10)
                       HashAggregate [s_store_id,sum,sum,isEmpty,sum,isEmpty] [sum(UnscaledValue(ss_ext_sales_price)),sum(coalesce(cast(sr_return_amt as decimal(12,2)), 0.00)),sum((ss_net_profit - coalesce(cast(sr_net_loss as decimal(12,2)), 0.00))),sales,returns,profit,channel,id,sum,sum,isEmpty,sum,isEmpty]
                         InputAdapter
                           Exchange [s_store_id] #2
-                            WholeStageCodegen (5)
+                            WholeStageCodegen (9)
                               HashAggregate [s_store_id,ss_ext_sales_price,sr_return_amt,ss_net_profit,sr_net_loss] [sum,sum,isEmpty,sum,isEmpty,sum,sum,isEmpty,sum,isEmpty]
                                 Project [ss_ext_sales_price,ss_net_profit,sr_return_amt,sr_net_loss,s_store_id]
                                   BroadcastHashJoin [ss_promo_sk,p_promo_sk]
@@ -22,39 +22,49 @@ TakeOrderedAndProject [channel,id,sales,returns,profit]
                                           BroadcastHashJoin [ss_store_sk,s_store_sk]
                                             Project [ss_item_sk,ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_net_profit,sr_return_amt,sr_net_loss]
                                               BroadcastHashJoin [ss_sold_date_sk,d_date_sk]
-                                                ColumnarToRow
-                                                  InputAdapter
-                                                    CometProject [ss_item_sk,ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_net_profit,ss_sold_date_sk,sr_return_amt,sr_net_loss]
-                                                      CometSortMergeJoin [ss_item_sk,ss_ticket_number,sr_item_sk,sr_ticket_number]
-                                                        CometSort [ss_item_sk,ss_ticket_number]
-                                                          CometExchange [ss_item_sk,ss_ticket_number] #3
-                                                            CometFilter [ss_store_sk,ss_item_sk,ss_promo_sk]
-                                                              CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_store_sk,ss_promo_sk,ss_ticket_number,ss_ext_sales_price,ss_net_profit,ss_sold_date_sk]
-                                                                SubqueryBroadcast [d_date_sk] #1
-                                                                  BroadcastExchange #4
-                                                                    WholeStageCodegen (1)
-                                                                      ColumnarToRow
-                                                                        InputAdapter
-                                                                          CometProject [d_date_sk]
-                                                                            CometFilter [d_date,d_date_sk]
-                                                                              CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_date]
-                                                        CometSort [sr_item_sk,sr_ticket_number]
-                                                          CometExchange [sr_item_sk,sr_ticket_number] #5
-                                                            CometProject [sr_item_sk,sr_ticket_number,sr_return_amt,sr_net_loss]
-                                                              CometFilter [sr_item_sk,sr_ticket_number]
-                                                                CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_return_amt,sr_net_loss,sr_returned_date_sk]
+                                                Project [ss_item_sk,ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_net_profit,ss_sold_date_sk,sr_return_amt,sr_net_loss]
+                                                  SortMergeJoin [ss_item_sk,ss_ticket_number,sr_item_sk,sr_ticket_number]
+                                                    InputAdapter
+                                                      WholeStageCodegen (2)
+                                                        Sort [ss_item_sk,ss_ticket_number]
+                                                          InputAdapter
+                                                            Exchange [ss_item_sk,ss_ticket_number] #3
+                                                              WholeStageCodegen (1)
+                                                                ColumnarToRow
+                                                                  InputAdapter
+                                                                    CometFilter [ss_store_sk,ss_item_sk,ss_promo_sk]
+                                                                      CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_store_sk,ss_promo_sk,ss_ticket_number,ss_ext_sales_price,ss_net_profit,ss_sold_date_sk]
+                                                                        SubqueryBroadcast [d_date_sk] #1
+                                                                          BroadcastExchange #4
+                                                                            WholeStageCodegen (1)
+                                                                              ColumnarToRow
+                                                                                InputAdapter
+                                                                                  CometProject [d_date_sk]
+                                                                                    CometFilter [d_date,d_date_sk]
+                                                                                      CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_date]
+                                                    InputAdapter
+                                                      WholeStageCodegen (4)
+                                                        Sort [sr_item_sk,sr_ticket_number]
+                                                          InputAdapter
+                                                            Exchange [sr_item_sk,sr_ticket_number] #5
+                                                              WholeStageCodegen (3)
+                                                                ColumnarToRow
+                                                                  InputAdapter
+                                                                    CometProject [sr_item_sk,sr_ticket_number,sr_return_amt,sr_net_loss]
+                                                                      CometFilter [sr_item_sk,sr_ticket_number]
+                                                                        CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_ticket_number,sr_return_amt,sr_net_loss,sr_returned_date_sk]
                                                 InputAdapter
                                                   ReusedExchange [d_date_sk] #4
                                             InputAdapter
                                               BroadcastExchange #6
-                                                WholeStageCodegen (2)
+                                                WholeStageCodegen (6)
                                                   ColumnarToRow
                                                     InputAdapter
                                                       CometFilter [s_store_sk]
                                                         CometScan parquet spark_catalog.default.store [s_store_sk,s_store_id]
                                         InputAdapter
                                           BroadcastExchange #7
-                                            WholeStageCodegen (3)
+                                            WholeStageCodegen (7)
                                               ColumnarToRow
                                                 InputAdapter
                                                   CometProject [i_item_sk]
@@ -62,17 +72,17 @@ TakeOrderedAndProject [channel,id,sales,returns,profit]
                                                       CometScan parquet spark_catalog.default.item [i_item_sk,i_current_price]
                                     InputAdapter
                                       BroadcastExchange #8
-                                        WholeStageCodegen (4)
+                                        WholeStageCodegen (8)
                                           ColumnarToRow
                                             InputAdapter
                                               CometProject [p_promo_sk]
                                                 CometFilter [p_channel_tv,p_promo_sk]
                                                   CometScan parquet spark_catalog.default.promotion [p_promo_sk,p_channel_tv]
-                    WholeStageCodegen (12)
+                    WholeStageCodegen (20)
                       HashAggregate [cp_catalog_page_id,sum,sum,isEmpty,sum,isEmpty] [sum(UnscaledValue(cs_ext_sales_price)),sum(coalesce(cast(cr_return_amount as decimal(12,2)), 0.00)),sum((cs_net_profit - coalesce(cast(cr_net_loss as decimal(12,2)), 0.00))),sales,returns,profit,channel,id,sum,sum,isEmpty,sum,isEmpty]
                         InputAdapter
                           Exchange [cp_catalog_page_id] #9
-                            WholeStageCodegen (11)
+                            WholeStageCodegen (19)
                               HashAggregate [cp_catalog_page_id,cs_ext_sales_price,cr_return_amount,cs_net_profit,cr_net_loss] [sum,sum,isEmpty,sum,isEmpty,sum,sum,isEmpty,sum,isEmpty]
                                 Project [cs_ext_sales_price,cs_net_profit,cr_return_amount,cr_net_loss,cp_catalog_page_id]
                                   BroadcastHashJoin [cs_promo_sk,p_promo_sk]
@@ -82,25 +92,35 @@ TakeOrderedAndProject [channel,id,sales,returns,profit]
                                           BroadcastHashJoin [cs_catalog_page_sk,cp_catalog_page_sk]
                                             Project [cs_catalog_page_sk,cs_item_sk,cs_promo_sk,cs_ext_sales_price,cs_net_profit,cr_return_amount,cr_net_loss]
                                               BroadcastHashJoin [cs_sold_date_sk,d_date_sk]
-                                                ColumnarToRow
-                                                  InputAdapter
-                                                    CometProject [cs_catalog_page_sk,cs_item_sk,cs_promo_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk,cr_return_amount,cr_net_loss]
-                                                      CometSortMergeJoin [cs_item_sk,cs_order_number,cr_item_sk,cr_order_number]
-                                                        CometSort [cs_item_sk,cs_order_number]
-                                                          CometExchange [cs_item_sk,cs_order_number] #10
-                                                            CometFilter [cs_catalog_page_sk,cs_item_sk,cs_promo_sk]
-                                                              CometScan parquet spark_catalog.default.catalog_sales [cs_catalog_page_sk,cs_item_sk,cs_promo_sk,cs_order_number,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk]
-                                                                ReusedSubquery [d_date_sk] #1
-                                                        CometSort [cr_item_sk,cr_order_number]
-                                                          CometExchange [cr_item_sk,cr_order_number] #11
-                                                            CometProject [cr_item_sk,cr_order_number,cr_return_amount,cr_net_loss]
-                                                              CometFilter [cr_item_sk,cr_order_number]
-                                                                CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_return_amount,cr_net_loss,cr_returned_date_sk]
+                                                Project [cs_catalog_page_sk,cs_item_sk,cs_promo_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk,cr_return_amount,cr_net_loss]
+                                                  SortMergeJoin [cs_item_sk,cs_order_number,cr_item_sk,cr_order_number]
+                                                    InputAdapter
+                                                      WholeStageCodegen (12)
+                                                        Sort [cs_item_sk,cs_order_number]
+                                                          InputAdapter
+                                                            Exchange [cs_item_sk,cs_order_number] #10
+                                                              WholeStageCodegen (11)
+                                                                ColumnarToRow
+                                                                  InputAdapter
+                                                                    CometFilter [cs_catalog_page_sk,cs_item_sk,cs_promo_sk]
+                                                                      CometScan parquet spark_catalog.default.catalog_sales [cs_catalog_page_sk,cs_item_sk,cs_promo_sk,cs_order_number,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk]
+                                                                        ReusedSubquery [d_date_sk] #1
+                                                    InputAdapter
+                                                      WholeStageCodegen (14)
+                                                        Sort [cr_item_sk,cr_order_number]
+                                                          InputAdapter
+                                                            Exchange [cr_item_sk,cr_order_number] #11
+                                                              WholeStageCodegen (13)
+                                                                ColumnarToRow
+                                                                  InputAdapter
+                                                                    CometProject [cr_item_sk,cr_order_number,cr_return_amount,cr_net_loss]
+                                                                      CometFilter [cr_item_sk,cr_order_number]
+                                                                        CometScan parquet spark_catalog.default.catalog_returns [cr_item_sk,cr_order_number,cr_return_amount,cr_net_loss,cr_returned_date_sk]
                                                 InputAdapter
                                                   ReusedExchange [d_date_sk] #4
                                             InputAdapter
                                               BroadcastExchange #12
-                                                WholeStageCodegen (8)
+                                                WholeStageCodegen (16)
                                                   ColumnarToRow
                                                     InputAdapter
                                                       CometFilter [cp_catalog_page_sk]
@@ -109,11 +129,11 @@ TakeOrderedAndProject [channel,id,sales,returns,profit]
                                           ReusedExchange [i_item_sk] #7
                                     InputAdapter
                                       ReusedExchange [p_promo_sk] #8
-                    WholeStageCodegen (18)
+                    WholeStageCodegen (30)
                       HashAggregate [web_site_id,sum,sum,isEmpty,sum,isEmpty] [sum(UnscaledValue(ws_ext_sales_price)),sum(coalesce(cast(wr_return_amt as decimal(12,2)), 0.00)),sum((ws_net_profit - coalesce(cast(wr_net_loss as decimal(12,2)), 0.00))),sales,returns,profit,channel,id,sum,sum,isEmpty,sum,isEmpty]
                         InputAdapter
                           Exchange [web_site_id] #13
-                            WholeStageCodegen (17)
+                            WholeStageCodegen (29)
                               HashAggregate [web_site_id,ws_ext_sales_price,wr_return_amt,ws_net_profit,wr_net_loss] [sum,sum,isEmpty,sum,isEmpty,sum,sum,isEmpty,sum,isEmpty]
                                 Project [ws_ext_sales_price,ws_net_profit,wr_return_amt,wr_net_loss,web_site_id]
                                   BroadcastHashJoin [ws_promo_sk,p_promo_sk]
@@ -123,25 +143,35 @@ TakeOrderedAndProject [channel,id,sales,returns,profit]
                                           BroadcastHashJoin [ws_web_site_sk,web_site_sk]
                                             Project [ws_item_sk,ws_web_site_sk,ws_promo_sk,ws_ext_sales_price,ws_net_profit,wr_return_amt,wr_net_loss]
                                               BroadcastHashJoin [ws_sold_date_sk,d_date_sk]
-                                                ColumnarToRow
-                                                  InputAdapter
-                                                    CometProject [ws_item_sk,ws_web_site_sk,ws_promo_sk,ws_ext_sales_price,ws_net_profit,ws_sold_date_sk,wr_return_amt,wr_net_loss]
-                                                      CometSortMergeJoin [ws_item_sk,ws_order_number,wr_item_sk,wr_order_number]
-                                                        CometSort [ws_item_sk,ws_order_number]
-                                                          CometExchange [ws_item_sk,ws_order_number] #14
-                                                            CometFilter [ws_web_site_sk,ws_item_sk,ws_promo_sk]
-                                                              CometScan parquet spark_catalog.default.web_sales [ws_item_sk,ws_web_site_sk,ws_promo_sk,ws_order_number,ws_ext_sales_price,ws_net_profit,ws_sold_date_sk]
-                                                                ReusedSubquery [d_date_sk] #1
-                                                        CometSort [wr_item_sk,wr_order_number]
-                                                          CometExchange [wr_item_sk,wr_order_number] #15
-                                                            CometProject [wr_item_sk,wr_order_number,wr_return_amt,wr_net_loss]
-                                                              CometFilter [wr_item_sk,wr_order_number]
-                                                                CometScan parquet spark_catalog.default.web_returns [wr_item_sk,wr_order_number,wr_return_amt,wr_net_loss,wr_returned_date_sk]
+                                                Project [ws_item_sk,ws_web_site_sk,ws_promo_sk,ws_ext_sales_price,ws_net_profit,ws_sold_date_sk,wr_return_amt,wr_net_loss]
+                                                  SortMergeJoin [ws_item_sk,ws_order_number,wr_item_sk,wr_order_number]
+                                                    InputAdapter
+                                                      WholeStageCodegen (22)
+                                                        Sort [ws_item_sk,ws_order_number]
+                                                          InputAdapter
+                                                            Exchange [ws_item_sk,ws_order_number] #14
+                                                              WholeStageCodegen (21)
+                                                                ColumnarToRow
+                                                                  InputAdapter
+                                                                    CometFilter [ws_web_site_sk,ws_item_sk,ws_promo_sk]
+                                                                      CometScan parquet spark_catalog.default.web_sales [ws_item_sk,ws_web_site_sk,ws_promo_sk,ws_order_number,ws_ext_sales_price,ws_net_profit,ws_sold_date_sk]
+                                                                        ReusedSubquery [d_date_sk] #1
+                                                    InputAdapter
+                                                      WholeStageCodegen (24)
+                                                        Sort [wr_item_sk,wr_order_number]
+                                                          InputAdapter
+                                                            Exchange [wr_item_sk,wr_order_number] #15
+                                                              WholeStageCodegen (23)
+                                                                ColumnarToRow
+                                                                  InputAdapter
+                                                                    CometProject [wr_item_sk,wr_order_number,wr_return_amt,wr_net_loss]
+                                                                      CometFilter [wr_item_sk,wr_order_number]
+                                                                        CometScan parquet spark_catalog.default.web_returns [wr_item_sk,wr_order_number,wr_return_amt,wr_net_loss,wr_returned_date_sk]
                                                 InputAdapter
                                                   ReusedExchange [d_date_sk] #4
                                             InputAdapter
                                               BroadcastExchange #16
-                                                WholeStageCodegen (14)
+                                                WholeStageCodegen (26)
                                                   ColumnarToRow
                                                     InputAdapter
                                                       CometFilter [web_site_sk]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q9/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q9/explain.txt
index 16718114..4fb9fc54 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q9/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q9/explain.txt
@@ -27,9 +27,9 @@ Input [1]: [r_reason_sk#1]
 
 Subquery:1 Hosting operator id = 4 Hosting Expression = Subquery scalar-subquery#2, [id=#3]
 * Project (12)
-+- * ColumnarToRow (11)
-   +- CometHashAggregate (10)
-      +- CometExchange (9)
++- * HashAggregate (11)
+   +- Exchange (10)
+      +- * ColumnarToRow (9)
          +- CometHashAggregate (8)
             +- CometProject (7)
                +- CometFilter (6)
@@ -56,21 +56,23 @@ Input [2]: [ss_ext_discount_amt#18, ss_net_paid#19]
 Keys: []
 Functions [3]: [partial_count(1), partial_avg(UnscaledValue(ss_ext_discount_amt#18)), partial_avg(UnscaledValue(ss_net_paid#19))]
 
-(9) CometExchange
+(9) ColumnarToRow [codegen id : 1]
 Input [5]: [count#21, sum#22, count#23, sum#24, count#25]
-Arguments: SinglePartition, ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(10) CometHashAggregate
+(10) Exchange
+Input [5]: [count#21, sum#22, count#23, sum#24, count#25]
+Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=1]
+
+(11) HashAggregate [codegen id : 2]
 Input [5]: [count#21, sum#22, count#23, sum#24, count#25]
 Keys: []
 Functions [3]: [count(1), avg(UnscaledValue(ss_ext_discount_amt#18)), avg(UnscaledValue(ss_net_paid#19))]
+Aggregate Attributes [3]: [count(1)#26, avg(UnscaledValue(ss_ext_discount_amt#18))#27, avg(UnscaledValue(ss_net_paid#19))#28]
+Results [3]: [count(1)#26 AS count(1)#29, cast((avg(UnscaledValue(ss_ext_discount_amt#18))#27 / 100.0) as decimal(11,6)) AS avg(ss_ext_discount_amt)#30, cast((avg(UnscaledValue(ss_net_paid#19))#28 / 100.0) as decimal(11,6)) AS avg(ss_net_paid)#31]
 
-(11) ColumnarToRow [codegen id : 1]
-Input [3]: [count(1)#26, avg(ss_ext_discount_amt)#27, avg(ss_net_paid)#28]
-
-(12) Project [codegen id : 1]
-Output [1]: [named_struct(count(1), count(1)#26, avg(ss_ext_discount_amt), avg(ss_ext_discount_amt)#27, avg(ss_net_paid), avg(ss_net_paid)#28) AS mergedValue#29]
-Input [3]: [count(1)#26, avg(ss_ext_discount_amt)#27, avg(ss_net_paid)#28]
+(12) Project [codegen id : 2]
+Output [1]: [named_struct(count(1), count(1)#29, avg(ss_ext_discount_amt), avg(ss_ext_discount_amt)#30, avg(ss_net_paid), avg(ss_net_paid)#31) AS mergedValue#32]
+Input [3]: [count(1)#29, avg(ss_ext_discount_amt)#30, avg(ss_net_paid)#31]
 
 Subquery:2 Hosting operator id = 4 Hosting Expression = ReusedSubquery Subquery scalar-subquery#2, [id=#3]
 
@@ -78,9 +80,9 @@ Subquery:3 Hosting operator id = 4 Hosting Expression = ReusedSubquery Subquery
 
 Subquery:4 Hosting operator id = 4 Hosting Expression = Subquery scalar-subquery#5, [id=#6]
 * Project (20)
-+- * ColumnarToRow (19)
-   +- CometHashAggregate (18)
-      +- CometExchange (17)
++- * HashAggregate (19)
+   +- Exchange (18)
+      +- * ColumnarToRow (17)
          +- CometHashAggregate (16)
             +- CometProject (15)
                +- CometFilter (14)
@@ -88,40 +90,42 @@ Subquery:4 Hosting operator id = 4 Hosting Expression = Subquery scalar-subquery
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
-Output [4]: [ss_quantity#30, ss_ext_discount_amt#31, ss_net_paid#32, ss_sold_date_sk#33]
+Output [4]: [ss_quantity#33, ss_ext_discount_amt#34, ss_net_paid#35, ss_sold_date_sk#36]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/store_sales]
 PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,21), LessThanOrEqual(ss_quantity,40)]
 ReadSchema: struct<ss_quantity:int,ss_ext_discount_amt:decimal(7,2),ss_net_paid:decimal(7,2)>
 
 (14) CometFilter
-Input [4]: [ss_quantity#30, ss_ext_discount_amt#31, ss_net_paid#32, ss_sold_date_sk#33]
-Condition : ((isnotnull(ss_quantity#30) AND (ss_quantity#30 >= 21)) AND (ss_quantity#30 <= 40))
+Input [4]: [ss_quantity#33, ss_ext_discount_amt#34, ss_net_paid#35, ss_sold_date_sk#36]
+Condition : ((isnotnull(ss_quantity#33) AND (ss_quantity#33 >= 21)) AND (ss_quantity#33 <= 40))
 
 (15) CometProject
-Input [4]: [ss_quantity#30, ss_ext_discount_amt#31, ss_net_paid#32, ss_sold_date_sk#33]
-Arguments: [ss_ext_discount_amt#31, ss_net_paid#32], [ss_ext_discount_amt#31, ss_net_paid#32]
+Input [4]: [ss_quantity#33, ss_ext_discount_amt#34, ss_net_paid#35, ss_sold_date_sk#36]
+Arguments: [ss_ext_discount_amt#34, ss_net_paid#35], [ss_ext_discount_amt#34, ss_net_paid#35]
 
 (16) CometHashAggregate
-Input [2]: [ss_ext_discount_amt#31, ss_net_paid#32]
+Input [2]: [ss_ext_discount_amt#34, ss_net_paid#35]
 Keys: []
-Functions [3]: [partial_count(1), partial_avg(UnscaledValue(ss_ext_discount_amt#31)), partial_avg(UnscaledValue(ss_net_paid#32))]
+Functions [3]: [partial_count(1), partial_avg(UnscaledValue(ss_ext_discount_amt#34)), partial_avg(UnscaledValue(ss_net_paid#35))]
 
-(17) CometExchange
-Input [5]: [count#34, sum#35, count#36, sum#37, count#38]
-Arguments: SinglePartition, ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]
+(17) ColumnarToRow [codegen id : 1]
+Input [5]: [count#37, sum#38, count#39, sum#40, count#41]
 
-(18) CometHashAggregate
-Input [5]: [count#34, sum#35, count#36, sum#37, count#38]
-Keys: []
-Functions [3]: [count(1), avg(UnscaledValue(ss_ext_discount_amt#31)), avg(UnscaledValue(ss_net_paid#32))]
+(18) Exchange
+Input [5]: [count#37, sum#38, count#39, sum#40, count#41]
+Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=2]
 
-(19) ColumnarToRow [codegen id : 1]
-Input [3]: [count(1)#39, avg(ss_ext_discount_amt)#40, avg(ss_net_paid)#41]
+(19) HashAggregate [codegen id : 2]
+Input [5]: [count#37, sum#38, count#39, sum#40, count#41]
+Keys: []
+Functions [3]: [count(1), avg(UnscaledValue(ss_ext_discount_amt#34)), avg(UnscaledValue(ss_net_paid#35))]
+Aggregate Attributes [3]: [count(1)#42, avg(UnscaledValue(ss_ext_discount_amt#34))#43, avg(UnscaledValue(ss_net_paid#35))#44]
+Results [3]: [count(1)#42 AS count(1)#45, cast((avg(UnscaledValue(ss_ext_discount_amt#34))#43 / 100.0) as decimal(11,6)) AS avg(ss_ext_discount_amt)#46, cast((avg(UnscaledValue(ss_net_paid#35))#44 / 100.0) as decimal(11,6)) AS avg(ss_net_paid)#47]
 
-(20) Project [codegen id : 1]
-Output [1]: [named_struct(count(1), count(1)#39, avg(ss_ext_discount_amt), avg(ss_ext_discount_amt)#40, avg(ss_net_paid), avg(ss_net_paid)#41) AS mergedValue#42]
-Input [3]: [count(1)#39, avg(ss_ext_discount_amt)#40, avg(ss_net_paid)#41]
+(20) Project [codegen id : 2]
+Output [1]: [named_struct(count(1), count(1)#45, avg(ss_ext_discount_amt), avg(ss_ext_discount_amt)#46, avg(ss_net_paid), avg(ss_net_paid)#47) AS mergedValue#48]
+Input [3]: [count(1)#45, avg(ss_ext_discount_amt)#46, avg(ss_net_paid)#47]
 
 Subquery:5 Hosting operator id = 4 Hosting Expression = ReusedSubquery Subquery scalar-subquery#5, [id=#6]
 
@@ -129,9 +133,9 @@ Subquery:6 Hosting operator id = 4 Hosting Expression = ReusedSubquery Subquery
 
 Subquery:7 Hosting operator id = 4 Hosting Expression = Subquery scalar-subquery#8, [id=#9]
 * Project (28)
-+- * ColumnarToRow (27)
-   +- CometHashAggregate (26)
-      +- CometExchange (25)
++- * HashAggregate (27)
+   +- Exchange (26)
+      +- * ColumnarToRow (25)
          +- CometHashAggregate (24)
             +- CometProject (23)
                +- CometFilter (22)
@@ -139,40 +143,42 @@ Subquery:7 Hosting operator id = 4 Hosting Expression = Subquery scalar-subquery
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
-Output [4]: [ss_quantity#43, ss_ext_discount_amt#44, ss_net_paid#45, ss_sold_date_sk#46]
+Output [4]: [ss_quantity#49, ss_ext_discount_amt#50, ss_net_paid#51, ss_sold_date_sk#52]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/store_sales]
 PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,41), LessThanOrEqual(ss_quantity,60)]
 ReadSchema: struct<ss_quantity:int,ss_ext_discount_amt:decimal(7,2),ss_net_paid:decimal(7,2)>
 
 (22) CometFilter
-Input [4]: [ss_quantity#43, ss_ext_discount_amt#44, ss_net_paid#45, ss_sold_date_sk#46]
-Condition : ((isnotnull(ss_quantity#43) AND (ss_quantity#43 >= 41)) AND (ss_quantity#43 <= 60))
+Input [4]: [ss_quantity#49, ss_ext_discount_amt#50, ss_net_paid#51, ss_sold_date_sk#52]
+Condition : ((isnotnull(ss_quantity#49) AND (ss_quantity#49 >= 41)) AND (ss_quantity#49 <= 60))
 
 (23) CometProject
-Input [4]: [ss_quantity#43, ss_ext_discount_amt#44, ss_net_paid#45, ss_sold_date_sk#46]
-Arguments: [ss_ext_discount_amt#44, ss_net_paid#45], [ss_ext_discount_amt#44, ss_net_paid#45]
+Input [4]: [ss_quantity#49, ss_ext_discount_amt#50, ss_net_paid#51, ss_sold_date_sk#52]
+Arguments: [ss_ext_discount_amt#50, ss_net_paid#51], [ss_ext_discount_amt#50, ss_net_paid#51]
 
 (24) CometHashAggregate
-Input [2]: [ss_ext_discount_amt#44, ss_net_paid#45]
+Input [2]: [ss_ext_discount_amt#50, ss_net_paid#51]
 Keys: []
-Functions [3]: [partial_count(1), partial_avg(UnscaledValue(ss_ext_discount_amt#44)), partial_avg(UnscaledValue(ss_net_paid#45))]
+Functions [3]: [partial_count(1), partial_avg(UnscaledValue(ss_ext_discount_amt#50)), partial_avg(UnscaledValue(ss_net_paid#51))]
 
-(25) CometExchange
-Input [5]: [count#47, sum#48, count#49, sum#50, count#51]
-Arguments: SinglePartition, ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]
+(25) ColumnarToRow [codegen id : 1]
+Input [5]: [count#53, sum#54, count#55, sum#56, count#57]
 
-(26) CometHashAggregate
-Input [5]: [count#47, sum#48, count#49, sum#50, count#51]
-Keys: []
-Functions [3]: [count(1), avg(UnscaledValue(ss_ext_discount_amt#44)), avg(UnscaledValue(ss_net_paid#45))]
+(26) Exchange
+Input [5]: [count#53, sum#54, count#55, sum#56, count#57]
+Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=3]
 
-(27) ColumnarToRow [codegen id : 1]
-Input [3]: [count(1)#52, avg(ss_ext_discount_amt)#53, avg(ss_net_paid)#54]
+(27) HashAggregate [codegen id : 2]
+Input [5]: [count#53, sum#54, count#55, sum#56, count#57]
+Keys: []
+Functions [3]: [count(1), avg(UnscaledValue(ss_ext_discount_amt#50)), avg(UnscaledValue(ss_net_paid#51))]
+Aggregate Attributes [3]: [count(1)#58, avg(UnscaledValue(ss_ext_discount_amt#50))#59, avg(UnscaledValue(ss_net_paid#51))#60]
+Results [3]: [count(1)#58 AS count(1)#61, cast((avg(UnscaledValue(ss_ext_discount_amt#50))#59 / 100.0) as decimal(11,6)) AS avg(ss_ext_discount_amt)#62, cast((avg(UnscaledValue(ss_net_paid#51))#60 / 100.0) as decimal(11,6)) AS avg(ss_net_paid)#63]
 
-(28) Project [codegen id : 1]
-Output [1]: [named_struct(count(1), count(1)#52, avg(ss_ext_discount_amt), avg(ss_ext_discount_amt)#53, avg(ss_net_paid), avg(ss_net_paid)#54) AS mergedValue#55]
-Input [3]: [count(1)#52, avg(ss_ext_discount_amt)#53, avg(ss_net_paid)#54]
+(28) Project [codegen id : 2]
+Output [1]: [named_struct(count(1), count(1)#61, avg(ss_ext_discount_amt), avg(ss_ext_discount_amt)#62, avg(ss_net_paid), avg(ss_net_paid)#63) AS mergedValue#64]
+Input [3]: [count(1)#61, avg(ss_ext_discount_amt)#62, avg(ss_net_paid)#63]
 
 Subquery:8 Hosting operator id = 4 Hosting Expression = ReusedSubquery Subquery scalar-subquery#8, [id=#9]
 
@@ -180,9 +186,9 @@ Subquery:9 Hosting operator id = 4 Hosting Expression = ReusedSubquery Subquery
 
 Subquery:10 Hosting operator id = 4 Hosting Expression = Subquery scalar-subquery#11, [id=#12]
 * Project (36)
-+- * ColumnarToRow (35)
-   +- CometHashAggregate (34)
-      +- CometExchange (33)
++- * HashAggregate (35)
+   +- Exchange (34)
+      +- * ColumnarToRow (33)
          +- CometHashAggregate (32)
             +- CometProject (31)
                +- CometFilter (30)
@@ -190,40 +196,42 @@ Subquery:10 Hosting operator id = 4 Hosting Expression = Subquery scalar-subquer
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
-Output [4]: [ss_quantity#56, ss_ext_discount_amt#57, ss_net_paid#58, ss_sold_date_sk#59]
+Output [4]: [ss_quantity#65, ss_ext_discount_amt#66, ss_net_paid#67, ss_sold_date_sk#68]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/store_sales]
 PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,61), LessThanOrEqual(ss_quantity,80)]
 ReadSchema: struct<ss_quantity:int,ss_ext_discount_amt:decimal(7,2),ss_net_paid:decimal(7,2)>
 
 (30) CometFilter
-Input [4]: [ss_quantity#56, ss_ext_discount_amt#57, ss_net_paid#58, ss_sold_date_sk#59]
-Condition : ((isnotnull(ss_quantity#56) AND (ss_quantity#56 >= 61)) AND (ss_quantity#56 <= 80))
+Input [4]: [ss_quantity#65, ss_ext_discount_amt#66, ss_net_paid#67, ss_sold_date_sk#68]
+Condition : ((isnotnull(ss_quantity#65) AND (ss_quantity#65 >= 61)) AND (ss_quantity#65 <= 80))
 
 (31) CometProject
-Input [4]: [ss_quantity#56, ss_ext_discount_amt#57, ss_net_paid#58, ss_sold_date_sk#59]
-Arguments: [ss_ext_discount_amt#57, ss_net_paid#58], [ss_ext_discount_amt#57, ss_net_paid#58]
+Input [4]: [ss_quantity#65, ss_ext_discount_amt#66, ss_net_paid#67, ss_sold_date_sk#68]
+Arguments: [ss_ext_discount_amt#66, ss_net_paid#67], [ss_ext_discount_amt#66, ss_net_paid#67]
 
 (32) CometHashAggregate
-Input [2]: [ss_ext_discount_amt#57, ss_net_paid#58]
+Input [2]: [ss_ext_discount_amt#66, ss_net_paid#67]
 Keys: []
-Functions [3]: [partial_count(1), partial_avg(UnscaledValue(ss_ext_discount_amt#57)), partial_avg(UnscaledValue(ss_net_paid#58))]
+Functions [3]: [partial_count(1), partial_avg(UnscaledValue(ss_ext_discount_amt#66)), partial_avg(UnscaledValue(ss_net_paid#67))]
 
-(33) CometExchange
-Input [5]: [count#60, sum#61, count#62, sum#63, count#64]
-Arguments: SinglePartition, ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=4]
+(33) ColumnarToRow [codegen id : 1]
+Input [5]: [count#69, sum#70, count#71, sum#72, count#73]
 
-(34) CometHashAggregate
-Input [5]: [count#60, sum#61, count#62, sum#63, count#64]
-Keys: []
-Functions [3]: [count(1), avg(UnscaledValue(ss_ext_discount_amt#57)), avg(UnscaledValue(ss_net_paid#58))]
+(34) Exchange
+Input [5]: [count#69, sum#70, count#71, sum#72, count#73]
+Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=4]
 
-(35) ColumnarToRow [codegen id : 1]
-Input [3]: [count(1)#65, avg(ss_ext_discount_amt)#66, avg(ss_net_paid)#67]
+(35) HashAggregate [codegen id : 2]
+Input [5]: [count#69, sum#70, count#71, sum#72, count#73]
+Keys: []
+Functions [3]: [count(1), avg(UnscaledValue(ss_ext_discount_amt#66)), avg(UnscaledValue(ss_net_paid#67))]
+Aggregate Attributes [3]: [count(1)#74, avg(UnscaledValue(ss_ext_discount_amt#66))#75, avg(UnscaledValue(ss_net_paid#67))#76]
+Results [3]: [count(1)#74 AS count(1)#77, cast((avg(UnscaledValue(ss_ext_discount_amt#66))#75 / 100.0) as decimal(11,6)) AS avg(ss_ext_discount_amt)#78, cast((avg(UnscaledValue(ss_net_paid#67))#76 / 100.0) as decimal(11,6)) AS avg(ss_net_paid)#79]
 
-(36) Project [codegen id : 1]
-Output [1]: [named_struct(count(1), count(1)#65, avg(ss_ext_discount_amt), avg(ss_ext_discount_amt)#66, avg(ss_net_paid), avg(ss_net_paid)#67) AS mergedValue#68]
-Input [3]: [count(1)#65, avg(ss_ext_discount_amt)#66, avg(ss_net_paid)#67]
+(36) Project [codegen id : 2]
+Output [1]: [named_struct(count(1), count(1)#77, avg(ss_ext_discount_amt), avg(ss_ext_discount_amt)#78, avg(ss_net_paid), avg(ss_net_paid)#79) AS mergedValue#80]
+Input [3]: [count(1)#77, avg(ss_ext_discount_amt)#78, avg(ss_net_paid)#79]
 
 Subquery:11 Hosting operator id = 4 Hosting Expression = ReusedSubquery Subquery scalar-subquery#11, [id=#12]
 
@@ -231,9 +239,9 @@ Subquery:12 Hosting operator id = 4 Hosting Expression = ReusedSubquery Subquery
 
 Subquery:13 Hosting operator id = 4 Hosting Expression = Subquery scalar-subquery#14, [id=#15]
 * Project (44)
-+- * ColumnarToRow (43)
-   +- CometHashAggregate (42)
-      +- CometExchange (41)
++- * HashAggregate (43)
+   +- Exchange (42)
+      +- * ColumnarToRow (41)
          +- CometHashAggregate (40)
             +- CometProject (39)
                +- CometFilter (38)
@@ -241,40 +249,42 @@ Subquery:13 Hosting operator id = 4 Hosting Expression = Subquery scalar-subquer
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
-Output [4]: [ss_quantity#69, ss_ext_discount_amt#70, ss_net_paid#71, ss_sold_date_sk#72]
+Output [4]: [ss_quantity#81, ss_ext_discount_amt#82, ss_net_paid#83, ss_sold_date_sk#84]
 Batched: true
 Location [not included in comparison]/{warehouse_dir}/store_sales]
 PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,81), LessThanOrEqual(ss_quantity,100)]
 ReadSchema: struct<ss_quantity:int,ss_ext_discount_amt:decimal(7,2),ss_net_paid:decimal(7,2)>
 
 (38) CometFilter
-Input [4]: [ss_quantity#69, ss_ext_discount_amt#70, ss_net_paid#71, ss_sold_date_sk#72]
-Condition : ((isnotnull(ss_quantity#69) AND (ss_quantity#69 >= 81)) AND (ss_quantity#69 <= 100))
+Input [4]: [ss_quantity#81, ss_ext_discount_amt#82, ss_net_paid#83, ss_sold_date_sk#84]
+Condition : ((isnotnull(ss_quantity#81) AND (ss_quantity#81 >= 81)) AND (ss_quantity#81 <= 100))
 
 (39) CometProject
-Input [4]: [ss_quantity#69, ss_ext_discount_amt#70, ss_net_paid#71, ss_sold_date_sk#72]
-Arguments: [ss_ext_discount_amt#70, ss_net_paid#71], [ss_ext_discount_amt#70, ss_net_paid#71]
+Input [4]: [ss_quantity#81, ss_ext_discount_amt#82, ss_net_paid#83, ss_sold_date_sk#84]
+Arguments: [ss_ext_discount_amt#82, ss_net_paid#83], [ss_ext_discount_amt#82, ss_net_paid#83]
 
 (40) CometHashAggregate
-Input [2]: [ss_ext_discount_amt#70, ss_net_paid#71]
+Input [2]: [ss_ext_discount_amt#82, ss_net_paid#83]
 Keys: []
-Functions [3]: [partial_count(1), partial_avg(UnscaledValue(ss_ext_discount_amt#70)), partial_avg(UnscaledValue(ss_net_paid#71))]
+Functions [3]: [partial_count(1), partial_avg(UnscaledValue(ss_ext_discount_amt#82)), partial_avg(UnscaledValue(ss_net_paid#83))]
 
-(41) CometExchange
-Input [5]: [count#73, sum#74, count#75, sum#76, count#77]
-Arguments: SinglePartition, ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=5]
+(41) ColumnarToRow [codegen id : 1]
+Input [5]: [count#85, sum#86, count#87, sum#88, count#89]
 
-(42) CometHashAggregate
-Input [5]: [count#73, sum#74, count#75, sum#76, count#77]
-Keys: []
-Functions [3]: [count(1), avg(UnscaledValue(ss_ext_discount_amt#70)), avg(UnscaledValue(ss_net_paid#71))]
+(42) Exchange
+Input [5]: [count#85, sum#86, count#87, sum#88, count#89]
+Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=5]
 
-(43) ColumnarToRow [codegen id : 1]
-Input [3]: [count(1)#78, avg(ss_ext_discount_amt)#79, avg(ss_net_paid)#80]
+(43) HashAggregate [codegen id : 2]
+Input [5]: [count#85, sum#86, count#87, sum#88, count#89]
+Keys: []
+Functions [3]: [count(1), avg(UnscaledValue(ss_ext_discount_amt#82)), avg(UnscaledValue(ss_net_paid#83))]
+Aggregate Attributes [3]: [count(1)#90, avg(UnscaledValue(ss_ext_discount_amt#82))#91, avg(UnscaledValue(ss_net_paid#83))#92]
+Results [3]: [count(1)#90 AS count(1)#93, cast((avg(UnscaledValue(ss_ext_discount_amt#82))#91 / 100.0) as decimal(11,6)) AS avg(ss_ext_discount_amt)#94, cast((avg(UnscaledValue(ss_net_paid#83))#92 / 100.0) as decimal(11,6)) AS avg(ss_net_paid)#95]
 
-(44) Project [codegen id : 1]
-Output [1]: [named_struct(count(1), count(1)#78, avg(ss_ext_discount_amt), avg(ss_ext_discount_amt)#79, avg(ss_net_paid), avg(ss_net_paid)#80) AS mergedValue#81]
-Input [3]: [count(1)#78, avg(ss_ext_discount_amt)#79, avg(ss_net_paid)#80]
+(44) Project [codegen id : 2]
+Output [1]: [named_struct(count(1), count(1)#93, avg(ss_ext_discount_amt), avg(ss_ext_discount_amt)#94, avg(ss_net_paid), avg(ss_net_paid)#95) AS mergedValue#96]
+Input [3]: [count(1)#93, avg(ss_ext_discount_amt)#94, avg(ss_net_paid)#95]
 
 Subquery:14 Hosting operator id = 4 Hosting Expression = ReusedSubquery Subquery scalar-subquery#14, [id=#15]
 
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q9/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q9/simplified.txt
index a1fd64ec..c54606f6 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q9/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q9/simplified.txt
@@ -1,68 +1,78 @@
 WholeStageCodegen (1)
   Project
     Subquery #1
-      WholeStageCodegen (1)
+      WholeStageCodegen (2)
         Project [count(1),avg(ss_ext_discount_amt),avg(ss_net_paid)]
-          ColumnarToRow
+          HashAggregate [count,sum,count,sum,count] [count(1),avg(UnscaledValue(ss_ext_discount_amt)),avg(UnscaledValue(ss_net_paid)),count(1),avg(ss_ext_discount_amt),avg(ss_net_paid),count,sum,count,sum,count]
             InputAdapter
-              CometHashAggregate [count,sum,count,sum,count]
-                CometExchange #1
-                  CometHashAggregate [ss_ext_discount_amt,ss_net_paid]
-                    CometProject [ss_ext_discount_amt,ss_net_paid]
-                      CometFilter [ss_quantity]
-                        CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_ext_discount_amt,ss_net_paid,ss_sold_date_sk]
+              Exchange #1
+                WholeStageCodegen (1)
+                  ColumnarToRow
+                    InputAdapter
+                      CometHashAggregate [ss_ext_discount_amt,ss_net_paid]
+                        CometProject [ss_ext_discount_amt,ss_net_paid]
+                          CometFilter [ss_quantity]
+                            CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_ext_discount_amt,ss_net_paid,ss_sold_date_sk]
     ReusedSubquery [mergedValue] #1
     ReusedSubquery [mergedValue] #1
     Subquery #2
-      WholeStageCodegen (1)
+      WholeStageCodegen (2)
         Project [count(1),avg(ss_ext_discount_amt),avg(ss_net_paid)]
-          ColumnarToRow
+          HashAggregate [count,sum,count,sum,count] [count(1),avg(UnscaledValue(ss_ext_discount_amt)),avg(UnscaledValue(ss_net_paid)),count(1),avg(ss_ext_discount_amt),avg(ss_net_paid),count,sum,count,sum,count]
             InputAdapter
-              CometHashAggregate [count,sum,count,sum,count]
-                CometExchange #2
-                  CometHashAggregate [ss_ext_discount_amt,ss_net_paid]
-                    CometProject [ss_ext_discount_amt,ss_net_paid]
-                      CometFilter [ss_quantity]
-                        CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_ext_discount_amt,ss_net_paid,ss_sold_date_sk]
+              Exchange #2
+                WholeStageCodegen (1)
+                  ColumnarToRow
+                    InputAdapter
+                      CometHashAggregate [ss_ext_discount_amt,ss_net_paid]
+                        CometProject [ss_ext_discount_amt,ss_net_paid]
+                          CometFilter [ss_quantity]
+                            CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_ext_discount_amt,ss_net_paid,ss_sold_date_sk]
     ReusedSubquery [mergedValue] #2
     ReusedSubquery [mergedValue] #2
     Subquery #3
-      WholeStageCodegen (1)
+      WholeStageCodegen (2)
         Project [count(1),avg(ss_ext_discount_amt),avg(ss_net_paid)]
-          ColumnarToRow
+          HashAggregate [count,sum,count,sum,count] [count(1),avg(UnscaledValue(ss_ext_discount_amt)),avg(UnscaledValue(ss_net_paid)),count(1),avg(ss_ext_discount_amt),avg(ss_net_paid),count,sum,count,sum,count]
             InputAdapter
-              CometHashAggregate [count,sum,count,sum,count]
-                CometExchange #3
-                  CometHashAggregate [ss_ext_discount_amt,ss_net_paid]
-                    CometProject [ss_ext_discount_amt,ss_net_paid]
-                      CometFilter [ss_quantity]
-                        CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_ext_discount_amt,ss_net_paid,ss_sold_date_sk]
+              Exchange #3
+                WholeStageCodegen (1)
+                  ColumnarToRow
+                    InputAdapter
+                      CometHashAggregate [ss_ext_discount_amt,ss_net_paid]
+                        CometProject [ss_ext_discount_amt,ss_net_paid]
+                          CometFilter [ss_quantity]
+                            CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_ext_discount_amt,ss_net_paid,ss_sold_date_sk]
     ReusedSubquery [mergedValue] #3
     ReusedSubquery [mergedValue] #3
     Subquery #4
-      WholeStageCodegen (1)
+      WholeStageCodegen (2)
         Project [count(1),avg(ss_ext_discount_amt),avg(ss_net_paid)]
-          ColumnarToRow
+          HashAggregate [count,sum,count,sum,count] [count(1),avg(UnscaledValue(ss_ext_discount_amt)),avg(UnscaledValue(ss_net_paid)),count(1),avg(ss_ext_discount_amt),avg(ss_net_paid),count,sum,count,sum,count]
             InputAdapter
-              CometHashAggregate [count,sum,count,sum,count]
-                CometExchange #4
-                  CometHashAggregate [ss_ext_discount_amt,ss_net_paid]
-                    CometProject [ss_ext_discount_amt,ss_net_paid]
-                      CometFilter [ss_quantity]
-                        CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_ext_discount_amt,ss_net_paid,ss_sold_date_sk]
+              Exchange #4
+                WholeStageCodegen (1)
+                  ColumnarToRow
+                    InputAdapter
+                      CometHashAggregate [ss_ext_discount_amt,ss_net_paid]
+                        CometProject [ss_ext_discount_amt,ss_net_paid]
+                          CometFilter [ss_quantity]
+                            CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_ext_discount_amt,ss_net_paid,ss_sold_date_sk]
     ReusedSubquery [mergedValue] #4
     ReusedSubquery [mergedValue] #4
     Subquery #5
-      WholeStageCodegen (1)
+      WholeStageCodegen (2)
         Project [count(1),avg(ss_ext_discount_amt),avg(ss_net_paid)]
-          ColumnarToRow
+          HashAggregate [count,sum,count,sum,count] [count(1),avg(UnscaledValue(ss_ext_discount_amt)),avg(UnscaledValue(ss_net_paid)),count(1),avg(ss_ext_discount_amt),avg(ss_net_paid),count,sum,count,sum,count]
             InputAdapter
-              CometHashAggregate [count,sum,count,sum,count]
-                CometExchange #5
-                  CometHashAggregate [ss_ext_discount_amt,ss_net_paid]
-                    CometProject [ss_ext_discount_amt,ss_net_paid]
-                      CometFilter [ss_quantity]
-                        CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_ext_discount_amt,ss_net_paid,ss_sold_date_sk]
+              Exchange #5
+                WholeStageCodegen (1)
+                  ColumnarToRow
+                    InputAdapter
+                      CometHashAggregate [ss_ext_discount_amt,ss_net_paid]
+                        CometProject [ss_ext_discount_amt,ss_net_paid]
+                          CometFilter [ss_quantity]
+                            CometScan parquet spark_catalog.default.store_sales [ss_quantity,ss_ext_discount_amt,ss_net_paid,ss_sold_date_sk]
     ReusedSubquery [mergedValue] #5
     ReusedSubquery [mergedValue] #5
     ColumnarToRow
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q93/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q93/explain.txt
index 4b396dbc..ee17b529 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q93/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q93/explain.txt
@@ -1,27 +1,28 @@
 == Physical Plan ==
-TakeOrderedAndProject (23)
-+- * HashAggregate (22)
-   +- Exchange (21)
-      +- * HashAggregate (20)
-         +- * Project (19)
-            +- * BroadcastHashJoin Inner BuildRight (18)
-               :- * ColumnarToRow (12)
-               :  +- CometProject (11)
-               :     +- CometSortMergeJoin (10)
-               :        :- CometSort (4)
-               :        :  +- CometExchange (3)
-               :        :     +- CometProject (2)
-               :        :        +- CometScan parquet spark_catalog.default.store_sales (1)
-               :        +- CometSort (9)
-               :           +- CometExchange (8)
-               :              +- CometProject (7)
-               :                 +- CometFilter (6)
-               :                    +- CometScan parquet spark_catalog.default.store_returns (5)
-               +- BroadcastExchange (17)
-                  +- * ColumnarToRow (16)
-                     +- CometProject (15)
-                        +- CometFilter (14)
-                           +- CometScan parquet spark_catalog.default.reason (13)
+TakeOrderedAndProject (24)
++- * HashAggregate (23)
+   +- Exchange (22)
+      +- * HashAggregate (21)
+         +- * Project (20)
+            +- * BroadcastHashJoin Inner BuildRight (19)
+               :- * Project (13)
+               :  +- * SortMergeJoin Inner (12)
+               :     :- * Sort (5)
+               :     :  +- Exchange (4)
+               :     :     +- * ColumnarToRow (3)
+               :     :        +- CometProject (2)
+               :     :           +- CometScan parquet spark_catalog.default.store_sales (1)
+               :     +- * Sort (11)
+               :        +- Exchange (10)
+               :           +- * ColumnarToRow (9)
+               :              +- CometProject (8)
+               :                 +- CometFilter (7)
+               :                    +- CometScan parquet spark_catalog.default.store_returns (6)
+               +- BroadcastExchange (18)
+                  +- * ColumnarToRow (17)
+                     +- CometProject (16)
+                        +- CometFilter (15)
+                           +- CometScan parquet spark_catalog.default.reason (14)
 
 
 (unknown) Scan parquet spark_catalog.default.store_sales
@@ -34,13 +35,16 @@ ReadSchema: struct<ss_item_sk:int,ss_customer_sk:int,ss_ticket_number:int,ss_qua
 Input [6]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_sales_price#5, ss_sold_date_sk#6]
 Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_sales_price#5], [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_sales_price#5]
 
-(3) CometExchange
+(3) ColumnarToRow [codegen id : 1]
 Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_sales_price#5]
-Arguments: hashpartitioning(ss_item_sk#1, ss_ticket_number#3, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(4) CometSort
+(4) Exchange
 Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_sales_price#5]
-Arguments: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_sales_price#5], [ss_item_sk#1 ASC NULLS FIRST, ss_ticket_number#3 ASC NULLS FIRST]
+Arguments: hashpartitioning(ss_item_sk#1, ss_ticket_number#3, 5), ENSURE_REQUIREMENTS, [plan_id=1]
+
+(5) Sort [codegen id : 2]
+Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_sales_price#5]
+Arguments: [ss_item_sk#1 ASC NULLS FIRST, ss_ticket_number#3 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.store_returns
 Output [5]: [sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10, sr_returned_date_sk#11]
@@ -49,33 +53,34 @@ Location [not included in comparison]/{warehouse_dir}/store_returns]
 PushedFilters: [IsNotNull(sr_item_sk), IsNotNull(sr_ticket_number), IsNotNull(sr_reason_sk)]
 ReadSchema: struct<sr_item_sk:int,sr_reason_sk:int,sr_ticket_number:int,sr_return_quantity:int>
 
-(6) CometFilter
+(7) CometFilter
 Input [5]: [sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10, sr_returned_date_sk#11]
 Condition : ((isnotnull(sr_item_sk#7) AND isnotnull(sr_ticket_number#9)) AND isnotnull(sr_reason_sk#8))
 
-(7) CometProject
+(8) CometProject
 Input [5]: [sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10, sr_returned_date_sk#11]
 Arguments: [sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10], [sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10]
 
-(8) CometExchange
+(9) ColumnarToRow [codegen id : 3]
 Input [4]: [sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10]
-Arguments: hashpartitioning(sr_item_sk#7, sr_ticket_number#9, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]
 
-(9) CometSort
+(10) Exchange
 Input [4]: [sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10]
-Arguments: [sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10], [sr_item_sk#7 ASC NULLS FIRST, sr_ticket_number#9 ASC NULLS FIRST]
+Arguments: hashpartitioning(sr_item_sk#7, sr_ticket_number#9, 5), ENSURE_REQUIREMENTS, [plan_id=2]
 
-(10) CometSortMergeJoin
-Left output [5]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_sales_price#5]
-Right output [4]: [sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10]
-Arguments: [ss_item_sk#1, ss_ticket_number#3], [sr_item_sk#7, sr_ticket_number#9], Inner
+(11) Sort [codegen id : 4]
+Input [4]: [sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10]
+Arguments: [sr_item_sk#7 ASC NULLS FIRST, sr_ticket_number#9 ASC NULLS FIRST], false, 0
 
-(11) CometProject
-Input [9]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_sales_price#5, sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10]
-Arguments: [ss_customer_sk#2, ss_quantity#4, ss_sales_price#5, sr_reason_sk#8, sr_return_quantity#10], [ss_customer_sk#2, ss_quantity#4, ss_sales_price#5, sr_reason_sk#8, sr_return_quantity#10]
+(12) SortMergeJoin [codegen id : 6]
+Left keys [2]: [ss_item_sk#1, ss_ticket_number#3]
+Right keys [2]: [sr_item_sk#7, sr_ticket_number#9]
+Join type: Inner
+Join condition: None
 
-(12) ColumnarToRow [codegen id : 2]
-Input [5]: [ss_customer_sk#2, ss_quantity#4, ss_sales_price#5, sr_reason_sk#8, sr_return_quantity#10]
+(13) Project [codegen id : 6]
+Output [5]: [ss_customer_sk#2, ss_quantity#4, ss_sales_price#5, sr_reason_sk#8, sr_return_quantity#10]
+Input [9]: [ss_item_sk#1, ss_customer_sk#2, ss_ticket_number#3, ss_quantity#4, ss_sales_price#5, sr_item_sk#7, sr_reason_sk#8, sr_ticket_number#9, sr_return_quantity#10]
 
 (unknown) Scan parquet spark_catalog.default.reason
 Output [2]: [r_reason_sk#12, r_reason_desc#13]
@@ -84,50 +89,50 @@ Location [not included in comparison]/{warehouse_dir}/reason]
 PushedFilters: [IsNotNull(r_reason_desc), EqualTo(r_reason_desc,reason 28                                                                                           ), IsNotNull(r_reason_sk)]
 ReadSchema: struct<r_reason_sk:int,r_reason_desc:string>
 
-(14) CometFilter
+(15) CometFilter
 Input [2]: [r_reason_sk#12, r_reason_desc#13]
 Condition : ((isnotnull(r_reason_desc#13) AND (r_reason_desc#13 = reason 28                                                                                           )) AND isnotnull(r_reason_sk#12))
 
-(15) CometProject
+(16) CometProject
 Input [2]: [r_reason_sk#12, r_reason_desc#13]
 Arguments: [r_reason_sk#12], [r_reason_sk#12]
 
-(16) ColumnarToRow [codegen id : 1]
+(17) ColumnarToRow [codegen id : 5]
 Input [1]: [r_reason_sk#12]
 
-(17) BroadcastExchange
+(18) BroadcastExchange
 Input [1]: [r_reason_sk#12]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=3]
 
-(18) BroadcastHashJoin [codegen id : 2]
+(19) BroadcastHashJoin [codegen id : 6]
 Left keys [1]: [sr_reason_sk#8]
 Right keys [1]: [r_reason_sk#12]
 Join type: Inner
 Join condition: None
 
-(19) Project [codegen id : 2]
+(20) Project [codegen id : 6]
 Output [2]: [ss_customer_sk#2, CASE WHEN isnotnull(sr_return_quantity#10) THEN (cast((ss_quantity#4 - sr_return_quantity#10) as decimal(10,0)) * ss_sales_price#5) ELSE (cast(ss_quantity#4 as decimal(10,0)) * ss_sales_price#5) END AS act_sales#14]
 Input [6]: [ss_customer_sk#2, ss_quantity#4, ss_sales_price#5, sr_reason_sk#8, sr_return_quantity#10, r_reason_sk#12]
 
-(20) HashAggregate [codegen id : 2]
+(21) HashAggregate [codegen id : 6]
 Input [2]: [ss_customer_sk#2, act_sales#14]
 Keys [1]: [ss_customer_sk#2]
 Functions [1]: [partial_sum(act_sales#14)]
 Aggregate Attributes [2]: [sum#15, isEmpty#16]
 Results [3]: [ss_customer_sk#2, sum#17, isEmpty#18]
 
-(21) Exchange
+(22) Exchange
 Input [3]: [ss_customer_sk#2, sum#17, isEmpty#18]
 Arguments: hashpartitioning(ss_customer_sk#2, 5), ENSURE_REQUIREMENTS, [plan_id=4]
 
-(22) HashAggregate [codegen id : 3]
+(23) HashAggregate [codegen id : 7]
 Input [3]: [ss_customer_sk#2, sum#17, isEmpty#18]
 Keys [1]: [ss_customer_sk#2]
 Functions [1]: [sum(act_sales#14)]
 Aggregate Attributes [1]: [sum(act_sales#14)#19]
 Results [2]: [ss_customer_sk#2, sum(act_sales#14)#19 AS sumsales#20]
 
-(23) TakeOrderedAndProject
+(24) TakeOrderedAndProject
 Input [2]: [ss_customer_sk#2, sumsales#20]
 Arguments: 100, [sumsales#20 ASC NULLS FIRST, ss_customer_sk#2 ASC NULLS FIRST], [ss_customer_sk#2, sumsales#20]
 
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q93/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q93/simplified.txt
index 6178d5a3..3ec7ac7b 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q93/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q93/simplified.txt
@@ -1,28 +1,38 @@
 TakeOrderedAndProject [sumsales,ss_customer_sk]
-  WholeStageCodegen (3)
+  WholeStageCodegen (7)
     HashAggregate [ss_customer_sk,sum,isEmpty] [sum(act_sales),sumsales,sum,isEmpty]
       InputAdapter
         Exchange [ss_customer_sk] #1
-          WholeStageCodegen (2)
+          WholeStageCodegen (6)
             HashAggregate [ss_customer_sk,act_sales] [sum,isEmpty,sum,isEmpty]
               Project [ss_customer_sk,sr_return_quantity,ss_quantity,ss_sales_price]
                 BroadcastHashJoin [sr_reason_sk,r_reason_sk]
-                  ColumnarToRow
-                    InputAdapter
-                      CometProject [ss_customer_sk,ss_quantity,ss_sales_price,sr_reason_sk,sr_return_quantity]
-                        CometSortMergeJoin [ss_item_sk,ss_ticket_number,sr_item_sk,sr_ticket_number]
-                          CometSort [ss_item_sk,ss_ticket_number]
-                            CometExchange [ss_item_sk,ss_ticket_number] #2
-                              CometProject [ss_item_sk,ss_customer_sk,ss_ticket_number,ss_quantity,ss_sales_price]
-                                CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_ticket_number,ss_quantity,ss_sales_price,ss_sold_date_sk]
-                          CometSort [sr_item_sk,sr_ticket_number]
-                            CometExchange [sr_item_sk,sr_ticket_number] #3
-                              CometProject [sr_item_sk,sr_reason_sk,sr_ticket_number,sr_return_quantity]
-                                CometFilter [sr_item_sk,sr_ticket_number,sr_reason_sk]
-                                  CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_reason_sk,sr_ticket_number,sr_return_quantity,sr_returned_date_sk]
+                  Project [ss_customer_sk,ss_quantity,ss_sales_price,sr_reason_sk,sr_return_quantity]
+                    SortMergeJoin [ss_item_sk,ss_ticket_number,sr_item_sk,sr_ticket_number]
+                      InputAdapter
+                        WholeStageCodegen (2)
+                          Sort [ss_item_sk,ss_ticket_number]
+                            InputAdapter
+                              Exchange [ss_item_sk,ss_ticket_number] #2
+                                WholeStageCodegen (1)
+                                  ColumnarToRow
+                                    InputAdapter
+                                      CometProject [ss_item_sk,ss_customer_sk,ss_ticket_number,ss_quantity,ss_sales_price]
+                                        CometScan parquet spark_catalog.default.store_sales [ss_item_sk,ss_customer_sk,ss_ticket_number,ss_quantity,ss_sales_price,ss_sold_date_sk]
+                      InputAdapter
+                        WholeStageCodegen (4)
+                          Sort [sr_item_sk,sr_ticket_number]
+                            InputAdapter
+                              Exchange [sr_item_sk,sr_ticket_number] #3
+                                WholeStageCodegen (3)
+                                  ColumnarToRow
+                                    InputAdapter
+                                      CometProject [sr_item_sk,sr_reason_sk,sr_ticket_number,sr_return_quantity]
+                                        CometFilter [sr_item_sk,sr_ticket_number,sr_reason_sk]
+                                          CometScan parquet spark_catalog.default.store_returns [sr_item_sk,sr_reason_sk,sr_ticket_number,sr_return_quantity,sr_returned_date_sk]
                   InputAdapter
                     BroadcastExchange #4
-                      WholeStageCodegen (1)
+                      WholeStageCodegen (5)
                         ColumnarToRow
                           InputAdapter
                             CometProject [r_reason_sk]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94/explain.txt
index aafe59a7..1ed6d0cb 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94/explain.txt
@@ -13,20 +13,20 @@
                   :     :     :- * SortMergeJoin LeftAnti (19)
                   :     :     :  :- * Project (13)
                   :     :     :  :  +- * SortMergeJoin LeftSemi (12)
-                  :     :     :  :     :- * ColumnarToRow (6)
-                  :     :     :  :     :  +- CometSort (5)
-                  :     :     :  :     :     +- CometExchange (4)
+                  :     :     :  :     :- * Sort (6)
+                  :     :     :  :     :  +- Exchange (5)
+                  :     :     :  :     :     +- * ColumnarToRow (4)
                   :     :     :  :     :        +- CometProject (3)
                   :     :     :  :     :           +- CometFilter (2)
                   :     :     :  :     :              +- CometScan parquet spark_catalog.default.web_sales (1)
-                  :     :     :  :     +- * ColumnarToRow (11)
-                  :     :     :  :        +- CometSort (10)
-                  :     :     :  :           +- CometExchange (9)
+                  :     :     :  :     +- * Sort (11)
+                  :     :     :  :        +- Exchange (10)
+                  :     :     :  :           +- * ColumnarToRow (9)
                   :     :     :  :              +- CometProject (8)
                   :     :     :  :                 +- CometScan parquet spark_catalog.default.web_sales (7)
-                  :     :     :  +- * ColumnarToRow (18)
-                  :     :     :     +- CometSort (17)
-                  :     :     :        +- CometExchange (16)
+                  :     :     :  +- * Sort (18)
+                  :     :     :     +- Exchange (17)
+                  :     :     :        +- * ColumnarToRow (16)
                   :     :     :           +- CometProject (15)
                   :     :     :              +- CometScan parquet spark_catalog.default.web_returns (14)
                   :     :     +- BroadcastExchange (24)
@@ -61,16 +61,16 @@ Condition : ((isnotnull(ws_ship_date_sk#1) AND isnotnull(ws_ship_addr_sk#2)) AND
 Input [8]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_warehouse_sk#4, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7, ws_sold_date_sk#8]
 Arguments: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_warehouse_sk#4, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7], [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_warehouse_sk#4, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7]
 
-(4) CometExchange
+(4) ColumnarToRow [codegen id : 1]
 Input [7]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_warehouse_sk#4, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7]
-Arguments: hashpartitioning(ws_order_number#5, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]
 
-(5) CometSort
+(5) Exchange
 Input [7]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_warehouse_sk#4, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7]
-Arguments: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_warehouse_sk#4, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7], [ws_order_number#5 ASC NULLS FIRST]
+Arguments: hashpartitioning(ws_order_number#5, 5), ENSURE_REQUIREMENTS, [plan_id=1]
 
-(6) ColumnarToRow [codegen id : 1]
+(6) Sort [codegen id : 2]
 Input [7]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_warehouse_sk#4, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7]
+Arguments: [ws_order_number#5 ASC NULLS FIRST], false, 0
 
 (unknown) Scan parquet spark_catalog.default.web_sales
 Output [3]: [ws_warehouse_sk#9, ws_order_number#10, ws_sold_date_sk#11]
@@ -82,24 +82,24 @@ ReadSchema: struct<ws_warehouse_sk:int,ws_order_number:int>
 Input [3]: [ws_warehouse_sk#9, ws_order_number#10, ws_sold_date_sk#11]
 Arguments: [ws_warehouse_sk#9, ws_order_number#10], [ws_warehouse_sk#9, ws_order_number#10]
 
-(9) CometExchange
+(9) ColumnarToRow [codegen id : 3]
 Input [2]: [ws_warehouse_sk#9, ws_order_number#10]
-Arguments: hashpartitioning(ws_order_number#10, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]
 
-(10) CometSort
+(10) Exchange
 Input [2]: [ws_warehouse_sk#9, ws_order_number#10]
-Arguments: [ws_warehouse_sk#9, ws_order_number#10], [ws_order_number#10 ASC NULLS FIRST]
+Arguments: hashpartitioning(ws_order_number#10, 5), ENSURE_REQUIREMENTS, [plan_id=2]
 
-(11) ColumnarToRow [codegen id : 2]
+(11) Sort [codegen id : 4]
 Input [2]: [ws_warehouse_sk#9, ws_order_number#10]
+Arguments: [ws_order_number#10 ASC NULLS FIRST], false, 0
 
-(12) SortMergeJoin [codegen id : 3]
+(12) SortMergeJoin [codegen id : 5]
 Left keys [1]: [ws_order_number#5]
 Right keys [1]: [ws_order_number#10]
 Join type: LeftSemi
 Join condition: NOT (ws_warehouse_sk#4 = ws_warehouse_sk#9)
 
-(13) Project [codegen id : 3]
+(13) Project [codegen id : 5]
 Output [6]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7]
 Input [7]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_warehouse_sk#4, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7]
 
@@ -113,18 +113,18 @@ ReadSchema: struct<wr_order_number:int>
 Input [2]: [wr_order_number#12, wr_returned_date_sk#13]
 Arguments: [wr_order_number#12], [wr_order_number#12]
 
-(16) CometExchange
+(16) ColumnarToRow [codegen id : 6]
 Input [1]: [wr_order_number#12]
-Arguments: hashpartitioning(wr_order_number#12, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]
 
-(17) CometSort
+(17) Exchange
 Input [1]: [wr_order_number#12]
-Arguments: [wr_order_number#12], [wr_order_number#12 ASC NULLS FIRST]
+Arguments: hashpartitioning(wr_order_number#12, 5), ENSURE_REQUIREMENTS, [plan_id=3]
 
-(18) ColumnarToRow [codegen id : 4]
+(18) Sort [codegen id : 7]
 Input [1]: [wr_order_number#12]
+Arguments: [wr_order_number#12 ASC NULLS FIRST], false, 0
 
-(19) SortMergeJoin [codegen id : 8]
+(19) SortMergeJoin [codegen id : 11]
 Left keys [1]: [ws_order_number#5]
 Right keys [1]: [wr_order_number#12]
 Join type: LeftAnti
@@ -145,20 +145,20 @@ Condition : (((isnotnull(d_date#15) AND (d_date#15 >= 1999-02-01)) AND (d_date#1
 Input [2]: [d_date_sk#14, d_date#15]
 Arguments: [d_date_sk#14], [d_date_sk#14]
 
-(23) ColumnarToRow [codegen id : 5]
+(23) ColumnarToRow [codegen id : 8]
 Input [1]: [d_date_sk#14]
 
 (24) BroadcastExchange
 Input [1]: [d_date_sk#14]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=4]
 
-(25) BroadcastHashJoin [codegen id : 8]
+(25) BroadcastHashJoin [codegen id : 11]
 Left keys [1]: [ws_ship_date_sk#1]
 Right keys [1]: [d_date_sk#14]
 Join type: Inner
 Join condition: None
 
-(26) Project [codegen id : 8]
+(26) Project [codegen id : 11]
 Output [5]: [ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7]
 Input [7]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7, d_date_sk#14]
 
@@ -177,20 +177,20 @@ Condition : ((isnotnull(ca_state#17) AND (ca_state#17 = IL)) AND isnotnull(ca_ad
 Input [2]: [ca_address_sk#16, ca_state#17]
 Arguments: [ca_address_sk#16], [ca_address_sk#16]
 
-(30) ColumnarToRow [codegen id : 6]
+(30) ColumnarToRow [codegen id : 9]
 Input [1]: [ca_address_sk#16]
 
 (31) BroadcastExchange
 Input [1]: [ca_address_sk#16]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=5]
 
-(32) BroadcastHashJoin [codegen id : 8]
+(32) BroadcastHashJoin [codegen id : 11]
 Left keys [1]: [ws_ship_addr_sk#2]
 Right keys [1]: [ca_address_sk#16]
 Join type: Inner
 Join condition: None
 
-(33) Project [codegen id : 8]
+(33) Project [codegen id : 11]
 Output [4]: [ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7]
 Input [6]: [ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7, ca_address_sk#16]
 
@@ -209,38 +209,38 @@ Condition : ((isnotnull(web_company_name#19) AND (web_company_name#19 = pri
 Input [2]: [web_site_sk#18, web_company_name#19]
 Arguments: [web_site_sk#18], [web_site_sk#18]
 
-(37) ColumnarToRow [codegen id : 7]
+(37) ColumnarToRow [codegen id : 10]
 Input [1]: [web_site_sk#18]
 
 (38) BroadcastExchange
 Input [1]: [web_site_sk#18]
 Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=6]
 
-(39) BroadcastHashJoin [codegen id : 8]
+(39) BroadcastHashJoin [codegen id : 11]
 Left keys [1]: [ws_web_site_sk#3]
 Right keys [1]: [web_site_sk#18]
 Join type: Inner
 Join condition: None
 
-(40) Project [codegen id : 8]
+(40) Project [codegen id : 11]
 Output [3]: [ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7]
 Input [5]: [ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7, web_site_sk#18]
 
-(41) HashAggregate [codegen id : 8]
+(41) HashAggregate [codegen id : 11]
 Input [3]: [ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7]
 Keys [1]: [ws_order_number#5]
 Functions [2]: [partial_sum(UnscaledValue(ws_ext_ship_cost#6)), partial_sum(UnscaledValue(ws_net_profit#7))]
 Aggregate Attributes [2]: [sum(UnscaledValue(ws_ext_ship_cost#6))#20, sum(UnscaledValue(ws_net_profit#7))#21]
 Results [3]: [ws_order_number#5, sum#22, sum#23]
 
-(42) HashAggregate [codegen id : 8]
+(42) HashAggregate [codegen id : 11]
 Input [3]: [ws_order_number#5, sum#22, sum#23]
 Keys [1]: [ws_order_number#5]
 Functions [2]: [merge_sum(UnscaledValue(ws_ext_ship_cost#6)), merge_sum(UnscaledValue(ws_net_profit#7))]
 Aggregate Attributes [2]: [sum(UnscaledValue(ws_ext_ship_cost#6))#20, sum(UnscaledValue(ws_net_profit#7))#21]
 Results [3]: [ws_order_number#5, sum#22, sum#23]
 
-(43) HashAggregate [codegen id : 8]
+(43) HashAggregate [codegen id : 11]
 Input [3]: [ws_order_number#5, sum#22, sum#23]
 Keys: []
 Functions [3]: [merge_sum(UnscaledValue(ws_ext_ship_cost#6)), merge_sum(UnscaledValue(ws_net_profit#7)), partial_count(distinct ws_order_number#5)]
@@ -251,7 +251,7 @@ Results [3]: [sum#22, sum#23, count#25]
 Input [3]: [sum#22, sum#23, count#25]
 Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=7]
 
-(45) HashAggregate [codegen id : 9]
+(45) HashAggregate [codegen id : 12]
 Input [3]: [sum#22, sum#23, count#25]
 Keys: []
 Functions [3]: [sum(UnscaledValue(ws_ext_ship_cost#6)), sum(UnscaledValue(ws_net_profit#7)), count(distinct ws_order_number#5)]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94/simplified.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94/simplified.txt
index 369065a6..34ddde76 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94/simplified.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94/simplified.txt
@@ -1,8 +1,8 @@
-WholeStageCodegen (9)
+WholeStageCodegen (12)
   HashAggregate [sum,sum,count] [sum(UnscaledValue(ws_ext_ship_cost)),sum(UnscaledValue(ws_net_profit)),count(ws_order_number),order count ,total shipping cost ,total net profit ,sum,sum,count]
     InputAdapter
       Exchange #1
-        WholeStageCodegen (8)
+        WholeStageCodegen (11)
           HashAggregate [ws_order_number] [sum(UnscaledValue(ws_ext_ship_cost)),sum(UnscaledValue(ws_net_profit)),count(ws_order_number),sum,sum,count,sum,sum,count]
             HashAggregate [ws_order_number] [sum(UnscaledValue(ws_ext_ship_cost)),sum(UnscaledValue(ws_net_profit)),sum,sum,sum,sum]
               HashAggregate [ws_order_number,ws_ext_ship_cost,ws_net_profit] [sum(UnscaledValue(ws_ext_ship_cost)),sum(UnscaledValue(ws_net_profit)),sum,sum,sum,sum]
@@ -14,37 +14,43 @@ WholeStageCodegen (9)
                           BroadcastHashJoin [ws_ship_date_sk,d_date_sk]
                             SortMergeJoin [ws_order_number,wr_order_number]
                               InputAdapter
-                                WholeStageCodegen (3)
+                                WholeStageCodegen (5)
                                   Project [ws_ship_date_sk,ws_ship_addr_sk,ws_web_site_sk,ws_order_number,ws_ext_ship_cost,ws_net_profit]
                                     SortMergeJoin [ws_order_number,ws_order_number,ws_warehouse_sk,ws_warehouse_sk]
                                       InputAdapter
-                                        WholeStageCodegen (1)
-                                          ColumnarToRow
+                                        WholeStageCodegen (2)
+                                          Sort [ws_order_number]
                                             InputAdapter
-                                              CometSort [ws_order_number]
-                                                CometExchange [ws_order_number] #2
-                                                  CometProject [ws_ship_date_sk,ws_ship_addr_sk,ws_web_site_sk,ws_warehouse_sk,ws_order_number,ws_ext_ship_cost,ws_net_profit]
-                                                    CometFilter [ws_ship_date_sk,ws_ship_addr_sk,ws_web_site_sk]
-                                                      CometScan parquet spark_catalog.default.web_sales [ws_ship_date_sk,ws_ship_addr_sk,ws_web_site_sk,ws_warehouse_sk,ws_order_number,ws_ext_ship_cost,ws_net_profit,ws_sold_date_sk]
+                                              Exchange [ws_order_number] #2
+                                                WholeStageCodegen (1)
+                                                  ColumnarToRow
+                                                    InputAdapter
+                                                      CometProject [ws_ship_date_sk,ws_ship_addr_sk,ws_web_site_sk,ws_warehouse_sk,ws_order_number,ws_ext_ship_cost,ws_net_profit]
+                                                        CometFilter [ws_ship_date_sk,ws_ship_addr_sk,ws_web_site_sk]
+                                                          CometScan parquet spark_catalog.default.web_sales [ws_ship_date_sk,ws_ship_addr_sk,ws_web_site_sk,ws_warehouse_sk,ws_order_number,ws_ext_ship_cost,ws_net_profit,ws_sold_date_sk]
                                       InputAdapter
-                                        WholeStageCodegen (2)
-                                          ColumnarToRow
+                                        WholeStageCodegen (4)
+                                          Sort [ws_order_number]
                                             InputAdapter
-                                              CometSort [ws_order_number]
-                                                CometExchange [ws_order_number] #3
-                                                  CometProject [ws_warehouse_sk,ws_order_number]
-                                                    CometScan parquet spark_catalog.default.web_sales [ws_warehouse_sk,ws_order_number,ws_sold_date_sk]
+                                              Exchange [ws_order_number] #3
+                                                WholeStageCodegen (3)
+                                                  ColumnarToRow
+                                                    InputAdapter
+                                                      CometProject [ws_warehouse_sk,ws_order_number]
+                                                        CometScan parquet spark_catalog.default.web_sales [ws_warehouse_sk,ws_order_number,ws_sold_date_sk]
                               InputAdapter
-                                WholeStageCodegen (4)
-                                  ColumnarToRow
+                                WholeStageCodegen (7)
+                                  Sort [wr_order_number]
                                     InputAdapter
-                                      CometSort [wr_order_number]
-                                        CometExchange [wr_order_number] #4
-                                          CometProject [wr_order_number]
-                                            CometScan parquet spark_catalog.default.web_returns [wr_order_number,wr_returned_date_sk]
+                                      Exchange [wr_order_number] #4
+                                        WholeStageCodegen (6)
+                                          ColumnarToRow
+                                            InputAdapter
+                                              CometProject [wr_order_number]
+                                                CometScan parquet spark_catalog.default.web_returns [wr_order_number,wr_returned_date_sk]
                             InputAdapter
                               BroadcastExchange #5
-                                WholeStageCodegen (5)
+                                WholeStageCodegen (8)
                                   ColumnarToRow
                                     InputAdapter
                                       CometProject [d_date_sk]
@@ -52,7 +58,7 @@ WholeStageCodegen (9)
                                           CometScan parquet spark_catalog.default.date_dim [d_date_sk,d_date]
                         InputAdapter
                           BroadcastExchange #6
-                            WholeStageCodegen (6)
+                            WholeStageCodegen (9)
                               ColumnarToRow
                                 InputAdapter
                                   CometProject [ca_address_sk]
@@ -60,7 +66,7 @@ WholeStageCodegen (9)
                                       CometScan parquet spark_catalog.default.customer_address [ca_address_sk,ca_state]
                     InputAdapter
                       BroadcastExchange #7
-                        WholeStageCodegen (7)
+                        WholeStageCodegen (10)
                           ColumnarToRow
                             InputAdapter
                               CometProject [web_site_sk]
diff --git a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95/explain.txt b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95/explain.txt
index 375c7bf2..d8686b2b 100644
--- a/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95/explain.txt
+++ b/spark/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95/explain.txt
@@ -1,65 +1,62 @@
 == Physical Plan ==
-* HashAggregate (61)
-+- Exchange (60)
-   +- * HashAggregate (59)
-      +- * HashAggregate (58)
-         +- * HashAggregate (57)
-            +- * Project (56)
-               +- * BroadcastHashJoin Inner BuildRight (55)
-                  :- * Project (49)
-                  :  +- * BroadcastHashJoin Inner BuildRight (48)
-                  :     :- * Project (42)
-                  :     :  +- * BroadcastHashJoin Inner BuildRight (41)
... 6804 lines suppressed ...


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