== Physical Plan ==
TakeOrderedAndProject (81)
+- * HashAggregate (80)
   +- * CometColumnarToRow (79)
      +- CometColumnarExchange (78)
         +- * HashAggregate (77)
            +- * Expand (76)
               +- Union (75)
                  :- * HashAggregate (23)
                  :  +- * CometColumnarToRow (22)
                  :     +- CometColumnarExchange (21)
                  :        +- * HashAggregate (20)
                  :           +- * Project (19)
                  :              +- * BroadcastHashJoin Inner BuildRight (18)
                  :                 :- * Project (12)
                  :                 :  +- * BroadcastHashJoin Inner BuildRight (11)
                  :                 :     :- Union (9)
                  :                 :     :  :- * Project (4)
                  :                 :     :  :  +- * Filter (3)
                  :                 :     :  :     +- * ColumnarToRow (2)
                  :                 :     :  :        +- Scan parquet spark_catalog.default.store_sales (1)
                  :                 :     :  +- * Project (8)
                  :                 :     :     +- * Filter (7)
                  :                 :     :        +- * ColumnarToRow (6)
                  :                 :     :           +- Scan parquet spark_catalog.default.store_returns (5)
                  :                 :     +- ReusedExchange (10)
                  :                 +- BroadcastExchange (17)
                  :                    +- * CometColumnarToRow (16)
                  :                       +- CometProject (15)
                  :                          +- CometFilter (14)
                  :                             +- CometNativeScan parquet spark_catalog.default.store (13)
                  :- * HashAggregate (46)
                  :  +- * CometColumnarToRow (45)
                  :     +- CometColumnarExchange (44)
                  :        +- * HashAggregate (43)
                  :           +- * Project (42)
                  :              +- * BroadcastHashJoin Inner BuildRight (41)
                  :                 :- * Project (35)
                  :                 :  +- * BroadcastHashJoin Inner BuildRight (34)
                  :                 :     :- Union (32)
                  :                 :     :  :- * Project (27)
                  :                 :     :  :  +- * Filter (26)
                  :                 :     :  :     +- * ColumnarToRow (25)
                  :                 :     :  :        +- Scan parquet spark_catalog.default.catalog_sales (24)
                  :                 :     :  +- * Project (31)
                  :                 :     :     +- * Filter (30)
                  :                 :     :        +- * ColumnarToRow (29)
                  :                 :     :           +- Scan parquet spark_catalog.default.catalog_returns (28)
                  :                 :     +- ReusedExchange (33)
                  :                 +- BroadcastExchange (40)
                  :                    +- * CometColumnarToRow (39)
                  :                       +- CometProject (38)
                  :                          +- CometFilter (37)
                  :                             +- CometNativeScan parquet spark_catalog.default.catalog_page (36)
                  +- * HashAggregate (74)
                     +- * CometColumnarToRow (73)
                        +- CometColumnarExchange (72)
                           +- * HashAggregate (71)
                              +- * Project (70)
                                 +- * BroadcastHashJoin Inner BuildRight (69)
                                    :- * Project (63)
                                    :  +- * BroadcastHashJoin Inner BuildRight (62)
                                    :     :- Union (60)
                                    :     :  :- * Project (50)
                                    :     :  :  +- * Filter (49)
                                    :     :  :     +- * ColumnarToRow (48)
                                    :     :  :        +- Scan parquet spark_catalog.default.web_sales (47)
                                    :     :  +- * Project (59)
                                    :     :     +- * BroadcastHashJoin Inner BuildLeft (58)
                                    :     :        :- BroadcastExchange (53)
                                    :     :        :  +- * ColumnarToRow (52)
                                    :     :        :     +- Scan parquet spark_catalog.default.web_returns (51)
                                    :     :        +- * CometColumnarToRow (57)
                                    :     :           +- CometProject (56)
                                    :     :              +- CometFilter (55)
                                    :     :                 +- CometNativeScan parquet spark_catalog.default.web_sales (54)
                                    :     +- ReusedExchange (61)
                                    +- BroadcastExchange (68)
                                       +- * CometColumnarToRow (67)
                                          +- CometProject (66)
                                             +- CometFilter (65)
                                                +- CometNativeScan parquet spark_catalog.default.web_site (64)


(1) Scan 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) ColumnarToRow [codegen id : 1]
Input [4]: [ss_store_sk#1, ss_ext_sales_price#2, ss_net_profit#3, ss_sold_date_sk#4]

(3) Filter [codegen id : 1]
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)

(4) Project [codegen id : 1]
Output [6]: [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]
Input [4]: [ss_store_sk#1, ss_ext_sales_price#2, ss_net_profit#3, ss_sold_date_sk#4]

(5) Scan 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)>

(6) ColumnarToRow [codegen id : 2]
Input [4]: [sr_store_sk#12, sr_return_amt#13, sr_net_loss#14, sr_returned_date_sk#15]

(7) Filter [codegen id : 2]
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)

(8) Project [codegen id : 2]
Output [6]: [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]
Input [4]: [sr_store_sk#12, sr_return_amt#13, sr_net_loss#14, sr_returned_date_sk#15]

(9) Union

(10) ReusedExchange [Reuses operator id: 86]
Output [1]: [d_date_sk#22]

(11) BroadcastHashJoin [codegen id : 5]
Left keys [1]: [date_sk#7]
Right keys [1]: [d_date_sk#22]
Join type: Inner
Join condition: None

(12) Project [codegen id : 5]
Output [5]: [store_sk#6, sales_price#8, profit#9, return_amt#10, net_loss#11]
Input [7]: [store_sk#6, date_sk#7, sales_price#8, profit#9, return_amt#10, net_loss#11, d_date_sk#22]

(13) CometNativeScan parquet spark_catalog.default.store
Output [2]: [s_store_sk#23, s_store_id#24]
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>

(14) CometFilter
Input [2]: [s_store_sk#23, s_store_id#24]
Condition : isnotnull(s_store_sk#23)

(15) CometProject
Input [2]: [s_store_sk#23, s_store_id#24]
Arguments: [s_store_sk#23, s_store_id#25], [s_store_sk#23, static_invoke(CharVarcharCodegenUtils.readSidePadding(s_store_id#24, 16)) AS s_store_id#25]

(16) CometColumnarToRow [codegen id : 4]
Input [2]: [s_store_sk#23, s_store_id#25]

(17) BroadcastExchange
Input [2]: [s_store_sk#23, s_store_id#25]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=1]

(18) BroadcastHashJoin [codegen id : 5]
Left keys [1]: [store_sk#6]
Right keys [1]: [s_store_sk#23]
Join type: Inner
Join condition: None

(19) Project [codegen id : 5]
Output [5]: [sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_id#25]
Input [7]: [store_sk#6, sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_sk#23, s_store_id#25]

(20) HashAggregate [codegen id : 5]
Input [5]: [sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_id#25]
Keys [1]: [s_store_id#25]
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))]
Aggregate Attributes [4]: [sum#26, sum#27, sum#28, sum#29]
Results [5]: [s_store_id#25, sum#30, sum#31, sum#32, sum#33]

(21) CometColumnarExchange
Input [5]: [s_store_id#25, sum#30, sum#31, sum#32, sum#33]
Arguments: hashpartitioning(s_store_id#25, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=2]

(22) CometColumnarToRow [codegen id : 6]
Input [5]: [s_store_id#25, sum#30, sum#31, sum#32, sum#33]

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

(24) Scan parquet spark_catalog.default.catalog_sales
Output [4]: [cs_catalog_page_sk#43, cs_ext_sales_price#44, cs_net_profit#45, cs_sold_date_sk#46]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cs_sold_date_sk#46), dynamicpruningexpression(cs_sold_date_sk#46 IN dynamicpruning#5)]
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) ColumnarToRow [codegen id : 7]
Input [4]: [cs_catalog_page_sk#43, cs_ext_sales_price#44, cs_net_profit#45, cs_sold_date_sk#46]

(26) Filter [codegen id : 7]
Input [4]: [cs_catalog_page_sk#43, cs_ext_sales_price#44, cs_net_profit#45, cs_sold_date_sk#46]
Condition : isnotnull(cs_catalog_page_sk#43)

(27) Project [codegen id : 7]
Output [6]: [cs_catalog_page_sk#43 AS page_sk#47, cs_sold_date_sk#46 AS date_sk#48, cs_ext_sales_price#44 AS sales_price#49, cs_net_profit#45 AS profit#50, 0.00 AS return_amt#51, 0.00 AS net_loss#52]
Input [4]: [cs_catalog_page_sk#43, cs_ext_sales_price#44, cs_net_profit#45, cs_sold_date_sk#46]

(28) Scan parquet spark_catalog.default.catalog_returns
Output [4]: [cr_catalog_page_sk#53, cr_return_amount#54, cr_net_loss#55, cr_returned_date_sk#56]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cr_returned_date_sk#56), dynamicpruningexpression(cr_returned_date_sk#56 IN dynamicpruning#5)]
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)>

(29) ColumnarToRow [codegen id : 8]
Input [4]: [cr_catalog_page_sk#53, cr_return_amount#54, cr_net_loss#55, cr_returned_date_sk#56]

(30) Filter [codegen id : 8]
Input [4]: [cr_catalog_page_sk#53, cr_return_amount#54, cr_net_loss#55, cr_returned_date_sk#56]
Condition : isnotnull(cr_catalog_page_sk#53)

(31) Project [codegen id : 8]
Output [6]: [cr_catalog_page_sk#53 AS page_sk#57, cr_returned_date_sk#56 AS date_sk#58, 0.00 AS sales_price#59, 0.00 AS profit#60, cr_return_amount#54 AS return_amt#61, cr_net_loss#55 AS net_loss#62]
Input [4]: [cr_catalog_page_sk#53, cr_return_amount#54, cr_net_loss#55, cr_returned_date_sk#56]

(32) Union

(33) ReusedExchange [Reuses operator id: 86]
Output [1]: [d_date_sk#63]

(34) BroadcastHashJoin [codegen id : 11]
Left keys [1]: [date_sk#48]
Right keys [1]: [d_date_sk#63]
Join type: Inner
Join condition: None

(35) Project [codegen id : 11]
Output [5]: [page_sk#47, sales_price#49, profit#50, return_amt#51, net_loss#52]
Input [7]: [page_sk#47, date_sk#48, sales_price#49, profit#50, return_amt#51, net_loss#52, d_date_sk#63]

(36) CometNativeScan parquet spark_catalog.default.catalog_page
Output [2]: [cp_catalog_page_sk#64, cp_catalog_page_id#65]
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>

(37) CometFilter
Input [2]: [cp_catalog_page_sk#64, cp_catalog_page_id#65]
Condition : isnotnull(cp_catalog_page_sk#64)

(38) CometProject
Input [2]: [cp_catalog_page_sk#64, cp_catalog_page_id#65]
Arguments: [cp_catalog_page_sk#64, cp_catalog_page_id#66], [cp_catalog_page_sk#64, static_invoke(CharVarcharCodegenUtils.readSidePadding(cp_catalog_page_id#65, 16)) AS cp_catalog_page_id#66]

(39) CometColumnarToRow [codegen id : 10]
Input [2]: [cp_catalog_page_sk#64, cp_catalog_page_id#66]

(40) BroadcastExchange
Input [2]: [cp_catalog_page_sk#64, cp_catalog_page_id#66]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=3]

(41) BroadcastHashJoin [codegen id : 11]
Left keys [1]: [page_sk#47]
Right keys [1]: [cp_catalog_page_sk#64]
Join type: Inner
Join condition: None

(42) Project [codegen id : 11]
Output [5]: [sales_price#49, profit#50, return_amt#51, net_loss#52, cp_catalog_page_id#66]
Input [7]: [page_sk#47, sales_price#49, profit#50, return_amt#51, net_loss#52, cp_catalog_page_sk#64, cp_catalog_page_id#66]

(43) HashAggregate [codegen id : 11]
Input [5]: [sales_price#49, profit#50, return_amt#51, net_loss#52, cp_catalog_page_id#66]
Keys [1]: [cp_catalog_page_id#66]
Functions [4]: [partial_sum(UnscaledValue(sales_price#49)), partial_sum(UnscaledValue(return_amt#51)), partial_sum(UnscaledValue(profit#50)), partial_sum(UnscaledValue(net_loss#52))]
Aggregate Attributes [4]: [sum#67, sum#68, sum#69, sum#70]
Results [5]: [cp_catalog_page_id#66, sum#71, sum#72, sum#73, sum#74]

(44) CometColumnarExchange
Input [5]: [cp_catalog_page_id#66, sum#71, sum#72, sum#73, sum#74]
Arguments: hashpartitioning(cp_catalog_page_id#66, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=4]

(45) CometColumnarToRow [codegen id : 12]
Input [5]: [cp_catalog_page_id#66, sum#71, sum#72, sum#73, sum#74]

(46) HashAggregate [codegen id : 12]
Input [5]: [cp_catalog_page_id#66, sum#71, sum#72, sum#73, sum#74]
Keys [1]: [cp_catalog_page_id#66]
Functions [4]: [sum(UnscaledValue(sales_price#49)), sum(UnscaledValue(return_amt#51)), sum(UnscaledValue(profit#50)), sum(UnscaledValue(net_loss#52))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#49))#75, sum(UnscaledValue(return_amt#51))#76, sum(UnscaledValue(profit#50))#77, sum(UnscaledValue(net_loss#52))#78]
Results [5]: [MakeDecimal(sum(UnscaledValue(sales_price#49))#75,17,2) AS sales#79, MakeDecimal(sum(UnscaledValue(return_amt#51))#76,17,2) AS returns#80, (MakeDecimal(sum(UnscaledValue(profit#50))#77,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#52))#78,17,2)) AS profit#81, catalog channel AS channel#82, concat(catalog_page, cp_catalog_page_id#66) AS id#83]

(47) Scan parquet spark_catalog.default.web_sales
Output [4]: [ws_web_site_sk#84, ws_ext_sales_price#85, ws_net_profit#86, ws_sold_date_sk#87]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#87), dynamicpruningexpression(ws_sold_date_sk#87 IN dynamicpruning#5)]
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)>

(48) ColumnarToRow [codegen id : 13]
Input [4]: [ws_web_site_sk#84, ws_ext_sales_price#85, ws_net_profit#86, ws_sold_date_sk#87]

(49) Filter [codegen id : 13]
Input [4]: [ws_web_site_sk#84, ws_ext_sales_price#85, ws_net_profit#86, ws_sold_date_sk#87]
Condition : isnotnull(ws_web_site_sk#84)

(50) Project [codegen id : 13]
Output [6]: [ws_web_site_sk#84 AS wsr_web_site_sk#88, ws_sold_date_sk#87 AS date_sk#89, ws_ext_sales_price#85 AS sales_price#90, ws_net_profit#86 AS profit#91, 0.00 AS return_amt#92, 0.00 AS net_loss#93]
Input [4]: [ws_web_site_sk#84, ws_ext_sales_price#85, ws_net_profit#86, ws_sold_date_sk#87]

(51) Scan parquet spark_catalog.default.web_returns
Output [5]: [wr_item_sk#94, wr_order_number#95, wr_return_amt#96, wr_net_loss#97, wr_returned_date_sk#98]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(wr_returned_date_sk#98), dynamicpruningexpression(wr_returned_date_sk#98 IN dynamicpruning#5)]
ReadSchema: struct<wr_item_sk:int,wr_order_number:int,wr_return_amt:decimal(7,2),wr_net_loss:decimal(7,2)>

(52) ColumnarToRow [codegen id : 14]
Input [5]: [wr_item_sk#94, wr_order_number#95, wr_return_amt#96, wr_net_loss#97, wr_returned_date_sk#98]

(53) BroadcastExchange
Input [5]: [wr_item_sk#94, wr_order_number#95, wr_return_amt#96, wr_net_loss#97, wr_returned_date_sk#98]
Arguments: HashedRelationBroadcastMode(List((shiftleft(cast(input[0, int, true] as bigint), 32) | (cast(input[1, int, true] as bigint) & 4294967295))),false), [plan_id=5]

(54) CometNativeScan parquet spark_catalog.default.web_sales
Output [4]: [ws_item_sk#99, ws_web_site_sk#100, ws_order_number#101, ws_sold_date_sk#102]
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>

(55) CometFilter
Input [4]: [ws_item_sk#99, ws_web_site_sk#100, ws_order_number#101, ws_sold_date_sk#102]
Condition : ((isnotnull(ws_item_sk#99) AND isnotnull(ws_order_number#101)) AND isnotnull(ws_web_site_sk#100))

(56) CometProject
Input [4]: [ws_item_sk#99, ws_web_site_sk#100, ws_order_number#101, ws_sold_date_sk#102]
Arguments: [ws_item_sk#99, ws_web_site_sk#100, ws_order_number#101], [ws_item_sk#99, ws_web_site_sk#100, ws_order_number#101]

(57) CometColumnarToRow
Input [3]: [ws_item_sk#99, ws_web_site_sk#100, ws_order_number#101]

(58) BroadcastHashJoin [codegen id : 15]
Left keys [2]: [wr_item_sk#94, wr_order_number#95]
Right keys [2]: [ws_item_sk#99, ws_order_number#101]
Join type: Inner
Join condition: None

(59) Project [codegen id : 15]
Output [6]: [ws_web_site_sk#100 AS wsr_web_site_sk#103, wr_returned_date_sk#98 AS date_sk#104, 0.00 AS sales_price#105, 0.00 AS profit#106, wr_return_amt#96 AS return_amt#107, wr_net_loss#97 AS net_loss#108]
Input [8]: [wr_item_sk#94, wr_order_number#95, wr_return_amt#96, wr_net_loss#97, wr_returned_date_sk#98, ws_item_sk#99, ws_web_site_sk#100, ws_order_number#101]

(60) Union

(61) ReusedExchange [Reuses operator id: 86]
Output [1]: [d_date_sk#109]

(62) BroadcastHashJoin [codegen id : 18]
Left keys [1]: [date_sk#89]
Right keys [1]: [d_date_sk#109]
Join type: Inner
Join condition: None

(63) Project [codegen id : 18]
Output [5]: [wsr_web_site_sk#88, sales_price#90, profit#91, return_amt#92, net_loss#93]
Input [7]: [wsr_web_site_sk#88, date_sk#89, sales_price#90, profit#91, return_amt#92, net_loss#93, d_date_sk#109]

(64) CometNativeScan parquet spark_catalog.default.web_site
Output [2]: [web_site_sk#110, web_site_id#111]
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>

(65) CometFilter
Input [2]: [web_site_sk#110, web_site_id#111]
Condition : isnotnull(web_site_sk#110)

(66) CometProject
Input [2]: [web_site_sk#110, web_site_id#111]
Arguments: [web_site_sk#110, web_site_id#112], [web_site_sk#110, static_invoke(CharVarcharCodegenUtils.readSidePadding(web_site_id#111, 16)) AS web_site_id#112]

(67) CometColumnarToRow [codegen id : 17]
Input [2]: [web_site_sk#110, web_site_id#112]

(68) BroadcastExchange
Input [2]: [web_site_sk#110, web_site_id#112]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=6]

(69) BroadcastHashJoin [codegen id : 18]
Left keys [1]: [wsr_web_site_sk#88]
Right keys [1]: [web_site_sk#110]
Join type: Inner
Join condition: None

(70) Project [codegen id : 18]
Output [5]: [sales_price#90, profit#91, return_amt#92, net_loss#93, web_site_id#112]
Input [7]: [wsr_web_site_sk#88, sales_price#90, profit#91, return_amt#92, net_loss#93, web_site_sk#110, web_site_id#112]

(71) HashAggregate [codegen id : 18]
Input [5]: [sales_price#90, profit#91, return_amt#92, net_loss#93, web_site_id#112]
Keys [1]: [web_site_id#112]
Functions [4]: [partial_sum(UnscaledValue(sales_price#90)), partial_sum(UnscaledValue(return_amt#92)), partial_sum(UnscaledValue(profit#91)), partial_sum(UnscaledValue(net_loss#93))]
Aggregate Attributes [4]: [sum#113, sum#114, sum#115, sum#116]
Results [5]: [web_site_id#112, sum#117, sum#118, sum#119, sum#120]

(72) CometColumnarExchange
Input [5]: [web_site_id#112, sum#117, sum#118, sum#119, sum#120]
Arguments: hashpartitioning(web_site_id#112, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=7]

(73) CometColumnarToRow [codegen id : 19]
Input [5]: [web_site_id#112, sum#117, sum#118, sum#119, sum#120]

(74) HashAggregate [codegen id : 19]
Input [5]: [web_site_id#112, sum#117, sum#118, sum#119, sum#120]
Keys [1]: [web_site_id#112]
Functions [4]: [sum(UnscaledValue(sales_price#90)), sum(UnscaledValue(return_amt#92)), sum(UnscaledValue(profit#91)), sum(UnscaledValue(net_loss#93))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#90))#121, sum(UnscaledValue(return_amt#92))#122, sum(UnscaledValue(profit#91))#123, sum(UnscaledValue(net_loss#93))#124]
Results [5]: [MakeDecimal(sum(UnscaledValue(sales_price#90))#121,17,2) AS sales#125, MakeDecimal(sum(UnscaledValue(return_amt#92))#122,17,2) AS returns#126, (MakeDecimal(sum(UnscaledValue(profit#91))#123,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#93))#124,17,2)) AS profit#127, web channel AS channel#128, concat(web_site, web_site_id#112) AS id#129]

(75) Union

(76) Expand [codegen id : 20]
Input [5]: [sales#38, returns#39, profit#40, channel#41, id#42]
Arguments: [[sales#38, returns#39, profit#40, channel#41, id#42, 0], [sales#38, returns#39, profit#40, channel#41, null, 1], [sales#38, returns#39, profit#40, null, null, 3]], [sales#38, returns#39, profit#40, channel#130, id#131, spark_grouping_id#132]

(77) HashAggregate [codegen id : 20]
Input [6]: [sales#38, returns#39, profit#40, channel#130, id#131, spark_grouping_id#132]
Keys [3]: [channel#130, id#131, spark_grouping_id#132]
Functions [3]: [partial_sum(sales#38), partial_sum(returns#39), partial_sum(profit#40)]
Aggregate Attributes [6]: [sum#133, isEmpty#134, sum#135, isEmpty#136, sum#137, isEmpty#138]
Results [9]: [channel#130, id#131, spark_grouping_id#132, sum#139, isEmpty#140, sum#141, isEmpty#142, sum#143, isEmpty#144]

(78) CometColumnarExchange
Input [9]: [channel#130, id#131, spark_grouping_id#132, sum#139, isEmpty#140, sum#141, isEmpty#142, sum#143, isEmpty#144]
Arguments: hashpartitioning(channel#130, id#131, spark_grouping_id#132, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=8]

(79) CometColumnarToRow [codegen id : 21]
Input [9]: [channel#130, id#131, spark_grouping_id#132, sum#139, isEmpty#140, sum#141, isEmpty#142, sum#143, isEmpty#144]

(80) HashAggregate [codegen id : 21]
Input [9]: [channel#130, id#131, spark_grouping_id#132, sum#139, isEmpty#140, sum#141, isEmpty#142, sum#143, isEmpty#144]
Keys [3]: [channel#130, id#131, spark_grouping_id#132]
Functions [3]: [sum(sales#38), sum(returns#39), sum(profit#40)]
Aggregate Attributes [3]: [sum(sales#38)#145, sum(returns#39)#146, sum(profit#40)#147]
Results [5]: [channel#130, id#131, sum(sales#38)#145 AS sales#148, sum(returns#39)#146 AS returns#149, sum(profit#40)#147 AS profit#150]

(81) TakeOrderedAndProject
Input [5]: [channel#130, id#131, sales#148, returns#149, profit#150]
Arguments: 100, [channel#130 ASC NULLS FIRST, id#131 ASC NULLS FIRST], [channel#130, id#131, sales#148, returns#149, profit#150]

===== Subqueries =====

Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#4 IN dynamicpruning#5
BroadcastExchange (86)
+- * CometColumnarToRow (85)
   +- CometProject (84)
      +- CometFilter (83)
         +- CometNativeScan parquet spark_catalog.default.date_dim (82)


(82) CometNativeScan parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#22, d_date#151]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,2000-08-23), LessThanOrEqual(d_date,2000-09-06), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_date:date>

(83) CometFilter
Input [2]: [d_date_sk#22, d_date#151]
Condition : (((isnotnull(d_date#151) AND (d_date#151 >= 2000-08-23)) AND (d_date#151 <= 2000-09-06)) AND isnotnull(d_date_sk#22))

(84) CometProject
Input [2]: [d_date_sk#22, d_date#151]
Arguments: [d_date_sk#22], [d_date_sk#22]

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

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

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

Subquery:3 Hosting operator id = 24 Hosting Expression = cs_sold_date_sk#46 IN dynamicpruning#5

Subquery:4 Hosting operator id = 28 Hosting Expression = cr_returned_date_sk#56 IN dynamicpruning#5

Subquery:5 Hosting operator id = 47 Hosting Expression = ws_sold_date_sk#87 IN dynamicpruning#5

Subquery:6 Hosting operator id = 51 Hosting Expression = wr_returned_date_sk#98 IN dynamicpruning#5


