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


(1) Scan parquet default.store
Output [5]: [s_store_sk#1, s_store_name#2, s_market_id#3, s_state#4, s_zip#5]
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>

(2) ColumnarToRow [codegen id : 1]
Input [5]: [s_store_sk#1, s_store_name#2, s_market_id#3, s_state#4, s_zip#5]

(3) Filter [codegen id : 1]
Input [5]: [s_store_sk#1, s_store_name#2, s_market_id#3, s_state#4, s_zip#5]
Condition : (((isnotnull(s_market_id#3) AND (s_market_id#3 = 8)) AND isnotnull(s_store_sk#1)) AND isnotnull(s_zip#5))

(4) Project [codegen id : 1]
Output [4]: [s_store_sk#1, s_store_name#2, s_state#4, s_zip#5]
Input [5]: [s_store_sk#1, s_store_name#2, s_market_id#3, s_state#4, s_zip#5]

(5) BroadcastExchange
Input [4]: [s_store_sk#1, s_store_name#2, s_state#4, s_zip#5]
Arguments: HashedRelationBroadcastMode(List(input[3, string, true]),false), [id=#6]

(6) Scan parquet default.customer_address
Output [4]: [ca_address_sk#7, ca_state#8, ca_zip#9, ca_country#10]
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>

(7) ColumnarToRow
Input [4]: [ca_address_sk#7, ca_state#8, ca_zip#9, ca_country#10]

(8) Filter
Input [4]: [ca_address_sk#7, ca_state#8, ca_zip#9, ca_country#10]
Condition : ((isnotnull(ca_address_sk#7) AND isnotnull(ca_country#10)) AND isnotnull(ca_zip#9))

(9) BroadcastHashJoin [codegen id : 2]
Left keys [1]: [s_zip#5]
Right keys [1]: [ca_zip#9]
Join condition: None

(10) Project [codegen id : 2]
Output [6]: [s_store_sk#1, s_store_name#2, s_state#4, ca_address_sk#7, ca_state#8, ca_country#10]
Input [8]: [s_store_sk#1, s_store_name#2, s_state#4, s_zip#5, ca_address_sk#7, ca_state#8, ca_zip#9, ca_country#10]

(11) BroadcastExchange
Input [6]: [s_store_sk#1, s_store_name#2, s_state#4, ca_address_sk#7, ca_state#8, ca_country#10]
Arguments: HashedRelationBroadcastMode(List(input[3, int, true], upper(input[5, string, true])),false), [id=#11]

(12) Scan parquet default.customer
Output [5]: [c_customer_sk#12, c_current_addr_sk#13, c_first_name#14, c_last_name#15, c_birth_country#16]
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>

(13) ColumnarToRow
Input [5]: [c_customer_sk#12, c_current_addr_sk#13, c_first_name#14, c_last_name#15, c_birth_country#16]

(14) Filter
Input [5]: [c_customer_sk#12, c_current_addr_sk#13, c_first_name#14, c_last_name#15, c_birth_country#16]
Condition : ((isnotnull(c_customer_sk#12) AND isnotnull(c_current_addr_sk#13)) AND isnotnull(c_birth_country#16))

(15) BroadcastHashJoin [codegen id : 3]
Left keys [2]: [ca_address_sk#7, upper(ca_country#10)]
Right keys [2]: [c_current_addr_sk#13, c_birth_country#16]
Join condition: None

(16) Project [codegen id : 3]
Output [7]: [s_store_sk#1, s_store_name#2, s_state#4, ca_state#8, c_customer_sk#12, c_first_name#14, c_last_name#15]
Input [11]: [s_store_sk#1, s_store_name#2, s_state#4, ca_address_sk#7, ca_state#8, ca_country#10, c_customer_sk#12, c_current_addr_sk#13, c_first_name#14, c_last_name#15, c_birth_country#16]

(17) BroadcastExchange
Input [7]: [s_store_sk#1, s_store_name#2, s_state#4, ca_state#8, c_customer_sk#12, c_first_name#14, c_last_name#15]
Arguments: HashedRelationBroadcastMode(List((shiftleft(cast(input[0, int, true] as bigint), 32) | (cast(input[4, int, true] as bigint) & 4294967295))),false), [id=#17]

(18) Scan parquet default.store_sales
Output [5]: [ss_item_sk#18, ss_customer_sk#19, ss_store_sk#20, ss_ticket_number#21, ss_net_paid#22]
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)>

(19) ColumnarToRow
Input [5]: [ss_item_sk#18, ss_customer_sk#19, ss_store_sk#20, ss_ticket_number#21, ss_net_paid#22]

(20) Filter
Input [5]: [ss_item_sk#18, ss_customer_sk#19, ss_store_sk#20, ss_ticket_number#21, ss_net_paid#22]
Condition : (((isnotnull(ss_ticket_number#21) AND isnotnull(ss_item_sk#18)) AND isnotnull(ss_store_sk#20)) AND isnotnull(ss_customer_sk#19))

(21) BroadcastHashJoin [codegen id : 5]
Left keys [2]: [s_store_sk#1, c_customer_sk#12]
Right keys [2]: [ss_store_sk#20, ss_customer_sk#19]
Join condition: None

(22) Project [codegen id : 5]
Output [8]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22]
Input [12]: [s_store_sk#1, s_store_name#2, s_state#4, ca_state#8, c_customer_sk#12, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_customer_sk#19, ss_store_sk#20, ss_ticket_number#21, ss_net_paid#22]

(23) Scan parquet default.item
Output [6]: [i_item_sk#23, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
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>

(24) ColumnarToRow [codegen id : 4]
Input [6]: [i_item_sk#23, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]

(25) Filter [codegen id : 4]
Input [6]: [i_item_sk#23, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
Condition : ((isnotnull(i_color#26) AND (i_color#26 = pale)) AND isnotnull(i_item_sk#23))

(26) BroadcastExchange
Input [6]: [i_item_sk#23, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#29]

(27) BroadcastHashJoin [codegen id : 5]
Left keys [1]: [ss_item_sk#18]
Right keys [1]: [i_item_sk#23]
Join condition: None

(28) Project [codegen id : 5]
Output [13]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
Input [14]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22, i_item_sk#23, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]

(29) Exchange
Input [13]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
Arguments: hashpartitioning(cast(ss_ticket_number#21 as bigint), cast(ss_item_sk#18 as bigint), 5), true, [id=#30]

(30) Sort [codegen id : 6]
Input [13]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
Arguments: [cast(ss_ticket_number#21 as bigint) ASC NULLS FIRST, cast(ss_item_sk#18 as bigint) ASC NULLS FIRST], false, 0

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

(32) ColumnarToRow [codegen id : 7]
Input [2]: [sr_item_sk#31, sr_ticket_number#32]

(33) Filter [codegen id : 7]
Input [2]: [sr_item_sk#31, sr_ticket_number#32]
Condition : (isnotnull(sr_ticket_number#32) AND isnotnull(sr_item_sk#31))

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

(35) Sort [codegen id : 8]
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

(36) SortMergeJoin [codegen id : 9]
Left keys [2]: [cast(ss_ticket_number#21 as bigint), cast(ss_item_sk#18 as bigint)]
Right keys [2]: [sr_ticket_number#32, sr_item_sk#31]
Join condition: None

(37) Project [codegen id : 9]
Output [11]: [ss_net_paid#22, s_store_name#2, s_state#4, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28, c_first_name#14, c_last_name#15, ca_state#8]
Input [15]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28, sr_item_sk#31, sr_ticket_number#32]

(38) HashAggregate [codegen id : 9]
Input [11]: [ss_net_paid#22, s_store_name#2, s_state#4, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28, c_first_name#14, c_last_name#15, ca_state#8]
Keys [10]: [c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25]
Functions [1]: [partial_sum(UnscaledValue(ss_net_paid#22))]
Aggregate Attributes [1]: [sum#34]
Results [11]: [c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25, sum#35]

(39) Exchange
Input [11]: [c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25, sum#35]
Arguments: hashpartitioning(c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25, 5), true, [id=#36]

(40) HashAggregate [codegen id : 10]
Input [11]: [c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25, sum#35]
Keys [10]: [c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25]
Functions [1]: [sum(UnscaledValue(ss_net_paid#22))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#22))#37]
Results [4]: [c_last_name#15, c_first_name#14, s_store_name#2, MakeDecimal(sum(UnscaledValue(ss_net_paid#22))#37,17,2) AS netpaid#38]

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

(42) Exchange
Input [5]: [c_last_name#15, c_first_name#14, s_store_name#2, sum#41, isEmpty#42]
Arguments: hashpartitioning(c_last_name#15, c_first_name#14, s_store_name#2, 5), true, [id=#43]

(43) HashAggregate [codegen id : 11]
Input [5]: [c_last_name#15, c_first_name#14, s_store_name#2, sum#41, isEmpty#42]
Keys [3]: [c_last_name#15, c_first_name#14, s_store_name#2]
Functions [1]: [sum(netpaid#38)]
Aggregate Attributes [1]: [sum(netpaid#38)#44]
Results [5]: [c_last_name#15, c_first_name#14, s_store_name#2, sum(netpaid#38)#44 AS paid#45, sum(netpaid#38)#44 AS sum(netpaid#38)#46]

(44) Filter [codegen id : 11]
Input [5]: [c_last_name#15, c_first_name#14, s_store_name#2, paid#45, sum(netpaid#38)#46]
Condition : (isnotnull(sum(netpaid#38)#46) AND (cast(sum(netpaid#38)#46 as decimal(33,8)) > cast(Subquery scalar-subquery#47, [id=#48] as decimal(33,8))))

(45) Project [codegen id : 11]
Output [4]: [c_last_name#15, c_first_name#14, s_store_name#2, paid#45]
Input [5]: [c_last_name#15, c_first_name#14, s_store_name#2, paid#45, sum(netpaid#38)#46]

(46) Exchange
Input [4]: [c_last_name#15, c_first_name#14, s_store_name#2, paid#45]
Arguments: rangepartitioning(c_last_name#15 ASC NULLS FIRST, c_first_name#14 ASC NULLS FIRST, s_store_name#2 ASC NULLS FIRST, 5), true, [id=#49]

(47) Sort [codegen id : 12]
Input [4]: [c_last_name#15, c_first_name#14, s_store_name#2, paid#45]
Arguments: [c_last_name#15 ASC NULLS FIRST, c_first_name#14 ASC NULLS FIRST, s_store_name#2 ASC NULLS FIRST], true, 0

===== Subqueries =====

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


(48) Scan parquet default.store
Output [5]: [s_store_sk#1, s_store_name#2, s_market_id#3, s_state#4, s_zip#5]
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>

(49) ColumnarToRow [codegen id : 1]
Input [5]: [s_store_sk#1, s_store_name#2, s_market_id#3, s_state#4, s_zip#5]

(50) Filter [codegen id : 1]
Input [5]: [s_store_sk#1, s_store_name#2, s_market_id#3, s_state#4, s_zip#5]
Condition : (((isnotnull(s_market_id#3) AND (s_market_id#3 = 8)) AND isnotnull(s_store_sk#1)) AND isnotnull(s_zip#5))

(51) Project [codegen id : 1]
Output [4]: [s_store_sk#1, s_store_name#2, s_state#4, s_zip#5]
Input [5]: [s_store_sk#1, s_store_name#2, s_market_id#3, s_state#4, s_zip#5]

(52) BroadcastExchange
Input [4]: [s_store_sk#1, s_store_name#2, s_state#4, s_zip#5]
Arguments: HashedRelationBroadcastMode(List(input[3, string, true]),false), [id=#50]

(53) Scan parquet default.customer_address
Output [4]: [ca_address_sk#7, ca_state#8, ca_zip#9, ca_country#10]
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>

(54) ColumnarToRow
Input [4]: [ca_address_sk#7, ca_state#8, ca_zip#9, ca_country#10]

(55) Filter
Input [4]: [ca_address_sk#7, ca_state#8, ca_zip#9, ca_country#10]
Condition : ((isnotnull(ca_address_sk#7) AND isnotnull(ca_country#10)) AND isnotnull(ca_zip#9))

(56) BroadcastHashJoin [codegen id : 2]
Left keys [1]: [s_zip#5]
Right keys [1]: [ca_zip#9]
Join condition: None

(57) Project [codegen id : 2]
Output [6]: [s_store_sk#1, s_store_name#2, s_state#4, ca_address_sk#7, ca_state#8, ca_country#10]
Input [8]: [s_store_sk#1, s_store_name#2, s_state#4, s_zip#5, ca_address_sk#7, ca_state#8, ca_zip#9, ca_country#10]

(58) BroadcastExchange
Input [6]: [s_store_sk#1, s_store_name#2, s_state#4, ca_address_sk#7, ca_state#8, ca_country#10]
Arguments: HashedRelationBroadcastMode(List(input[3, int, true], upper(input[5, string, true])),false), [id=#51]

(59) Scan parquet default.customer
Output [5]: [c_customer_sk#12, c_current_addr_sk#13, c_first_name#14, c_last_name#15, c_birth_country#16]
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>

(60) ColumnarToRow
Input [5]: [c_customer_sk#12, c_current_addr_sk#13, c_first_name#14, c_last_name#15, c_birth_country#16]

(61) Filter
Input [5]: [c_customer_sk#12, c_current_addr_sk#13, c_first_name#14, c_last_name#15, c_birth_country#16]
Condition : ((isnotnull(c_customer_sk#12) AND isnotnull(c_current_addr_sk#13)) AND isnotnull(c_birth_country#16))

(62) BroadcastHashJoin [codegen id : 3]
Left keys [2]: [ca_address_sk#7, upper(ca_country#10)]
Right keys [2]: [c_current_addr_sk#13, c_birth_country#16]
Join condition: None

(63) Project [codegen id : 3]
Output [7]: [s_store_sk#1, s_store_name#2, s_state#4, ca_state#8, c_customer_sk#12, c_first_name#14, c_last_name#15]
Input [11]: [s_store_sk#1, s_store_name#2, s_state#4, ca_address_sk#7, ca_state#8, ca_country#10, c_customer_sk#12, c_current_addr_sk#13, c_first_name#14, c_last_name#15, c_birth_country#16]

(64) BroadcastExchange
Input [7]: [s_store_sk#1, s_store_name#2, s_state#4, ca_state#8, c_customer_sk#12, c_first_name#14, c_last_name#15]
Arguments: HashedRelationBroadcastMode(List((shiftleft(cast(input[0, int, true] as bigint), 32) | (cast(input[4, int, true] as bigint) & 4294967295))),false), [id=#52]

(65) Scan parquet default.store_sales
Output [5]: [ss_item_sk#18, ss_customer_sk#19, ss_store_sk#20, ss_ticket_number#21, ss_net_paid#22]
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)>

(66) ColumnarToRow
Input [5]: [ss_item_sk#18, ss_customer_sk#19, ss_store_sk#20, ss_ticket_number#21, ss_net_paid#22]

(67) Filter
Input [5]: [ss_item_sk#18, ss_customer_sk#19, ss_store_sk#20, ss_ticket_number#21, ss_net_paid#22]
Condition : (((isnotnull(ss_ticket_number#21) AND isnotnull(ss_item_sk#18)) AND isnotnull(ss_store_sk#20)) AND isnotnull(ss_customer_sk#19))

(68) BroadcastHashJoin [codegen id : 4]
Left keys [2]: [s_store_sk#1, c_customer_sk#12]
Right keys [2]: [ss_store_sk#20, ss_customer_sk#19]
Join condition: None

(69) Project [codegen id : 4]
Output [8]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22]
Input [12]: [s_store_sk#1, s_store_name#2, s_state#4, ca_state#8, c_customer_sk#12, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_customer_sk#19, ss_store_sk#20, ss_ticket_number#21, ss_net_paid#22]

(70) Exchange
Input [8]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22]
Arguments: hashpartitioning(ss_item_sk#18, 5), true, [id=#53]

(71) Sort [codegen id : 5]
Input [8]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22]
Arguments: [ss_item_sk#18 ASC NULLS FIRST], false, 0

(72) Scan parquet default.item
Output [6]: [i_item_sk#23, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
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>

(73) ColumnarToRow [codegen id : 6]
Input [6]: [i_item_sk#23, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]

(74) Filter [codegen id : 6]
Input [6]: [i_item_sk#23, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
Condition : isnotnull(i_item_sk#23)

(75) Exchange
Input [6]: [i_item_sk#23, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
Arguments: hashpartitioning(i_item_sk#23, 5), true, [id=#54]

(76) Sort [codegen id : 7]
Input [6]: [i_item_sk#23, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
Arguments: [i_item_sk#23 ASC NULLS FIRST], false, 0

(77) SortMergeJoin [codegen id : 8]
Left keys [1]: [ss_item_sk#18]
Right keys [1]: [i_item_sk#23]
Join condition: None

(78) Project [codegen id : 8]
Output [13]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
Input [14]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22, i_item_sk#23, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]

(79) Exchange
Input [13]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
Arguments: hashpartitioning(cast(ss_ticket_number#21 as bigint), cast(ss_item_sk#18 as bigint), 5), true, [id=#55]

(80) Sort [codegen id : 9]
Input [13]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28]
Arguments: [cast(ss_ticket_number#21 as bigint) ASC NULLS FIRST, cast(ss_item_sk#18 as bigint) ASC NULLS FIRST], false, 0

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

(82) ColumnarToRow [codegen id : 10]
Input [2]: [sr_item_sk#31, sr_ticket_number#32]

(83) Filter [codegen id : 10]
Input [2]: [sr_item_sk#31, sr_ticket_number#32]
Condition : (isnotnull(sr_ticket_number#32) AND isnotnull(sr_item_sk#31))

(84) Exchange
Input [2]: [sr_item_sk#31, sr_ticket_number#32]
Arguments: hashpartitioning(sr_ticket_number#32, sr_item_sk#31, 5), true, [id=#56]

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

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

(87) Project [codegen id : 12]
Output [11]: [ss_net_paid#22, s_store_name#2, s_state#4, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28, c_first_name#14, c_last_name#15, ca_state#8]
Input [15]: [s_store_name#2, s_state#4, ca_state#8, c_first_name#14, c_last_name#15, ss_item_sk#18, ss_ticket_number#21, ss_net_paid#22, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28, sr_item_sk#31, sr_ticket_number#32]

(88) HashAggregate [codegen id : 12]
Input [11]: [ss_net_paid#22, s_store_name#2, s_state#4, i_current_price#24, i_size#25, i_color#26, i_units#27, i_manager_id#28, c_first_name#14, c_last_name#15, ca_state#8]
Keys [10]: [c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25]
Functions [1]: [partial_sum(UnscaledValue(ss_net_paid#22))]
Aggregate Attributes [1]: [sum#57]
Results [11]: [c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25, sum#58]

(89) Exchange
Input [11]: [c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25, sum#58]
Arguments: hashpartitioning(c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25, 5), true, [id=#59]

(90) HashAggregate [codegen id : 13]
Input [11]: [c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25, sum#58]
Keys [10]: [c_last_name#15, c_first_name#14, s_store_name#2, ca_state#8, s_state#4, i_color#26, i_current_price#24, i_manager_id#28, i_units#27, i_size#25]
Functions [1]: [sum(UnscaledValue(ss_net_paid#22))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#22))#60]
Results [1]: [MakeDecimal(sum(UnscaledValue(ss_net_paid#22))#60,17,2) AS netpaid#38]

(91) HashAggregate [codegen id : 13]
Input [1]: [netpaid#38]
Keys: []
Functions [1]: [partial_avg(netpaid#38)]
Aggregate Attributes [2]: [sum#61, count#62]
Results [2]: [sum#63, count#64]

(92) Exchange
Input [2]: [sum#63, count#64]
Arguments: SinglePartition, true, [id=#65]

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


