== Physical Plan ==
TakeOrderedAndProject (61)
+- * Project (60)
   +- * BroadcastHashJoin Inner BuildRight (59)
      :- * Project (38)
      :  +- * SortMergeJoin Inner (37)
      :     :- * Sort (11)
      :     :  +- Exchange (10)
      :     :     +- * Project (9)
      :     :        +- * BroadcastHashJoin Inner BuildRight (8)
      :     :           :- * Filter (3)
      :     :           :  +- * ColumnarToRow (2)
      :     :           :     +- Scan parquet default.customer (1)
      :     :           +- BroadcastExchange (7)
      :     :              +- * Filter (6)
      :     :                 +- * ColumnarToRow (5)
      :     :                    +- Scan parquet default.customer_address (4)
      :     +- * Sort (36)
      :        +- Exchange (35)
      :           +- * Filter (34)
      :              +- * HashAggregate (33)
      :                 +- Exchange (32)
      :                    +- * HashAggregate (31)
      :                       +- * Project (30)
      :                          +- * SortMergeJoin Inner (29)
      :                             :- * Sort (23)
      :                             :  +- Exchange (22)
      :                             :     +- * Project (21)
      :                             :        +- * BroadcastHashJoin Inner BuildRight (20)
      :                             :           :- * Filter (14)
      :                             :           :  +- * ColumnarToRow (13)
      :                             :           :     +- Scan parquet default.catalog_returns (12)
      :                             :           +- BroadcastExchange (19)
      :                             :              +- * Project (18)
      :                             :                 +- * Filter (17)
      :                             :                    +- * ColumnarToRow (16)
      :                             :                       +- Scan parquet default.date_dim (15)
      :                             +- * Sort (28)
      :                                +- Exchange (27)
      :                                   +- * Filter (26)
      :                                      +- * ColumnarToRow (25)
      :                                         +- Scan parquet default.customer_address (24)
      +- BroadcastExchange (58)
         +- * Filter (57)
            +- * HashAggregate (56)
               +- Exchange (55)
                  +- * HashAggregate (54)
                     +- * HashAggregate (53)
                        +- Exchange (52)
                           +- * HashAggregate (51)
                              +- * Project (50)
                                 +- * SortMergeJoin Inner (49)
                                    :- * Sort (46)
                                    :  +- Exchange (45)
                                    :     +- * Project (44)
                                    :        +- * BroadcastHashJoin Inner BuildRight (43)
                                    :           :- * Filter (41)
                                    :           :  +- * ColumnarToRow (40)
                                    :           :     +- Scan parquet default.catalog_returns (39)
                                    :           +- ReusedExchange (42)
                                    +- * Sort (48)
                                       +- ReusedExchange (47)


(1) Scan parquet default.customer
Output [6]: [c_customer_sk#1, c_customer_id#2, c_current_addr_sk#3, c_salutation#4, c_first_name#5, c_last_name#6]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_current_addr_sk)]
ReadSchema: struct<c_customer_sk:int,c_customer_id:string,c_current_addr_sk:int,c_salutation:string,c_first_name:string,c_last_name:string>

(2) ColumnarToRow [codegen id : 2]
Input [6]: [c_customer_sk#1, c_customer_id#2, c_current_addr_sk#3, c_salutation#4, c_first_name#5, c_last_name#6]

(3) Filter [codegen id : 2]
Input [6]: [c_customer_sk#1, c_customer_id#2, c_current_addr_sk#3, c_salutation#4, c_first_name#5, c_last_name#6]
Condition : (isnotnull(c_customer_sk#1) AND isnotnull(c_current_addr_sk#3))

(4) Scan parquet default.customer_address
Output [12]: [ca_address_sk#7, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer_address]
PushedFilters: [IsNotNull(ca_state), EqualTo(ca_state,GA), IsNotNull(ca_address_sk)]
ReadSchema: struct<ca_address_sk:int,ca_street_number:string,ca_street_name:string,ca_street_type:string,ca_suite_number:string,ca_city:string,ca_county:string,ca_state:string,ca_zip:string,ca_country:string,ca_gmt_offset:decimal(5,2),ca_location_type:string>

(5) ColumnarToRow [codegen id : 1]
Input [12]: [ca_address_sk#7, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18]

(6) Filter [codegen id : 1]
Input [12]: [ca_address_sk#7, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18]
Condition : ((isnotnull(ca_state#14) AND (ca_state#14 = GA)) AND isnotnull(ca_address_sk#7))

(7) BroadcastExchange
Input [12]: [ca_address_sk#7, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#19]

(8) BroadcastHashJoin [codegen id : 2]
Left keys [1]: [c_current_addr_sk#3]
Right keys [1]: [ca_address_sk#7]
Join condition: None

(9) Project [codegen id : 2]
Output [16]: [c_customer_sk#1, c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18]
Input [18]: [c_customer_sk#1, c_customer_id#2, c_current_addr_sk#3, c_salutation#4, c_first_name#5, c_last_name#6, ca_address_sk#7, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18]

(10) Exchange
Input [16]: [c_customer_sk#1, c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18]
Arguments: hashpartitioning(c_customer_sk#1, 5), ENSURE_REQUIREMENTS, [id=#20]

(11) Sort [codegen id : 3]
Input [16]: [c_customer_sk#1, c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18]
Arguments: [c_customer_sk#1 ASC NULLS FIRST], false, 0

(12) Scan parquet default.catalog_returns
Output [4]: [cr_returned_date_sk#21, cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]
Batched: true
Location [not included in comparison]/{warehouse_dir}/catalog_returns]
PushedFilters: [IsNotNull(cr_returned_date_sk), IsNotNull(cr_returning_addr_sk), IsNotNull(cr_returning_customer_sk)]
ReadSchema: struct<cr_returned_date_sk:int,cr_returning_customer_sk:int,cr_returning_addr_sk:int,cr_return_amt_inc_tax:decimal(7,2)>

(13) ColumnarToRow [codegen id : 5]
Input [4]: [cr_returned_date_sk#21, cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]

(14) Filter [codegen id : 5]
Input [4]: [cr_returned_date_sk#21, cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]
Condition : ((isnotnull(cr_returned_date_sk#21) AND isnotnull(cr_returning_addr_sk#23)) AND isnotnull(cr_returning_customer_sk#22))

(15) Scan parquet default.date_dim
Output [2]: [d_date_sk#25, d_year#26]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2000), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int>

(16) ColumnarToRow [codegen id : 4]
Input [2]: [d_date_sk#25, d_year#26]

(17) Filter [codegen id : 4]
Input [2]: [d_date_sk#25, d_year#26]
Condition : ((isnotnull(d_year#26) AND (d_year#26 = 2000)) AND isnotnull(d_date_sk#25))

(18) Project [codegen id : 4]
Output [1]: [d_date_sk#25]
Input [2]: [d_date_sk#25, d_year#26]

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

(20) BroadcastHashJoin [codegen id : 5]
Left keys [1]: [cr_returned_date_sk#21]
Right keys [1]: [d_date_sk#25]
Join condition: None

(21) Project [codegen id : 5]
Output [3]: [cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]
Input [5]: [cr_returned_date_sk#21, cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24, d_date_sk#25]

(22) Exchange
Input [3]: [cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]
Arguments: hashpartitioning(cr_returning_addr_sk#23, 5), ENSURE_REQUIREMENTS, [id=#28]

(23) Sort [codegen id : 6]
Input [3]: [cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]
Arguments: [cr_returning_addr_sk#23 ASC NULLS FIRST], false, 0

(24) Scan parquet default.customer_address
Output [2]: [ca_address_sk#7, ca_state#14]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer_address]
PushedFilters: [IsNotNull(ca_address_sk), IsNotNull(ca_state)]
ReadSchema: struct<ca_address_sk:int,ca_state:string>

(25) ColumnarToRow [codegen id : 7]
Input [2]: [ca_address_sk#7, ca_state#14]

(26) Filter [codegen id : 7]
Input [2]: [ca_address_sk#7, ca_state#14]
Condition : (isnotnull(ca_address_sk#7) AND isnotnull(ca_state#14))

(27) Exchange
Input [2]: [ca_address_sk#7, ca_state#14]
Arguments: hashpartitioning(ca_address_sk#7, 5), ENSURE_REQUIREMENTS, [id=#29]

(28) Sort [codegen id : 8]
Input [2]: [ca_address_sk#7, ca_state#14]
Arguments: [ca_address_sk#7 ASC NULLS FIRST], false, 0

(29) SortMergeJoin [codegen id : 9]
Left keys [1]: [cr_returning_addr_sk#23]
Right keys [1]: [ca_address_sk#7]
Join condition: None

(30) Project [codegen id : 9]
Output [3]: [cr_returning_customer_sk#22, cr_return_amt_inc_tax#24, ca_state#14]
Input [5]: [cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24, ca_address_sk#7, ca_state#14]

(31) HashAggregate [codegen id : 9]
Input [3]: [cr_returning_customer_sk#22, cr_return_amt_inc_tax#24, ca_state#14]
Keys [2]: [cr_returning_customer_sk#22, ca_state#14]
Functions [1]: [partial_sum(UnscaledValue(cr_return_amt_inc_tax#24))]
Aggregate Attributes [1]: [sum#30]
Results [3]: [cr_returning_customer_sk#22, ca_state#14, sum#31]

(32) Exchange
Input [3]: [cr_returning_customer_sk#22, ca_state#14, sum#31]
Arguments: hashpartitioning(cr_returning_customer_sk#22, ca_state#14, 5), ENSURE_REQUIREMENTS, [id=#32]

(33) HashAggregate [codegen id : 10]
Input [3]: [cr_returning_customer_sk#22, ca_state#14, sum#31]
Keys [2]: [cr_returning_customer_sk#22, ca_state#14]
Functions [1]: [sum(UnscaledValue(cr_return_amt_inc_tax#24))]
Aggregate Attributes [1]: [sum(UnscaledValue(cr_return_amt_inc_tax#24))#33]
Results [3]: [cr_returning_customer_sk#22 AS ctr_customer_sk#34, ca_state#14 AS ctr_state#35, MakeDecimal(sum(UnscaledValue(cr_return_amt_inc_tax#24))#33,17,2) AS ctr_total_return#36]

(34) Filter [codegen id : 10]
Input [3]: [ctr_customer_sk#34, ctr_state#35, ctr_total_return#36]
Condition : isnotnull(ctr_total_return#36)

(35) Exchange
Input [3]: [ctr_customer_sk#34, ctr_state#35, ctr_total_return#36]
Arguments: hashpartitioning(ctr_customer_sk#34, 5), ENSURE_REQUIREMENTS, [id=#37]

(36) Sort [codegen id : 11]
Input [3]: [ctr_customer_sk#34, ctr_state#35, ctr_total_return#36]
Arguments: [ctr_customer_sk#34 ASC NULLS FIRST], false, 0

(37) SortMergeJoin [codegen id : 20]
Left keys [1]: [c_customer_sk#1]
Right keys [1]: [ctr_customer_sk#34]
Join condition: None

(38) Project [codegen id : 20]
Output [17]: [c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18, ctr_state#35, ctr_total_return#36]
Input [19]: [c_customer_sk#1, c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18, ctr_customer_sk#34, ctr_state#35, ctr_total_return#36]

(39) Scan parquet default.catalog_returns
Output [4]: [cr_returned_date_sk#21, cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]
Batched: true
Location [not included in comparison]/{warehouse_dir}/catalog_returns]
PushedFilters: [IsNotNull(cr_returned_date_sk), IsNotNull(cr_returning_addr_sk)]
ReadSchema: struct<cr_returned_date_sk:int,cr_returning_customer_sk:int,cr_returning_addr_sk:int,cr_return_amt_inc_tax:decimal(7,2)>

(40) ColumnarToRow [codegen id : 13]
Input [4]: [cr_returned_date_sk#21, cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]

(41) Filter [codegen id : 13]
Input [4]: [cr_returned_date_sk#21, cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]
Condition : (isnotnull(cr_returned_date_sk#21) AND isnotnull(cr_returning_addr_sk#23))

(42) ReusedExchange [Reuses operator id: 19]
Output [1]: [d_date_sk#25]

(43) BroadcastHashJoin [codegen id : 13]
Left keys [1]: [cr_returned_date_sk#21]
Right keys [1]: [d_date_sk#25]
Join condition: None

(44) Project [codegen id : 13]
Output [3]: [cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]
Input [5]: [cr_returned_date_sk#21, cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24, d_date_sk#25]

(45) Exchange
Input [3]: [cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]
Arguments: hashpartitioning(cr_returning_addr_sk#23, 5), ENSURE_REQUIREMENTS, [id=#38]

(46) Sort [codegen id : 14]
Input [3]: [cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24]
Arguments: [cr_returning_addr_sk#23 ASC NULLS FIRST], false, 0

(47) ReusedExchange [Reuses operator id: 27]
Output [2]: [ca_address_sk#7, ca_state#14]

(48) Sort [codegen id : 16]
Input [2]: [ca_address_sk#7, ca_state#14]
Arguments: [ca_address_sk#7 ASC NULLS FIRST], false, 0

(49) SortMergeJoin [codegen id : 17]
Left keys [1]: [cr_returning_addr_sk#23]
Right keys [1]: [ca_address_sk#7]
Join condition: None

(50) Project [codegen id : 17]
Output [3]: [cr_returning_customer_sk#22, cr_return_amt_inc_tax#24, ca_state#14]
Input [5]: [cr_returning_customer_sk#22, cr_returning_addr_sk#23, cr_return_amt_inc_tax#24, ca_address_sk#7, ca_state#14]

(51) HashAggregate [codegen id : 17]
Input [3]: [cr_returning_customer_sk#22, cr_return_amt_inc_tax#24, ca_state#14]
Keys [2]: [cr_returning_customer_sk#22, ca_state#14]
Functions [1]: [partial_sum(UnscaledValue(cr_return_amt_inc_tax#24))]
Aggregate Attributes [1]: [sum#39]
Results [3]: [cr_returning_customer_sk#22, ca_state#14, sum#40]

(52) Exchange
Input [3]: [cr_returning_customer_sk#22, ca_state#14, sum#40]
Arguments: hashpartitioning(cr_returning_customer_sk#22, ca_state#14, 5), ENSURE_REQUIREMENTS, [id=#41]

(53) HashAggregate [codegen id : 18]
Input [3]: [cr_returning_customer_sk#22, ca_state#14, sum#40]
Keys [2]: [cr_returning_customer_sk#22, ca_state#14]
Functions [1]: [sum(UnscaledValue(cr_return_amt_inc_tax#24))]
Aggregate Attributes [1]: [sum(UnscaledValue(cr_return_amt_inc_tax#24))#42]
Results [2]: [ca_state#14 AS ctr_state#35, MakeDecimal(sum(UnscaledValue(cr_return_amt_inc_tax#24))#42,17,2) AS ctr_total_return#36]

(54) HashAggregate [codegen id : 18]
Input [2]: [ctr_state#35, ctr_total_return#36]
Keys [1]: [ctr_state#35]
Functions [1]: [partial_avg(ctr_total_return#36)]
Aggregate Attributes [2]: [sum#43, count#44]
Results [3]: [ctr_state#35, sum#45, count#46]

(55) Exchange
Input [3]: [ctr_state#35, sum#45, count#46]
Arguments: hashpartitioning(ctr_state#35, 5), ENSURE_REQUIREMENTS, [id=#47]

(56) HashAggregate [codegen id : 19]
Input [3]: [ctr_state#35, sum#45, count#46]
Keys [1]: [ctr_state#35]
Functions [1]: [avg(ctr_total_return#36)]
Aggregate Attributes [1]: [avg(ctr_total_return#36)#48]
Results [2]: [CheckOverflow((promote_precision(avg(ctr_total_return#36)#48) * 1.200000), DecimalType(24,7), true) AS (CAST(avg(ctr_total_return) AS DECIMAL(21,6)) * CAST(1.2 AS DECIMAL(21,6)))#49, ctr_state#35 AS ctr_state#35#50]

(57) Filter [codegen id : 19]
Input [2]: [(CAST(avg(ctr_total_return) AS DECIMAL(21,6)) * CAST(1.2 AS DECIMAL(21,6)))#49, ctr_state#35#50]
Condition : isnotnull((CAST(avg(ctr_total_return) AS DECIMAL(21,6)) * CAST(1.2 AS DECIMAL(21,6)))#49)

(58) BroadcastExchange
Input [2]: [(CAST(avg(ctr_total_return) AS DECIMAL(21,6)) * CAST(1.2 AS DECIMAL(21,6)))#49, ctr_state#35#50]
Arguments: HashedRelationBroadcastMode(List(input[1, string, true]),false), [id=#51]

(59) BroadcastHashJoin [codegen id : 20]
Left keys [1]: [ctr_state#35]
Right keys [1]: [ctr_state#35#50]
Join condition: (cast(ctr_total_return#36 as decimal(24,7)) > (CAST(avg(ctr_total_return) AS DECIMAL(21,6)) * CAST(1.2 AS DECIMAL(21,6)))#49)

(60) Project [codegen id : 20]
Output [16]: [c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18, ctr_total_return#36]
Input [19]: [c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18, ctr_state#35, ctr_total_return#36, (CAST(avg(ctr_total_return) AS DECIMAL(21,6)) * CAST(1.2 AS DECIMAL(21,6)))#49, ctr_state#35#50]

(61) TakeOrderedAndProject
Input [16]: [c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18, ctr_total_return#36]
Arguments: 100, [c_customer_id#2 ASC NULLS FIRST, c_salutation#4 ASC NULLS FIRST, c_first_name#5 ASC NULLS FIRST, c_last_name#6 ASC NULLS FIRST, ca_street_number#8 ASC NULLS FIRST, ca_street_name#9 ASC NULLS FIRST, ca_street_type#10 ASC NULLS FIRST, ca_suite_number#11 ASC NULLS FIRST, ca_city#12 ASC NULLS FIRST, ca_county#13 ASC NULLS FIRST, ca_state#14 ASC NULLS FIRST, ca_zip#15 ASC NULLS FIRST, ca_country#16 ASC NULLS FIRST, ca_gmt_offset#17 ASC NULLS FIRST, ca_location_type#18 ASC NULLS FIRST, ctr_total_return#36 ASC NULLS FIRST], [c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, ca_street_number#8, ca_street_name#9, ca_street_type#10, ca_suite_number#11, ca_city#12, ca_county#13, ca_state#14, ca_zip#15, ca_country#16, ca_gmt_offset#17, ca_location_type#18, ctr_total_return#36]

