== Physical Plan ==
* CometColumnarToRow (92)
+- CometTakeOrderedAndProject (91)
   +- CometHashAggregate (90)
      +- CometColumnarExchange (89)
         +- * HashAggregate (88)
            +- Union (87)
               :- * HashAggregate (72)
               :  +- * CometColumnarToRow (71)
               :     +- CometColumnarExchange (70)
               :        +- * HashAggregate (69)
               :           +- Union (68)
               :              :- * HashAggregate (23)
               :              :  +- * CometColumnarToRow (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)
               :              :- * HashAggregate (43)
               :              :  +- * CometColumnarToRow (42)
               :              :     +- CometExchange (41)
               :              :        +- CometHashAggregate (40)
               :              :           +- CometProject (39)
               :              :              +- CometBroadcastHashJoin (38)
               :              :                 :- CometProject (33)
               :              :                 :  +- CometBroadcastHashJoin (32)
               :              :                 :     :- CometUnion (30)
               :              :                 :     :  :- CometProject (26)
               :              :                 :     :  :  +- CometFilter (25)
               :              :                 :     :  :     +- CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_sales (24)
               :              :                 :     :  +- CometProject (29)
               :              :                 :     :     +- CometFilter (28)
               :              :                 :     :        +- CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_returns (27)
               :              :                 :     +- ReusedExchange (31)
               :              :                 +- CometBroadcastExchange (37)
               :              :                    +- CometProject (36)
               :              :                       +- CometFilter (35)
               :              :                          +- CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_page (34)
               :              +- * HashAggregate (67)
               :                 +- * CometColumnarToRow (66)
               :                    +- CometExchange (65)
               :                       +- CometHashAggregate (64)
               :                          +- CometProject (63)
               :                             +- CometBroadcastHashJoin (62)
               :                                :- CometProject (57)
               :                                :  +- CometBroadcastHashJoin (56)
               :                                :     :- CometUnion (54)
               :                                :     :  :- CometProject (46)
               :                                :     :  :  +- CometFilter (45)
               :                                :     :  :     +- CometScan [native_iceberg_compat] parquet spark_catalog.default.web_sales (44)
               :                                :     :  +- CometProject (53)
               :                                :     :     +- CometBroadcastHashJoin (52)
               :                                :     :        :- CometBroadcastExchange (48)
               :                                :     :        :  +- CometScan [native_iceberg_compat] parquet spark_catalog.default.web_returns (47)
               :                                :     :        +- CometProject (51)
               :                                :     :           +- CometFilter (50)
               :                                :     :              +- CometScan [native_iceberg_compat] parquet spark_catalog.default.web_sales (49)
               :                                :     +- ReusedExchange (55)
               :                                +- CometBroadcastExchange (61)
               :                                   +- CometProject (60)
               :                                      +- CometFilter (59)
               :                                         +- CometScan [native_iceberg_compat] parquet spark_catalog.default.web_site (58)
               :- * HashAggregate (79)
               :  +- * CometColumnarToRow (78)
               :     +- CometColumnarExchange (77)
               :        +- * HashAggregate (76)
               :           +- * HashAggregate (75)
               :              +- * CometColumnarToRow (74)
               :                 +- ReusedExchange (73)
               +- * HashAggregate (86)
                  +- * CometColumnarToRow (85)
                     +- CometColumnarExchange (84)
                        +- * HashAggregate (83)
                           +- * HashAggregate (82)
                              +- * CometColumnarToRow (81)
                                 +- ReusedExchange (80)


(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) CometColumnarToRow [codegen id : 1]
Input [5]: [s_store_id#26, sum#27, sum#28, sum#29, sum#30]

(23) HashAggregate [codegen id : 1]
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))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#8))#31, sum(UnscaledValue(return_amt#10))#32, sum(UnscaledValue(profit#9))#33, sum(UnscaledValue(net_loss#11))#34]
Results [5]: [store channel AS channel#35, concat(store, s_store_id#26) AS id#36, MakeDecimal(sum(UnscaledValue(sales_price#8))#31,17,2) AS sales#37, MakeDecimal(sum(UnscaledValue(return_amt#10))#32,17,2) AS returns#38, (MakeDecimal(sum(UnscaledValue(profit#9))#33,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#11))#34,17,2)) AS profit#39]

(24) CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_sales
Output [4]: [cs_catalog_page_sk#40, cs_ext_sales_price#41, cs_net_profit#42, cs_sold_date_sk#43]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cs_sold_date_sk#43), dynamicpruningexpression(cs_sold_date_sk#43 IN dynamicpruning#44)]
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)>

(25) CometFilter
Input [4]: [cs_catalog_page_sk#40, cs_ext_sales_price#41, cs_net_profit#42, cs_sold_date_sk#43]
Condition : isnotnull(cs_catalog_page_sk#40)

(26) CometProject
Input [4]: [cs_catalog_page_sk#40, cs_ext_sales_price#41, cs_net_profit#42, cs_sold_date_sk#43]
Arguments: [page_sk#45, date_sk#46, sales_price#47, profit#48, return_amt#49, net_loss#50], [cs_catalog_page_sk#40 AS page_sk#45, cs_sold_date_sk#43 AS date_sk#46, cs_ext_sales_price#41 AS sales_price#47, cs_net_profit#42 AS profit#48, 0.00 AS return_amt#49, 0.00 AS net_loss#50]

(27) CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_returns
Output [4]: [cr_catalog_page_sk#51, cr_return_amount#52, cr_net_loss#53, cr_returned_date_sk#54]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cr_returned_date_sk#54), dynamicpruningexpression(cr_returned_date_sk#54 IN dynamicpruning#44)]
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)>

(28) CometFilter
Input [4]: [cr_catalog_page_sk#51, cr_return_amount#52, cr_net_loss#53, cr_returned_date_sk#54]
Condition : isnotnull(cr_catalog_page_sk#51)

(29) CometProject
Input [4]: [cr_catalog_page_sk#51, cr_return_amount#52, cr_net_loss#53, cr_returned_date_sk#54]
Arguments: [page_sk#55, date_sk#56, sales_price#57, profit#58, return_amt#59, net_loss#60], [cr_catalog_page_sk#51 AS page_sk#55, cr_returned_date_sk#54 AS date_sk#56, 0.00 AS sales_price#57, 0.00 AS profit#58, cr_return_amount#52 AS return_amt#59, cr_net_loss#53 AS net_loss#60]

(30) CometUnion
Child 0 Input [6]: [page_sk#45, date_sk#46, sales_price#47, profit#48, return_amt#49, net_loss#50]
Child 1 Input [6]: [page_sk#55, date_sk#56, sales_price#57, profit#58, return_amt#59, net_loss#60]

(31) ReusedExchange [Reuses operator id: 11]
Output [1]: [d_date_sk#61]

(32) CometBroadcastHashJoin
Left output [6]: [page_sk#45, date_sk#46, sales_price#47, profit#48, return_amt#49, net_loss#50]
Right output [1]: [d_date_sk#61]
Arguments: [date_sk#46], [d_date_sk#61], Inner, BuildRight

(33) CometProject
Input [7]: [page_sk#45, date_sk#46, sales_price#47, profit#48, return_amt#49, net_loss#50, d_date_sk#61]
Arguments: [page_sk#45, sales_price#47, profit#48, return_amt#49, net_loss#50], [page_sk#45, sales_price#47, profit#48, return_amt#49, net_loss#50]

(34) CometScan [native_iceberg_compat] parquet spark_catalog.default.catalog_page
Output [2]: [cp_catalog_page_sk#62, cp_catalog_page_id#63]
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>

(35) CometFilter
Input [2]: [cp_catalog_page_sk#62, cp_catalog_page_id#63]
Condition : isnotnull(cp_catalog_page_sk#62)

(36) CometProject
Input [2]: [cp_catalog_page_sk#62, cp_catalog_page_id#63]
Arguments: [cp_catalog_page_sk#62, cp_catalog_page_id#64], [cp_catalog_page_sk#62, staticinvoke(class org.apache.spark.sql.catalyst.util.CharVarcharCodegenUtils, StringType, readSidePadding, cp_catalog_page_id#63, 16, true, false, true) AS cp_catalog_page_id#64]

(37) CometBroadcastExchange
Input [2]: [cp_catalog_page_sk#62, cp_catalog_page_id#64]
Arguments: [cp_catalog_page_sk#62, cp_catalog_page_id#64]

(38) CometBroadcastHashJoin
Left output [5]: [page_sk#45, sales_price#47, profit#48, return_amt#49, net_loss#50]
Right output [2]: [cp_catalog_page_sk#62, cp_catalog_page_id#64]
Arguments: [page_sk#45], [cp_catalog_page_sk#62], Inner, BuildRight

(39) CometProject
Input [7]: [page_sk#45, sales_price#47, profit#48, return_amt#49, net_loss#50, cp_catalog_page_sk#62, cp_catalog_page_id#64]
Arguments: [sales_price#47, profit#48, return_amt#49, net_loss#50, cp_catalog_page_id#64], [sales_price#47, profit#48, return_amt#49, net_loss#50, cp_catalog_page_id#64]

(40) CometHashAggregate
Input [5]: [sales_price#47, profit#48, return_amt#49, net_loss#50, cp_catalog_page_id#64]
Keys [1]: [cp_catalog_page_id#64]
Functions [4]: [partial_sum(UnscaledValue(sales_price#47)), partial_sum(UnscaledValue(return_amt#49)), partial_sum(UnscaledValue(profit#48)), partial_sum(UnscaledValue(net_loss#50))]

(41) CometExchange
Input [5]: [cp_catalog_page_id#64, sum#65, sum#66, sum#67, sum#68]
Arguments: hashpartitioning(cp_catalog_page_id#64, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]

(42) CometColumnarToRow [codegen id : 2]
Input [5]: [cp_catalog_page_id#64, sum#65, sum#66, sum#67, sum#68]

(43) HashAggregate [codegen id : 2]
Input [5]: [cp_catalog_page_id#64, sum#65, sum#66, sum#67, sum#68]
Keys [1]: [cp_catalog_page_id#64]
Functions [4]: [sum(UnscaledValue(sales_price#47)), sum(UnscaledValue(return_amt#49)), sum(UnscaledValue(profit#48)), sum(UnscaledValue(net_loss#50))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#47))#69, sum(UnscaledValue(return_amt#49))#70, sum(UnscaledValue(profit#48))#71, sum(UnscaledValue(net_loss#50))#72]
Results [5]: [catalog channel AS channel#73, concat(catalog_page, cp_catalog_page_id#64) AS id#74, MakeDecimal(sum(UnscaledValue(sales_price#47))#69,17,2) AS sales#75, MakeDecimal(sum(UnscaledValue(return_amt#49))#70,17,2) AS returns#76, (MakeDecimal(sum(UnscaledValue(profit#48))#71,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#50))#72,17,2)) AS profit#77]

(44) CometScan [native_iceberg_compat] parquet spark_catalog.default.web_sales
Output [4]: [ws_web_site_sk#78, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#81), dynamicpruningexpression(ws_sold_date_sk#81 IN dynamicpruning#82)]
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)>

(45) CometFilter
Input [4]: [ws_web_site_sk#78, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81]
Condition : isnotnull(ws_web_site_sk#78)

(46) CometProject
Input [4]: [ws_web_site_sk#78, ws_ext_sales_price#79, ws_net_profit#80, ws_sold_date_sk#81]
Arguments: [wsr_web_site_sk#83, date_sk#84, sales_price#85, profit#86, return_amt#87, net_loss#88], [ws_web_site_sk#78 AS wsr_web_site_sk#83, ws_sold_date_sk#81 AS date_sk#84, ws_ext_sales_price#79 AS sales_price#85, ws_net_profit#80 AS profit#86, 0.00 AS return_amt#87, 0.00 AS net_loss#88]

(47) CometScan [native_iceberg_compat] parquet spark_catalog.default.web_returns
Output [5]: [wr_item_sk#89, wr_order_number#90, wr_return_amt#91, wr_net_loss#92, wr_returned_date_sk#93]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(wr_returned_date_sk#93), dynamicpruningexpression(wr_returned_date_sk#93 IN dynamicpruning#82)]
ReadSchema: struct<wr_item_sk:int,wr_order_number:int,wr_return_amt:decimal(7,2),wr_net_loss:decimal(7,2)>

(48) CometBroadcastExchange
Input [5]: [wr_item_sk#89, wr_order_number#90, wr_return_amt#91, wr_net_loss#92, wr_returned_date_sk#93]
Arguments: [wr_item_sk#89, wr_order_number#90, wr_return_amt#91, wr_net_loss#92, wr_returned_date_sk#93]

(49) CometScan [native_iceberg_compat] parquet spark_catalog.default.web_sales
Output [4]: [ws_item_sk#94, ws_web_site_sk#95, ws_order_number#96, ws_sold_date_sk#97]
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>

(50) CometFilter
Input [4]: [ws_item_sk#94, ws_web_site_sk#95, ws_order_number#96, ws_sold_date_sk#97]
Condition : ((isnotnull(ws_item_sk#94) AND isnotnull(ws_order_number#96)) AND isnotnull(ws_web_site_sk#95))

(51) CometProject
Input [4]: [ws_item_sk#94, ws_web_site_sk#95, ws_order_number#96, ws_sold_date_sk#97]
Arguments: [ws_item_sk#94, ws_web_site_sk#95, ws_order_number#96], [ws_item_sk#94, ws_web_site_sk#95, ws_order_number#96]

(52) CometBroadcastHashJoin
Left output [5]: [wr_item_sk#89, wr_order_number#90, wr_return_amt#91, wr_net_loss#92, wr_returned_date_sk#93]
Right output [3]: [ws_item_sk#94, ws_web_site_sk#95, ws_order_number#96]
Arguments: [wr_item_sk#89, wr_order_number#90], [ws_item_sk#94, ws_order_number#96], Inner, BuildLeft

(53) CometProject
Input [8]: [wr_item_sk#89, wr_order_number#90, wr_return_amt#91, wr_net_loss#92, wr_returned_date_sk#93, ws_item_sk#94, ws_web_site_sk#95, ws_order_number#96]
Arguments: [wsr_web_site_sk#98, date_sk#99, sales_price#100, profit#101, return_amt#102, net_loss#103], [ws_web_site_sk#95 AS wsr_web_site_sk#98, wr_returned_date_sk#93 AS date_sk#99, 0.00 AS sales_price#100, 0.00 AS profit#101, wr_return_amt#91 AS return_amt#102, wr_net_loss#92 AS net_loss#103]

(54) CometUnion
Child 0 Input [6]: [wsr_web_site_sk#83, date_sk#84, sales_price#85, profit#86, return_amt#87, net_loss#88]
Child 1 Input [6]: [wsr_web_site_sk#98, date_sk#99, sales_price#100, profit#101, return_amt#102, net_loss#103]

(55) ReusedExchange [Reuses operator id: 11]
Output [1]: [d_date_sk#104]

(56) CometBroadcastHashJoin
Left output [6]: [wsr_web_site_sk#83, date_sk#84, sales_price#85, profit#86, return_amt#87, net_loss#88]
Right output [1]: [d_date_sk#104]
Arguments: [date_sk#84], [d_date_sk#104], Inner, BuildRight

(57) CometProject
Input [7]: [wsr_web_site_sk#83, date_sk#84, sales_price#85, profit#86, return_amt#87, net_loss#88, d_date_sk#104]
Arguments: [wsr_web_site_sk#83, sales_price#85, profit#86, return_amt#87, net_loss#88], [wsr_web_site_sk#83, sales_price#85, profit#86, return_amt#87, net_loss#88]

(58) CometScan [native_iceberg_compat] parquet spark_catalog.default.web_site
Output [2]: [web_site_sk#105, web_site_id#106]
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>

(59) CometFilter
Input [2]: [web_site_sk#105, web_site_id#106]
Condition : isnotnull(web_site_sk#105)

(60) CometProject
Input [2]: [web_site_sk#105, web_site_id#106]
Arguments: [web_site_sk#105, web_site_id#107], [web_site_sk#105, staticinvoke(class org.apache.spark.sql.catalyst.util.CharVarcharCodegenUtils, StringType, readSidePadding, web_site_id#106, 16, true, false, true) AS web_site_id#107]

(61) CometBroadcastExchange
Input [2]: [web_site_sk#105, web_site_id#107]
Arguments: [web_site_sk#105, web_site_id#107]

(62) CometBroadcastHashJoin
Left output [5]: [wsr_web_site_sk#83, sales_price#85, profit#86, return_amt#87, net_loss#88]
Right output [2]: [web_site_sk#105, web_site_id#107]
Arguments: [wsr_web_site_sk#83], [web_site_sk#105], Inner, BuildRight

(63) CometProject
Input [7]: [wsr_web_site_sk#83, sales_price#85, profit#86, return_amt#87, net_loss#88, web_site_sk#105, web_site_id#107]
Arguments: [sales_price#85, profit#86, return_amt#87, net_loss#88, web_site_id#107], [sales_price#85, profit#86, return_amt#87, net_loss#88, web_site_id#107]

(64) CometHashAggregate
Input [5]: [sales_price#85, profit#86, return_amt#87, net_loss#88, web_site_id#107]
Keys [1]: [web_site_id#107]
Functions [4]: [partial_sum(UnscaledValue(sales_price#85)), partial_sum(UnscaledValue(return_amt#87)), partial_sum(UnscaledValue(profit#86)), partial_sum(UnscaledValue(net_loss#88))]

(65) CometExchange
Input [5]: [web_site_id#107, sum#108, sum#109, sum#110, sum#111]
Arguments: hashpartitioning(web_site_id#107, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]

(66) CometColumnarToRow [codegen id : 3]
Input [5]: [web_site_id#107, sum#108, sum#109, sum#110, sum#111]

(67) HashAggregate [codegen id : 3]
Input [5]: [web_site_id#107, sum#108, sum#109, sum#110, sum#111]
Keys [1]: [web_site_id#107]
Functions [4]: [sum(UnscaledValue(sales_price#85)), sum(UnscaledValue(return_amt#87)), sum(UnscaledValue(profit#86)), sum(UnscaledValue(net_loss#88))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#85))#112, sum(UnscaledValue(return_amt#87))#113, sum(UnscaledValue(profit#86))#114, sum(UnscaledValue(net_loss#88))#115]
Results [5]: [web channel AS channel#116, concat(web_site, web_site_id#107) AS id#117, MakeDecimal(sum(UnscaledValue(sales_price#85))#112,17,2) AS sales#118, MakeDecimal(sum(UnscaledValue(return_amt#87))#113,17,2) AS returns#119, (MakeDecimal(sum(UnscaledValue(profit#86))#114,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#88))#115,17,2)) AS profit#120]

(68) Union

(69) HashAggregate [codegen id : 4]
Input [5]: [channel#35, id#36, sales#37, returns#38, profit#39]
Keys [2]: [channel#35, id#36]
Functions [3]: [partial_sum(sales#37), partial_sum(returns#38), partial_sum(profit#39)]
Aggregate Attributes [6]: [sum#121, isEmpty#122, sum#123, isEmpty#124, sum#125, isEmpty#126]
Results [8]: [channel#35, id#36, sum#127, isEmpty#128, sum#129, isEmpty#130, sum#131, isEmpty#132]

(70) CometColumnarExchange
Input [8]: [channel#35, id#36, sum#127, isEmpty#128, sum#129, isEmpty#130, sum#131, isEmpty#132]
Arguments: hashpartitioning(channel#35, id#36, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=4]

(71) CometColumnarToRow [codegen id : 5]
Input [8]: [channel#35, id#36, sum#127, isEmpty#128, sum#129, isEmpty#130, sum#131, isEmpty#132]

(72) HashAggregate [codegen id : 5]
Input [8]: [channel#35, id#36, sum#127, isEmpty#128, sum#129, isEmpty#130, sum#131, isEmpty#132]
Keys [2]: [channel#35, id#36]
Functions [3]: [sum(sales#37), sum(returns#38), sum(profit#39)]
Aggregate Attributes [3]: [sum(sales#37)#133, sum(returns#38)#134, sum(profit#39)#135]
Results [5]: [channel#35, id#36, cast(sum(sales#37)#133 as decimal(37,2)) AS sales#136, cast(sum(returns#38)#134 as decimal(37,2)) AS returns#137, cast(sum(profit#39)#135 as decimal(38,2)) AS profit#138]

(73) ReusedExchange [Reuses operator id: 70]
Output [8]: [channel#35, id#36, sum#127, isEmpty#128, sum#129, isEmpty#130, sum#131, isEmpty#132]

(74) CometColumnarToRow [codegen id : 10]
Input [8]: [channel#35, id#36, sum#127, isEmpty#128, sum#129, isEmpty#130, sum#131, isEmpty#132]

(75) HashAggregate [codegen id : 10]
Input [8]: [channel#35, id#36, sum#127, isEmpty#128, sum#129, isEmpty#130, sum#131, isEmpty#132]
Keys [2]: [channel#35, id#36]
Functions [3]: [sum(sales#37), sum(returns#38), sum(profit#39)]
Aggregate Attributes [3]: [sum(sales#37)#133, sum(returns#38)#134, sum(profit#39)#135]
Results [4]: [channel#35, sum(sales#37)#133 AS sales#139, sum(returns#38)#134 AS returns#140, sum(profit#39)#135 AS profit#141]

(76) HashAggregate [codegen id : 10]
Input [4]: [channel#35, sales#139, returns#140, profit#141]
Keys [1]: [channel#35]
Functions [3]: [partial_sum(sales#139), partial_sum(returns#140), partial_sum(profit#141)]
Aggregate Attributes [6]: [sum#142, isEmpty#143, sum#144, isEmpty#145, sum#146, isEmpty#147]
Results [7]: [channel#35, sum#148, isEmpty#149, sum#150, isEmpty#151, sum#152, isEmpty#153]

(77) CometColumnarExchange
Input [7]: [channel#35, sum#148, isEmpty#149, sum#150, isEmpty#151, sum#152, isEmpty#153]
Arguments: hashpartitioning(channel#35, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=5]

(78) CometColumnarToRow [codegen id : 11]
Input [7]: [channel#35, sum#148, isEmpty#149, sum#150, isEmpty#151, sum#152, isEmpty#153]

(79) HashAggregate [codegen id : 11]
Input [7]: [channel#35, sum#148, isEmpty#149, sum#150, isEmpty#151, sum#152, isEmpty#153]
Keys [1]: [channel#35]
Functions [3]: [sum(sales#139), sum(returns#140), sum(profit#141)]
Aggregate Attributes [3]: [sum(sales#139)#154, sum(returns#140)#155, sum(profit#141)#156]
Results [5]: [channel#35, null AS id#157, sum(sales#139)#154 AS sum(sales)#158, sum(returns#140)#155 AS sum(returns)#159, sum(profit#141)#156 AS sum(profit)#160]

(80) ReusedExchange [Reuses operator id: 70]
Output [8]: [channel#35, id#36, sum#127, isEmpty#128, sum#129, isEmpty#130, sum#131, isEmpty#132]

(81) CometColumnarToRow [codegen id : 16]
Input [8]: [channel#35, id#36, sum#127, isEmpty#128, sum#129, isEmpty#130, sum#131, isEmpty#132]

(82) HashAggregate [codegen id : 16]
Input [8]: [channel#35, id#36, sum#127, isEmpty#128, sum#129, isEmpty#130, sum#131, isEmpty#132]
Keys [2]: [channel#35, id#36]
Functions [3]: [sum(sales#37), sum(returns#38), sum(profit#39)]
Aggregate Attributes [3]: [sum(sales#37)#133, sum(returns#38)#134, sum(profit#39)#135]
Results [3]: [sum(sales#37)#133 AS sales#161, sum(returns#38)#134 AS returns#162, sum(profit#39)#135 AS profit#163]

(83) HashAggregate [codegen id : 16]
Input [3]: [sales#161, returns#162, profit#163]
Keys: []
Functions [3]: [partial_sum(sales#161), partial_sum(returns#162), partial_sum(profit#163)]
Aggregate Attributes [6]: [sum#164, isEmpty#165, sum#166, isEmpty#167, sum#168, isEmpty#169]
Results [6]: [sum#170, isEmpty#171, sum#172, isEmpty#173, sum#174, isEmpty#175]

(84) CometColumnarExchange
Input [6]: [sum#170, isEmpty#171, sum#172, isEmpty#173, sum#174, isEmpty#175]
Arguments: SinglePartition, ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=6]

(85) CometColumnarToRow [codegen id : 17]
Input [6]: [sum#170, isEmpty#171, sum#172, isEmpty#173, sum#174, isEmpty#175]

(86) HashAggregate [codegen id : 17]
Input [6]: [sum#170, isEmpty#171, sum#172, isEmpty#173, sum#174, isEmpty#175]
Keys: []
Functions [3]: [sum(sales#161), sum(returns#162), sum(profit#163)]
Aggregate Attributes [3]: [sum(sales#161)#176, sum(returns#162)#177, sum(profit#163)#178]
Results [5]: [null AS channel#179, null AS id#180, sum(sales#161)#176 AS sum(sales)#181, sum(returns#162)#177 AS sum(returns)#182, sum(profit#163)#178 AS sum(profit)#183]

(87) Union

(88) HashAggregate [codegen id : 18]
Input [5]: [channel#35, id#36, sales#136, returns#137, profit#138]
Keys [5]: [channel#35, id#36, sales#136, returns#137, profit#138]
Functions: []
Aggregate Attributes: []
Results [5]: [channel#35, id#36, sales#136, returns#137, profit#138]

(89) CometColumnarExchange
Input [5]: [channel#35, id#36, sales#136, returns#137, profit#138]
Arguments: hashpartitioning(channel#35, id#36, sales#136, returns#137, profit#138, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=7]

(90) CometHashAggregate
Input [5]: [channel#35, id#36, sales#136, returns#137, profit#138]
Keys [5]: [channel#35, id#36, sales#136, returns#137, profit#138]
Functions: []

(91) CometTakeOrderedAndProject
Input [5]: [channel#35, id#36, sales#136, returns#137, profit#138]
Arguments: TakeOrderedAndProject(limit=100, orderBy=[channel#35 ASC NULLS FIRST,id#36 ASC NULLS FIRST], output=[channel#35,id#36,sales#136,returns#137,profit#138]), [channel#35, id#36, sales#136, returns#137, profit#138], 100, 0, [channel#35 ASC NULLS FIRST, id#36 ASC NULLS FIRST], [channel#35, id#36, sales#136, returns#137, profit#138]

(92) CometColumnarToRow [codegen id : 19]
Input [5]: [channel#35, id#36, sales#136, returns#137, profit#138]

===== Subqueries =====

Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#4 IN dynamicpruning#5
BroadcastExchange (97)
+- * CometColumnarToRow (96)
   +- CometProject (95)
      +- CometFilter (94)
         +- CometScan [native_iceberg_compat] parquet spark_catalog.default.date_dim (93)


(93) 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>

(94) 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))

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

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

(97) 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 = 24 Hosting Expression = cs_sold_date_sk#43 IN dynamicpruning#5

Subquery:4 Hosting operator id = 27 Hosting Expression = cr_returned_date_sk#54 IN dynamicpruning#5

Subquery:5 Hosting operator id = 44 Hosting Expression = ws_sold_date_sk#81 IN dynamicpruning#5

Subquery:6 Hosting operator id = 47 Hosting Expression = wr_returned_date_sk#93 IN dynamicpruning#5


