== Physical Plan ==
* CometColumnarToRow (84)
+- CometTakeOrderedAndProject (83)
   +- CometHashAggregate (82)
      +- CometExchange (81)
         +- CometHashAggregate (80)
            +- CometUnion (79)
               :- CometHashAggregate (68)
               :  +- CometExchange (67)
               :     +- CometHashAggregate (66)
               :        +- CometUnion (65)
               :           :- CometHashAggregate (22)
               :           :  +- CometExchange (21)
               :           :     +- CometHashAggregate (20)
               :           :        +- CometProject (19)
               :           :           +- CometBroadcastHashJoin (18)
               :           :              :- CometProject (13)
               :           :              :  +- CometBroadcastHashJoin (12)
               :           :              :     :- CometUnion (7)
               :           :              :     :  :- CometProject (3)
               :           :              :     :  :  +- CometFilter (2)
               :           :              :     :  :     +- CometScan [native_iceberg_compat] parquet spark_catalog.default.store_sales (1)
               :           :              :     :  +- CometProject (6)
               :           :              :     :     +- CometFilter (5)
               :           :              :     :        +- CometScan [native_iceberg_compat] parquet spark_catalog.default.store_returns (4)
               :           :              :     +- CometBroadcastExchange (11)
               :           :              :        +- CometProject (10)
               :           :              :           +- CometFilter (9)
               :           :              :              +- CometScan [native_iceberg_compat] parquet spark_catalog.default.date_dim (8)
               :           :              +- CometBroadcastExchange (17)
               :           :                 +- CometProject (16)
               :           :                    +- CometFilter (15)
               :           :                       +- CometScan [native_iceberg_compat] parquet spark_catalog.default.store (14)
               :           :- CometHashAggregate (41)
               :           :  +- CometExchange (40)
               :           :     +- CometHashAggregate (39)
               :           :        +- CometProject (38)
               :           :           +- CometBroadcastHashJoin (37)
               :           :              :- CometProject (32)
               :           :              :  +- CometBroadcastHashJoin (31)
               :           :              :     :- CometUnion (29)
               :           :              :     :  :- CometProject (25)
               :           :              :     :  :  +- CometFilter (24)
               :           :              :     :  :     +- CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_sales (23)
               :           :              :     :  +- CometProject (28)
               :           :              :     :     +- CometFilter (27)
               :           :              :     :        +- CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_returns (26)
               :           :              :     +- ReusedExchange (30)
               :           :              +- CometBroadcastExchange (36)
               :           :                 +- CometProject (35)
               :           :                    +- CometFilter (34)
               :           :                       +- CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_page (33)
               :           +- CometHashAggregate (64)
               :              +- CometExchange (63)
               :                 +- CometHashAggregate (62)
               :                    +- CometProject (61)
               :                       +- CometBroadcastHashJoin (60)
               :                          :- CometProject (55)
               :                          :  +- CometBroadcastHashJoin (54)
               :                          :     :- CometUnion (52)
               :                          :     :  :- CometProject (44)
               :                          :     :  :  +- CometFilter (43)
               :                          :     :  :     +- CometScan [native_iceberg_compat] parquet spark_catalog.default.web_sales (42)
               :                          :     :  +- CometProject (51)
               :                          :     :     +- CometBroadcastHashJoin (50)
               :                          :     :        :- CometBroadcastExchange (46)
               :                          :     :        :  +- CometScan [native_iceberg_compat] parquet spark_catalog.default.web_returns (45)
               :                          :     :        +- CometProject (49)
               :                          :     :           +- CometFilter (48)
               :                          :     :              +- CometScan [native_iceberg_compat] parquet spark_catalog.default.web_sales (47)
               :                          :     +- ReusedExchange (53)
               :                          +- CometBroadcastExchange (59)
               :                             +- CometProject (58)
               :                                +- CometFilter (57)
               :                                   +- CometScan [native_iceberg_compat] parquet spark_catalog.default.web_site (56)
               :- CometHashAggregate (73)
               :  +- CometExchange (72)
               :     +- CometHashAggregate (71)
               :        +- CometHashAggregate (70)
               :           +- ReusedExchange (69)
               +- CometHashAggregate (78)
                  +- CometExchange (77)
                     +- CometHashAggregate (76)
                        +- CometHashAggregate (75)
                           +- ReusedExchange (74)


(1) CometScan [native_iceberg_compat] parquet spark_catalog.default.store_sales
Output [4]: [ss_store_sk#1, ss_ext_sales_price#2, ss_net_profit#3, ss_sold_date_sk#4]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ss_sold_date_sk#4), dynamicpruningexpression(ss_sold_date_sk#4 IN dynamicpruning#5)]
PushedFilters: [IsNotNull(ss_store_sk)]
ReadSchema: struct<ss_store_sk:int,ss_ext_sales_price:decimal(7,2),ss_net_profit:decimal(7,2)>

(2) CometFilter
Input [4]: [ss_store_sk#1, ss_ext_sales_price#2, ss_net_profit#3, ss_sold_date_sk#4]
Condition : isnotnull(ss_store_sk#1)

(3) CometProject
Input [4]: [ss_store_sk#1, ss_ext_sales_price#2, ss_net_profit#3, ss_sold_date_sk#4]
Arguments: [store_sk#6, date_sk#7, sales_price#8, profit#9, return_amt#10, net_loss#11], [ss_store_sk#1 AS store_sk#6, ss_sold_date_sk#4 AS date_sk#7, ss_ext_sales_price#2 AS sales_price#8, ss_net_profit#3 AS profit#9, 0.00 AS return_amt#10, 0.00 AS net_loss#11]

(4) CometScan [native_iceberg_compat] parquet spark_catalog.default.store_returns
Output [4]: [sr_store_sk#12, sr_return_amt#13, sr_net_loss#14, sr_returned_date_sk#15]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(sr_returned_date_sk#15), dynamicpruningexpression(sr_returned_date_sk#15 IN dynamicpruning#5)]
PushedFilters: [IsNotNull(sr_store_sk)]
ReadSchema: struct<sr_store_sk:int,sr_return_amt:decimal(7,2),sr_net_loss:decimal(7,2)>

(5) CometFilter
Input [4]: [sr_store_sk#12, sr_return_amt#13, sr_net_loss#14, sr_returned_date_sk#15]
Condition : isnotnull(sr_store_sk#12)

(6) CometProject
Input [4]: [sr_store_sk#12, sr_return_amt#13, sr_net_loss#14, sr_returned_date_sk#15]
Arguments: [store_sk#16, date_sk#17, sales_price#18, profit#19, return_amt#20, net_loss#21], [sr_store_sk#12 AS store_sk#16, sr_returned_date_sk#15 AS date_sk#17, 0.00 AS sales_price#18, 0.00 AS profit#19, sr_return_amt#13 AS return_amt#20, sr_net_loss#14 AS net_loss#21]

(7) CometUnion
Child 0 Input [6]: [store_sk#6, date_sk#7, sales_price#8, profit#9, return_amt#10, net_loss#11]
Child 1 Input [6]: [store_sk#16, date_sk#17, sales_price#18, profit#19, return_amt#20, net_loss#21]

(8) CometScan [native_iceberg_compat] parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#22, d_date#23]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,1998-08-04), LessThanOrEqual(d_date,1998-08-18), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_date:date>

(9) CometFilter
Input [2]: [d_date_sk#22, d_date#23]
Condition : (((isnotnull(d_date#23) AND (d_date#23 >= 1998-08-04)) AND (d_date#23 <= 1998-08-18)) AND isnotnull(d_date_sk#22))

(10) CometProject
Input [2]: [d_date_sk#22, d_date#23]
Arguments: [d_date_sk#22], [d_date_sk#22]

(11) CometBroadcastExchange
Input [1]: [d_date_sk#22]
Arguments: [d_date_sk#22]

(12) CometBroadcastHashJoin
Left output [6]: [store_sk#6, date_sk#7, sales_price#8, profit#9, return_amt#10, net_loss#11]
Right output [1]: [d_date_sk#22]
Arguments: [date_sk#7], [d_date_sk#22], Inner, BuildRight

(13) CometProject
Input [7]: [store_sk#6, date_sk#7, sales_price#8, profit#9, return_amt#10, net_loss#11, d_date_sk#22]
Arguments: [store_sk#6, sales_price#8, profit#9, return_amt#10, net_loss#11], [store_sk#6, sales_price#8, profit#9, return_amt#10, net_loss#11]

(14) CometScan [native_iceberg_compat] parquet spark_catalog.default.store
Output [2]: [s_store_sk#24, s_store_id#25]
Batched: true
Location [not included in comparison]/{warehouse_dir}/store]
PushedFilters: [IsNotNull(s_store_sk)]
ReadSchema: struct<s_store_sk:int,s_store_id:string>

(15) CometFilter
Input [2]: [s_store_sk#24, s_store_id#25]
Condition : isnotnull(s_store_sk#24)

(16) CometProject
Input [2]: [s_store_sk#24, s_store_id#25]
Arguments: [s_store_sk#24, s_store_id#26], [s_store_sk#24, staticinvoke(class org.apache.spark.sql.catalyst.util.CharVarcharCodegenUtils, StringType, readSidePadding, s_store_id#25, 16, true, false, true) AS s_store_id#26]

(17) CometBroadcastExchange
Input [2]: [s_store_sk#24, s_store_id#26]
Arguments: [s_store_sk#24, s_store_id#26]

(18) CometBroadcastHashJoin
Left output [5]: [store_sk#6, sales_price#8, profit#9, return_amt#10, net_loss#11]
Right output [2]: [s_store_sk#24, s_store_id#26]
Arguments: [store_sk#6], [s_store_sk#24], Inner, BuildRight

(19) CometProject
Input [7]: [store_sk#6, sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_sk#24, s_store_id#26]
Arguments: [sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_id#26], [sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_id#26]

(20) CometHashAggregate
Input [5]: [sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_id#26]
Keys [1]: [s_store_id#26]
Functions [4]: [partial_sum(UnscaledValue(sales_price#8)), partial_sum(UnscaledValue(return_amt#10)), partial_sum(UnscaledValue(profit#9)), partial_sum(UnscaledValue(net_loss#11))]

(21) CometExchange
Input [5]: [s_store_id#26, sum#27, sum#28, sum#29, sum#30]
Arguments: hashpartitioning(s_store_id#26, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]

(22) CometHashAggregate
Input [5]: [s_store_id#26, sum#27, sum#28, sum#29, sum#30]
Keys [1]: [s_store_id#26]
Functions [4]: [sum(UnscaledValue(sales_price#8)), sum(UnscaledValue(return_amt#10)), sum(UnscaledValue(profit#9)), sum(UnscaledValue(net_loss#11))]

(23) CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_sales
Output [4]: [cs_catalog_page_sk#31, cs_ext_sales_price#32, cs_net_profit#33, cs_sold_date_sk#34]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cs_sold_date_sk#34), dynamicpruningexpression(cs_sold_date_sk#34 IN dynamicpruning#35)]
PushedFilters: [IsNotNull(cs_catalog_page_sk)]
ReadSchema: struct<cs_catalog_page_sk:int,cs_ext_sales_price:decimal(7,2),cs_net_profit:decimal(7,2)>

(24) CometFilter
Input [4]: [cs_catalog_page_sk#31, cs_ext_sales_price#32, cs_net_profit#33, cs_sold_date_sk#34]
Condition : isnotnull(cs_catalog_page_sk#31)

(25) CometProject
Input [4]: [cs_catalog_page_sk#31, cs_ext_sales_price#32, cs_net_profit#33, cs_sold_date_sk#34]
Arguments: [page_sk#36, date_sk#37, sales_price#38, profit#39, return_amt#40, net_loss#41], [cs_catalog_page_sk#31 AS page_sk#36, cs_sold_date_sk#34 AS date_sk#37, cs_ext_sales_price#32 AS sales_price#38, cs_net_profit#33 AS profit#39, 0.00 AS return_amt#40, 0.00 AS net_loss#41]

(26) CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_returns
Output [4]: [cr_catalog_page_sk#42, cr_return_amount#43, cr_net_loss#44, cr_returned_date_sk#45]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cr_returned_date_sk#45), dynamicpruningexpression(cr_returned_date_sk#45 IN dynamicpruning#35)]
PushedFilters: [IsNotNull(cr_catalog_page_sk)]
ReadSchema: struct<cr_catalog_page_sk:int,cr_return_amount:decimal(7,2),cr_net_loss:decimal(7,2)>

(27) CometFilter
Input [4]: [cr_catalog_page_sk#42, cr_return_amount#43, cr_net_loss#44, cr_returned_date_sk#45]
Condition : isnotnull(cr_catalog_page_sk#42)

(28) CometProject
Input [4]: [cr_catalog_page_sk#42, cr_return_amount#43, cr_net_loss#44, cr_returned_date_sk#45]
Arguments: [page_sk#46, date_sk#47, sales_price#48, profit#49, return_amt#50, net_loss#51], [cr_catalog_page_sk#42 AS page_sk#46, cr_returned_date_sk#45 AS date_sk#47, 0.00 AS sales_price#48, 0.00 AS profit#49, cr_return_amount#43 AS return_amt#50, cr_net_loss#44 AS net_loss#51]

(29) CometUnion
Child 0 Input [6]: [page_sk#36, date_sk#37, sales_price#38, profit#39, return_amt#40, net_loss#41]
Child 1 Input [6]: [page_sk#46, date_sk#47, sales_price#48, profit#49, return_amt#50, net_loss#51]

(30) ReusedExchange [Reuses operator id: 11]
Output [1]: [d_date_sk#52]

(31) CometBroadcastHashJoin
Left output [6]: [page_sk#36, date_sk#37, sales_price#38, profit#39, return_amt#40, net_loss#41]
Right output [1]: [d_date_sk#52]
Arguments: [date_sk#37], [d_date_sk#52], Inner, BuildRight

(32) CometProject
Input [7]: [page_sk#36, date_sk#37, sales_price#38, profit#39, return_amt#40, net_loss#41, d_date_sk#52]
Arguments: [page_sk#36, sales_price#38, profit#39, return_amt#40, net_loss#41], [page_sk#36, sales_price#38, profit#39, return_amt#40, net_loss#41]

(33) CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_page
Output [2]: [cp_catalog_page_sk#53, cp_catalog_page_id#54]
Batched: true
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>

(34) CometFilter
Input [2]: [cp_catalog_page_sk#53, cp_catalog_page_id#54]
Condition : isnotnull(cp_catalog_page_sk#53)

(35) CometProject
Input [2]: [cp_catalog_page_sk#53, cp_catalog_page_id#54]
Arguments: [cp_catalog_page_sk#53, cp_catalog_page_id#55], [cp_catalog_page_sk#53, staticinvoke(class org.apache.spark.sql.catalyst.util.CharVarcharCodegenUtils, StringType, readSidePadding, cp_catalog_page_id#54, 16, true, false, true) AS cp_catalog_page_id#55]

(36) CometBroadcastExchange
Input [2]: [cp_catalog_page_sk#53, cp_catalog_page_id#55]
Arguments: [cp_catalog_page_sk#53, cp_catalog_page_id#55]

(37) CometBroadcastHashJoin
Left output [5]: [page_sk#36, sales_price#38, profit#39, return_amt#40, net_loss#41]
Right output [2]: [cp_catalog_page_sk#53, cp_catalog_page_id#55]
Arguments: [page_sk#36], [cp_catalog_page_sk#53], Inner, BuildRight

(38) CometProject
Input [7]: [page_sk#36, sales_price#38, profit#39, return_amt#40, net_loss#41, cp_catalog_page_sk#53, cp_catalog_page_id#55]
Arguments: [sales_price#38, profit#39, return_amt#40, net_loss#41, cp_catalog_page_id#55], [sales_price#38, profit#39, return_amt#40, net_loss#41, cp_catalog_page_id#55]

(39) CometHashAggregate
Input [5]: [sales_price#38, profit#39, return_amt#40, net_loss#41, cp_catalog_page_id#55]
Keys [1]: [cp_catalog_page_id#55]
Functions [4]: [partial_sum(UnscaledValue(sales_price#38)), partial_sum(UnscaledValue(return_amt#40)), partial_sum(UnscaledValue(profit#39)), partial_sum(UnscaledValue(net_loss#41))]

(40) CometExchange
Input [5]: [cp_catalog_page_id#55, sum#56, sum#57, sum#58, sum#59]
Arguments: hashpartitioning(cp_catalog_page_id#55, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]

(41) CometHashAggregate
Input [5]: [cp_catalog_page_id#55, sum#56, sum#57, sum#58, sum#59]
Keys [1]: [cp_catalog_page_id#55]
Functions [4]: [sum(UnscaledValue(sales_price#38)), sum(UnscaledValue(return_amt#40)), sum(UnscaledValue(profit#39)), sum(UnscaledValue(net_loss#41))]

(42) CometScan [native_iceberg_compat] parquet spark_catalog.default.web_sales
Output [4]: [ws_web_site_sk#60, ws_ext_sales_price#61, ws_net_profit#62, ws_sold_date_sk#63]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#63), dynamicpruningexpression(ws_sold_date_sk#63 IN dynamicpruning#64)]
PushedFilters: [IsNotNull(ws_web_site_sk)]
ReadSchema: struct<ws_web_site_sk:int,ws_ext_sales_price:decimal(7,2),ws_net_profit:decimal(7,2)>

(43) CometFilter
Input [4]: [ws_web_site_sk#60, ws_ext_sales_price#61, ws_net_profit#62, ws_sold_date_sk#63]
Condition : isnotnull(ws_web_site_sk#60)

(44) CometProject
Input [4]: [ws_web_site_sk#60, ws_ext_sales_price#61, ws_net_profit#62, ws_sold_date_sk#63]
Arguments: [wsr_web_site_sk#65, date_sk#66, sales_price#67, profit#68, return_amt#69, net_loss#70], [ws_web_site_sk#60 AS wsr_web_site_sk#65, ws_sold_date_sk#63 AS date_sk#66, ws_ext_sales_price#61 AS sales_price#67, ws_net_profit#62 AS profit#68, 0.00 AS return_amt#69, 0.00 AS net_loss#70]

(45) CometScan [native_iceberg_compat] parquet spark_catalog.default.web_returns
Output [5]: [wr_item_sk#71, wr_order_number#72, wr_return_amt#73, wr_net_loss#74, wr_returned_date_sk#75]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(wr_returned_date_sk#75), dynamicpruningexpression(wr_returned_date_sk#75 IN dynamicpruning#64)]
ReadSchema: struct<wr_item_sk:int,wr_order_number:int,wr_return_amt:decimal(7,2),wr_net_loss:decimal(7,2)>

(46) CometBroadcastExchange
Input [5]: [wr_item_sk#71, wr_order_number#72, wr_return_amt#73, wr_net_loss#74, wr_returned_date_sk#75]
Arguments: [wr_item_sk#71, wr_order_number#72, wr_return_amt#73, wr_net_loss#74, wr_returned_date_sk#75]

(47) CometScan [native_iceberg_compat] parquet spark_catalog.default.web_sales
Output [4]: [ws_item_sk#76, ws_web_site_sk#77, ws_order_number#78, ws_sold_date_sk#79]
Batched: true
Location [not included in comparison]/{warehouse_dir}/web_sales]
PushedFilters: [IsNotNull(ws_item_sk), IsNotNull(ws_order_number), IsNotNull(ws_web_site_sk)]
ReadSchema: struct<ws_item_sk:int,ws_web_site_sk:int,ws_order_number:int>

(48) CometFilter
Input [4]: [ws_item_sk#76, ws_web_site_sk#77, ws_order_number#78, ws_sold_date_sk#79]
Condition : ((isnotnull(ws_item_sk#76) AND isnotnull(ws_order_number#78)) AND isnotnull(ws_web_site_sk#77))

(49) CometProject
Input [4]: [ws_item_sk#76, ws_web_site_sk#77, ws_order_number#78, ws_sold_date_sk#79]
Arguments: [ws_item_sk#76, ws_web_site_sk#77, ws_order_number#78], [ws_item_sk#76, ws_web_site_sk#77, ws_order_number#78]

(50) CometBroadcastHashJoin
Left output [5]: [wr_item_sk#71, wr_order_number#72, wr_return_amt#73, wr_net_loss#74, wr_returned_date_sk#75]
Right output [3]: [ws_item_sk#76, ws_web_site_sk#77, ws_order_number#78]
Arguments: [wr_item_sk#71, wr_order_number#72], [ws_item_sk#76, ws_order_number#78], Inner, BuildLeft

(51) CometProject
Input [8]: [wr_item_sk#71, wr_order_number#72, wr_return_amt#73, wr_net_loss#74, wr_returned_date_sk#75, ws_item_sk#76, ws_web_site_sk#77, ws_order_number#78]
Arguments: [wsr_web_site_sk#80, date_sk#81, sales_price#82, profit#83, return_amt#84, net_loss#85], [ws_web_site_sk#77 AS wsr_web_site_sk#80, wr_returned_date_sk#75 AS date_sk#81, 0.00 AS sales_price#82, 0.00 AS profit#83, wr_return_amt#73 AS return_amt#84, wr_net_loss#74 AS net_loss#85]

(52) CometUnion
Child 0 Input [6]: [wsr_web_site_sk#65, date_sk#66, sales_price#67, profit#68, return_amt#69, net_loss#70]
Child 1 Input [6]: [wsr_web_site_sk#80, date_sk#81, sales_price#82, profit#83, return_amt#84, net_loss#85]

(53) ReusedExchange [Reuses operator id: 11]
Output [1]: [d_date_sk#86]

(54) CometBroadcastHashJoin
Left output [6]: [wsr_web_site_sk#65, date_sk#66, sales_price#67, profit#68, return_amt#69, net_loss#70]
Right output [1]: [d_date_sk#86]
Arguments: [date_sk#66], [d_date_sk#86], Inner, BuildRight

(55) CometProject
Input [7]: [wsr_web_site_sk#65, date_sk#66, sales_price#67, profit#68, return_amt#69, net_loss#70, d_date_sk#86]
Arguments: [wsr_web_site_sk#65, sales_price#67, profit#68, return_amt#69, net_loss#70], [wsr_web_site_sk#65, sales_price#67, profit#68, return_amt#69, net_loss#70]

(56) CometScan [native_iceberg_compat] parquet spark_catalog.default.web_site
Output [2]: [web_site_sk#87, web_site_id#88]
Batched: true
Location [not included in comparison]/{warehouse_dir}/web_site]
PushedFilters: [IsNotNull(web_site_sk)]
ReadSchema: struct<web_site_sk:int,web_site_id:string>

(57) CometFilter
Input [2]: [web_site_sk#87, web_site_id#88]
Condition : isnotnull(web_site_sk#87)

(58) CometProject
Input [2]: [web_site_sk#87, web_site_id#88]
Arguments: [web_site_sk#87, web_site_id#89], [web_site_sk#87, staticinvoke(class org.apache.spark.sql.catalyst.util.CharVarcharCodegenUtils, StringType, readSidePadding, web_site_id#88, 16, true, false, true) AS web_site_id#89]

(59) CometBroadcastExchange
Input [2]: [web_site_sk#87, web_site_id#89]
Arguments: [web_site_sk#87, web_site_id#89]

(60) CometBroadcastHashJoin
Left output [5]: [wsr_web_site_sk#65, sales_price#67, profit#68, return_amt#69, net_loss#70]
Right output [2]: [web_site_sk#87, web_site_id#89]
Arguments: [wsr_web_site_sk#65], [web_site_sk#87], Inner, BuildRight

(61) CometProject
Input [7]: [wsr_web_site_sk#65, sales_price#67, profit#68, return_amt#69, net_loss#70, web_site_sk#87, web_site_id#89]
Arguments: [sales_price#67, profit#68, return_amt#69, net_loss#70, web_site_id#89], [sales_price#67, profit#68, return_amt#69, net_loss#70, web_site_id#89]

(62) CometHashAggregate
Input [5]: [sales_price#67, profit#68, return_amt#69, net_loss#70, web_site_id#89]
Keys [1]: [web_site_id#89]
Functions [4]: [partial_sum(UnscaledValue(sales_price#67)), partial_sum(UnscaledValue(return_amt#69)), partial_sum(UnscaledValue(profit#68)), partial_sum(UnscaledValue(net_loss#70))]

(63) CometExchange
Input [5]: [web_site_id#89, sum#90, sum#91, sum#92, sum#93]
Arguments: hashpartitioning(web_site_id#89, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]

(64) CometHashAggregate
Input [5]: [web_site_id#89, sum#90, sum#91, sum#92, sum#93]
Keys [1]: [web_site_id#89]
Functions [4]: [sum(UnscaledValue(sales_price#67)), sum(UnscaledValue(return_amt#69)), sum(UnscaledValue(profit#68)), sum(UnscaledValue(net_loss#70))]

(65) CometUnion
Child 0 Input [5]: [channel#94, id#95, sales#96, returns#97, profit#98]
Child 1 Input [5]: [channel#99, id#100, sales#101, returns#102, profit#103]
Child 2 Input [5]: [channel#104, id#105, sales#106, returns#107, profit#108]

(66) CometHashAggregate
Input [5]: [channel#94, id#95, sales#96, returns#97, profit#98]
Keys [2]: [channel#94, id#95]
Functions [3]: [partial_sum(sales#96), partial_sum(returns#97), partial_sum(profit#98)]

(67) CometExchange
Input [8]: [channel#94, id#95, sum#109, isEmpty#110, sum#111, isEmpty#112, sum#113, isEmpty#114]
Arguments: hashpartitioning(channel#94, id#95, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=4]

(68) CometHashAggregate
Input [8]: [channel#94, id#95, sum#109, isEmpty#110, sum#111, isEmpty#112, sum#113, isEmpty#114]
Keys [2]: [channel#94, id#95]
Functions [3]: [sum(sales#96), sum(returns#97), sum(profit#98)]

(69) ReusedExchange [Reuses operator id: 67]
Output [8]: [channel#94, id#95, sum#109, isEmpty#110, sum#111, isEmpty#112, sum#113, isEmpty#114]

(70) CometHashAggregate
Input [8]: [channel#94, id#95, sum#109, isEmpty#110, sum#111, isEmpty#112, sum#113, isEmpty#114]
Keys [2]: [channel#94, id#95]
Functions [3]: [sum(sales#96), sum(returns#97), sum(profit#98)]

(71) CometHashAggregate
Input [4]: [channel#94, sales#115, returns#116, profit#117]
Keys [1]: [channel#94]
Functions [3]: [partial_sum(sales#115), partial_sum(returns#116), partial_sum(profit#117)]

(72) CometExchange
Input [7]: [channel#94, sum#118, isEmpty#119, sum#120, isEmpty#121, sum#122, isEmpty#123]
Arguments: hashpartitioning(channel#94, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=5]

(73) CometHashAggregate
Input [7]: [channel#94, sum#118, isEmpty#119, sum#120, isEmpty#121, sum#122, isEmpty#123]
Keys [1]: [channel#94]
Functions [3]: [sum(sales#115), sum(returns#116), sum(profit#117)]

(74) ReusedExchange [Reuses operator id: 67]
Output [8]: [channel#94, id#95, sum#109, isEmpty#110, sum#111, isEmpty#112, sum#113, isEmpty#114]

(75) CometHashAggregate
Input [8]: [channel#94, id#95, sum#109, isEmpty#110, sum#111, isEmpty#112, sum#113, isEmpty#114]
Keys [2]: [channel#94, id#95]
Functions [3]: [sum(sales#96), sum(returns#97), sum(profit#98)]

(76) CometHashAggregate
Input [3]: [sales#115, returns#116, profit#117]
Keys: []
Functions [3]: [partial_sum(sales#115), partial_sum(returns#116), partial_sum(profit#117)]

(77) CometExchange
Input [6]: [sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]
Arguments: SinglePartition, ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=6]

(78) CometHashAggregate
Input [6]: [sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]
Keys: []
Functions [3]: [sum(sales#115), sum(returns#116), sum(profit#117)]

(79) CometUnion
Child 0 Input [5]: [channel#94, id#95, sales#130, returns#131, profit#132]
Child 1 Input [5]: [channel#94, id#133, sum(sales)#134, sum(returns)#135, sum(profit)#136]
Child 2 Input [5]: [channel#137, id#138, sum(sales)#139, sum(returns)#140, sum(profit)#141]

(80) CometHashAggregate
Input [5]: [channel#94, id#95, sales#130, returns#131, profit#132]
Keys [5]: [channel#94, id#95, sales#130, returns#131, profit#132]
Functions: []

(81) CometExchange
Input [5]: [channel#94, id#95, sales#130, returns#131, profit#132]
Arguments: hashpartitioning(channel#94, id#95, sales#130, returns#131, profit#132, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=7]

(82) CometHashAggregate
Input [5]: [channel#94, id#95, sales#130, returns#131, profit#132]
Keys [5]: [channel#94, id#95, sales#130, returns#131, profit#132]
Functions: []

(83) CometTakeOrderedAndProject
Input [5]: [channel#94, id#95, sales#130, returns#131, profit#132]
Arguments: TakeOrderedAndProject(limit=100, orderBy=[channel#94 ASC NULLS FIRST,id#95 ASC NULLS FIRST], output=[channel#94,id#95,sales#130,returns#131,profit#132]), [channel#94, id#95, sales#130, returns#131, profit#132], 100, 0, [channel#94 ASC NULLS FIRST, id#95 ASC NULLS FIRST], [channel#94, id#95, sales#130, returns#131, profit#132]

(84) CometColumnarToRow [codegen id : 1]
Input [5]: [channel#94, id#95, sales#130, returns#131, profit#132]

===== Subqueries =====

Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#4 IN dynamicpruning#5
BroadcastExchange (89)
+- * CometColumnarToRow (88)
   +- CometProject (87)
      +- CometFilter (86)
         +- CometScan [native_iceberg_compat] parquet spark_catalog.default.date_dim (85)


(85) CometScan [native_iceberg_compat] parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#22, d_date#23]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,1998-08-04), LessThanOrEqual(d_date,1998-08-18), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_date:date>

(86) CometFilter
Input [2]: [d_date_sk#22, d_date#23]
Condition : (((isnotnull(d_date#23) AND (d_date#23 >= 1998-08-04)) AND (d_date#23 <= 1998-08-18)) AND isnotnull(d_date_sk#22))

(87) CometProject
Input [2]: [d_date_sk#22, d_date#23]
Arguments: [d_date_sk#22], [d_date_sk#22]

(88) CometColumnarToRow [codegen id : 1]
Input [1]: [d_date_sk#22]

(89) BroadcastExchange
Input [1]: [d_date_sk#22]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=8]

Subquery:2 Hosting operator id = 4 Hosting Expression = sr_returned_date_sk#15 IN dynamicpruning#5

Subquery:3 Hosting operator id = 23 Hosting Expression = cs_sold_date_sk#34 IN dynamicpruning#5

Subquery:4 Hosting operator id = 26 Hosting Expression = cr_returned_date_sk#45 IN dynamicpruning#5

Subquery:5 Hosting operator id = 42 Hosting Expression = ws_sold_date_sk#63 IN dynamicpruning#5

Subquery:6 Hosting operator id = 45 Hosting Expression = wr_returned_date_sk#75 IN dynamicpruning#5


