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


(1) Scan parquet 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 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: 79]
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 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) Scan parquet 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) ColumnarToRow [codegen id : 4]
Input [2]: [s_store_sk#23, s_store_id#24]

(15) Filter [codegen id : 4]
Input [2]: [s_store_sk#23, s_store_id#24]
Condition : isnotnull(s_store_sk#23)

(16) BroadcastExchange
Input [2]: [s_store_sk#23, s_store_id#24]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#25]

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

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

(19) HashAggregate [codegen id : 5]
Input [5]: [sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_id#24]
Keys [1]: [s_store_id#24]
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#24, sum#30, sum#31, sum#32, sum#33]

(20) Exchange
Input [5]: [s_store_id#24, sum#30, sum#31, sum#32, sum#33]
Arguments: hashpartitioning(s_store_id#24, 5), ENSURE_REQUIREMENTS, [id=#34]

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

(22) Scan parquet default.catalog_sales
Output [4]: [cs_catalog_page_sk#44, cs_ext_sales_price#45, cs_net_profit#46, cs_sold_date_sk#47]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cs_sold_date_sk#47), dynamicpruningexpression(cs_sold_date_sk#47 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)>

(23) ColumnarToRow [codegen id : 7]
Input [4]: [cs_catalog_page_sk#44, cs_ext_sales_price#45, cs_net_profit#46, cs_sold_date_sk#47]

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

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

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

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

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

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

(30) Union

(31) ReusedExchange [Reuses operator id: 79]
Output [1]: [d_date_sk#64]

(32) BroadcastHashJoin [codegen id : 11]
Left keys [1]: [date_sk#49]
Right keys [1]: [d_date_sk#64]
Join condition: None

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

(34) Scan parquet default.catalog_page
Output [2]: [cp_catalog_page_sk#65, cp_catalog_page_id#66]
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) ColumnarToRow [codegen id : 10]
Input [2]: [cp_catalog_page_sk#65, cp_catalog_page_id#66]

(36) Filter [codegen id : 10]
Input [2]: [cp_catalog_page_sk#65, cp_catalog_page_id#66]
Condition : isnotnull(cp_catalog_page_sk#65)

(37) BroadcastExchange
Input [2]: [cp_catalog_page_sk#65, cp_catalog_page_id#66]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#67]

(38) BroadcastHashJoin [codegen id : 11]
Left keys [1]: [page_sk#48]
Right keys [1]: [cp_catalog_page_sk#65]
Join condition: None

(39) Project [codegen id : 11]
Output [5]: [sales_price#50, profit#51, return_amt#52, net_loss#53, cp_catalog_page_id#66]
Input [7]: [page_sk#48, sales_price#50, profit#51, return_amt#52, net_loss#53, cp_catalog_page_sk#65, cp_catalog_page_id#66]

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

(41) Exchange
Input [5]: [cp_catalog_page_id#66, sum#72, sum#73, sum#74, sum#75]
Arguments: hashpartitioning(cp_catalog_page_id#66, 5), ENSURE_REQUIREMENTS, [id=#76]

(42) HashAggregate [codegen id : 12]
Input [5]: [cp_catalog_page_id#66, sum#72, sum#73, sum#74, sum#75]
Keys [1]: [cp_catalog_page_id#66]
Functions [4]: [sum(UnscaledValue(sales_price#50)), sum(UnscaledValue(return_amt#52)), sum(UnscaledValue(profit#51)), sum(UnscaledValue(net_loss#53))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#50))#77, sum(UnscaledValue(return_amt#52))#78, sum(UnscaledValue(profit#51))#79, sum(UnscaledValue(net_loss#53))#80]
Results [5]: [MakeDecimal(sum(UnscaledValue(sales_price#50))#77,17,2) AS sales#81, MakeDecimal(sum(UnscaledValue(return_amt#52))#78,17,2) AS returns#82, CheckOverflow((promote_precision(cast(MakeDecimal(sum(UnscaledValue(profit#51))#79,17,2) as decimal(18,2))) - promote_precision(cast(MakeDecimal(sum(UnscaledValue(net_loss#53))#80,17,2) as decimal(18,2)))), DecimalType(18,2), true) AS profit#83, catalog channel AS channel#84, concat(catalog_page, cp_catalog_page_id#66) AS id#85]

(43) Scan parquet default.web_sales
Output [4]: [ws_web_site_sk#86, ws_ext_sales_price#87, ws_net_profit#88, ws_sold_date_sk#89]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#89), dynamicpruningexpression(ws_sold_date_sk#89 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)>

(44) ColumnarToRow [codegen id : 13]
Input [4]: [ws_web_site_sk#86, ws_ext_sales_price#87, ws_net_profit#88, ws_sold_date_sk#89]

(45) Filter [codegen id : 13]
Input [4]: [ws_web_site_sk#86, ws_ext_sales_price#87, ws_net_profit#88, ws_sold_date_sk#89]
Condition : isnotnull(ws_web_site_sk#86)

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

(47) Scan parquet default.web_returns
Output [5]: [wr_item_sk#96, wr_order_number#97, wr_return_amt#98, wr_net_loss#99, wr_returned_date_sk#100]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(wr_returned_date_sk#100), dynamicpruningexpression(wr_returned_date_sk#100 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)>

(48) ColumnarToRow [codegen id : 14]
Input [5]: [wr_item_sk#96, wr_order_number#97, wr_return_amt#98, wr_net_loss#99, wr_returned_date_sk#100]

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

(50) Scan parquet default.web_sales
Output [4]: [ws_item_sk#102, ws_web_site_sk#103, ws_order_number#104, ws_sold_date_sk#105]
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>

(51) ColumnarToRow
Input [4]: [ws_item_sk#102, ws_web_site_sk#103, ws_order_number#104, ws_sold_date_sk#105]

(52) Filter
Input [4]: [ws_item_sk#102, ws_web_site_sk#103, ws_order_number#104, ws_sold_date_sk#105]
Condition : ((isnotnull(ws_item_sk#102) AND isnotnull(ws_order_number#104)) AND isnotnull(ws_web_site_sk#103))

(53) Project
Output [3]: [ws_item_sk#102, ws_web_site_sk#103, ws_order_number#104]
Input [4]: [ws_item_sk#102, ws_web_site_sk#103, ws_order_number#104, ws_sold_date_sk#105]

(54) BroadcastHashJoin [codegen id : 15]
Left keys [2]: [wr_item_sk#96, wr_order_number#97]
Right keys [2]: [ws_item_sk#102, ws_order_number#104]
Join condition: None

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

(56) Union

(57) ReusedExchange [Reuses operator id: 79]
Output [1]: [d_date_sk#112]

(58) BroadcastHashJoin [codegen id : 18]
Left keys [1]: [date_sk#91]
Right keys [1]: [d_date_sk#112]
Join condition: None

(59) Project [codegen id : 18]
Output [5]: [wsr_web_site_sk#90, sales_price#92, profit#93, return_amt#94, net_loss#95]
Input [7]: [wsr_web_site_sk#90, date_sk#91, sales_price#92, profit#93, return_amt#94, net_loss#95, d_date_sk#112]

(60) Scan parquet default.web_site
Output [2]: [web_site_sk#113, web_site_id#114]
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>

(61) ColumnarToRow [codegen id : 17]
Input [2]: [web_site_sk#113, web_site_id#114]

(62) Filter [codegen id : 17]
Input [2]: [web_site_sk#113, web_site_id#114]
Condition : isnotnull(web_site_sk#113)

(63) BroadcastExchange
Input [2]: [web_site_sk#113, web_site_id#114]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#115]

(64) BroadcastHashJoin [codegen id : 18]
Left keys [1]: [wsr_web_site_sk#90]
Right keys [1]: [web_site_sk#113]
Join condition: None

(65) Project [codegen id : 18]
Output [5]: [sales_price#92, profit#93, return_amt#94, net_loss#95, web_site_id#114]
Input [7]: [wsr_web_site_sk#90, sales_price#92, profit#93, return_amt#94, net_loss#95, web_site_sk#113, web_site_id#114]

(66) HashAggregate [codegen id : 18]
Input [5]: [sales_price#92, profit#93, return_amt#94, net_loss#95, web_site_id#114]
Keys [1]: [web_site_id#114]
Functions [4]: [partial_sum(UnscaledValue(sales_price#92)), partial_sum(UnscaledValue(return_amt#94)), partial_sum(UnscaledValue(profit#93)), partial_sum(UnscaledValue(net_loss#95))]
Aggregate Attributes [4]: [sum#116, sum#117, sum#118, sum#119]
Results [5]: [web_site_id#114, sum#120, sum#121, sum#122, sum#123]

(67) Exchange
Input [5]: [web_site_id#114, sum#120, sum#121, sum#122, sum#123]
Arguments: hashpartitioning(web_site_id#114, 5), ENSURE_REQUIREMENTS, [id=#124]

(68) HashAggregate [codegen id : 19]
Input [5]: [web_site_id#114, sum#120, sum#121, sum#122, sum#123]
Keys [1]: [web_site_id#114]
Functions [4]: [sum(UnscaledValue(sales_price#92)), sum(UnscaledValue(return_amt#94)), sum(UnscaledValue(profit#93)), sum(UnscaledValue(net_loss#95))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#92))#125, sum(UnscaledValue(return_amt#94))#126, sum(UnscaledValue(profit#93))#127, sum(UnscaledValue(net_loss#95))#128]
Results [5]: [MakeDecimal(sum(UnscaledValue(sales_price#92))#125,17,2) AS sales#129, MakeDecimal(sum(UnscaledValue(return_amt#94))#126,17,2) AS returns#130, CheckOverflow((promote_precision(cast(MakeDecimal(sum(UnscaledValue(profit#93))#127,17,2) as decimal(18,2))) - promote_precision(cast(MakeDecimal(sum(UnscaledValue(net_loss#95))#128,17,2) as decimal(18,2)))), DecimalType(18,2), true) AS profit#131, web channel AS channel#132, concat(web_site, web_site_id#114) AS id#133]

(69) Union

(70) Expand [codegen id : 20]
Input [5]: [sales#39, returns#40, profit#41, channel#42, id#43]
Arguments: [[sales#39, returns#40, profit#41, channel#42, id#43, 0], [sales#39, returns#40, profit#41, channel#42, null, 1], [sales#39, returns#40, profit#41, null, null, 3]], [sales#39, returns#40, profit#41, channel#134, id#135, spark_grouping_id#136]

(71) HashAggregate [codegen id : 20]
Input [6]: [sales#39, returns#40, profit#41, channel#134, id#135, spark_grouping_id#136]
Keys [3]: [channel#134, id#135, spark_grouping_id#136]
Functions [3]: [partial_sum(sales#39), partial_sum(returns#40), partial_sum(profit#41)]
Aggregate Attributes [6]: [sum#137, isEmpty#138, sum#139, isEmpty#140, sum#141, isEmpty#142]
Results [9]: [channel#134, id#135, spark_grouping_id#136, sum#143, isEmpty#144, sum#145, isEmpty#146, sum#147, isEmpty#148]

(72) Exchange
Input [9]: [channel#134, id#135, spark_grouping_id#136, sum#143, isEmpty#144, sum#145, isEmpty#146, sum#147, isEmpty#148]
Arguments: hashpartitioning(channel#134, id#135, spark_grouping_id#136, 5), ENSURE_REQUIREMENTS, [id=#149]

(73) HashAggregate [codegen id : 21]
Input [9]: [channel#134, id#135, spark_grouping_id#136, sum#143, isEmpty#144, sum#145, isEmpty#146, sum#147, isEmpty#148]
Keys [3]: [channel#134, id#135, spark_grouping_id#136]
Functions [3]: [sum(sales#39), sum(returns#40), sum(profit#41)]
Aggregate Attributes [3]: [sum(sales#39)#150, sum(returns#40)#151, sum(profit#41)#152]
Results [5]: [channel#134, id#135, sum(sales#39)#150 AS sales#153, sum(returns#40)#151 AS returns#154, sum(profit#41)#152 AS profit#155]

(74) TakeOrderedAndProject
Input [5]: [channel#134, id#135, sales#153, returns#154, profit#155]
Arguments: 100, [channel#134 ASC NULLS FIRST, id#135 ASC NULLS FIRST], [channel#134, id#135, sales#153, returns#154, profit#155]

===== Subqueries =====

Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#4 IN dynamicpruning#5
BroadcastExchange (79)
+- * Project (78)
   +- * Filter (77)
      +- * ColumnarToRow (76)
         +- Scan parquet default.date_dim (75)


(75) Scan parquet default.date_dim
Output [2]: [d_date_sk#22, d_date#156]
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>

(76) ColumnarToRow [codegen id : 1]
Input [2]: [d_date_sk#22, d_date#156]

(77) Filter [codegen id : 1]
Input [2]: [d_date_sk#22, d_date#156]
Condition : (((isnotnull(d_date#156) AND (d_date#156 >= 2000-08-23)) AND (d_date#156 <= 2000-09-06)) AND isnotnull(d_date_sk#22))

(78) Project [codegen id : 1]
Output [1]: [d_date_sk#22]
Input [2]: [d_date_sk#22, d_date#156]

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

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

Subquery:3 Hosting operator id = 22 Hosting Expression = cs_sold_date_sk#47 IN dynamicpruning#5

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

Subquery:5 Hosting operator id = 43 Hosting Expression = ws_sold_date_sk#89 IN dynamicpruning#5

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


