== Physical Plan ==
CollectLimit (31)
+- * Project (30)
   +- * BroadcastHashJoin Inner BuildRight (29)
      :- * Project (27)
      :  +- * BroadcastHashJoin Inner BuildRight (26)
      :     :- * Project (10)
      :     :  +- * BroadcastHashJoin Inner BuildRight (9)
      :     :     :- * Filter (3)
      :     :     :  +- * ColumnarToRow (2)
      :     :     :     +- Scan parquet default.catalog_sales (1)
      :     :     +- BroadcastExchange (8)
      :     :        +- * Project (7)
      :     :           +- * Filter (6)
      :     :              +- * ColumnarToRow (5)
      :     :                 +- Scan parquet default.item (4)
      :     +- BroadcastExchange (25)
      :        +- * Filter (24)
      :           +- * HashAggregate (23)
      :              +- Exchange (22)
      :                 +- * HashAggregate (21)
      :                    +- * Project (20)
      :                       +- * BroadcastHashJoin Inner BuildRight (19)
      :                          :- * Filter (13)
      :                          :  +- * ColumnarToRow (12)
      :                          :     +- Scan parquet default.catalog_sales (11)
      :                          +- BroadcastExchange (18)
      :                             +- * Project (17)
      :                                +- * Filter (16)
      :                                   +- * ColumnarToRow (15)
      :                                      +- Scan parquet default.date_dim (14)
      +- ReusedExchange (28)


(1) Scan parquet default.catalog_sales
Output [3]: [cs_sold_date_sk#1, cs_item_sk#2, cs_ext_discount_amt#3]
Batched: true
Location [not included in comparison]/{warehouse_dir}/catalog_sales]
PushedFilters: [IsNotNull(cs_item_sk), IsNotNull(cs_ext_discount_amt), IsNotNull(cs_sold_date_sk)]
ReadSchema: struct<cs_sold_date_sk:int,cs_item_sk:int,cs_ext_discount_amt:decimal(7,2)>

(2) ColumnarToRow [codegen id : 6]
Input [3]: [cs_sold_date_sk#1, cs_item_sk#2, cs_ext_discount_amt#3]

(3) Filter [codegen id : 6]
Input [3]: [cs_sold_date_sk#1, cs_item_sk#2, cs_ext_discount_amt#3]
Condition : ((isnotnull(cs_item_sk#2) AND isnotnull(cs_ext_discount_amt#3)) AND isnotnull(cs_sold_date_sk#1))

(4) Scan parquet default.item
Output [2]: [i_item_sk#4, i_manufact_id#5]
Batched: true
Location [not included in comparison]/{warehouse_dir}/item]
PushedFilters: [IsNotNull(i_manufact_id), EqualTo(i_manufact_id,977), IsNotNull(i_item_sk)]
ReadSchema: struct<i_item_sk:int,i_manufact_id:int>

(5) ColumnarToRow [codegen id : 1]
Input [2]: [i_item_sk#4, i_manufact_id#5]

(6) Filter [codegen id : 1]
Input [2]: [i_item_sk#4, i_manufact_id#5]
Condition : ((isnotnull(i_manufact_id#5) AND (i_manufact_id#5 = 977)) AND isnotnull(i_item_sk#4))

(7) Project [codegen id : 1]
Output [1]: [i_item_sk#4]
Input [2]: [i_item_sk#4, i_manufact_id#5]

(8) BroadcastExchange
Input [1]: [i_item_sk#4]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#6]

(9) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [cs_item_sk#2]
Right keys [1]: [i_item_sk#4]
Join condition: None

(10) Project [codegen id : 6]
Output [3]: [cs_sold_date_sk#1, cs_ext_discount_amt#3, i_item_sk#4]
Input [4]: [cs_sold_date_sk#1, cs_item_sk#2, cs_ext_discount_amt#3, i_item_sk#4]

(11) Scan parquet default.catalog_sales
Output [3]: [cs_sold_date_sk#1, cs_item_sk#2, cs_ext_discount_amt#3]
Batched: true
Location [not included in comparison]/{warehouse_dir}/catalog_sales]
PushedFilters: [IsNotNull(cs_sold_date_sk), IsNotNull(cs_item_sk)]
ReadSchema: struct<cs_sold_date_sk:int,cs_item_sk:int,cs_ext_discount_amt:decimal(7,2)>

(12) ColumnarToRow [codegen id : 3]
Input [3]: [cs_sold_date_sk#1, cs_item_sk#2, cs_ext_discount_amt#3]

(13) Filter [codegen id : 3]
Input [3]: [cs_sold_date_sk#1, cs_item_sk#2, cs_ext_discount_amt#3]
Condition : (isnotnull(cs_sold_date_sk#1) AND isnotnull(cs_item_sk#2))

(14) Scan parquet default.date_dim
Output [2]: [d_date_sk#7, d_date#8]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,2000-01-27), LessThanOrEqual(d_date,2000-04-26), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_date:date>

(15) ColumnarToRow [codegen id : 2]
Input [2]: [d_date_sk#7, d_date#8]

(16) Filter [codegen id : 2]
Input [2]: [d_date_sk#7, d_date#8]
Condition : (((isnotnull(d_date#8) AND (d_date#8 >= 10983)) AND (d_date#8 <= 11073)) AND isnotnull(d_date_sk#7))

(17) Project [codegen id : 2]
Output [1]: [d_date_sk#7]
Input [2]: [d_date_sk#7, d_date#8]

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

(19) BroadcastHashJoin [codegen id : 3]
Left keys [1]: [cs_sold_date_sk#1]
Right keys [1]: [d_date_sk#7]
Join condition: None

(20) Project [codegen id : 3]
Output [2]: [cs_item_sk#2, cs_ext_discount_amt#3]
Input [4]: [cs_sold_date_sk#1, cs_item_sk#2, cs_ext_discount_amt#3, d_date_sk#7]

(21) HashAggregate [codegen id : 3]
Input [2]: [cs_item_sk#2, cs_ext_discount_amt#3]
Keys [1]: [cs_item_sk#2]
Functions [1]: [partial_avg(UnscaledValue(cs_ext_discount_amt#3))]
Aggregate Attributes [2]: [sum#10, count#11]
Results [3]: [cs_item_sk#2, sum#12, count#13]

(22) Exchange
Input [3]: [cs_item_sk#2, sum#12, count#13]
Arguments: hashpartitioning(cs_item_sk#2, 5), true, [id=#14]

(23) HashAggregate [codegen id : 4]
Input [3]: [cs_item_sk#2, sum#12, count#13]
Keys [1]: [cs_item_sk#2]
Functions [1]: [avg(UnscaledValue(cs_ext_discount_amt#3))]
Aggregate Attributes [1]: [avg(UnscaledValue(cs_ext_discount_amt#3))#15]
Results [2]: [CheckOverflow((1.300000 * promote_precision(cast((avg(UnscaledValue(cs_ext_discount_amt#3))#15 / 100.0) as decimal(11,6)))), DecimalType(14,7), true) AS (CAST(1.3 AS DECIMAL(11,6)) * CAST(avg(cs_ext_discount_amt) AS DECIMAL(11,6)))#16, cs_item_sk#2 AS cs_item_sk#2#17]

(24) Filter [codegen id : 4]
Input [2]: [(CAST(1.3 AS DECIMAL(11,6)) * CAST(avg(cs_ext_discount_amt) AS DECIMAL(11,6)))#16, cs_item_sk#2#17]
Condition : isnotnull((CAST(1.3 AS DECIMAL(11,6)) * CAST(avg(cs_ext_discount_amt) AS DECIMAL(11,6)))#16)

(25) BroadcastExchange
Input [2]: [(CAST(1.3 AS DECIMAL(11,6)) * CAST(avg(cs_ext_discount_amt) AS DECIMAL(11,6)))#16, cs_item_sk#2#17]
Arguments: HashedRelationBroadcastMode(List(cast(input[1, int, true] as bigint)),false), [id=#18]

(26) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [i_item_sk#4]
Right keys [1]: [cs_item_sk#2#17]
Join condition: (cast(cs_ext_discount_amt#3 as decimal(14,7)) > (CAST(1.3 AS DECIMAL(11,6)) * CAST(avg(cs_ext_discount_amt) AS DECIMAL(11,6)))#16)

(27) Project [codegen id : 6]
Output [1]: [cs_sold_date_sk#1]
Input [5]: [cs_sold_date_sk#1, cs_ext_discount_amt#3, i_item_sk#4, (CAST(1.3 AS DECIMAL(11,6)) * CAST(avg(cs_ext_discount_amt) AS DECIMAL(11,6)))#16, cs_item_sk#2#17]

(28) ReusedExchange [Reuses operator id: 18]
Output [1]: [d_date_sk#7]

(29) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [cs_sold_date_sk#1]
Right keys [1]: [d_date_sk#7]
Join condition: None

(30) Project [codegen id : 6]
Output [1]: [1 AS excess discount amount #19]
Input [2]: [cs_sold_date_sk#1, d_date_sk#7]

(31) CollectLimit
Input [1]: [excess discount amount #19]
Arguments: 100

