== Physical Plan ==
* Project (50)
+- * Filter (49)
   +- * HashAggregate (48)
      +- Exchange (47)
         +- * HashAggregate (46)
            +- * HashAggregate (45)
               +- Exchange (44)
                  +- * HashAggregate (43)
                     +- * Project (42)
                        +- * SortMergeJoin Inner (41)
                           :- * Sort (34)
                           :  +- Exchange (33)
                           :     +- * Project (32)
                           :        +- * BroadcastHashJoin Inner BuildRight (31)
                           :           :- * Project (19)
                           :           :  +- * SortMergeJoin Inner (18)
                           :           :     :- * Sort (12)
                           :           :     :  +- Exchange (11)
                           :           :     :     +- * Project (10)
                           :           :     :        +- * BroadcastHashJoin Inner BuildRight (9)
                           :           :     :           :- * Project (4)
                           :           :     :           :  +- * Filter (3)
                           :           :     :           :     +- * ColumnarToRow (2)
                           :           :     :           :        +- Scan parquet default.store_sales (1)
                           :           :     :           +- BroadcastExchange (8)
                           :           :     :              +- * Filter (7)
                           :           :     :                 +- * ColumnarToRow (6)
                           :           :     :                    +- Scan parquet default.item (5)
                           :           :     +- * Sort (17)
                           :           :        +- Exchange (16)
                           :           :           +- * Filter (15)
                           :           :              +- * ColumnarToRow (14)
                           :           :                 +- Scan parquet default.customer (13)
                           :           +- BroadcastExchange (30)
                           :              +- * Project (29)
                           :                 +- * BroadcastHashJoin Inner BuildLeft (28)
                           :                    :- BroadcastExchange (24)
                           :                    :  +- * Project (23)
                           :                    :     +- * Filter (22)
                           :                    :        +- * ColumnarToRow (21)
                           :                    :           +- Scan parquet default.store (20)
                           :                    +- * Filter (27)
                           :                       +- * ColumnarToRow (26)
                           :                          +- Scan parquet default.customer_address (25)
                           +- * Sort (40)
                              +- Exchange (39)
                                 +- * Project (38)
                                    +- * Filter (37)
                                       +- * ColumnarToRow (36)
                                          +- Scan parquet default.store_returns (35)


(1) Scan parquet default.store_sales
Output [6]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, ss_sold_date_sk#6]
Batched: true
Location [not included in comparison]/{warehouse_dir}/store_sales]
PushedFilters: [IsNotNull(ss_ticket_number), IsNotNull(ss_item_sk), IsNotNull(ss_store_sk), IsNotNull(ss_customer_sk)]
ReadSchema: struct<ss_item_sk:int,ss_customer_sk:int,ss_store_sk:int,ss_ticket_number:int,ss_net_paid:decimal(7,2)>

(2) ColumnarToRow [codegen id : 2]
Input [6]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, ss_sold_date_sk#6]

(3) Filter [codegen id : 2]
Input [6]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, ss_sold_date_sk#6]
Condition : (((isnotnull(ss_ticket_number#4) AND isnotnull(ss_item_sk#1)) AND isnotnull(ss_store_sk#3)) AND isnotnull(ss_customer_sk#2))

(4) Project [codegen id : 2]
Output [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
Input [6]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, ss_sold_date_sk#6]

(5) Scan parquet default.item
Output [6]: [i_item_sk#7, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12]
Batched: true
Location [not included in comparison]/{warehouse_dir}/item]
PushedFilters: [IsNotNull(i_color), EqualTo(i_color,pale                ), IsNotNull(i_item_sk)]
ReadSchema: struct<i_item_sk:int,i_current_price:decimal(7,2),i_size:string,i_color:string,i_units:string,i_manager_id:int>

(6) ColumnarToRow [codegen id : 1]
Input [6]: [i_item_sk#7, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12]

(7) Filter [codegen id : 1]
Input [6]: [i_item_sk#7, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12]
Condition : ((isnotnull(i_color#10) AND (i_color#10 = pale                )) AND isnotnull(i_item_sk#7))

(8) BroadcastExchange
Input [6]: [i_item_sk#7, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#13]

(9) BroadcastHashJoin [codegen id : 2]
Left keys [1]: [ss_item_sk#1]
Right keys [1]: [i_item_sk#7]
Join condition: None

(10) Project [codegen id : 2]
Output [10]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12]
Input [11]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, i_item_sk#7, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12]

(11) Exchange
Input [10]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12]
Arguments: hashpartitioning(ss_customer_sk#2, 5), ENSURE_REQUIREMENTS, [id=#14]

(12) Sort [codegen id : 3]
Input [10]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12]
Arguments: [ss_customer_sk#2 ASC NULLS FIRST], false, 0

(13) Scan parquet default.customer
Output [4]: [c_customer_sk#15, c_first_name#16, c_last_name#17, c_birth_country#18]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_birth_country)]
ReadSchema: struct<c_customer_sk:int,c_first_name:string,c_last_name:string,c_birth_country:string>

(14) ColumnarToRow [codegen id : 4]
Input [4]: [c_customer_sk#15, c_first_name#16, c_last_name#17, c_birth_country#18]

(15) Filter [codegen id : 4]
Input [4]: [c_customer_sk#15, c_first_name#16, c_last_name#17, c_birth_country#18]
Condition : (isnotnull(c_customer_sk#15) AND isnotnull(c_birth_country#18))

(16) Exchange
Input [4]: [c_customer_sk#15, c_first_name#16, c_last_name#17, c_birth_country#18]
Arguments: hashpartitioning(c_customer_sk#15, 5), ENSURE_REQUIREMENTS, [id=#19]

(17) Sort [codegen id : 5]
Input [4]: [c_customer_sk#15, c_first_name#16, c_last_name#17, c_birth_country#18]
Arguments: [c_customer_sk#15 ASC NULLS FIRST], false, 0

(18) SortMergeJoin [codegen id : 8]
Left keys [1]: [ss_customer_sk#2]
Right keys [1]: [c_customer_sk#15]
Join condition: None

(19) Project [codegen id : 8]
Output [12]: [ss_item_sk#1, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12, c_first_name#16, c_last_name#17, c_birth_country#18]
Input [14]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12, c_customer_sk#15, c_first_name#16, c_last_name#17, c_birth_country#18]

(20) Scan parquet default.store
Output [5]: [s_store_sk#20, s_store_name#21, s_market_id#22, s_state#23, s_zip#24]
Batched: true
Location [not included in comparison]/{warehouse_dir}/store]
PushedFilters: [IsNotNull(s_market_id), EqualTo(s_market_id,8), IsNotNull(s_store_sk), IsNotNull(s_zip)]
ReadSchema: struct<s_store_sk:int,s_store_name:string,s_market_id:int,s_state:string,s_zip:string>

(21) ColumnarToRow [codegen id : 6]
Input [5]: [s_store_sk#20, s_store_name#21, s_market_id#22, s_state#23, s_zip#24]

(22) Filter [codegen id : 6]
Input [5]: [s_store_sk#20, s_store_name#21, s_market_id#22, s_state#23, s_zip#24]
Condition : (((isnotnull(s_market_id#22) AND (s_market_id#22 = 8)) AND isnotnull(s_store_sk#20)) AND isnotnull(s_zip#24))

(23) Project [codegen id : 6]
Output [4]: [s_store_sk#20, s_store_name#21, s_state#23, s_zip#24]
Input [5]: [s_store_sk#20, s_store_name#21, s_market_id#22, s_state#23, s_zip#24]

(24) BroadcastExchange
Input [4]: [s_store_sk#20, s_store_name#21, s_state#23, s_zip#24]
Arguments: HashedRelationBroadcastMode(List(input[3, string, true]),false), [id=#25]

(25) Scan parquet default.customer_address
Output [3]: [ca_state#26, ca_zip#27, ca_country#28]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer_address]
PushedFilters: [IsNotNull(ca_country), IsNotNull(ca_zip)]
ReadSchema: struct<ca_state:string,ca_zip:string,ca_country:string>

(26) ColumnarToRow
Input [3]: [ca_state#26, ca_zip#27, ca_country#28]

(27) Filter
Input [3]: [ca_state#26, ca_zip#27, ca_country#28]
Condition : (isnotnull(ca_country#28) AND isnotnull(ca_zip#27))

(28) BroadcastHashJoin [codegen id : 7]
Left keys [1]: [s_zip#24]
Right keys [1]: [ca_zip#27]
Join condition: None

(29) Project [codegen id : 7]
Output [5]: [s_store_sk#20, s_store_name#21, s_state#23, ca_state#26, ca_country#28]
Input [7]: [s_store_sk#20, s_store_name#21, s_state#23, s_zip#24, ca_state#26, ca_zip#27, ca_country#28]

(30) BroadcastExchange
Input [5]: [s_store_sk#20, s_store_name#21, s_state#23, ca_state#26, ca_country#28]
Arguments: HashedRelationBroadcastMode(List(input[0, int, true], upper(input[4, string, true])),false), [id=#29]

(31) BroadcastHashJoin [codegen id : 8]
Left keys [2]: [ss_store_sk#3, c_birth_country#18]
Right keys [2]: [s_store_sk#20, upper(ca_country#28)]
Join condition: None

(32) Project [codegen id : 8]
Output [13]: [ss_item_sk#1, ss_ticket_number#4, ss_net_paid#5, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12, c_first_name#16, c_last_name#17, s_store_name#21, s_state#23, ca_state#26]
Input [17]: [ss_item_sk#1, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12, c_first_name#16, c_last_name#17, c_birth_country#18, s_store_sk#20, s_store_name#21, s_state#23, ca_state#26, ca_country#28]

(33) Exchange
Input [13]: [ss_item_sk#1, ss_ticket_number#4, ss_net_paid#5, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12, c_first_name#16, c_last_name#17, s_store_name#21, s_state#23, ca_state#26]
Arguments: hashpartitioning(cast(ss_ticket_number#4 as bigint), cast(ss_item_sk#1 as bigint), 5), ENSURE_REQUIREMENTS, [id=#30]

(34) Sort [codegen id : 9]
Input [13]: [ss_item_sk#1, ss_ticket_number#4, ss_net_paid#5, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12, c_first_name#16, c_last_name#17, s_store_name#21, s_state#23, ca_state#26]
Arguments: [cast(ss_ticket_number#4 as bigint) ASC NULLS FIRST, cast(ss_item_sk#1 as bigint) ASC NULLS FIRST], false, 0

(35) Scan parquet default.store_returns
Output [3]: [sr_item_sk#31, sr_ticket_number#32, sr_returned_date_sk#33]
Batched: true
Location [not included in comparison]/{warehouse_dir}/store_returns]
PushedFilters: [IsNotNull(sr_ticket_number), IsNotNull(sr_item_sk)]
ReadSchema: struct<sr_item_sk:bigint,sr_ticket_number:bigint>

(36) ColumnarToRow [codegen id : 10]
Input [3]: [sr_item_sk#31, sr_ticket_number#32, sr_returned_date_sk#33]

(37) Filter [codegen id : 10]
Input [3]: [sr_item_sk#31, sr_ticket_number#32, sr_returned_date_sk#33]
Condition : (isnotnull(sr_ticket_number#32) AND isnotnull(sr_item_sk#31))

(38) Project [codegen id : 10]
Output [2]: [sr_item_sk#31, sr_ticket_number#32]
Input [3]: [sr_item_sk#31, sr_ticket_number#32, sr_returned_date_sk#33]

(39) Exchange
Input [2]: [sr_item_sk#31, sr_ticket_number#32]
Arguments: hashpartitioning(sr_ticket_number#32, sr_item_sk#31, 5), ENSURE_REQUIREMENTS, [id=#34]

(40) Sort [codegen id : 11]
Input [2]: [sr_item_sk#31, sr_ticket_number#32]
Arguments: [sr_ticket_number#32 ASC NULLS FIRST, sr_item_sk#31 ASC NULLS FIRST], false, 0

(41) SortMergeJoin [codegen id : 12]
Left keys [2]: [cast(ss_ticket_number#4 as bigint), cast(ss_item_sk#1 as bigint)]
Right keys [2]: [sr_ticket_number#32, sr_item_sk#31]
Join condition: None

(42) Project [codegen id : 12]
Output [11]: [ss_net_paid#5, s_store_name#21, s_state#23, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12, c_first_name#16, c_last_name#17, ca_state#26]
Input [15]: [ss_item_sk#1, ss_ticket_number#4, ss_net_paid#5, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12, c_first_name#16, c_last_name#17, s_store_name#21, s_state#23, ca_state#26, sr_item_sk#31, sr_ticket_number#32]

(43) HashAggregate [codegen id : 12]
Input [11]: [ss_net_paid#5, s_store_name#21, s_state#23, i_current_price#8, i_size#9, i_color#10, i_units#11, i_manager_id#12, c_first_name#16, c_last_name#17, ca_state#26]
Keys [10]: [c_last_name#17, c_first_name#16, s_store_name#21, ca_state#26, s_state#23, i_color#10, i_current_price#8, i_manager_id#12, i_units#11, i_size#9]
Functions [1]: [partial_sum(UnscaledValue(ss_net_paid#5))]
Aggregate Attributes [1]: [sum#35]
Results [11]: [c_last_name#17, c_first_name#16, s_store_name#21, ca_state#26, s_state#23, i_color#10, i_current_price#8, i_manager_id#12, i_units#11, i_size#9, sum#36]

(44) Exchange
Input [11]: [c_last_name#17, c_first_name#16, s_store_name#21, ca_state#26, s_state#23, i_color#10, i_current_price#8, i_manager_id#12, i_units#11, i_size#9, sum#36]
Arguments: hashpartitioning(c_last_name#17, c_first_name#16, s_store_name#21, ca_state#26, s_state#23, i_color#10, i_current_price#8, i_manager_id#12, i_units#11, i_size#9, 5), ENSURE_REQUIREMENTS, [id=#37]

(45) HashAggregate [codegen id : 13]
Input [11]: [c_last_name#17, c_first_name#16, s_store_name#21, ca_state#26, s_state#23, i_color#10, i_current_price#8, i_manager_id#12, i_units#11, i_size#9, sum#36]
Keys [10]: [c_last_name#17, c_first_name#16, s_store_name#21, ca_state#26, s_state#23, i_color#10, i_current_price#8, i_manager_id#12, i_units#11, i_size#9]
Functions [1]: [sum(UnscaledValue(ss_net_paid#5))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#5))#38]
Results [4]: [c_last_name#17, c_first_name#16, s_store_name#21, MakeDecimal(sum(UnscaledValue(ss_net_paid#5))#38,17,2) AS netpaid#39]

(46) HashAggregate [codegen id : 13]
Input [4]: [c_last_name#17, c_first_name#16, s_store_name#21, netpaid#39]
Keys [3]: [c_last_name#17, c_first_name#16, s_store_name#21]
Functions [1]: [partial_sum(netpaid#39)]
Aggregate Attributes [2]: [sum#40, isEmpty#41]
Results [5]: [c_last_name#17, c_first_name#16, s_store_name#21, sum#42, isEmpty#43]

(47) Exchange
Input [5]: [c_last_name#17, c_first_name#16, s_store_name#21, sum#42, isEmpty#43]
Arguments: hashpartitioning(c_last_name#17, c_first_name#16, s_store_name#21, 5), ENSURE_REQUIREMENTS, [id=#44]

(48) HashAggregate [codegen id : 14]
Input [5]: [c_last_name#17, c_first_name#16, s_store_name#21, sum#42, isEmpty#43]
Keys [3]: [c_last_name#17, c_first_name#16, s_store_name#21]
Functions [1]: [sum(netpaid#39)]
Aggregate Attributes [1]: [sum(netpaid#39)#45]
Results [5]: [c_last_name#17, c_first_name#16, s_store_name#21, sum(netpaid#39)#45 AS paid#46, sum(netpaid#39)#45 AS sum(netpaid#39)#47]

(49) Filter [codegen id : 14]
Input [5]: [c_last_name#17, c_first_name#16, s_store_name#21, paid#46, sum(netpaid#39)#47]
Condition : (isnotnull(sum(netpaid#39)#47) AND (cast(sum(netpaid#39)#47 as decimal(33,8)) > cast(Subquery scalar-subquery#48, [id=#49] as decimal(33,8))))

(50) Project [codegen id : 14]
Output [4]: [c_last_name#17, c_first_name#16, s_store_name#21, paid#46]
Input [5]: [c_last_name#17, c_first_name#16, s_store_name#21, paid#46, sum(netpaid#39)#47]

===== Subqueries =====

Subquery:1 Hosting operator id = 49 Hosting Expression = Subquery scalar-subquery#48, [id=#49]
* HashAggregate (104)
+- Exchange (103)
   +- * HashAggregate (102)
      +- * HashAggregate (101)
         +- Exchange (100)
            +- * HashAggregate (99)
               +- * Project (98)
                  +- * SortMergeJoin Inner (97)
                     :- * Sort (90)
                     :  +- Exchange (89)
                     :     +- * Project (88)
                     :        +- * SortMergeJoin Inner (87)
                     :           :- * Sort (81)
                     :           :  +- Exchange (80)
                     :           :     +- * Project (79)
                     :           :        +- * SortMergeJoin Inner (78)
                     :           :           :- * Sort (72)
                     :           :           :  +- Exchange (71)
                     :           :           :     +- * Project (70)
                     :           :           :        +- * SortMergeJoin Inner (69)
                     :           :           :           :- * Sort (63)
                     :           :           :           :  +- Exchange (62)
                     :           :           :           :     +- * Project (61)
                     :           :           :           :        +- * BroadcastHashJoin Inner BuildRight (60)
                     :           :           :           :           :- * Project (54)
                     :           :           :           :           :  +- * Filter (53)
                     :           :           :           :           :     +- * ColumnarToRow (52)
                     :           :           :           :           :        +- Scan parquet default.store_sales (51)
                     :           :           :           :           +- BroadcastExchange (59)
                     :           :           :           :              +- * Project (58)
                     :           :           :           :                 +- * Filter (57)
                     :           :           :           :                    +- * ColumnarToRow (56)
                     :           :           :           :                       +- Scan parquet default.store (55)
                     :           :           :           +- * Sort (68)
                     :           :           :              +- Exchange (67)
                     :           :           :                 +- * Filter (66)
                     :           :           :                    +- * ColumnarToRow (65)
                     :           :           :                       +- Scan parquet default.item (64)
                     :           :           +- * Sort (77)
                     :           :              +- Exchange (76)
                     :           :                 +- * Filter (75)
                     :           :                    +- * ColumnarToRow (74)
                     :           :                       +- Scan parquet default.customer (73)
                     :           +- * Sort (86)
                     :              +- Exchange (85)
                     :                 +- * Filter (84)
                     :                    +- * ColumnarToRow (83)
                     :                       +- Scan parquet default.customer_address (82)
                     +- * Sort (96)
                        +- Exchange (95)
                           +- * Project (94)
                              +- * Filter (93)
                                 +- * ColumnarToRow (92)
                                    +- Scan parquet default.store_returns (91)


(51) Scan parquet default.store_sales
Output [6]: [ss_item_sk#50, ss_customer_sk#51, ss_store_sk#52, ss_ticket_number#53, ss_net_paid#54, ss_sold_date_sk#55]
Batched: true
Location [not included in comparison]/{warehouse_dir}/store_sales]
PushedFilters: [IsNotNull(ss_ticket_number), IsNotNull(ss_item_sk), IsNotNull(ss_store_sk), IsNotNull(ss_customer_sk)]
ReadSchema: struct<ss_item_sk:int,ss_customer_sk:int,ss_store_sk:int,ss_ticket_number:int,ss_net_paid:decimal(7,2)>

(52) ColumnarToRow [codegen id : 2]
Input [6]: [ss_item_sk#50, ss_customer_sk#51, ss_store_sk#52, ss_ticket_number#53, ss_net_paid#54, ss_sold_date_sk#55]

(53) Filter [codegen id : 2]
Input [6]: [ss_item_sk#50, ss_customer_sk#51, ss_store_sk#52, ss_ticket_number#53, ss_net_paid#54, ss_sold_date_sk#55]
Condition : (((isnotnull(ss_ticket_number#53) AND isnotnull(ss_item_sk#50)) AND isnotnull(ss_store_sk#52)) AND isnotnull(ss_customer_sk#51))

(54) Project [codegen id : 2]
Output [5]: [ss_item_sk#50, ss_customer_sk#51, ss_store_sk#52, ss_ticket_number#53, ss_net_paid#54]
Input [6]: [ss_item_sk#50, ss_customer_sk#51, ss_store_sk#52, ss_ticket_number#53, ss_net_paid#54, ss_sold_date_sk#55]

(55) Scan parquet default.store
Output [5]: [s_store_sk#56, s_store_name#57, s_market_id#58, s_state#59, s_zip#60]
Batched: true
Location [not included in comparison]/{warehouse_dir}/store]
PushedFilters: [IsNotNull(s_market_id), EqualTo(s_market_id,8), IsNotNull(s_store_sk), IsNotNull(s_zip)]
ReadSchema: struct<s_store_sk:int,s_store_name:string,s_market_id:int,s_state:string,s_zip:string>

(56) ColumnarToRow [codegen id : 1]
Input [5]: [s_store_sk#56, s_store_name#57, s_market_id#58, s_state#59, s_zip#60]

(57) Filter [codegen id : 1]
Input [5]: [s_store_sk#56, s_store_name#57, s_market_id#58, s_state#59, s_zip#60]
Condition : (((isnotnull(s_market_id#58) AND (s_market_id#58 = 8)) AND isnotnull(s_store_sk#56)) AND isnotnull(s_zip#60))

(58) Project [codegen id : 1]
Output [4]: [s_store_sk#56, s_store_name#57, s_state#59, s_zip#60]
Input [5]: [s_store_sk#56, s_store_name#57, s_market_id#58, s_state#59, s_zip#60]

(59) BroadcastExchange
Input [4]: [s_store_sk#56, s_store_name#57, s_state#59, s_zip#60]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#61]

(60) BroadcastHashJoin [codegen id : 2]
Left keys [1]: [ss_store_sk#52]
Right keys [1]: [s_store_sk#56]
Join condition: None

(61) Project [codegen id : 2]
Output [7]: [ss_item_sk#50, ss_customer_sk#51, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60]
Input [9]: [ss_item_sk#50, ss_customer_sk#51, ss_store_sk#52, ss_ticket_number#53, ss_net_paid#54, s_store_sk#56, s_store_name#57, s_state#59, s_zip#60]

(62) Exchange
Input [7]: [ss_item_sk#50, ss_customer_sk#51, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60]
Arguments: hashpartitioning(ss_item_sk#50, 5), ENSURE_REQUIREMENTS, [id=#62]

(63) Sort [codegen id : 3]
Input [7]: [ss_item_sk#50, ss_customer_sk#51, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60]
Arguments: [ss_item_sk#50 ASC NULLS FIRST], false, 0

(64) Scan parquet default.item
Output [6]: [i_item_sk#63, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68]
Batched: true
Location [not included in comparison]/{warehouse_dir}/item]
PushedFilters: [IsNotNull(i_item_sk)]
ReadSchema: struct<i_item_sk:int,i_current_price:decimal(7,2),i_size:string,i_color:string,i_units:string,i_manager_id:int>

(65) ColumnarToRow [codegen id : 4]
Input [6]: [i_item_sk#63, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68]

(66) Filter [codegen id : 4]
Input [6]: [i_item_sk#63, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68]
Condition : isnotnull(i_item_sk#63)

(67) Exchange
Input [6]: [i_item_sk#63, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68]
Arguments: hashpartitioning(i_item_sk#63, 5), ENSURE_REQUIREMENTS, [id=#69]

(68) Sort [codegen id : 5]
Input [6]: [i_item_sk#63, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68]
Arguments: [i_item_sk#63 ASC NULLS FIRST], false, 0

(69) SortMergeJoin [codegen id : 6]
Left keys [1]: [ss_item_sk#50]
Right keys [1]: [i_item_sk#63]
Join condition: None

(70) Project [codegen id : 6]
Output [12]: [ss_item_sk#50, ss_customer_sk#51, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68]
Input [13]: [ss_item_sk#50, ss_customer_sk#51, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60, i_item_sk#63, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68]

(71) Exchange
Input [12]: [ss_item_sk#50, ss_customer_sk#51, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68]
Arguments: hashpartitioning(ss_customer_sk#51, 5), ENSURE_REQUIREMENTS, [id=#70]

(72) Sort [codegen id : 7]
Input [12]: [ss_item_sk#50, ss_customer_sk#51, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68]
Arguments: [ss_customer_sk#51 ASC NULLS FIRST], false, 0

(73) Scan parquet default.customer
Output [4]: [c_customer_sk#71, c_first_name#72, c_last_name#73, c_birth_country#74]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_birth_country)]
ReadSchema: struct<c_customer_sk:int,c_first_name:string,c_last_name:string,c_birth_country:string>

(74) ColumnarToRow [codegen id : 8]
Input [4]: [c_customer_sk#71, c_first_name#72, c_last_name#73, c_birth_country#74]

(75) Filter [codegen id : 8]
Input [4]: [c_customer_sk#71, c_first_name#72, c_last_name#73, c_birth_country#74]
Condition : (isnotnull(c_customer_sk#71) AND isnotnull(c_birth_country#74))

(76) Exchange
Input [4]: [c_customer_sk#71, c_first_name#72, c_last_name#73, c_birth_country#74]
Arguments: hashpartitioning(c_customer_sk#71, 5), ENSURE_REQUIREMENTS, [id=#75]

(77) Sort [codegen id : 9]
Input [4]: [c_customer_sk#71, c_first_name#72, c_last_name#73, c_birth_country#74]
Arguments: [c_customer_sk#71 ASC NULLS FIRST], false, 0

(78) SortMergeJoin [codegen id : 10]
Left keys [1]: [ss_customer_sk#51]
Right keys [1]: [c_customer_sk#71]
Join condition: None

(79) Project [codegen id : 10]
Output [14]: [ss_item_sk#50, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68, c_first_name#72, c_last_name#73, c_birth_country#74]
Input [16]: [ss_item_sk#50, ss_customer_sk#51, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68, c_customer_sk#71, c_first_name#72, c_last_name#73, c_birth_country#74]

(80) Exchange
Input [14]: [ss_item_sk#50, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68, c_first_name#72, c_last_name#73, c_birth_country#74]
Arguments: hashpartitioning(c_birth_country#74, s_zip#60, 5), ENSURE_REQUIREMENTS, [id=#76]

(81) Sort [codegen id : 11]
Input [14]: [ss_item_sk#50, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68, c_first_name#72, c_last_name#73, c_birth_country#74]
Arguments: [c_birth_country#74 ASC NULLS FIRST, s_zip#60 ASC NULLS FIRST], false, 0

(82) Scan parquet default.customer_address
Output [3]: [ca_state#77, ca_zip#78, ca_country#79]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer_address]
PushedFilters: [IsNotNull(ca_country), IsNotNull(ca_zip)]
ReadSchema: struct<ca_state:string,ca_zip:string,ca_country:string>

(83) ColumnarToRow [codegen id : 12]
Input [3]: [ca_state#77, ca_zip#78, ca_country#79]

(84) Filter [codegen id : 12]
Input [3]: [ca_state#77, ca_zip#78, ca_country#79]
Condition : (isnotnull(ca_country#79) AND isnotnull(ca_zip#78))

(85) Exchange
Input [3]: [ca_state#77, ca_zip#78, ca_country#79]
Arguments: hashpartitioning(upper(ca_country#79), ca_zip#78, 5), ENSURE_REQUIREMENTS, [id=#80]

(86) Sort [codegen id : 13]
Input [3]: [ca_state#77, ca_zip#78, ca_country#79]
Arguments: [upper(ca_country#79) ASC NULLS FIRST, ca_zip#78 ASC NULLS FIRST], false, 0

(87) SortMergeJoin [codegen id : 14]
Left keys [2]: [c_birth_country#74, s_zip#60]
Right keys [2]: [upper(ca_country#79), ca_zip#78]
Join condition: None

(88) Project [codegen id : 14]
Output [13]: [ss_item_sk#50, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68, c_first_name#72, c_last_name#73, ca_state#77]
Input [17]: [ss_item_sk#50, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, s_zip#60, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68, c_first_name#72, c_last_name#73, c_birth_country#74, ca_state#77, ca_zip#78, ca_country#79]

(89) Exchange
Input [13]: [ss_item_sk#50, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68, c_first_name#72, c_last_name#73, ca_state#77]
Arguments: hashpartitioning(cast(ss_ticket_number#53 as bigint), cast(ss_item_sk#50 as bigint), 5), ENSURE_REQUIREMENTS, [id=#81]

(90) Sort [codegen id : 15]
Input [13]: [ss_item_sk#50, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68, c_first_name#72, c_last_name#73, ca_state#77]
Arguments: [cast(ss_ticket_number#53 as bigint) ASC NULLS FIRST, cast(ss_item_sk#50 as bigint) ASC NULLS FIRST], false, 0

(91) Scan parquet default.store_returns
Output [3]: [sr_item_sk#82, sr_ticket_number#83, sr_returned_date_sk#84]
Batched: true
Location [not included in comparison]/{warehouse_dir}/store_returns]
PushedFilters: [IsNotNull(sr_ticket_number), IsNotNull(sr_item_sk)]
ReadSchema: struct<sr_item_sk:bigint,sr_ticket_number:bigint>

(92) ColumnarToRow [codegen id : 16]
Input [3]: [sr_item_sk#82, sr_ticket_number#83, sr_returned_date_sk#84]

(93) Filter [codegen id : 16]
Input [3]: [sr_item_sk#82, sr_ticket_number#83, sr_returned_date_sk#84]
Condition : (isnotnull(sr_ticket_number#83) AND isnotnull(sr_item_sk#82))

(94) Project [codegen id : 16]
Output [2]: [sr_item_sk#82, sr_ticket_number#83]
Input [3]: [sr_item_sk#82, sr_ticket_number#83, sr_returned_date_sk#84]

(95) Exchange
Input [2]: [sr_item_sk#82, sr_ticket_number#83]
Arguments: hashpartitioning(sr_ticket_number#83, sr_item_sk#82, 5), ENSURE_REQUIREMENTS, [id=#85]

(96) Sort [codegen id : 17]
Input [2]: [sr_item_sk#82, sr_ticket_number#83]
Arguments: [sr_ticket_number#83 ASC NULLS FIRST, sr_item_sk#82 ASC NULLS FIRST], false, 0

(97) SortMergeJoin [codegen id : 18]
Left keys [2]: [cast(ss_ticket_number#53 as bigint), cast(ss_item_sk#50 as bigint)]
Right keys [2]: [sr_ticket_number#83, sr_item_sk#82]
Join condition: None

(98) Project [codegen id : 18]
Output [11]: [ss_net_paid#54, s_store_name#57, s_state#59, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68, c_first_name#72, c_last_name#73, ca_state#77]
Input [15]: [ss_item_sk#50, ss_ticket_number#53, ss_net_paid#54, s_store_name#57, s_state#59, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68, c_first_name#72, c_last_name#73, ca_state#77, sr_item_sk#82, sr_ticket_number#83]

(99) HashAggregate [codegen id : 18]
Input [11]: [ss_net_paid#54, s_store_name#57, s_state#59, i_current_price#64, i_size#65, i_color#66, i_units#67, i_manager_id#68, c_first_name#72, c_last_name#73, ca_state#77]
Keys [10]: [c_last_name#73, c_first_name#72, s_store_name#57, ca_state#77, s_state#59, i_color#66, i_current_price#64, i_manager_id#68, i_units#67, i_size#65]
Functions [1]: [partial_sum(UnscaledValue(ss_net_paid#54))]
Aggregate Attributes [1]: [sum#86]
Results [11]: [c_last_name#73, c_first_name#72, s_store_name#57, ca_state#77, s_state#59, i_color#66, i_current_price#64, i_manager_id#68, i_units#67, i_size#65, sum#87]

(100) Exchange
Input [11]: [c_last_name#73, c_first_name#72, s_store_name#57, ca_state#77, s_state#59, i_color#66, i_current_price#64, i_manager_id#68, i_units#67, i_size#65, sum#87]
Arguments: hashpartitioning(c_last_name#73, c_first_name#72, s_store_name#57, ca_state#77, s_state#59, i_color#66, i_current_price#64, i_manager_id#68, i_units#67, i_size#65, 5), ENSURE_REQUIREMENTS, [id=#88]

(101) HashAggregate [codegen id : 19]
Input [11]: [c_last_name#73, c_first_name#72, s_store_name#57, ca_state#77, s_state#59, i_color#66, i_current_price#64, i_manager_id#68, i_units#67, i_size#65, sum#87]
Keys [10]: [c_last_name#73, c_first_name#72, s_store_name#57, ca_state#77, s_state#59, i_color#66, i_current_price#64, i_manager_id#68, i_units#67, i_size#65]
Functions [1]: [sum(UnscaledValue(ss_net_paid#54))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#54))#89]
Results [1]: [MakeDecimal(sum(UnscaledValue(ss_net_paid#54))#89,17,2) AS netpaid#39]

(102) HashAggregate [codegen id : 19]
Input [1]: [netpaid#39]
Keys: []
Functions [1]: [partial_avg(netpaid#39)]
Aggregate Attributes [2]: [sum#90, count#91]
Results [2]: [sum#92, count#93]

(103) Exchange
Input [2]: [sum#92, count#93]
Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#94]

(104) HashAggregate [codegen id : 20]
Input [2]: [sum#92, count#93]
Keys: []
Functions [1]: [avg(netpaid#39)]
Aggregate Attributes [1]: [avg(netpaid#39)#95]
Results [1]: [CheckOverflow((0.050000 * promote_precision(avg(netpaid#39)#95)), DecimalType(24,8), true) AS (0.05 * avg(netpaid))#96]


