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


(1) Scan parquet default.store_sales
Output [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
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 : 6]
Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]

(3) Filter [codegen id : 6]
Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
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) Scan parquet default.store_returns
Output [2]: [sr_item_sk#6, sr_ticket_number#7]
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>

(5) ColumnarToRow [codegen id : 1]
Input [2]: [sr_item_sk#6, sr_ticket_number#7]

(6) Filter [codegen id : 1]
Input [2]: [sr_item_sk#6, sr_ticket_number#7]
Condition : (isnotnull(sr_ticket_number#7) AND isnotnull(sr_item_sk#6))

(7) BroadcastExchange
Input [2]: [sr_item_sk#6, sr_ticket_number#7]
Arguments: HashedRelationBroadcastMode(List(input[1, bigint, false], input[0, bigint, false]),false), [id=#8]

(8) BroadcastHashJoin [codegen id : 6]
Left keys [2]: [cast(ss_ticket_number#4 as bigint), cast(ss_item_sk#1 as bigint)]
Right keys [2]: [sr_ticket_number#7, sr_item_sk#6]
Join condition: None

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

(10) Scan parquet default.store
Output [5]: [s_store_sk#9, s_store_name#10, s_market_id#11, s_state#12, s_zip#13]
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>

(11) ColumnarToRow [codegen id : 2]
Input [5]: [s_store_sk#9, s_store_name#10, s_market_id#11, s_state#12, s_zip#13]

(12) Filter [codegen id : 2]
Input [5]: [s_store_sk#9, s_store_name#10, s_market_id#11, s_state#12, s_zip#13]
Condition : (((isnotnull(s_market_id#11) AND (s_market_id#11 = 8)) AND isnotnull(s_store_sk#9)) AND isnotnull(s_zip#13))

(13) Project [codegen id : 2]
Output [4]: [s_store_sk#9, s_store_name#10, s_state#12, s_zip#13]
Input [5]: [s_store_sk#9, s_store_name#10, s_market_id#11, s_state#12, s_zip#13]

(14) BroadcastExchange
Input [4]: [s_store_sk#9, s_store_name#10, s_state#12, s_zip#13]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#14]

(15) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [ss_store_sk#3]
Right keys [1]: [s_store_sk#9]
Join condition: None

(16) Project [codegen id : 6]
Output [6]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13]
Input [8]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5, s_store_sk#9, s_store_name#10, s_state#12, s_zip#13]

(17) Scan parquet default.item
Output [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
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>

(18) ColumnarToRow [codegen id : 3]
Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]

(19) Filter [codegen id : 3]
Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
Condition : ((isnotnull(i_color#18) AND (i_color#18 = pale)) AND isnotnull(i_item_sk#15))

(20) BroadcastExchange
Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#21]

(21) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [ss_item_sk#1]
Right keys [1]: [i_item_sk#15]
Join condition: None

(22) Project [codegen id : 6]
Output [10]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
Input [12]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13, i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]

(23) Scan parquet default.customer
Output [5]: [c_customer_sk#22, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_current_addr_sk), IsNotNull(c_birth_country)]
ReadSchema: struct<c_customer_sk:int,c_current_addr_sk:int,c_first_name:string,c_last_name:string,c_birth_country:string>

(24) ColumnarToRow [codegen id : 4]
Input [5]: [c_customer_sk#22, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]

(25) Filter [codegen id : 4]
Input [5]: [c_customer_sk#22, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]
Condition : ((isnotnull(c_customer_sk#22) AND isnotnull(c_current_addr_sk#23)) AND isnotnull(c_birth_country#26))

(26) BroadcastExchange
Input [5]: [c_customer_sk#22, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#27]

(27) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [ss_customer_sk#2]
Right keys [1]: [c_customer_sk#22]
Join condition: None

(28) Project [codegen id : 6]
Output [13]: [ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]
Input [15]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_customer_sk#22, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]

(29) Scan parquet default.customer_address
Output [4]: [ca_address_sk#28, ca_state#29, ca_zip#30, ca_country#31]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer_address]
PushedFilters: [IsNotNull(ca_address_sk), IsNotNull(ca_country), IsNotNull(ca_zip)]
ReadSchema: struct<ca_address_sk:int,ca_state:string,ca_zip:string,ca_country:string>

(30) ColumnarToRow [codegen id : 5]
Input [4]: [ca_address_sk#28, ca_state#29, ca_zip#30, ca_country#31]

(31) Filter [codegen id : 5]
Input [4]: [ca_address_sk#28, ca_state#29, ca_zip#30, ca_country#31]
Condition : ((isnotnull(ca_address_sk#28) AND isnotnull(ca_country#31)) AND isnotnull(ca_zip#30))

(32) BroadcastExchange
Input [4]: [ca_address_sk#28, ca_state#29, ca_zip#30, ca_country#31]
Arguments: HashedRelationBroadcastMode(List(input[0, int, false], upper(input[3, string, false]), input[2, string, false]),false), [id=#32]

(33) BroadcastHashJoin [codegen id : 6]
Left keys [3]: [c_current_addr_sk#23, c_birth_country#26, s_zip#13]
Right keys [3]: [ca_address_sk#28, upper(ca_country#31), ca_zip#30]
Join condition: None

(34) Project [codegen id : 6]
Output [11]: [ss_net_paid#5, s_store_name#10, s_state#12, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#24, c_last_name#25, ca_state#29]
Input [17]: [ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26, ca_address_sk#28, ca_state#29, ca_zip#30, ca_country#31]

(35) HashAggregate [codegen id : 6]
Input [11]: [ss_net_paid#5, s_store_name#10, s_state#12, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#24, c_last_name#25, ca_state#29]
Keys [10]: [c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
Functions [1]: [partial_sum(UnscaledValue(ss_net_paid#5))]
Aggregate Attributes [1]: [sum#33]
Results [11]: [c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#34]

(36) Exchange
Input [11]: [c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#34]
Arguments: hashpartitioning(c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, 5), true, [id=#35]

(37) HashAggregate [codegen id : 7]
Input [11]: [c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#34]
Keys [10]: [c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
Functions [1]: [sum(UnscaledValue(ss_net_paid#5))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#5))#36]
Results [4]: [c_last_name#25, c_first_name#24, s_store_name#10, MakeDecimal(sum(UnscaledValue(ss_net_paid#5))#36,17,2) AS netpaid#37]

(38) HashAggregate [codegen id : 7]
Input [4]: [c_last_name#25, c_first_name#24, s_store_name#10, netpaid#37]
Keys [3]: [c_last_name#25, c_first_name#24, s_store_name#10]
Functions [1]: [partial_sum(netpaid#37)]
Aggregate Attributes [2]: [sum#38, isEmpty#39]
Results [5]: [c_last_name#25, c_first_name#24, s_store_name#10, sum#40, isEmpty#41]

(39) Exchange
Input [5]: [c_last_name#25, c_first_name#24, s_store_name#10, sum#40, isEmpty#41]
Arguments: hashpartitioning(c_last_name#25, c_first_name#24, s_store_name#10, 5), true, [id=#42]

(40) HashAggregate [codegen id : 8]
Input [5]: [c_last_name#25, c_first_name#24, s_store_name#10, sum#40, isEmpty#41]
Keys [3]: [c_last_name#25, c_first_name#24, s_store_name#10]
Functions [1]: [sum(netpaid#37)]
Aggregate Attributes [1]: [sum(netpaid#37)#43]
Results [5]: [c_last_name#25, c_first_name#24, s_store_name#10, sum(netpaid#37)#43 AS paid#44, sum(netpaid#37)#43 AS sum(netpaid#37)#45]

(41) Filter [codegen id : 8]
Input [5]: [c_last_name#25, c_first_name#24, s_store_name#10, paid#44, sum(netpaid#37)#45]
Condition : (isnotnull(sum(netpaid#37)#45) AND (cast(sum(netpaid#37)#45 as decimal(33,8)) > cast(Subquery scalar-subquery#46, [id=#47] as decimal(33,8))))

(42) Project [codegen id : 8]
Output [4]: [c_last_name#25, c_first_name#24, s_store_name#10, paid#44]
Input [5]: [c_last_name#25, c_first_name#24, s_store_name#10, paid#44, sum(netpaid#37)#45]

(43) Exchange
Input [4]: [c_last_name#25, c_first_name#24, s_store_name#10, paid#44]
Arguments: rangepartitioning(c_last_name#25 ASC NULLS FIRST, c_first_name#24 ASC NULLS FIRST, s_store_name#10 ASC NULLS FIRST, 5), true, [id=#48]

(44) Sort [codegen id : 9]
Input [4]: [c_last_name#25, c_first_name#24, s_store_name#10, paid#44]
Arguments: [c_last_name#25 ASC NULLS FIRST, c_first_name#24 ASC NULLS FIRST, s_store_name#10 ASC NULLS FIRST], true, 0

===== Subqueries =====

Subquery:1 Hosting operator id = 41 Hosting Expression = Subquery scalar-subquery#46, [id=#47]
* HashAggregate (84)
+- Exchange (83)
   +- * HashAggregate (82)
      +- * HashAggregate (81)
         +- Exchange (80)
            +- * HashAggregate (79)
               +- * Project (78)
                  +- * BroadcastHashJoin Inner BuildRight (77)
                     :- * Project (72)
                     :  +- * BroadcastHashJoin Inner BuildRight (71)
                     :     :- * Project (66)
                     :     :  +- * BroadcastHashJoin Inner BuildRight (65)
                     :     :     :- * Project (60)
                     :     :     :  +- * BroadcastHashJoin Inner BuildRight (59)
                     :     :     :     :- * Project (53)
                     :     :     :     :  +- * BroadcastHashJoin Inner BuildRight (52)
                     :     :     :     :     :- * Filter (47)
                     :     :     :     :     :  +- * ColumnarToRow (46)
                     :     :     :     :     :     +- Scan parquet default.store_sales (45)
                     :     :     :     :     +- BroadcastExchange (51)
                     :     :     :     :        +- * Filter (50)
                     :     :     :     :           +- * ColumnarToRow (49)
                     :     :     :     :              +- Scan parquet default.store_returns (48)
                     :     :     :     +- BroadcastExchange (58)
                     :     :     :        +- * Project (57)
                     :     :     :           +- * Filter (56)
                     :     :     :              +- * ColumnarToRow (55)
                     :     :     :                 +- Scan parquet default.store (54)
                     :     :     +- BroadcastExchange (64)
                     :     :        +- * Filter (63)
                     :     :           +- * ColumnarToRow (62)
                     :     :              +- Scan parquet default.item (61)
                     :     +- BroadcastExchange (70)
                     :        +- * Filter (69)
                     :           +- * ColumnarToRow (68)
                     :              +- Scan parquet default.customer (67)
                     +- BroadcastExchange (76)
                        +- * Filter (75)
                           +- * ColumnarToRow (74)
                              +- Scan parquet default.customer_address (73)


(45) Scan parquet default.store_sales
Output [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ticket_number#4, ss_net_paid#5]
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)>

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

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

(48) Scan parquet default.store_returns
Output [2]: [sr_item_sk#6, sr_ticket_number#7]
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>

(49) ColumnarToRow [codegen id : 1]
Input [2]: [sr_item_sk#6, sr_ticket_number#7]

(50) Filter [codegen id : 1]
Input [2]: [sr_item_sk#6, sr_ticket_number#7]
Condition : (isnotnull(sr_ticket_number#7) AND isnotnull(sr_item_sk#6))

(51) BroadcastExchange
Input [2]: [sr_item_sk#6, sr_ticket_number#7]
Arguments: HashedRelationBroadcastMode(List(input[1, bigint, false], input[0, bigint, false]),false), [id=#49]

(52) BroadcastHashJoin [codegen id : 6]
Left keys [2]: [cast(ss_ticket_number#4 as bigint), cast(ss_item_sk#1 as bigint)]
Right keys [2]: [sr_ticket_number#7, sr_item_sk#6]
Join condition: None

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

(54) Scan parquet default.store
Output [5]: [s_store_sk#9, s_store_name#10, s_market_id#11, s_state#12, s_zip#13]
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>

(55) ColumnarToRow [codegen id : 2]
Input [5]: [s_store_sk#9, s_store_name#10, s_market_id#11, s_state#12, s_zip#13]

(56) Filter [codegen id : 2]
Input [5]: [s_store_sk#9, s_store_name#10, s_market_id#11, s_state#12, s_zip#13]
Condition : (((isnotnull(s_market_id#11) AND (s_market_id#11 = 8)) AND isnotnull(s_store_sk#9)) AND isnotnull(s_zip#13))

(57) Project [codegen id : 2]
Output [4]: [s_store_sk#9, s_store_name#10, s_state#12, s_zip#13]
Input [5]: [s_store_sk#9, s_store_name#10, s_market_id#11, s_state#12, s_zip#13]

(58) BroadcastExchange
Input [4]: [s_store_sk#9, s_store_name#10, s_state#12, s_zip#13]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#50]

(59) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [ss_store_sk#3]
Right keys [1]: [s_store_sk#9]
Join condition: None

(60) Project [codegen id : 6]
Output [6]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13]
Input [8]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_net_paid#5, s_store_sk#9, s_store_name#10, s_state#12, s_zip#13]

(61) Scan parquet default.item
Output [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
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>

(62) ColumnarToRow [codegen id : 3]
Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]

(63) Filter [codegen id : 3]
Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
Condition : isnotnull(i_item_sk#15)

(64) BroadcastExchange
Input [6]: [i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#51]

(65) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [ss_item_sk#1]
Right keys [1]: [i_item_sk#15]
Join condition: None

(66) Project [codegen id : 6]
Output [10]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]
Input [12]: [ss_item_sk#1, ss_customer_sk#2, ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13, i_item_sk#15, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20]

(67) Scan parquet default.customer
Output [5]: [c_customer_sk#22, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_current_addr_sk), IsNotNull(c_birth_country)]
ReadSchema: struct<c_customer_sk:int,c_current_addr_sk:int,c_first_name:string,c_last_name:string,c_birth_country:string>

(68) ColumnarToRow [codegen id : 4]
Input [5]: [c_customer_sk#22, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]

(69) Filter [codegen id : 4]
Input [5]: [c_customer_sk#22, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]
Condition : ((isnotnull(c_customer_sk#22) AND isnotnull(c_current_addr_sk#23)) AND isnotnull(c_birth_country#26))

(70) BroadcastExchange
Input [5]: [c_customer_sk#22, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#52]

(71) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [ss_customer_sk#2]
Right keys [1]: [c_customer_sk#22]
Join condition: None

(72) Project [codegen id : 6]
Output [13]: [ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]
Input [15]: [ss_customer_sk#2, ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_customer_sk#22, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26]

(73) Scan parquet default.customer_address
Output [4]: [ca_address_sk#28, ca_state#29, ca_zip#30, ca_country#31]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer_address]
PushedFilters: [IsNotNull(ca_address_sk), IsNotNull(ca_country), IsNotNull(ca_zip)]
ReadSchema: struct<ca_address_sk:int,ca_state:string,ca_zip:string,ca_country:string>

(74) ColumnarToRow [codegen id : 5]
Input [4]: [ca_address_sk#28, ca_state#29, ca_zip#30, ca_country#31]

(75) Filter [codegen id : 5]
Input [4]: [ca_address_sk#28, ca_state#29, ca_zip#30, ca_country#31]
Condition : ((isnotnull(ca_address_sk#28) AND isnotnull(ca_country#31)) AND isnotnull(ca_zip#30))

(76) BroadcastExchange
Input [4]: [ca_address_sk#28, ca_state#29, ca_zip#30, ca_country#31]
Arguments: HashedRelationBroadcastMode(List(input[0, int, false], upper(input[3, string, false]), input[2, string, false]),false), [id=#53]

(77) BroadcastHashJoin [codegen id : 6]
Left keys [3]: [c_current_addr_sk#23, c_birth_country#26, s_zip#13]
Right keys [3]: [ca_address_sk#28, upper(ca_country#31), ca_zip#30]
Join condition: None

(78) Project [codegen id : 6]
Output [11]: [ss_net_paid#5, s_store_name#10, s_state#12, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#24, c_last_name#25, ca_state#29]
Input [17]: [ss_net_paid#5, s_store_name#10, s_state#12, s_zip#13, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_current_addr_sk#23, c_first_name#24, c_last_name#25, c_birth_country#26, ca_address_sk#28, ca_state#29, ca_zip#30, ca_country#31]

(79) HashAggregate [codegen id : 6]
Input [11]: [ss_net_paid#5, s_store_name#10, s_state#12, i_current_price#16, i_size#17, i_color#18, i_units#19, i_manager_id#20, c_first_name#24, c_last_name#25, ca_state#29]
Keys [10]: [c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
Functions [1]: [partial_sum(UnscaledValue(ss_net_paid#5))]
Aggregate Attributes [1]: [sum#54]
Results [11]: [c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#55]

(80) Exchange
Input [11]: [c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#55]
Arguments: hashpartitioning(c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, 5), true, [id=#56]

(81) HashAggregate [codegen id : 7]
Input [11]: [c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17, sum#55]
Keys [10]: [c_last_name#25, c_first_name#24, s_store_name#10, ca_state#29, s_state#12, i_color#18, i_current_price#16, i_manager_id#20, i_units#19, i_size#17]
Functions [1]: [sum(UnscaledValue(ss_net_paid#5))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#5))#57]
Results [1]: [MakeDecimal(sum(UnscaledValue(ss_net_paid#5))#57,17,2) AS netpaid#37]

(82) HashAggregate [codegen id : 7]
Input [1]: [netpaid#37]
Keys: []
Functions [1]: [partial_avg(netpaid#37)]
Aggregate Attributes [2]: [sum#58, count#59]
Results [2]: [sum#60, count#61]

(83) Exchange
Input [2]: [sum#60, count#61]
Arguments: SinglePartition, true, [id=#62]

(84) HashAggregate [codegen id : 8]
Input [2]: [sum#60, count#61]
Keys: []
Functions [1]: [avg(netpaid#37)]
Aggregate Attributes [1]: [avg(netpaid#37)#63]
Results [1]: [CheckOverflow((0.050000 * promote_precision(avg(netpaid#37)#63)), DecimalType(24,8), true) AS (CAST(0.05 AS DECIMAL(21,6)) * CAST(avg(netpaid) AS DECIMAL(21,6)))#64]


