diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/CostBasedJoinReorder.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/CostBasedJoinReorder.scala index c41686da79487..12f1a13c2c90f 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/CostBasedJoinReorder.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/CostBasedJoinReorder.scala @@ -204,13 +204,15 @@ object JoinReorderDP extends PredicateHelper with Logging { filters: Option[JoinGraphInfo]): JoinPlanMap = { val nextLevel = new JoinPlanMap - var k = 0 val lev = existingLevels.length - 1 + var k = lev // Build plans for the next level from plans at level k (one side of the join) and level // lev - k (the other side of the join). - // For the lower level k, we only need to search from 0 to lev - k, because when building + // For the higher level k, we only need to search from lev to lev - k, because when building // a join from A and B, both A J B and B J A are handled. - while (k <= lev - k) { + // Start searching from highest level to make sure that optimally ordered input doesn't get + // reordered into another plan with the same cost. + while (k >= lev - k) { val oneSideCandidates = existingLevels(k).values.toSeq for (i <- oneSideCandidates.indices) { val oneSidePlan = oneSideCandidates(i) @@ -234,7 +236,7 @@ object JoinReorderDP extends PredicateHelper with Logging { } } } - k += 1 + k -= 1 } nextLevel } diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala index f8b719bbc8361..c4f51755275c0 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala @@ -199,9 +199,7 @@ abstract class Optimizer(catalogManager: CatalogManager) // plan may contain nodes that do not report stats. Anything that uses stats must run after // this batch. Batch("Early Filter and Projection Push-Down", Once, earlyScanPushDownRules: _*) :+ - // Since join costs in AQP can change between multiple runs, there is no reason that we have an - // idempotence enforcement on this batch. We thus make it FixedPoint(1) instead of Once. - Batch("Join Reorder", FixedPoint(1), + Batch("Join Reorder", Once, CostBasedJoinReorder) :+ Batch("Eliminate Sorts", Once, EliminateSorts) :+ diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/joinReorder/JoinReorderSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/joinReorder/JoinReorderSuite.scala index f41c6753f4f74..12b66a59c6cb2 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/joinReorder/JoinReorderSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/joinReorder/JoinReorderSuite.scala @@ -35,15 +35,15 @@ class JoinReorderSuite extends JoinReorderPlanTestBase with StatsEstimationTestB val batches = Batch("Resolve Hints", Once, EliminateResolvedHint) :: - Batch("Operator Optimizations", FixedPoint(100), - CombineFilters, - PushPredicateThroughNonJoin, - ReorderJoin, - PushPredicateThroughJoin, - ColumnPruning, - CollapseProject) :: - Batch("Join Reorder", FixedPoint(1), - CostBasedJoinReorder) :: Nil + Batch("Operator Optimizations", FixedPoint(100), + CombineFilters, + PushPredicateThroughNonJoin, + ReorderJoin, + PushPredicateThroughJoin, + ColumnPruning, + CollapseProject) :: + Batch("Join Reorder", Once, + CostBasedJoinReorder) :: Nil } var originalConfCBOEnabled = false @@ -127,9 +127,9 @@ class JoinReorderSuite extends JoinReorderPlanTestBase with StatsEstimationTestB // so (t1 J t3) J t2 is better (has lower cost, i.e. intermediate result size) than // the original order (t1 J t2) J t3. val bestPlan = - t1.join(t3, Inner, Some(nameToAttr("t1.v-1-10") === nameToAttr("t3.v-1-100"))) - .join(t2, Inner, Some(nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5"))) - .select(outputsOf(t1, t2, t3): _*) + t1.join(t3, Inner, Some(nameToAttr("t1.v-1-10") === nameToAttr("t3.v-1-100"))) + .join(t2, Inner, Some(nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5"))) + .select(outputsOf(t1, t2, t3): _*) assertEqualJoinPlans(Optimize, originalPlan, bestPlan) } @@ -138,8 +138,8 @@ class JoinReorderSuite extends JoinReorderPlanTestBase with StatsEstimationTestB // The ReorderJoin rule puts the unjoinable item at the end, and then CostBasedJoinReorder // reorders other joinable items. val originalPlan = - t1.join(t2).join(t4).join(t3).where((nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5")) && - (nameToAttr("t1.v-1-10") === nameToAttr("t3.v-1-100"))) + t1.join(t2).join(t4).join(t3).where((nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5")) && + (nameToAttr("t1.v-1-10") === nameToAttr("t3.v-1-100"))) val bestPlan = t1.join(t3, Inner, Some(nameToAttr("t1.v-1-10") === nameToAttr("t3.v-1-100"))) @@ -206,10 +206,10 @@ class JoinReorderSuite extends JoinReorderPlanTestBase with StatsEstimationTestB // cost(t1 J t2) = 1000 * 20 / 5 = 4000, cost(t4 J t3) = 2000 * 100 / 100 = 2000, // cost = cost(t1 J t2) + cost(t4 J t3) = 6000 << 5000000. val bestPlan = - t1.join(t2, Inner, Some(nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5"))) - .join(t4.join(t3, Inner, Some(nameToAttr("t4.v-1-10") === nameToAttr("t3.v-1-100"))), - Inner, Some(nameToAttr("t1.k-1-2") === nameToAttr("t4.k-1-2"))) - .select(outputsOf(t1, t4, t2, t3): _*) + t1.join(t2, Inner, Some(nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5"))) + .join(t4.join(t3, Inner, Some(nameToAttr("t4.v-1-10") === nameToAttr("t3.v-1-100"))), + Inner, Some(nameToAttr("t1.k-1-2") === nameToAttr("t4.k-1-2"))) + .select(outputsOf(t1, t4, t2, t3): _*) assertEqualJoinPlans(Optimize, originalPlan, bestPlan) } @@ -235,11 +235,11 @@ class JoinReorderSuite extends JoinReorderPlanTestBase with StatsEstimationTestB val tab3 = LocalRelation('a.int, 'b.int) val original = tab1.join(tab2, Cross) - .join(tab3, Inner, Some('a === 'x && 'b === 'i)) + .join(tab3, Inner, Some('a === 'x && 'b === 'i)) val expected = tab1.join(tab3, Inner, Some('a === 'x)) - .join(tab2, Cross, Some('b === 'i)) - .select(outputsOf(tab1, tab2, tab3): _*) + .join(tab2, Cross, Some('b === 'i)) + .select(outputsOf(tab1, tab2, tab3): _*) assertEqualJoinPlans(Optimize, original, expected) } @@ -256,9 +256,9 @@ class JoinReorderSuite extends JoinReorderPlanTestBase with StatsEstimationTestB // / \ // t1 t2 val bottomJoins = - t1.join(t2).join(t3).where((nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5")) && - (nameToAttr("t1.v-1-10") === nameToAttr("t3.v-1-100"))) - .select(nameToAttr("t1.v-1-10")) + t1.join(t2).join(t3).where((nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5")) && + (nameToAttr("t1.v-1-10") === nameToAttr("t3.v-1-100"))) + .select(nameToAttr("t1.v-1-10")) val originalPlan = bottomJoins .union(t4.select(nameToAttr("t4.v-1-10"))) @@ -276,10 +276,10 @@ class JoinReorderSuite extends JoinReorderPlanTestBase with StatsEstimationTestB // / \ // t1 t3 val bestBottomPlan = - t1.join(t3, Inner, Some(nameToAttr("t1.v-1-10") === nameToAttr("t3.v-1-100"))) - .select(nameToAttr("t1.k-1-2"), nameToAttr("t1.v-1-10")) - .join(t2, Inner, Some(nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5"))) - .select(nameToAttr("t1.v-1-10")) + t1.join(t3, Inner, Some(nameToAttr("t1.v-1-10") === nameToAttr("t3.v-1-100"))) + .select(nameToAttr("t1.k-1-2"), nameToAttr("t1.v-1-10")) + .join(t2, Inner, Some(nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5"))) + .select(nameToAttr("t1.v-1-10")) val bestPlan = bestBottomPlan .union(t4.select(nameToAttr("t4.v-1-10"))) @@ -326,10 +326,10 @@ class JoinReorderSuite extends JoinReorderPlanTestBase with StatsEstimationTestB .hint("broadcast").join(t4) val bestPlan = - t1.join(t3, Inner, Some(nameToAttr("t1.v-1-10") === nameToAttr("t3.v-1-100"))) - .join(t2, Inner, Some(nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5"))) - .select(outputsOf(t1, t2, t3): _*) - .hint("broadcast").join(t4) + t1.join(t3, Inner, Some(nameToAttr("t1.v-1-10") === nameToAttr("t3.v-1-100"))) + .join(t2, Inner, Some(nameToAttr("t1.k-1-2") === nameToAttr("t2.k-1-5"))) + .select(outputsOf(t1, t2, t3): _*) + .hint("broadcast").join(t4) assertEqualJoinPlans(Optimize, originalPlan, bestPlan) @@ -387,4 +387,51 @@ class JoinReorderSuite extends JoinReorderPlanTestBase with StatsEstimationTestB // this can fail before the fix Optimize.execute(plan.analyze) } + + test("SPARK-32995: Optimized plan should not get reordered to one with the same cost") { + // Define new columns and tables, so all join orders would have the same total cost + val columnInfo = AttributeMap(Seq( + attr("t1.col1") -> rangeColumnStat(5, 0), + attr("t1.col2") -> rangeColumnStat(5, 0), + attr("t2.col1") -> rangeColumnStat(5, 0), + attr("t2.col2") -> rangeColumnStat(5, 0), + attr("t3.col1") -> rangeColumnStat(5, 0), + attr("t3.col2") -> rangeColumnStat(5, 0) + )) + + val nameToAttr = columnInfo.map(kv => kv._1.name -> kv._1) + val nameToColInfo = columnInfo.map(kv => kv._1.name -> kv) + + val t1 = StatsTestPlan( + outputList = Seq("t1.col1", "t1.col2").map(nameToAttr), + rowCount = 1000, + size = Some(1000), + attributeStats = AttributeMap(Seq("t1.col1", "t1.col2").map(nameToColInfo))) + val t2 = StatsTestPlan( + outputList = Seq("t2.col1", "t2.col2").map(nameToAttr), + rowCount = 1000, + size = Some(1000), + attributeStats = AttributeMap(Seq("t2.col1", "t2.col2").map(nameToColInfo))) + val t3 = StatsTestPlan( + outputList = Seq("t3.col1", "t3.col2").map(nameToAttr), + rowCount = 1000, + size = Some(1000), + attributeStats = AttributeMap(Seq("t3.col1", "t3.col2").map(nameToColInfo))) + + // Right-deep + val originalPlan = t1.join( + t2.join(t3, Inner, Some(nameToAttr("t2.col2") === nameToAttr("t3.col2"))), + Inner, Some(nameToAttr("t1.col1") === nameToAttr("t2.col1"))) + + // Left-deep with the plans in the same order + val expectedPlan = + t1.join(t2, Inner, Some(nameToAttr("t1.col1") === nameToAttr("t2.col1"))) + .join(t3, Inner, Some(nameToAttr("t2.col2") === nameToAttr("t3.col2"))) + + // Right-deep gets turned into a left-deep + assertEqualJoinPlans(Optimize, originalPlan, expectedPlan) + + // Left-deep is not changed (the rule is idempotent) + assertEqualJoinPlans(Optimize, expectedPlan, expectedPlan) + } } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/joinReorder/StarJoinCostBasedReorderSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/joinReorder/StarJoinCostBasedReorderSuite.scala index a42914765dcc8..0bb3cf8672fd1 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/joinReorder/StarJoinCostBasedReorderSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/joinReorder/StarJoinCostBasedReorderSuite.scala @@ -39,7 +39,7 @@ class StarJoinCostBasedReorderSuite extends JoinReorderPlanTestBase with StatsEs PushPredicateThroughJoin, ColumnPruning, CollapseProject) :: - Batch("Join Reorder", FixedPoint(1), + Batch("Join Reorder", Once, CostBasedJoinReorder) :: Nil } @@ -345,8 +345,8 @@ class StarJoinCostBasedReorderSuite extends JoinReorderPlanTestBase with StatsEs val expected = f1.join(d3, Inner, Some(nameToAttr("f1_fk3") === nameToAttr("d3_pk"))) - .join(d2, Inner, Some(nameToAttr("f1_fk2") === nameToAttr("d2_pk"))) .join(d1, Inner, Some(nameToAttr("f1_fk1") === nameToAttr("d1_pk"))) + .join(d2, Inner, Some(nameToAttr("f1_fk2") === nameToAttr("d2_pk"))) .join(t4.join(t3, Inner, Some(nameToAttr("t3_c2") === nameToAttr("t4_c2"))), Inner, Some(nameToAttr("d1_c2") === nameToAttr("t3_c1"))) .join(t2.join(t1, Inner, Some(nameToAttr("t1_c2") === nameToAttr("t2_c2"))), Inner, @@ -380,8 +380,8 @@ class StarJoinCostBasedReorderSuite extends JoinReorderPlanTestBase with StatsEs val expected = f1.join(d3, Inner, Some(nameToAttr("f1_fk3") === nameToAttr("d3_pk"))) - .join(d2, Inner, Some(nameToAttr("f1_fk2") === nameToAttr("d2_pk"))) .join(d1, Inner, Some(nameToAttr("f1_fk1") === nameToAttr("d1_pk"))) + .join(d2, Inner, Some(nameToAttr("f1_fk2") === nameToAttr("d2_pk"))) .select(outputsOf(d1, d2, f1, d3): _*) assertEqualJoinPlans(Optimize, query, expected) @@ -405,8 +405,8 @@ class StarJoinCostBasedReorderSuite extends JoinReorderPlanTestBase with StatsEs (nameToAttr("f1_fk3") === nameToAttr("t3_c1"))) val expected = - f1.join(t3, Inner, Some(nameToAttr("f1_fk3") === nameToAttr("t3_c1"))) - .join(t2, Inner, Some(nameToAttr("f1_fk2") === nameToAttr("t2_c1"))) + f1.join(t2, Inner, Some(nameToAttr("f1_fk2") === nameToAttr("t2_c1"))) + .join(t3, Inner, Some(nameToAttr("f1_fk3") === nameToAttr("t3_c1"))) .join(t1, Inner, Some(nameToAttr("f1_fk1") === nameToAttr("t1_c1"))) .select(outputsOf(t1, f1, t2, t3): _*) diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-modified/q68.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-modified/q68.sf100/explain.txt index 0b96b76a0ffc4..525fdfee176aa 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-modified/q68.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-modified/q68.sf100/explain.txt @@ -25,12 +25,12 @@ TakeOrderedAndProject (46) : : : : : +- * Project (7) : : : : : +- * Filter (6) : : : : : +- * ColumnarToRow (5) - : : : : : +- Scan parquet default.store (4) + : : : : : +- Scan parquet default.date_dim (4) : : : : +- BroadcastExchange (15) : : : : +- * Project (14) : : : : +- * Filter (13) : : : : +- * ColumnarToRow (12) - : : : : +- Scan parquet default.date_dim (11) + : : : : +- Scan parquet default.store (11) : : : +- BroadcastExchange (22) : : : +- * Project (21) : : : +- * Filter (20) @@ -62,67 +62,67 @@ Input [9]: [ss_customer_sk#1, ss_hdemo_sk#2, ss_addr_sk#3, ss_store_sk#4, ss_tic Input [9]: [ss_customer_sk#1, ss_hdemo_sk#2, ss_addr_sk#3, ss_store_sk#4, ss_ticket_number#5, ss_ext_sales_price#6, ss_ext_list_price#7, ss_ext_tax#8, ss_sold_date_sk#9] Condition : (((isnotnull(ss_store_sk#4) AND isnotnull(ss_hdemo_sk#2)) AND isnotnull(ss_addr_sk#3)) AND isnotnull(ss_customer_sk#1)) -(4) Scan parquet default.store -Output [2]: [s_store_sk#11, s_city#12] +(4) Scan parquet default.date_dim +Output [3]: [d_date_sk#11, d_year#12, d_dom#13] Batched: true -Location [not included in comparison]/{warehouse_dir}/store] -PushedFilters: [In(s_city, [Midway,Fairview]), IsNotNull(s_store_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_dom), GreaterThanOrEqual(d_dom,1), LessThanOrEqual(d_dom,2), In(d_year, [1999,2000,2001]), In(d_date_sk, [2451790,2451180,2452216,2451454,2452184,2451485,2451850,2451514,2452062,2451270,2452123,2451758,2451971,2451546,2451942,2451393,2451667,2451453,2452215,2451819,2451331,2451577,2451911,2452245,2451301,2451545,2451605,2451943,2451851,2451181,2452154,2451820,2452001,2451362,2451392,2451240,2452032,2451637,2451484,2452124,2451300,2451727,2452093,2451759,2451698,2451332,2451606,2451666,2451912,2452185,2451211,2451361,2452031,2451212,2451880,2451789,2451423,2451576,2451728,2452246,2452155,2452092,2451881,2451970,2451697,2452063,2451271,2451636,2451515,2451424,2451239,2452002]), IsNotNull(d_date_sk)] +ReadSchema: struct (5) ColumnarToRow [codegen id : 1] -Input [2]: [s_store_sk#11, s_city#12] +Input [3]: [d_date_sk#11, d_year#12, d_dom#13] (6) Filter [codegen id : 1] -Input [2]: [s_store_sk#11, s_city#12] -Condition : (s_city#12 IN (Midway,Fairview) AND isnotnull(s_store_sk#11)) +Input [3]: [d_date_sk#11, d_year#12, d_dom#13] +Condition : (((((isnotnull(d_dom#13) AND (d_dom#13 >= 1)) AND (d_dom#13 <= 2)) AND d_year#12 IN (1999,2000,2001)) AND d_date_sk#11 INSET (2451790,2451180,2452216,2451454,2452184,2451485,2451850,2451514,2452062,2451270,2452123,2451758,2451971,2451546,2451942,2451393,2451667,2451453,2452215,2451819,2451331,2451577,2451911,2452245,2451301,2451545,2451605,2451943,2451851,2451181,2452154,2451820,2452001,2451362,2451392,2451240,2452032,2451637,2451484,2452124,2451300,2451727,2452093,2451759,2451698,2451332,2451606,2451666,2451912,2452185,2451211,2451361,2452031,2451212,2451880,2451789,2451423,2451576,2451728,2452246,2452155,2452092,2451881,2451970,2451697,2452063,2451271,2451636,2451515,2451424,2451239,2452002)) AND isnotnull(d_date_sk#11)) (7) Project [codegen id : 1] -Output [1]: [s_store_sk#11] -Input [2]: [s_store_sk#11, s_city#12] +Output [1]: [d_date_sk#11] +Input [3]: [d_date_sk#11, d_year#12, d_dom#13] (8) BroadcastExchange -Input [1]: [s_store_sk#11] -Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#13] +Input [1]: [d_date_sk#11] +Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#14] (9) BroadcastHashJoin [codegen id : 4] -Left keys [1]: [ss_store_sk#4] -Right keys [1]: [s_store_sk#11] +Left keys [1]: [ss_sold_date_sk#9] +Right keys [1]: [d_date_sk#11] Join condition: None (10) Project [codegen id : 4] -Output [8]: [ss_customer_sk#1, ss_hdemo_sk#2, ss_addr_sk#3, ss_ticket_number#5, ss_ext_sales_price#6, ss_ext_list_price#7, ss_ext_tax#8, ss_sold_date_sk#9] -Input [10]: [ss_customer_sk#1, ss_hdemo_sk#2, ss_addr_sk#3, ss_store_sk#4, ss_ticket_number#5, ss_ext_sales_price#6, ss_ext_list_price#7, ss_ext_tax#8, ss_sold_date_sk#9, s_store_sk#11] +Output [8]: [ss_customer_sk#1, ss_hdemo_sk#2, ss_addr_sk#3, ss_store_sk#4, ss_ticket_number#5, ss_ext_sales_price#6, ss_ext_list_price#7, ss_ext_tax#8] +Input [10]: [ss_customer_sk#1, ss_hdemo_sk#2, ss_addr_sk#3, ss_store_sk#4, ss_ticket_number#5, ss_ext_sales_price#6, ss_ext_list_price#7, ss_ext_tax#8, ss_sold_date_sk#9, d_date_sk#11] -(11) Scan parquet default.date_dim -Output [3]: [d_date_sk#14, d_year#15, d_dom#16] +(11) Scan parquet default.store +Output [2]: [s_store_sk#15, s_city#16] Batched: true -Location [not included in comparison]/{warehouse_dir}/date_dim] -PushedFilters: [IsNotNull(d_dom), GreaterThanOrEqual(d_dom,1), LessThanOrEqual(d_dom,2), In(d_year, [1999,2000,2001]), In(d_date_sk, [2451790,2451180,2452216,2451454,2452184,2451485,2451850,2451514,2452062,2451270,2452123,2451758,2451971,2451546,2451942,2451393,2451667,2451453,2452215,2451819,2451331,2451577,2451911,2452245,2451301,2451545,2451605,2451943,2451851,2451181,2452154,2451820,2452001,2451362,2451392,2451240,2452032,2451637,2451484,2452124,2451300,2451727,2452093,2451759,2451698,2451332,2451606,2451666,2451912,2452185,2451211,2451361,2452031,2451212,2451880,2451789,2451423,2451576,2451728,2452246,2452155,2452092,2451881,2451970,2451697,2452063,2451271,2451636,2451515,2451424,2451239,2452002]), IsNotNull(d_date_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/store] +PushedFilters: [In(s_city, [Midway,Fairview]), IsNotNull(s_store_sk)] +ReadSchema: struct (12) ColumnarToRow [codegen id : 2] -Input [3]: [d_date_sk#14, d_year#15, d_dom#16] +Input [2]: [s_store_sk#15, s_city#16] (13) Filter [codegen id : 2] -Input [3]: [d_date_sk#14, d_year#15, d_dom#16] -Condition : (((((isnotnull(d_dom#16) AND (d_dom#16 >= 1)) AND (d_dom#16 <= 2)) AND d_year#15 IN (1999,2000,2001)) AND d_date_sk#14 INSET (2451790,2451180,2452216,2451454,2452184,2451485,2451850,2451514,2452062,2451270,2452123,2451758,2451971,2451546,2451942,2451393,2451667,2451453,2452215,2451819,2451331,2451577,2451911,2452245,2451301,2451545,2451605,2451943,2451851,2451181,2452154,2451820,2452001,2451362,2451392,2451240,2452032,2451637,2451484,2452124,2451300,2451727,2452093,2451759,2451698,2451332,2451606,2451666,2451912,2452185,2451211,2451361,2452031,2451212,2451880,2451789,2451423,2451576,2451728,2452246,2452155,2452092,2451881,2451970,2451697,2452063,2451271,2451636,2451515,2451424,2451239,2452002)) AND isnotnull(d_date_sk#14)) +Input [2]: [s_store_sk#15, s_city#16] +Condition : (s_city#16 IN (Midway,Fairview) AND isnotnull(s_store_sk#15)) (14) Project [codegen id : 2] -Output [1]: [d_date_sk#14] -Input [3]: [d_date_sk#14, d_year#15, d_dom#16] +Output [1]: [s_store_sk#15] +Input [2]: [s_store_sk#15, s_city#16] (15) BroadcastExchange -Input [1]: [d_date_sk#14] +Input [1]: [s_store_sk#15] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#17] (16) BroadcastHashJoin [codegen id : 4] -Left keys [1]: [ss_sold_date_sk#9] -Right keys [1]: [d_date_sk#14] +Left keys [1]: [ss_store_sk#4] +Right keys [1]: [s_store_sk#15] Join condition: None (17) Project [codegen id : 4] Output [7]: [ss_customer_sk#1, ss_hdemo_sk#2, ss_addr_sk#3, ss_ticket_number#5, ss_ext_sales_price#6, ss_ext_list_price#7, ss_ext_tax#8] -Input [9]: [ss_customer_sk#1, ss_hdemo_sk#2, ss_addr_sk#3, ss_ticket_number#5, ss_ext_sales_price#6, ss_ext_list_price#7, ss_ext_tax#8, ss_sold_date_sk#9, d_date_sk#14] +Input [9]: [ss_customer_sk#1, ss_hdemo_sk#2, ss_addr_sk#3, ss_store_sk#4, ss_ticket_number#5, ss_ext_sales_price#6, ss_ext_list_price#7, ss_ext_tax#8, s_store_sk#15] (18) Scan parquet default.household_demographics Output [3]: [hd_demo_sk#18, hd_dep_count#19, hd_vehicle_count#20] @@ -264,7 +264,7 @@ Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#9 IN dyn ReusedExchange (47) -(47) ReusedExchange [Reuses operator id: 15] -Output [1]: [d_date_sk#14] +(47) ReusedExchange [Reuses operator id: 8] +Output [1]: [d_date_sk#11] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-modified/q68.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-modified/q68.sf100/simplified.txt index 11ab7865edd5a..48be0d34404af 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-modified/q68.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-modified/q68.sf100/simplified.txt @@ -23,9 +23,9 @@ TakeOrderedAndProject [c_last_name,ss_ticket_number,c_first_name,ca_city,bought_ Project [ss_customer_sk,ss_addr_sk,ss_ticket_number,ss_ext_sales_price,ss_ext_list_price,ss_ext_tax] BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] Project [ss_customer_sk,ss_hdemo_sk,ss_addr_sk,ss_ticket_number,ss_ext_sales_price,ss_ext_list_price,ss_ext_tax] - BroadcastHashJoin [ss_sold_date_sk,d_date_sk] - Project [ss_customer_sk,ss_hdemo_sk,ss_addr_sk,ss_ticket_number,ss_ext_sales_price,ss_ext_list_price,ss_ext_tax,ss_sold_date_sk] - BroadcastHashJoin [ss_store_sk,s_store_sk] + BroadcastHashJoin [ss_store_sk,s_store_sk] + Project [ss_customer_sk,ss_hdemo_sk,ss_addr_sk,ss_store_sk,ss_ticket_number,ss_ext_sales_price,ss_ext_list_price,ss_ext_tax] + BroadcastHashJoin [ss_sold_date_sk,d_date_sk] Filter [ss_store_sk,ss_hdemo_sk,ss_addr_sk,ss_customer_sk] ColumnarToRow InputAdapter @@ -33,21 +33,21 @@ TakeOrderedAndProject [c_last_name,ss_ticket_number,c_first_name,ca_city,bought_ SubqueryBroadcast [d_date_sk] #1 ReusedExchange [d_date_sk] #5 InputAdapter - BroadcastExchange #6 + BroadcastExchange #5 WholeStageCodegen (1) - Project [s_store_sk] - Filter [s_city,s_store_sk] + Project [d_date_sk] + Filter [d_dom,d_year,d_date_sk] ColumnarToRow InputAdapter - Scan parquet default.store [s_store_sk,s_city] + Scan parquet default.date_dim [d_date_sk,d_year,d_dom] InputAdapter - BroadcastExchange #5 + BroadcastExchange #6 WholeStageCodegen (2) - Project [d_date_sk] - Filter [d_dom,d_year,d_date_sk] + Project [s_store_sk] + Filter [s_city,s_store_sk] ColumnarToRow InputAdapter - Scan parquet default.date_dim [d_date_sk,d_year,d_dom] + Scan parquet default.store [s_store_sk,s_city] InputAdapter BroadcastExchange #7 WholeStageCodegen (3) diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16.sf100/explain.txt index 7604ea1e786d8..60b232d1b48cf 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16.sf100/explain.txt @@ -39,12 +39,12 @@ : +- * Project (30) : +- * Filter (29) : +- * ColumnarToRow (28) - : +- Scan parquet default.call_center (27) + : +- Scan parquet default.date_dim (27) +- BroadcastExchange (38) +- * Project (37) +- * Filter (36) +- * ColumnarToRow (35) - +- Scan parquet default.date_dim (34) + +- Scan parquet default.call_center (34) (1) Scan parquet default.catalog_sales @@ -160,67 +160,67 @@ Join condition: None Output [5]: [cs_ship_date_sk#1, cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7] Input [7]: [cs_ship_date_sk#1, cs_ship_addr_sk#2, cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7, ca_address_sk#17] -(27) Scan parquet default.call_center -Output [2]: [cc_call_center_sk#20, cc_county#21] +(27) Scan parquet default.date_dim +Output [2]: [d_date_sk#20, d_date#21] Batched: true -Location [not included in comparison]/{warehouse_dir}/call_center] -PushedFilters: [IsNotNull(cc_county), EqualTo(cc_county,Williamson County), IsNotNull(cc_call_center_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,2002-02-01), LessThanOrEqual(d_date,2002-04-02), IsNotNull(d_date_sk)] +ReadSchema: struct (28) ColumnarToRow [codegen id : 9] -Input [2]: [cc_call_center_sk#20, cc_county#21] +Input [2]: [d_date_sk#20, d_date#21] (29) Filter [codegen id : 9] -Input [2]: [cc_call_center_sk#20, cc_county#21] -Condition : ((isnotnull(cc_county#21) AND (cc_county#21 = Williamson County)) AND isnotnull(cc_call_center_sk#20)) +Input [2]: [d_date_sk#20, d_date#21] +Condition : (((isnotnull(d_date#21) AND (d_date#21 >= 2002-02-01)) AND (d_date#21 <= 2002-04-02)) AND isnotnull(d_date_sk#20)) (30) Project [codegen id : 9] -Output [1]: [cc_call_center_sk#20] -Input [2]: [cc_call_center_sk#20, cc_county#21] +Output [1]: [d_date_sk#20] +Input [2]: [d_date_sk#20, d_date#21] (31) BroadcastExchange -Input [1]: [cc_call_center_sk#20] +Input [1]: [d_date_sk#20] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#22] (32) BroadcastHashJoin [codegen id : 11] -Left keys [1]: [cs_call_center_sk#3] -Right keys [1]: [cc_call_center_sk#20] +Left keys [1]: [cs_ship_date_sk#1] +Right keys [1]: [d_date_sk#20] Join condition: None (33) Project [codegen id : 11] -Output [4]: [cs_ship_date_sk#1, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7] -Input [6]: [cs_ship_date_sk#1, cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7, cc_call_center_sk#20] +Output [4]: [cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7] +Input [6]: [cs_ship_date_sk#1, cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7, d_date_sk#20] -(34) Scan parquet default.date_dim -Output [2]: [d_date_sk#23, d_date#24] +(34) Scan parquet default.call_center +Output [2]: [cc_call_center_sk#23, cc_county#24] Batched: true -Location [not included in comparison]/{warehouse_dir}/date_dim] -PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,2002-02-01), LessThanOrEqual(d_date,2002-04-02), IsNotNull(d_date_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/call_center] +PushedFilters: [IsNotNull(cc_county), EqualTo(cc_county,Williamson County), IsNotNull(cc_call_center_sk)] +ReadSchema: struct (35) ColumnarToRow [codegen id : 10] -Input [2]: [d_date_sk#23, d_date#24] +Input [2]: [cc_call_center_sk#23, cc_county#24] (36) Filter [codegen id : 10] -Input [2]: [d_date_sk#23, d_date#24] -Condition : (((isnotnull(d_date#24) AND (d_date#24 >= 2002-02-01)) AND (d_date#24 <= 2002-04-02)) AND isnotnull(d_date_sk#23)) +Input [2]: [cc_call_center_sk#23, cc_county#24] +Condition : ((isnotnull(cc_county#24) AND (cc_county#24 = Williamson County)) AND isnotnull(cc_call_center_sk#23)) (37) Project [codegen id : 10] -Output [1]: [d_date_sk#23] -Input [2]: [d_date_sk#23, d_date#24] +Output [1]: [cc_call_center_sk#23] +Input [2]: [cc_call_center_sk#23, cc_county#24] (38) BroadcastExchange -Input [1]: [d_date_sk#23] +Input [1]: [cc_call_center_sk#23] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#25] (39) BroadcastHashJoin [codegen id : 11] -Left keys [1]: [cs_ship_date_sk#1] -Right keys [1]: [d_date_sk#23] +Left keys [1]: [cs_call_center_sk#3] +Right keys [1]: [cc_call_center_sk#23] Join condition: None (40) Project [codegen id : 11] Output [3]: [cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7] -Input [5]: [cs_ship_date_sk#1, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7, d_date_sk#23] +Input [5]: [cs_call_center_sk#3, cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7, cc_call_center_sk#23] (41) HashAggregate [codegen id : 11] Input [3]: [cs_order_number#5, cs_ext_ship_cost#6, cs_net_profit#7] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16.sf100/simplified.txt index 393a5baec4400..9ac103bd903fc 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q16.sf100/simplified.txt @@ -8,9 +8,9 @@ WholeStageCodegen (12) HashAggregate [cs_order_number] [sum(UnscaledValue(cs_ext_ship_cost)),sum(UnscaledValue(cs_net_profit)),sum,sum,sum,sum] HashAggregate [cs_order_number,cs_ext_ship_cost,cs_net_profit] [sum(UnscaledValue(cs_ext_ship_cost)),sum(UnscaledValue(cs_net_profit)),sum,sum,sum,sum] Project [cs_order_number,cs_ext_ship_cost,cs_net_profit] - BroadcastHashJoin [cs_ship_date_sk,d_date_sk] - Project [cs_ship_date_sk,cs_order_number,cs_ext_ship_cost,cs_net_profit] - BroadcastHashJoin [cs_call_center_sk,cc_call_center_sk] + BroadcastHashJoin [cs_call_center_sk,cc_call_center_sk] + Project [cs_call_center_sk,cs_order_number,cs_ext_ship_cost,cs_net_profit] + BroadcastHashJoin [cs_ship_date_sk,d_date_sk] Project [cs_ship_date_sk,cs_call_center_sk,cs_order_number,cs_ext_ship_cost,cs_net_profit] BroadcastHashJoin [cs_ship_addr_sk,ca_address_sk] InputAdapter @@ -58,16 +58,16 @@ WholeStageCodegen (12) InputAdapter BroadcastExchange #6 WholeStageCodegen (9) - Project [cc_call_center_sk] - Filter [cc_county,cc_call_center_sk] + Project [d_date_sk] + Filter [d_date,d_date_sk] ColumnarToRow InputAdapter - Scan parquet default.call_center [cc_call_center_sk,cc_county] + Scan parquet default.date_dim [d_date_sk,d_date] InputAdapter BroadcastExchange #7 WholeStageCodegen (10) - Project [d_date_sk] - Filter [d_date,d_date_sk] + Project [cc_call_center_sk] + Filter [cc_county,cc_call_center_sk] ColumnarToRow InputAdapter - Scan parquet default.date_dim [d_date_sk,d_date] + Scan parquet default.call_center [cc_call_center_sk,cc_county] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q22.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q22.sf100/explain.txt index db9e7c70fbc21..3ba8299ca3eb6 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q22.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q22.sf100/explain.txt @@ -10,20 +10,20 @@ TakeOrderedAndProject (30) : +- Exchange (17) : +- * Project (16) : +- * BroadcastHashJoin Inner BuildRight (15) - : :- * Project (9) - : : +- * BroadcastHashJoin Inner BuildRight (8) + : :- * Project (10) + : : +- * BroadcastHashJoin Inner BuildRight (9) : : :- * Filter (3) : : : +- * ColumnarToRow (2) : : : +- Scan parquet default.inventory (1) - : : +- BroadcastExchange (7) - : : +- * Filter (6) - : : +- * ColumnarToRow (5) - : : +- Scan parquet default.warehouse (4) + : : +- BroadcastExchange (8) + : : +- * Project (7) + : : +- * Filter (6) + : : +- * ColumnarToRow (5) + : : +- Scan parquet default.date_dim (4) : +- BroadcastExchange (14) - : +- * Project (13) - : +- * Filter (12) - : +- * ColumnarToRow (11) - : +- Scan parquet default.date_dim (10) + : +- * Filter (13) + : +- * ColumnarToRow (12) + : +- Scan parquet default.warehouse (11) +- * Sort (23) +- Exchange (22) +- * Filter (21) @@ -46,63 +46,63 @@ Input [4]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3, inv_date_ Input [4]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3, inv_date_sk#4] Condition : (isnotnull(inv_item_sk#1) AND isnotnull(inv_warehouse_sk#2)) -(4) Scan parquet default.warehouse -Output [1]: [w_warehouse_sk#6] +(4) Scan parquet default.date_dim +Output [2]: [d_date_sk#6, d_month_seq#7] Batched: true -Location [not included in comparison]/{warehouse_dir}/warehouse] -PushedFilters: [IsNotNull(w_warehouse_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_month_seq), GreaterThanOrEqual(d_month_seq,1200), LessThanOrEqual(d_month_seq,1211), IsNotNull(d_date_sk)] +ReadSchema: struct (5) ColumnarToRow [codegen id : 1] -Input [1]: [w_warehouse_sk#6] +Input [2]: [d_date_sk#6, d_month_seq#7] (6) Filter [codegen id : 1] -Input [1]: [w_warehouse_sk#6] -Condition : isnotnull(w_warehouse_sk#6) +Input [2]: [d_date_sk#6, d_month_seq#7] +Condition : (((isnotnull(d_month_seq#7) AND (d_month_seq#7 >= 1200)) AND (d_month_seq#7 <= 1211)) AND isnotnull(d_date_sk#6)) -(7) BroadcastExchange -Input [1]: [w_warehouse_sk#6] -Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#7] +(7) Project [codegen id : 1] +Output [1]: [d_date_sk#6] +Input [2]: [d_date_sk#6, d_month_seq#7] -(8) BroadcastHashJoin [codegen id : 3] -Left keys [1]: [inv_warehouse_sk#2] -Right keys [1]: [w_warehouse_sk#6] +(8) BroadcastExchange +Input [1]: [d_date_sk#6] +Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#8] + +(9) BroadcastHashJoin [codegen id : 3] +Left keys [1]: [inv_date_sk#4] +Right keys [1]: [d_date_sk#6] Join condition: None -(9) Project [codegen id : 3] -Output [3]: [inv_item_sk#1, inv_quantity_on_hand#3, inv_date_sk#4] -Input [5]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3, inv_date_sk#4, w_warehouse_sk#6] +(10) Project [codegen id : 3] +Output [3]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3] +Input [5]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3, inv_date_sk#4, d_date_sk#6] -(10) Scan parquet default.date_dim -Output [2]: [d_date_sk#8, d_month_seq#9] +(11) Scan parquet default.warehouse +Output [1]: [w_warehouse_sk#9] Batched: true -Location [not included in comparison]/{warehouse_dir}/date_dim] -PushedFilters: [IsNotNull(d_month_seq), GreaterThanOrEqual(d_month_seq,1200), LessThanOrEqual(d_month_seq,1211), IsNotNull(d_date_sk)] -ReadSchema: struct - -(11) ColumnarToRow [codegen id : 2] -Input [2]: [d_date_sk#8, d_month_seq#9] +Location [not included in comparison]/{warehouse_dir}/warehouse] +PushedFilters: [IsNotNull(w_warehouse_sk)] +ReadSchema: struct -(12) Filter [codegen id : 2] -Input [2]: [d_date_sk#8, d_month_seq#9] -Condition : (((isnotnull(d_month_seq#9) AND (d_month_seq#9 >= 1200)) AND (d_month_seq#9 <= 1211)) AND isnotnull(d_date_sk#8)) +(12) ColumnarToRow [codegen id : 2] +Input [1]: [w_warehouse_sk#9] -(13) Project [codegen id : 2] -Output [1]: [d_date_sk#8] -Input [2]: [d_date_sk#8, d_month_seq#9] +(13) Filter [codegen id : 2] +Input [1]: [w_warehouse_sk#9] +Condition : isnotnull(w_warehouse_sk#9) (14) BroadcastExchange -Input [1]: [d_date_sk#8] -Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#10] +Input [1]: [w_warehouse_sk#9] +Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#10] (15) BroadcastHashJoin [codegen id : 3] -Left keys [1]: [inv_date_sk#4] -Right keys [1]: [d_date_sk#8] +Left keys [1]: [inv_warehouse_sk#2] +Right keys [1]: [w_warehouse_sk#9] Join condition: None (16) Project [codegen id : 3] Output [2]: [inv_item_sk#1, inv_quantity_on_hand#3] -Input [4]: [inv_item_sk#1, inv_quantity_on_hand#3, inv_date_sk#4, d_date_sk#8] +Input [4]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3, w_warehouse_sk#9] (17) Exchange Input [2]: [inv_item_sk#1, inv_quantity_on_hand#3] @@ -175,7 +175,7 @@ Subquery:1 Hosting operator id = 1 Hosting Expression = inv_date_sk#4 IN dynamic ReusedExchange (31) -(31) ReusedExchange [Reuses operator id: 14] -Output [1]: [d_date_sk#8] +(31) ReusedExchange [Reuses operator id: 8] +Output [1]: [d_date_sk#6] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q22.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q22.sf100/simplified.txt index 1bcae4201335b..4b97ab81401af 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q22.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q22.sf100/simplified.txt @@ -15,9 +15,9 @@ TakeOrderedAndProject [qoh,i_product_name,i_brand,i_class,i_category] Exchange [inv_item_sk] #2 WholeStageCodegen (3) Project [inv_item_sk,inv_quantity_on_hand] - BroadcastHashJoin [inv_date_sk,d_date_sk] - Project [inv_item_sk,inv_quantity_on_hand,inv_date_sk] - BroadcastHashJoin [inv_warehouse_sk,w_warehouse_sk] + BroadcastHashJoin [inv_warehouse_sk,w_warehouse_sk] + Project [inv_item_sk,inv_warehouse_sk,inv_quantity_on_hand] + BroadcastHashJoin [inv_date_sk,d_date_sk] Filter [inv_item_sk,inv_warehouse_sk] ColumnarToRow InputAdapter @@ -25,20 +25,20 @@ TakeOrderedAndProject [qoh,i_product_name,i_brand,i_class,i_category] SubqueryBroadcast [d_date_sk] #1 ReusedExchange [d_date_sk] #3 InputAdapter - BroadcastExchange #4 + BroadcastExchange #3 WholeStageCodegen (1) - Filter [w_warehouse_sk] - ColumnarToRow - InputAdapter - Scan parquet default.warehouse [w_warehouse_sk] + Project [d_date_sk] + Filter [d_month_seq,d_date_sk] + ColumnarToRow + InputAdapter + Scan parquet default.date_dim [d_date_sk,d_month_seq] InputAdapter - BroadcastExchange #3 + BroadcastExchange #4 WholeStageCodegen (2) - Project [d_date_sk] - Filter [d_month_seq,d_date_sk] - ColumnarToRow - InputAdapter - Scan parquet default.date_dim [d_date_sk,d_month_seq] + Filter [w_warehouse_sk] + ColumnarToRow + InputAdapter + Scan parquet default.warehouse [w_warehouse_sk] InputAdapter WholeStageCodegen (6) Sort [i_item_sk] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q26.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q26.sf100/explain.txt index 40565dc76a7ba..c6a8f8092d10d 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q26.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q26.sf100/explain.txt @@ -23,12 +23,12 @@ TakeOrderedAndProject (34) : : +- * Project (14) : : +- * Filter (13) : : +- * ColumnarToRow (12) - : : +- Scan parquet default.promotion (11) + : : +- Scan parquet default.date_dim (11) : +- BroadcastExchange (22) : +- * Project (21) : +- * Filter (20) : +- * ColumnarToRow (19) - : +- Scan parquet default.date_dim (18) + : +- Scan parquet default.promotion (18) +- BroadcastExchange (28) +- * Filter (27) +- * ColumnarToRow (26) @@ -81,67 +81,67 @@ Join condition: None Output [7]: [cs_item_sk#2, cs_promo_sk#3, cs_quantity#4, cs_list_price#5, cs_sales_price#6, cs_coupon_amt#7, cs_sold_date_sk#8] Input [9]: [cs_bill_cdemo_sk#1, cs_item_sk#2, cs_promo_sk#3, cs_quantity#4, cs_list_price#5, cs_sales_price#6, cs_coupon_amt#7, cs_sold_date_sk#8, cd_demo_sk#10] -(11) Scan parquet default.promotion -Output [3]: [p_promo_sk#15, p_channel_email#16, p_channel_event#17] +(11) Scan parquet default.date_dim +Output [2]: [d_date_sk#15, d_year#16] Batched: true -Location [not included in comparison]/{warehouse_dir}/promotion] -PushedFilters: [Or(EqualTo(p_channel_email,N),EqualTo(p_channel_event,N)), IsNotNull(p_promo_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2000), IsNotNull(d_date_sk)] +ReadSchema: struct (12) ColumnarToRow [codegen id : 2] -Input [3]: [p_promo_sk#15, p_channel_email#16, p_channel_event#17] +Input [2]: [d_date_sk#15, d_year#16] (13) Filter [codegen id : 2] -Input [3]: [p_promo_sk#15, p_channel_email#16, p_channel_event#17] -Condition : (((p_channel_email#16 = N) OR (p_channel_event#17 = N)) AND isnotnull(p_promo_sk#15)) +Input [2]: [d_date_sk#15, d_year#16] +Condition : ((isnotnull(d_year#16) AND (d_year#16 = 2000)) AND isnotnull(d_date_sk#15)) (14) Project [codegen id : 2] -Output [1]: [p_promo_sk#15] -Input [3]: [p_promo_sk#15, p_channel_email#16, p_channel_event#17] +Output [1]: [d_date_sk#15] +Input [2]: [d_date_sk#15, d_year#16] (15) BroadcastExchange -Input [1]: [p_promo_sk#15] -Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#18] +Input [1]: [d_date_sk#15] +Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#17] (16) BroadcastHashJoin [codegen id : 5] -Left keys [1]: [cs_promo_sk#3] -Right keys [1]: [p_promo_sk#15] +Left keys [1]: [cs_sold_date_sk#8] +Right keys [1]: [d_date_sk#15] Join condition: None (17) Project [codegen id : 5] -Output [6]: [cs_item_sk#2, cs_quantity#4, cs_list_price#5, cs_sales_price#6, cs_coupon_amt#7, cs_sold_date_sk#8] -Input [8]: [cs_item_sk#2, cs_promo_sk#3, cs_quantity#4, cs_list_price#5, cs_sales_price#6, cs_coupon_amt#7, cs_sold_date_sk#8, p_promo_sk#15] +Output [6]: [cs_item_sk#2, cs_promo_sk#3, cs_quantity#4, cs_list_price#5, cs_sales_price#6, cs_coupon_amt#7] +Input [8]: [cs_item_sk#2, cs_promo_sk#3, cs_quantity#4, cs_list_price#5, cs_sales_price#6, cs_coupon_amt#7, cs_sold_date_sk#8, d_date_sk#15] -(18) Scan parquet default.date_dim -Output [2]: [d_date_sk#19, d_year#20] +(18) Scan parquet default.promotion +Output [3]: [p_promo_sk#18, p_channel_email#19, p_channel_event#20] 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 +Location [not included in comparison]/{warehouse_dir}/promotion] +PushedFilters: [Or(EqualTo(p_channel_email,N),EqualTo(p_channel_event,N)), IsNotNull(p_promo_sk)] +ReadSchema: struct (19) ColumnarToRow [codegen id : 3] -Input [2]: [d_date_sk#19, d_year#20] +Input [3]: [p_promo_sk#18, p_channel_email#19, p_channel_event#20] (20) Filter [codegen id : 3] -Input [2]: [d_date_sk#19, d_year#20] -Condition : ((isnotnull(d_year#20) AND (d_year#20 = 2000)) AND isnotnull(d_date_sk#19)) +Input [3]: [p_promo_sk#18, p_channel_email#19, p_channel_event#20] +Condition : (((p_channel_email#19 = N) OR (p_channel_event#20 = N)) AND isnotnull(p_promo_sk#18)) (21) Project [codegen id : 3] -Output [1]: [d_date_sk#19] -Input [2]: [d_date_sk#19, d_year#20] +Output [1]: [p_promo_sk#18] +Input [3]: [p_promo_sk#18, p_channel_email#19, p_channel_event#20] (22) BroadcastExchange -Input [1]: [d_date_sk#19] +Input [1]: [p_promo_sk#18] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#21] (23) BroadcastHashJoin [codegen id : 5] -Left keys [1]: [cs_sold_date_sk#8] -Right keys [1]: [d_date_sk#19] +Left keys [1]: [cs_promo_sk#3] +Right keys [1]: [p_promo_sk#18] Join condition: None (24) Project [codegen id : 5] Output [5]: [cs_item_sk#2, cs_quantity#4, cs_list_price#5, cs_sales_price#6, cs_coupon_amt#7] -Input [7]: [cs_item_sk#2, cs_quantity#4, cs_list_price#5, cs_sales_price#6, cs_coupon_amt#7, cs_sold_date_sk#8, d_date_sk#19] +Input [7]: [cs_item_sk#2, cs_promo_sk#3, cs_quantity#4, cs_list_price#5, cs_sales_price#6, cs_coupon_amt#7, p_promo_sk#18] (25) Scan parquet default.item Output [2]: [i_item_sk#22, i_item_id#23] @@ -198,7 +198,7 @@ Subquery:1 Hosting operator id = 1 Hosting Expression = cs_sold_date_sk#8 IN dyn ReusedExchange (35) -(35) ReusedExchange [Reuses operator id: 22] -Output [1]: [d_date_sk#19] +(35) ReusedExchange [Reuses operator id: 15] +Output [1]: [d_date_sk#15] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q26.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q26.sf100/simplified.txt index f5af2ee1a4aa4..f40f391214af2 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q26.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q26.sf100/simplified.txt @@ -8,9 +8,9 @@ TakeOrderedAndProject [i_item_id,agg1,agg2,agg3,agg4] Project [cs_quantity,cs_list_price,cs_sales_price,cs_coupon_amt,i_item_id] BroadcastHashJoin [cs_item_sk,i_item_sk] Project [cs_item_sk,cs_quantity,cs_list_price,cs_sales_price,cs_coupon_amt] - BroadcastHashJoin [cs_sold_date_sk,d_date_sk] - Project [cs_item_sk,cs_quantity,cs_list_price,cs_sales_price,cs_coupon_amt,cs_sold_date_sk] - BroadcastHashJoin [cs_promo_sk,p_promo_sk] + BroadcastHashJoin [cs_promo_sk,p_promo_sk] + Project [cs_item_sk,cs_promo_sk,cs_quantity,cs_list_price,cs_sales_price,cs_coupon_amt] + BroadcastHashJoin [cs_sold_date_sk,d_date_sk] Project [cs_item_sk,cs_promo_sk,cs_quantity,cs_list_price,cs_sales_price,cs_coupon_amt,cs_sold_date_sk] BroadcastHashJoin [cs_bill_cdemo_sk,cd_demo_sk] Filter [cs_bill_cdemo_sk,cs_item_sk,cs_promo_sk] @@ -28,21 +28,21 @@ TakeOrderedAndProject [i_item_id,agg1,agg2,agg3,agg4] InputAdapter Scan parquet default.customer_demographics [cd_demo_sk,cd_gender,cd_marital_status,cd_education_status] InputAdapter - BroadcastExchange #4 + BroadcastExchange #2 WholeStageCodegen (2) - Project [p_promo_sk] - Filter [p_channel_email,p_channel_event,p_promo_sk] + Project [d_date_sk] + Filter [d_year,d_date_sk] ColumnarToRow InputAdapter - Scan parquet default.promotion [p_promo_sk,p_channel_email,p_channel_event] + Scan parquet default.date_dim [d_date_sk,d_year] InputAdapter - BroadcastExchange #2 + BroadcastExchange #4 WholeStageCodegen (3) - Project [d_date_sk] - Filter [d_year,d_date_sk] + Project [p_promo_sk] + Filter [p_channel_email,p_channel_event,p_promo_sk] ColumnarToRow InputAdapter - Scan parquet default.date_dim [d_date_sk,d_year] + Scan parquet default.promotion [p_promo_sk,p_channel_email,p_channel_event] InputAdapter BroadcastExchange #5 WholeStageCodegen (4) diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6.sf100/explain.txt index 7e82b4d5df296..5f550c1f83f31 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6.sf100/explain.txt @@ -11,30 +11,30 @@ TakeOrderedAndProject (50) : +- Exchange (27) : +- * Project (26) : +- * BroadcastHashJoin Inner BuildRight (25) - : :- * Project (19) - : : +- * BroadcastHashJoin Inner BuildRight (18) + : :- * Project (10) + : : +- * BroadcastHashJoin Inner BuildRight (9) : : :- * Filter (3) : : : +- * ColumnarToRow (2) : : : +- Scan parquet default.store_sales (1) - : : +- BroadcastExchange (17) - : : +- * Project (16) - : : +- * Filter (15) - : : +- * BroadcastHashJoin LeftOuter BuildRight (14) - : : :- * Filter (6) - : : : +- * ColumnarToRow (5) - : : : +- Scan parquet default.item (4) - : : +- BroadcastExchange (13) - : : +- * HashAggregate (12) - : : +- Exchange (11) - : : +- * HashAggregate (10) - : : +- * Filter (9) - : : +- * ColumnarToRow (8) - : : +- Scan parquet default.item (7) + : : +- BroadcastExchange (8) + : : +- * Project (7) + : : +- * Filter (6) + : : +- * ColumnarToRow (5) + : : +- Scan parquet default.date_dim (4) : +- BroadcastExchange (24) : +- * Project (23) : +- * Filter (22) - : +- * ColumnarToRow (21) - : +- Scan parquet default.date_dim (20) + : +- * BroadcastHashJoin LeftOuter BuildRight (21) + : :- * Filter (13) + : : +- * ColumnarToRow (12) + : : +- Scan parquet default.item (11) + : +- BroadcastExchange (20) + : +- * HashAggregate (19) + : +- Exchange (18) + : +- * HashAggregate (17) + : +- * Filter (16) + : +- * ColumnarToRow (15) + : +- Scan parquet default.item (14) +- * Sort (42) +- Exchange (41) +- * Project (40) @@ -66,112 +66,112 @@ Input [3]: [ss_item_sk#1, ss_customer_sk#2, ss_sold_date_sk#3] Input [3]: [ss_item_sk#1, ss_customer_sk#2, ss_sold_date_sk#3] Condition : (isnotnull(ss_customer_sk#2) AND isnotnull(ss_item_sk#1)) -(4) Scan parquet default.item -Output [3]: [i_item_sk#5, i_current_price#6, i_category#7] +(4) Scan parquet default.date_dim +Output [2]: [d_date_sk#5, d_month_seq#6] Batched: true -Location [not included in comparison]/{warehouse_dir}/item] -PushedFilters: [IsNotNull(i_current_price), IsNotNull(i_item_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_month_seq), IsNotNull(d_date_sk)] +ReadSchema: struct -(5) ColumnarToRow [codegen id : 3] -Input [3]: [i_item_sk#5, i_current_price#6, i_category#7] +(5) ColumnarToRow [codegen id : 1] +Input [2]: [d_date_sk#5, d_month_seq#6] -(6) Filter [codegen id : 3] -Input [3]: [i_item_sk#5, i_current_price#6, i_category#7] -Condition : (isnotnull(i_current_price#6) AND isnotnull(i_item_sk#5)) +(6) Filter [codegen id : 1] +Input [2]: [d_date_sk#5, d_month_seq#6] +Condition : ((isnotnull(d_month_seq#6) AND (d_month_seq#6 = Subquery scalar-subquery#7, [id=#8])) AND isnotnull(d_date_sk#5)) -(7) Scan parquet default.item -Output [2]: [i_current_price#8, i_category#9] -Batched: true -Location [not included in comparison]/{warehouse_dir}/item] -PushedFilters: [IsNotNull(i_category)] -ReadSchema: struct +(7) Project [codegen id : 1] +Output [1]: [d_date_sk#5] +Input [2]: [d_date_sk#5, d_month_seq#6] -(8) ColumnarToRow [codegen id : 1] -Input [2]: [i_current_price#8, i_category#9] - -(9) Filter [codegen id : 1] -Input [2]: [i_current_price#8, i_category#9] -Condition : isnotnull(i_category#9) - -(10) HashAggregate [codegen id : 1] -Input [2]: [i_current_price#8, i_category#9] -Keys [1]: [i_category#9] -Functions [1]: [partial_avg(UnscaledValue(i_current_price#8))] -Aggregate Attributes [2]: [sum#10, count#11] -Results [3]: [i_category#9, sum#12, count#13] - -(11) Exchange -Input [3]: [i_category#9, sum#12, count#13] -Arguments: hashpartitioning(i_category#9, 5), ENSURE_REQUIREMENTS, [id=#14] - -(12) HashAggregate [codegen id : 2] -Input [3]: [i_category#9, sum#12, count#13] -Keys [1]: [i_category#9] -Functions [1]: [avg(UnscaledValue(i_current_price#8))] -Aggregate Attributes [1]: [avg(UnscaledValue(i_current_price#8))#15] -Results [2]: [cast((avg(UnscaledValue(i_current_price#8))#15 / 100.0) as decimal(11,6)) AS avg(i_current_price)#16, i_category#9] - -(13) BroadcastExchange -Input [2]: [avg(i_current_price)#16, i_category#9] -Arguments: HashedRelationBroadcastMode(List(input[1, string, true]),false), [id=#17] - -(14) BroadcastHashJoin [codegen id : 3] -Left keys [1]: [i_category#7] -Right keys [1]: [i_category#9] -Join condition: None +(8) BroadcastExchange +Input [1]: [d_date_sk#5] +Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#9] -(15) Filter [codegen id : 3] -Input [5]: [i_item_sk#5, i_current_price#6, i_category#7, avg(i_current_price)#16, i_category#9] -Condition : (cast(i_current_price#6 as decimal(14,7)) > CheckOverflow((1.200000 * promote_precision(avg(i_current_price)#16)), DecimalType(14,7), true)) +(9) BroadcastHashJoin [codegen id : 5] +Left keys [1]: [ss_sold_date_sk#3] +Right keys [1]: [d_date_sk#5] +Join condition: None -(16) Project [codegen id : 3] -Output [1]: [i_item_sk#5] -Input [5]: [i_item_sk#5, i_current_price#6, i_category#7, avg(i_current_price)#16, i_category#9] +(10) Project [codegen id : 5] +Output [2]: [ss_item_sk#1, ss_customer_sk#2] +Input [4]: [ss_item_sk#1, ss_customer_sk#2, ss_sold_date_sk#3, d_date_sk#5] -(17) BroadcastExchange -Input [1]: [i_item_sk#5] -Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#18] +(11) Scan parquet default.item +Output [3]: [i_item_sk#10, i_current_price#11, i_category#12] +Batched: true +Location [not included in comparison]/{warehouse_dir}/item] +PushedFilters: [IsNotNull(i_current_price), IsNotNull(i_item_sk)] +ReadSchema: struct -(18) BroadcastHashJoin [codegen id : 5] -Left keys [1]: [ss_item_sk#1] -Right keys [1]: [i_item_sk#5] -Join condition: None +(12) ColumnarToRow [codegen id : 4] +Input [3]: [i_item_sk#10, i_current_price#11, i_category#12] -(19) Project [codegen id : 5] -Output [2]: [ss_customer_sk#2, ss_sold_date_sk#3] -Input [4]: [ss_item_sk#1, ss_customer_sk#2, ss_sold_date_sk#3, i_item_sk#5] +(13) Filter [codegen id : 4] +Input [3]: [i_item_sk#10, i_current_price#11, i_category#12] +Condition : (isnotnull(i_current_price#11) AND isnotnull(i_item_sk#10)) -(20) Scan parquet default.date_dim -Output [2]: [d_date_sk#19, d_month_seq#20] +(14) Scan parquet default.item +Output [2]: [i_current_price#13, i_category#14] Batched: true -Location [not included in comparison]/{warehouse_dir}/date_dim] -PushedFilters: [IsNotNull(d_month_seq), IsNotNull(d_date_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/item] +PushedFilters: [IsNotNull(i_category)] +ReadSchema: struct -(21) ColumnarToRow [codegen id : 4] -Input [2]: [d_date_sk#19, d_month_seq#20] +(15) ColumnarToRow [codegen id : 2] +Input [2]: [i_current_price#13, i_category#14] + +(16) Filter [codegen id : 2] +Input [2]: [i_current_price#13, i_category#14] +Condition : isnotnull(i_category#14) + +(17) HashAggregate [codegen id : 2] +Input [2]: [i_current_price#13, i_category#14] +Keys [1]: [i_category#14] +Functions [1]: [partial_avg(UnscaledValue(i_current_price#13))] +Aggregate Attributes [2]: [sum#15, count#16] +Results [3]: [i_category#14, sum#17, count#18] + +(18) Exchange +Input [3]: [i_category#14, sum#17, count#18] +Arguments: hashpartitioning(i_category#14, 5), ENSURE_REQUIREMENTS, [id=#19] + +(19) HashAggregate [codegen id : 3] +Input [3]: [i_category#14, sum#17, count#18] +Keys [1]: [i_category#14] +Functions [1]: [avg(UnscaledValue(i_current_price#13))] +Aggregate Attributes [1]: [avg(UnscaledValue(i_current_price#13))#20] +Results [2]: [cast((avg(UnscaledValue(i_current_price#13))#20 / 100.0) as decimal(11,6)) AS avg(i_current_price)#21, i_category#14] + +(20) BroadcastExchange +Input [2]: [avg(i_current_price)#21, i_category#14] +Arguments: HashedRelationBroadcastMode(List(input[1, string, true]),false), [id=#22] + +(21) BroadcastHashJoin [codegen id : 4] +Left keys [1]: [i_category#12] +Right keys [1]: [i_category#14] +Join condition: None (22) Filter [codegen id : 4] -Input [2]: [d_date_sk#19, d_month_seq#20] -Condition : ((isnotnull(d_month_seq#20) AND (d_month_seq#20 = Subquery scalar-subquery#21, [id=#22])) AND isnotnull(d_date_sk#19)) +Input [5]: [i_item_sk#10, i_current_price#11, i_category#12, avg(i_current_price)#21, i_category#14] +Condition : (cast(i_current_price#11 as decimal(14,7)) > CheckOverflow((1.200000 * promote_precision(avg(i_current_price)#21)), DecimalType(14,7), true)) (23) Project [codegen id : 4] -Output [1]: [d_date_sk#19] -Input [2]: [d_date_sk#19, d_month_seq#20] +Output [1]: [i_item_sk#10] +Input [5]: [i_item_sk#10, i_current_price#11, i_category#12, avg(i_current_price)#21, i_category#14] (24) BroadcastExchange -Input [1]: [d_date_sk#19] +Input [1]: [i_item_sk#10] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#23] (25) BroadcastHashJoin [codegen id : 5] -Left keys [1]: [ss_sold_date_sk#3] -Right keys [1]: [d_date_sk#19] +Left keys [1]: [ss_item_sk#1] +Right keys [1]: [i_item_sk#10] Join condition: None (26) Project [codegen id : 5] Output [1]: [ss_customer_sk#2] -Input [3]: [ss_customer_sk#2, ss_sold_date_sk#3, d_date_sk#19] +Input [3]: [ss_item_sk#1, ss_customer_sk#2, i_item_sk#10] (27) Exchange Input [1]: [ss_customer_sk#2] @@ -287,10 +287,10 @@ Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#3 IN dyn ReusedExchange (51) -(51) ReusedExchange [Reuses operator id: 24] -Output [1]: [d_date_sk#19] +(51) ReusedExchange [Reuses operator id: 8] +Output [1]: [d_date_sk#5] -Subquery:2 Hosting operator id = 22 Hosting Expression = Subquery scalar-subquery#21, [id=#22] +Subquery:2 Hosting operator id = 6 Hosting Expression = Subquery scalar-subquery#7, [id=#8] * HashAggregate (58) +- Exchange (57) +- * HashAggregate (56) diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6.sf100/simplified.txt index 1cdb7a5df8e6f..ff1f0e7c4d299 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q6.sf100/simplified.txt @@ -16,9 +16,9 @@ TakeOrderedAndProject [cnt,state] Exchange [ss_customer_sk] #2 WholeStageCodegen (5) Project [ss_customer_sk] - BroadcastHashJoin [ss_sold_date_sk,d_date_sk] - Project [ss_customer_sk,ss_sold_date_sk] - BroadcastHashJoin [ss_item_sk,i_item_sk] + BroadcastHashJoin [ss_item_sk,i_item_sk] + Project [ss_item_sk,ss_customer_sk] + BroadcastHashJoin [ss_sold_date_sk,d_date_sk] Filter [ss_customer_sk,ss_item_sk] ColumnarToRow InputAdapter @@ -26,47 +26,47 @@ TakeOrderedAndProject [cnt,state] SubqueryBroadcast [d_date_sk] #1 ReusedExchange [d_date_sk] #3 InputAdapter - BroadcastExchange #4 - WholeStageCodegen (3) - Project [i_item_sk] - Filter [i_current_price,avg(i_current_price)] - BroadcastHashJoin [i_category,i_category] - Filter [i_current_price,i_item_sk] - ColumnarToRow + BroadcastExchange #3 + WholeStageCodegen (1) + Project [d_date_sk] + Filter [d_month_seq,d_date_sk] + Subquery #2 + WholeStageCodegen (2) + HashAggregate [d_month_seq] InputAdapter - Scan parquet default.item [i_item_sk,i_current_price,i_category] + Exchange [d_month_seq] #4 + WholeStageCodegen (1) + HashAggregate [d_month_seq] + Project [d_month_seq] + Filter [d_year,d_moy] + ColumnarToRow + InputAdapter + Scan parquet default.date_dim [d_month_seq,d_year,d_moy] + ColumnarToRow InputAdapter - BroadcastExchange #5 - WholeStageCodegen (2) - HashAggregate [i_category,sum,count] [avg(UnscaledValue(i_current_price)),avg(i_current_price),sum,count] - InputAdapter - Exchange [i_category] #6 - WholeStageCodegen (1) - HashAggregate [i_category,i_current_price] [sum,count,sum,count] - Filter [i_category] - ColumnarToRow - InputAdapter - Scan parquet default.item [i_current_price,i_category] + Scan parquet default.date_dim [d_date_sk,d_month_seq] InputAdapter - BroadcastExchange #3 + BroadcastExchange #5 WholeStageCodegen (4) - Project [d_date_sk] - Filter [d_month_seq,d_date_sk] - Subquery #2 - WholeStageCodegen (2) - HashAggregate [d_month_seq] + Project [i_item_sk] + Filter [i_current_price,avg(i_current_price)] + BroadcastHashJoin [i_category,i_category] + Filter [i_current_price,i_item_sk] + ColumnarToRow InputAdapter - Exchange [d_month_seq] #7 - WholeStageCodegen (1) - HashAggregate [d_month_seq] - Project [d_month_seq] - Filter [d_year,d_moy] - ColumnarToRow - InputAdapter - Scan parquet default.date_dim [d_month_seq,d_year,d_moy] - ColumnarToRow + Scan parquet default.item [i_item_sk,i_current_price,i_category] InputAdapter - Scan parquet default.date_dim [d_date_sk,d_month_seq] + BroadcastExchange #6 + WholeStageCodegen (3) + HashAggregate [i_category,sum,count] [avg(UnscaledValue(i_current_price)),avg(i_current_price),sum,count] + InputAdapter + Exchange [i_category] #7 + WholeStageCodegen (2) + HashAggregate [i_category,i_current_price] [sum,count,sum,count] + Filter [i_category] + ColumnarToRow + InputAdapter + Scan parquet default.item [i_current_price,i_category] InputAdapter WholeStageCodegen (12) Sort [c_customer_sk] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61.sf100/explain.txt index 410fd9bc3d4e7..4b8d04b6aa5fc 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61.sf100/explain.txt @@ -27,12 +27,12 @@ : : : : +- * Project (14) : : : : +- * Filter (13) : : : : +- * ColumnarToRow (12) - : : : : +- Scan parquet default.item (11) + : : : : +- Scan parquet default.promotion (11) : : : +- BroadcastExchange (22) : : : +- * Project (21) : : : +- * Filter (20) : : : +- * ColumnarToRow (19) - : : : +- Scan parquet default.promotion (18) + : : : +- Scan parquet default.item (18) : : +- BroadcastExchange (29) : : +- * Project (28) : : +- * Filter (27) @@ -116,67 +116,67 @@ Join condition: None Output [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_promo_sk#4, ss_ext_sales_price#5] Input [7]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_promo_sk#4, ss_ext_sales_price#5, ss_sold_date_sk#6, d_date_sk#8] -(11) Scan parquet default.item -Output [2]: [i_item_sk#12, i_category#13] +(11) Scan parquet default.promotion +Output [4]: [p_promo_sk#12, p_channel_dmail#13, p_channel_email#14, p_channel_tv#15] Batched: true -Location [not included in comparison]/{warehouse_dir}/item] -PushedFilters: [IsNotNull(i_category), EqualTo(i_category,Jewelry ), IsNotNull(i_item_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/promotion] +PushedFilters: [Or(Or(EqualTo(p_channel_dmail,Y),EqualTo(p_channel_email,Y)),EqualTo(p_channel_tv,Y)), IsNotNull(p_promo_sk)] +ReadSchema: struct (12) ColumnarToRow [codegen id : 2] -Input [2]: [i_item_sk#12, i_category#13] +Input [4]: [p_promo_sk#12, p_channel_dmail#13, p_channel_email#14, p_channel_tv#15] (13) Filter [codegen id : 2] -Input [2]: [i_item_sk#12, i_category#13] -Condition : ((isnotnull(i_category#13) AND (i_category#13 = Jewelry )) AND isnotnull(i_item_sk#12)) +Input [4]: [p_promo_sk#12, p_channel_dmail#13, p_channel_email#14, p_channel_tv#15] +Condition : ((((p_channel_dmail#13 = Y) OR (p_channel_email#14 = Y)) OR (p_channel_tv#15 = Y)) AND isnotnull(p_promo_sk#12)) (14) Project [codegen id : 2] -Output [1]: [i_item_sk#12] -Input [2]: [i_item_sk#12, i_category#13] +Output [1]: [p_promo_sk#12] +Input [4]: [p_promo_sk#12, p_channel_dmail#13, p_channel_email#14, p_channel_tv#15] (15) BroadcastExchange -Input [1]: [i_item_sk#12] -Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#14] +Input [1]: [p_promo_sk#12] +Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#16] (16) BroadcastHashJoin [codegen id : 7] -Left keys [1]: [ss_item_sk#1] -Right keys [1]: [i_item_sk#12] +Left keys [1]: [ss_promo_sk#4] +Right keys [1]: [p_promo_sk#12] Join condition: None (17) Project [codegen id : 7] -Output [4]: [ss_customer_sk#2, ss_store_sk#3, ss_promo_sk#4, ss_ext_sales_price#5] -Input [6]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_promo_sk#4, ss_ext_sales_price#5, i_item_sk#12] +Output [4]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ext_sales_price#5] +Input [6]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_promo_sk#4, ss_ext_sales_price#5, p_promo_sk#12] -(18) Scan parquet default.promotion -Output [4]: [p_promo_sk#15, p_channel_dmail#16, p_channel_email#17, p_channel_tv#18] +(18) Scan parquet default.item +Output [2]: [i_item_sk#17, i_category#18] Batched: true -Location [not included in comparison]/{warehouse_dir}/promotion] -PushedFilters: [Or(Or(EqualTo(p_channel_dmail,Y),EqualTo(p_channel_email,Y)),EqualTo(p_channel_tv,Y)), IsNotNull(p_promo_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/item] +PushedFilters: [IsNotNull(i_category), EqualTo(i_category,Jewelry ), IsNotNull(i_item_sk)] +ReadSchema: struct (19) ColumnarToRow [codegen id : 3] -Input [4]: [p_promo_sk#15, p_channel_dmail#16, p_channel_email#17, p_channel_tv#18] +Input [2]: [i_item_sk#17, i_category#18] (20) Filter [codegen id : 3] -Input [4]: [p_promo_sk#15, p_channel_dmail#16, p_channel_email#17, p_channel_tv#18] -Condition : ((((p_channel_dmail#16 = Y) OR (p_channel_email#17 = Y)) OR (p_channel_tv#18 = Y)) AND isnotnull(p_promo_sk#15)) +Input [2]: [i_item_sk#17, i_category#18] +Condition : ((isnotnull(i_category#18) AND (i_category#18 = Jewelry )) AND isnotnull(i_item_sk#17)) (21) Project [codegen id : 3] -Output [1]: [p_promo_sk#15] -Input [4]: [p_promo_sk#15, p_channel_dmail#16, p_channel_email#17, p_channel_tv#18] +Output [1]: [i_item_sk#17] +Input [2]: [i_item_sk#17, i_category#18] (22) BroadcastExchange -Input [1]: [p_promo_sk#15] +Input [1]: [i_item_sk#17] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#19] (23) BroadcastHashJoin [codegen id : 7] -Left keys [1]: [ss_promo_sk#4] -Right keys [1]: [p_promo_sk#15] +Left keys [1]: [ss_item_sk#1] +Right keys [1]: [i_item_sk#17] Join condition: None (24) Project [codegen id : 7] Output [3]: [ss_customer_sk#2, ss_store_sk#3, ss_ext_sales_price#5] -Input [5]: [ss_customer_sk#2, ss_store_sk#3, ss_promo_sk#4, ss_ext_sales_price#5, p_promo_sk#15] +Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ext_sales_price#5, i_item_sk#17] (25) Scan parquet default.store Output [2]: [s_store_sk#20, s_gmt_offset#21] @@ -312,7 +312,7 @@ Join condition: None Output [4]: [ss_item_sk#34, ss_customer_sk#35, ss_store_sk#36, ss_ext_sales_price#37] Input [6]: [ss_item_sk#34, ss_customer_sk#35, ss_store_sk#36, ss_ext_sales_price#37, ss_sold_date_sk#38, d_date_sk#39] -(54) ReusedExchange [Reuses operator id: 15] +(54) ReusedExchange [Reuses operator id: 22] Output [1]: [i_item_sk#40] (55) BroadcastHashJoin [codegen id : 13] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61.sf100/simplified.txt index b4e4877c12ee1..126bbb047a19e 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61.sf100/simplified.txt @@ -12,9 +12,9 @@ WholeStageCodegen (15) Project [ss_customer_sk,ss_ext_sales_price] BroadcastHashJoin [ss_store_sk,s_store_sk] Project [ss_customer_sk,ss_store_sk,ss_ext_sales_price] - BroadcastHashJoin [ss_promo_sk,p_promo_sk] - Project [ss_customer_sk,ss_store_sk,ss_promo_sk,ss_ext_sales_price] - BroadcastHashJoin [ss_item_sk,i_item_sk] + BroadcastHashJoin [ss_item_sk,i_item_sk] + Project [ss_item_sk,ss_customer_sk,ss_store_sk,ss_ext_sales_price] + BroadcastHashJoin [ss_promo_sk,p_promo_sk] Project [ss_item_sk,ss_customer_sk,ss_store_sk,ss_promo_sk,ss_ext_sales_price] BroadcastHashJoin [ss_sold_date_sk,d_date_sk] Filter [ss_store_sk,ss_promo_sk,ss_customer_sk,ss_item_sk] @@ -34,19 +34,19 @@ WholeStageCodegen (15) InputAdapter BroadcastExchange #3 WholeStageCodegen (2) - Project [i_item_sk] - Filter [i_category,i_item_sk] + Project [p_promo_sk] + Filter [p_channel_dmail,p_channel_email,p_channel_tv,p_promo_sk] ColumnarToRow InputAdapter - Scan parquet default.item [i_item_sk,i_category] + Scan parquet default.promotion [p_promo_sk,p_channel_dmail,p_channel_email,p_channel_tv] InputAdapter BroadcastExchange #4 WholeStageCodegen (3) - Project [p_promo_sk] - Filter [p_channel_dmail,p_channel_email,p_channel_tv,p_promo_sk] + Project [i_item_sk] + Filter [i_category,i_item_sk] ColumnarToRow InputAdapter - Scan parquet default.promotion [p_promo_sk,p_channel_dmail,p_channel_email,p_channel_tv] + Scan parquet default.item [i_item_sk,i_category] InputAdapter BroadcastExchange #5 WholeStageCodegen (4) @@ -96,7 +96,7 @@ WholeStageCodegen (15) InputAdapter ReusedExchange [d_date_sk] #2 InputAdapter - ReusedExchange [i_item_sk] #3 + ReusedExchange [i_item_sk] #4 InputAdapter ReusedExchange [s_store_sk] #5 InputAdapter diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q7.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q7.sf100/explain.txt index b138d059eaecb..03b396968b526 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q7.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q7.sf100/explain.txt @@ -23,12 +23,12 @@ TakeOrderedAndProject (34) : : +- * Project (14) : : +- * Filter (13) : : +- * ColumnarToRow (12) - : : +- Scan parquet default.promotion (11) + : : +- Scan parquet default.date_dim (11) : +- BroadcastExchange (22) : +- * Project (21) : +- * Filter (20) : +- * ColumnarToRow (19) - : +- Scan parquet default.date_dim (18) + : +- Scan parquet default.promotion (18) +- BroadcastExchange (28) +- * Filter (27) +- * ColumnarToRow (26) @@ -81,67 +81,67 @@ Join condition: None Output [7]: [ss_item_sk#1, ss_promo_sk#3, ss_quantity#4, ss_list_price#5, ss_sales_price#6, ss_coupon_amt#7, ss_sold_date_sk#8] Input [9]: [ss_item_sk#1, ss_cdemo_sk#2, ss_promo_sk#3, ss_quantity#4, ss_list_price#5, ss_sales_price#6, ss_coupon_amt#7, ss_sold_date_sk#8, cd_demo_sk#10] -(11) Scan parquet default.promotion -Output [3]: [p_promo_sk#15, p_channel_email#16, p_channel_event#17] +(11) Scan parquet default.date_dim +Output [2]: [d_date_sk#15, d_year#16] Batched: true -Location [not included in comparison]/{warehouse_dir}/promotion] -PushedFilters: [Or(EqualTo(p_channel_email,N),EqualTo(p_channel_event,N)), IsNotNull(p_promo_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2000), IsNotNull(d_date_sk)] +ReadSchema: struct (12) ColumnarToRow [codegen id : 2] -Input [3]: [p_promo_sk#15, p_channel_email#16, p_channel_event#17] +Input [2]: [d_date_sk#15, d_year#16] (13) Filter [codegen id : 2] -Input [3]: [p_promo_sk#15, p_channel_email#16, p_channel_event#17] -Condition : (((p_channel_email#16 = N) OR (p_channel_event#17 = N)) AND isnotnull(p_promo_sk#15)) +Input [2]: [d_date_sk#15, d_year#16] +Condition : ((isnotnull(d_year#16) AND (d_year#16 = 2000)) AND isnotnull(d_date_sk#15)) (14) Project [codegen id : 2] -Output [1]: [p_promo_sk#15] -Input [3]: [p_promo_sk#15, p_channel_email#16, p_channel_event#17] +Output [1]: [d_date_sk#15] +Input [2]: [d_date_sk#15, d_year#16] (15) BroadcastExchange -Input [1]: [p_promo_sk#15] -Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#18] +Input [1]: [d_date_sk#15] +Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#17] (16) BroadcastHashJoin [codegen id : 5] -Left keys [1]: [ss_promo_sk#3] -Right keys [1]: [p_promo_sk#15] +Left keys [1]: [ss_sold_date_sk#8] +Right keys [1]: [d_date_sk#15] Join condition: None (17) Project [codegen id : 5] -Output [6]: [ss_item_sk#1, ss_quantity#4, ss_list_price#5, ss_sales_price#6, ss_coupon_amt#7, ss_sold_date_sk#8] -Input [8]: [ss_item_sk#1, ss_promo_sk#3, ss_quantity#4, ss_list_price#5, ss_sales_price#6, ss_coupon_amt#7, ss_sold_date_sk#8, p_promo_sk#15] +Output [6]: [ss_item_sk#1, ss_promo_sk#3, ss_quantity#4, ss_list_price#5, ss_sales_price#6, ss_coupon_amt#7] +Input [8]: [ss_item_sk#1, ss_promo_sk#3, ss_quantity#4, ss_list_price#5, ss_sales_price#6, ss_coupon_amt#7, ss_sold_date_sk#8, d_date_sk#15] -(18) Scan parquet default.date_dim -Output [2]: [d_date_sk#19, d_year#20] +(18) Scan parquet default.promotion +Output [3]: [p_promo_sk#18, p_channel_email#19, p_channel_event#20] 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 +Location [not included in comparison]/{warehouse_dir}/promotion] +PushedFilters: [Or(EqualTo(p_channel_email,N),EqualTo(p_channel_event,N)), IsNotNull(p_promo_sk)] +ReadSchema: struct (19) ColumnarToRow [codegen id : 3] -Input [2]: [d_date_sk#19, d_year#20] +Input [3]: [p_promo_sk#18, p_channel_email#19, p_channel_event#20] (20) Filter [codegen id : 3] -Input [2]: [d_date_sk#19, d_year#20] -Condition : ((isnotnull(d_year#20) AND (d_year#20 = 2000)) AND isnotnull(d_date_sk#19)) +Input [3]: [p_promo_sk#18, p_channel_email#19, p_channel_event#20] +Condition : (((p_channel_email#19 = N) OR (p_channel_event#20 = N)) AND isnotnull(p_promo_sk#18)) (21) Project [codegen id : 3] -Output [1]: [d_date_sk#19] -Input [2]: [d_date_sk#19, d_year#20] +Output [1]: [p_promo_sk#18] +Input [3]: [p_promo_sk#18, p_channel_email#19, p_channel_event#20] (22) BroadcastExchange -Input [1]: [d_date_sk#19] +Input [1]: [p_promo_sk#18] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#21] (23) BroadcastHashJoin [codegen id : 5] -Left keys [1]: [ss_sold_date_sk#8] -Right keys [1]: [d_date_sk#19] +Left keys [1]: [ss_promo_sk#3] +Right keys [1]: [p_promo_sk#18] Join condition: None (24) Project [codegen id : 5] Output [5]: [ss_item_sk#1, ss_quantity#4, ss_list_price#5, ss_sales_price#6, ss_coupon_amt#7] -Input [7]: [ss_item_sk#1, ss_quantity#4, ss_list_price#5, ss_sales_price#6, ss_coupon_amt#7, ss_sold_date_sk#8, d_date_sk#19] +Input [7]: [ss_item_sk#1, ss_promo_sk#3, ss_quantity#4, ss_list_price#5, ss_sales_price#6, ss_coupon_amt#7, p_promo_sk#18] (25) Scan parquet default.item Output [2]: [i_item_sk#22, i_item_id#23] @@ -198,7 +198,7 @@ Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#8 IN dyn ReusedExchange (35) -(35) ReusedExchange [Reuses operator id: 22] -Output [1]: [d_date_sk#19] +(35) ReusedExchange [Reuses operator id: 15] +Output [1]: [d_date_sk#15] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q7.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q7.sf100/simplified.txt index e5cf942ba37b5..5635ba66f92eb 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q7.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q7.sf100/simplified.txt @@ -8,9 +8,9 @@ TakeOrderedAndProject [i_item_id,agg1,agg2,agg3,agg4] Project [ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt,i_item_id] BroadcastHashJoin [ss_item_sk,i_item_sk] Project [ss_item_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt] - BroadcastHashJoin [ss_sold_date_sk,d_date_sk] - Project [ss_item_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastHashJoin [ss_promo_sk,p_promo_sk] + BroadcastHashJoin [ss_promo_sk,p_promo_sk] + Project [ss_item_sk,ss_promo_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt] + BroadcastHashJoin [ss_sold_date_sk,d_date_sk] Project [ss_item_sk,ss_promo_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt,ss_sold_date_sk] BroadcastHashJoin [ss_cdemo_sk,cd_demo_sk] Filter [ss_cdemo_sk,ss_item_sk,ss_promo_sk] @@ -28,21 +28,21 @@ TakeOrderedAndProject [i_item_id,agg1,agg2,agg3,agg4] InputAdapter Scan parquet default.customer_demographics [cd_demo_sk,cd_gender,cd_marital_status,cd_education_status] InputAdapter - BroadcastExchange #4 + BroadcastExchange #2 WholeStageCodegen (2) - Project [p_promo_sk] - Filter [p_channel_email,p_channel_event,p_promo_sk] + Project [d_date_sk] + Filter [d_year,d_date_sk] ColumnarToRow InputAdapter - Scan parquet default.promotion [p_promo_sk,p_channel_email,p_channel_event] + Scan parquet default.date_dim [d_date_sk,d_year] InputAdapter - BroadcastExchange #2 + BroadcastExchange #4 WholeStageCodegen (3) - Project [d_date_sk] - Filter [d_year,d_date_sk] + Project [p_promo_sk] + Filter [p_channel_email,p_channel_event,p_promo_sk] ColumnarToRow InputAdapter - Scan parquet default.date_dim [d_date_sk,d_year] + Scan parquet default.promotion [p_promo_sk,p_channel_email,p_channel_event] InputAdapter BroadcastExchange #5 WholeStageCodegen (4) diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80.sf100/explain.txt index bdb1a52a18f2d..70c2e69507b10 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80.sf100/explain.txt @@ -38,12 +38,12 @@ TakeOrderedAndProject (111) : : : +- * Project (24) : : : +- * Filter (23) : : : +- * ColumnarToRow (22) - : : : +- Scan parquet default.promotion (21) + : : : +- Scan parquet default.date_dim (21) : : +- BroadcastExchange (32) : : +- * Project (31) : : +- * Filter (30) : : +- * ColumnarToRow (29) - : : +- Scan parquet default.date_dim (28) + : : +- Scan parquet default.promotion (28) : +- BroadcastExchange (38) : +- * Filter (37) : +- * ColumnarToRow (36) @@ -201,67 +201,67 @@ Join condition: None Output [7]: [ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13] Input [9]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13, i_item_sk#16] -(21) Scan parquet default.promotion -Output [2]: [p_promo_sk#19, p_channel_tv#20] +(21) Scan parquet default.date_dim +Output [2]: [d_date_sk#19, d_date#20] Batched: true -Location [not included in comparison]/{warehouse_dir}/promotion] -PushedFilters: [IsNotNull(p_channel_tv), EqualTo(p_channel_tv,N), IsNotNull(p_promo_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,2000-08-23), LessThanOrEqual(d_date,2000-09-22), IsNotNull(d_date_sk)] +ReadSchema: struct (22) ColumnarToRow [codegen id : 6] -Input [2]: [p_promo_sk#19, p_channel_tv#20] +Input [2]: [d_date_sk#19, d_date#20] (23) Filter [codegen id : 6] -Input [2]: [p_promo_sk#19, p_channel_tv#20] -Condition : ((isnotnull(p_channel_tv#20) AND (p_channel_tv#20 = N)) AND isnotnull(p_promo_sk#19)) +Input [2]: [d_date_sk#19, d_date#20] +Condition : (((isnotnull(d_date#20) AND (d_date#20 >= 2000-08-23)) AND (d_date#20 <= 2000-09-22)) AND isnotnull(d_date_sk#19)) (24) Project [codegen id : 6] -Output [1]: [p_promo_sk#19] -Input [2]: [p_promo_sk#19, p_channel_tv#20] +Output [1]: [d_date_sk#19] +Input [2]: [d_date_sk#19, d_date#20] (25) BroadcastExchange -Input [1]: [p_promo_sk#19] +Input [1]: [d_date_sk#19] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#21] (26) BroadcastHashJoin [codegen id : 9] -Left keys [1]: [ss_promo_sk#3] -Right keys [1]: [p_promo_sk#19] +Left keys [1]: [ss_sold_date_sk#7] +Right keys [1]: [d_date_sk#19] Join condition: None (27) Project [codegen id : 9] -Output [6]: [ss_store_sk#2, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13] -Input [8]: [ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13, p_promo_sk#19] +Output [6]: [ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#12, sr_net_loss#13] +Input [8]: [ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13, d_date_sk#19] -(28) Scan parquet default.date_dim -Output [2]: [d_date_sk#22, d_date#23] +(28) Scan parquet default.promotion +Output [2]: [p_promo_sk#22, p_channel_tv#23] Batched: true -Location [not included in comparison]/{warehouse_dir}/date_dim] -PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,2000-08-23), LessThanOrEqual(d_date,2000-09-22), IsNotNull(d_date_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/promotion] +PushedFilters: [IsNotNull(p_channel_tv), EqualTo(p_channel_tv,N), IsNotNull(p_promo_sk)] +ReadSchema: struct (29) ColumnarToRow [codegen id : 7] -Input [2]: [d_date_sk#22, d_date#23] +Input [2]: [p_promo_sk#22, p_channel_tv#23] (30) Filter [codegen id : 7] -Input [2]: [d_date_sk#22, d_date#23] -Condition : (((isnotnull(d_date#23) AND (d_date#23 >= 2000-08-23)) AND (d_date#23 <= 2000-09-22)) AND isnotnull(d_date_sk#22)) +Input [2]: [p_promo_sk#22, p_channel_tv#23] +Condition : ((isnotnull(p_channel_tv#23) AND (p_channel_tv#23 = N)) AND isnotnull(p_promo_sk#22)) (31) Project [codegen id : 7] -Output [1]: [d_date_sk#22] -Input [2]: [d_date_sk#22, d_date#23] +Output [1]: [p_promo_sk#22] +Input [2]: [p_promo_sk#22, p_channel_tv#23] (32) BroadcastExchange -Input [1]: [d_date_sk#22] +Input [1]: [p_promo_sk#22] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#24] (33) BroadcastHashJoin [codegen id : 9] -Left keys [1]: [ss_sold_date_sk#7] -Right keys [1]: [d_date_sk#22] +Left keys [1]: [ss_promo_sk#3] +Right keys [1]: [p_promo_sk#22] Join condition: None (34) Project [codegen id : 9] Output [5]: [ss_store_sk#2, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#12, sr_net_loss#13] -Input [7]: [ss_store_sk#2, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13, d_date_sk#22] +Input [7]: [ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#12, sr_net_loss#13, p_promo_sk#22] (35) Scan parquet default.store Output [2]: [s_store_sk#25, s_store_id#26] @@ -379,28 +379,28 @@ Output [7]: [cs_catalog_page_sk#47, cs_promo_sk#49, cs_ext_sales_price#51, cs_ne Input [9]: [cs_catalog_page_sk#47, cs_item_sk#48, cs_promo_sk#49, cs_ext_sales_price#51, cs_net_profit#52, cs_sold_date_sk#53, cr_return_amount#57, cr_net_loss#58, i_item_sk#61] (60) ReusedExchange [Reuses operator id: 25] -Output [1]: [p_promo_sk#62] +Output [1]: [d_date_sk#62] (61) BroadcastHashJoin [codegen id : 19] -Left keys [1]: [cs_promo_sk#49] -Right keys [1]: [p_promo_sk#62] +Left keys [1]: [cs_sold_date_sk#53] +Right keys [1]: [d_date_sk#62] Join condition: None (62) Project [codegen id : 19] -Output [6]: [cs_catalog_page_sk#47, cs_ext_sales_price#51, cs_net_profit#52, cs_sold_date_sk#53, cr_return_amount#57, cr_net_loss#58] -Input [8]: [cs_catalog_page_sk#47, cs_promo_sk#49, cs_ext_sales_price#51, cs_net_profit#52, cs_sold_date_sk#53, cr_return_amount#57, cr_net_loss#58, p_promo_sk#62] +Output [6]: [cs_catalog_page_sk#47, cs_promo_sk#49, cs_ext_sales_price#51, cs_net_profit#52, cr_return_amount#57, cr_net_loss#58] +Input [8]: [cs_catalog_page_sk#47, cs_promo_sk#49, cs_ext_sales_price#51, cs_net_profit#52, cs_sold_date_sk#53, cr_return_amount#57, cr_net_loss#58, d_date_sk#62] (63) ReusedExchange [Reuses operator id: 32] -Output [1]: [d_date_sk#63] +Output [1]: [p_promo_sk#63] (64) BroadcastHashJoin [codegen id : 19] -Left keys [1]: [cs_sold_date_sk#53] -Right keys [1]: [d_date_sk#63] +Left keys [1]: [cs_promo_sk#49] +Right keys [1]: [p_promo_sk#63] Join condition: None (65) Project [codegen id : 19] Output [5]: [cs_catalog_page_sk#47, cs_ext_sales_price#51, cs_net_profit#52, cr_return_amount#57, cr_net_loss#58] -Input [7]: [cs_catalog_page_sk#47, cs_ext_sales_price#51, cs_net_profit#52, cs_sold_date_sk#53, cr_return_amount#57, cr_net_loss#58, d_date_sk#63] +Input [7]: [cs_catalog_page_sk#47, cs_promo_sk#49, cs_ext_sales_price#51, cs_net_profit#52, cr_return_amount#57, cr_net_loss#58, p_promo_sk#63] (66) Scan parquet default.catalog_page Output [2]: [cp_catalog_page_sk#64, cp_catalog_page_id#65] @@ -518,28 +518,28 @@ Output [7]: [ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_pr Input [9]: [ws_item_sk#86, ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_profit#91, ws_sold_date_sk#92, wr_return_amt#96, wr_net_loss#97, i_item_sk#100] (91) ReusedExchange [Reuses operator id: 25] -Output [1]: [p_promo_sk#101] +Output [1]: [d_date_sk#101] (92) BroadcastHashJoin [codegen id : 29] -Left keys [1]: [ws_promo_sk#88] -Right keys [1]: [p_promo_sk#101] +Left keys [1]: [ws_sold_date_sk#92] +Right keys [1]: [d_date_sk#101] Join condition: None (93) Project [codegen id : 29] -Output [6]: [ws_web_site_sk#87, ws_ext_sales_price#90, ws_net_profit#91, ws_sold_date_sk#92, wr_return_amt#96, wr_net_loss#97] -Input [8]: [ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_profit#91, ws_sold_date_sk#92, wr_return_amt#96, wr_net_loss#97, p_promo_sk#101] +Output [6]: [ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_profit#91, wr_return_amt#96, wr_net_loss#97] +Input [8]: [ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_profit#91, ws_sold_date_sk#92, wr_return_amt#96, wr_net_loss#97, d_date_sk#101] (94) ReusedExchange [Reuses operator id: 32] -Output [1]: [d_date_sk#102] +Output [1]: [p_promo_sk#102] (95) BroadcastHashJoin [codegen id : 29] -Left keys [1]: [ws_sold_date_sk#92] -Right keys [1]: [d_date_sk#102] +Left keys [1]: [ws_promo_sk#88] +Right keys [1]: [p_promo_sk#102] Join condition: None (96) Project [codegen id : 29] Output [5]: [ws_web_site_sk#87, ws_ext_sales_price#90, ws_net_profit#91, wr_return_amt#96, wr_net_loss#97] -Input [7]: [ws_web_site_sk#87, ws_ext_sales_price#90, ws_net_profit#91, ws_sold_date_sk#92, wr_return_amt#96, wr_net_loss#97, d_date_sk#102] +Input [7]: [ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_profit#91, wr_return_amt#96, wr_net_loss#97, p_promo_sk#102] (97) Scan parquet default.web_site Output [2]: [web_site_sk#103, web_site_id#104] @@ -620,8 +620,8 @@ Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#7 IN dyn ReusedExchange (112) -(112) ReusedExchange [Reuses operator id: 32] -Output [1]: [d_date_sk#22] +(112) ReusedExchange [Reuses operator id: 25] +Output [1]: [d_date_sk#19] Subquery:2 Hosting operator id = 44 Hosting Expression = cs_sold_date_sk#53 IN dynamicpruning#8 diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80.sf100/simplified.txt index ccba19ac63c1a..dd29c26786826 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q80.sf100/simplified.txt @@ -17,9 +17,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] Project [ss_ext_sales_price,ss_net_profit,sr_return_amt,sr_net_loss,s_store_id] BroadcastHashJoin [ss_store_sk,s_store_sk] Project [ss_store_sk,ss_ext_sales_price,ss_net_profit,sr_return_amt,sr_net_loss] - BroadcastHashJoin [ss_sold_date_sk,d_date_sk] - Project [ss_store_sk,ss_ext_sales_price,ss_net_profit,ss_sold_date_sk,sr_return_amt,sr_net_loss] - BroadcastHashJoin [ss_promo_sk,p_promo_sk] + BroadcastHashJoin [ss_promo_sk,p_promo_sk] + Project [ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_net_profit,sr_return_amt,sr_net_loss] + BroadcastHashJoin [ss_sold_date_sk,d_date_sk] Project [ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_net_profit,ss_sold_date_sk,sr_return_amt,sr_net_loss] BroadcastHashJoin [ss_item_sk,i_item_sk] Project [ss_item_sk,ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_net_profit,ss_sold_date_sk,sr_return_amt,sr_net_loss] @@ -55,21 +55,21 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] InputAdapter Scan parquet default.item [i_item_sk,i_current_price] InputAdapter - BroadcastExchange #7 + BroadcastExchange #4 WholeStageCodegen (6) - Project [p_promo_sk] - Filter [p_channel_tv,p_promo_sk] + Project [d_date_sk] + Filter [d_date,d_date_sk] ColumnarToRow InputAdapter - Scan parquet default.promotion [p_promo_sk,p_channel_tv] + Scan parquet default.date_dim [d_date_sk,d_date] InputAdapter - BroadcastExchange #4 + BroadcastExchange #7 WholeStageCodegen (7) - Project [d_date_sk] - Filter [d_date,d_date_sk] + Project [p_promo_sk] + Filter [p_channel_tv,p_promo_sk] ColumnarToRow InputAdapter - Scan parquet default.date_dim [d_date_sk,d_date] + Scan parquet default.promotion [p_promo_sk,p_channel_tv] InputAdapter BroadcastExchange #8 WholeStageCodegen (8) @@ -86,9 +86,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] Project [cs_ext_sales_price,cs_net_profit,cr_return_amount,cr_net_loss,cp_catalog_page_id] BroadcastHashJoin [cs_catalog_page_sk,cp_catalog_page_sk] Project [cs_catalog_page_sk,cs_ext_sales_price,cs_net_profit,cr_return_amount,cr_net_loss] - BroadcastHashJoin [cs_sold_date_sk,d_date_sk] - Project [cs_catalog_page_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk,cr_return_amount,cr_net_loss] - BroadcastHashJoin [cs_promo_sk,p_promo_sk] + BroadcastHashJoin [cs_promo_sk,p_promo_sk] + Project [cs_catalog_page_sk,cs_promo_sk,cs_ext_sales_price,cs_net_profit,cr_return_amount,cr_net_loss] + BroadcastHashJoin [cs_sold_date_sk,d_date_sk] Project [cs_catalog_page_sk,cs_promo_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk,cr_return_amount,cr_net_loss] BroadcastHashJoin [cs_item_sk,i_item_sk] Project [cs_catalog_page_sk,cs_item_sk,cs_promo_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk,cr_return_amount,cr_net_loss] @@ -117,9 +117,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] InputAdapter ReusedExchange [i_item_sk] #6 InputAdapter - ReusedExchange [p_promo_sk] #7 + ReusedExchange [d_date_sk] #4 InputAdapter - ReusedExchange [d_date_sk] #4 + ReusedExchange [p_promo_sk] #7 InputAdapter BroadcastExchange #12 WholeStageCodegen (18) @@ -136,9 +136,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] Project [ws_ext_sales_price,ws_net_profit,wr_return_amt,wr_net_loss,web_site_id] BroadcastHashJoin [ws_web_site_sk,web_site_sk] Project [ws_web_site_sk,ws_ext_sales_price,ws_net_profit,wr_return_amt,wr_net_loss] - BroadcastHashJoin [ws_sold_date_sk,d_date_sk] - Project [ws_web_site_sk,ws_ext_sales_price,ws_net_profit,ws_sold_date_sk,wr_return_amt,wr_net_loss] - BroadcastHashJoin [ws_promo_sk,p_promo_sk] + BroadcastHashJoin [ws_promo_sk,p_promo_sk] + Project [ws_web_site_sk,ws_promo_sk,ws_ext_sales_price,ws_net_profit,wr_return_amt,wr_net_loss] + BroadcastHashJoin [ws_sold_date_sk,d_date_sk] Project [ws_web_site_sk,ws_promo_sk,ws_ext_sales_price,ws_net_profit,ws_sold_date_sk,wr_return_amt,wr_net_loss] BroadcastHashJoin [ws_item_sk,i_item_sk] Project [ws_item_sk,ws_web_site_sk,ws_promo_sk,ws_ext_sales_price,ws_net_profit,ws_sold_date_sk,wr_return_amt,wr_net_loss] @@ -167,9 +167,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] InputAdapter ReusedExchange [i_item_sk] #6 InputAdapter - ReusedExchange [p_promo_sk] #7 + ReusedExchange [d_date_sk] #4 InputAdapter - ReusedExchange [d_date_sk] #4 + ReusedExchange [p_promo_sk] #7 InputAdapter BroadcastExchange #16 WholeStageCodegen (28) diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94.sf100/explain.txt index 8a5b567285939..c9af17b1d319e 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94.sf100/explain.txt @@ -42,12 +42,12 @@ : +- * Project (32) : +- * Filter (31) : +- * ColumnarToRow (30) - : +- Scan parquet default.web_site (29) + : +- Scan parquet default.date_dim (29) +- BroadcastExchange (40) +- * Project (39) +- * Filter (38) +- * ColumnarToRow (37) - +- Scan parquet default.date_dim (36) + +- Scan parquet default.web_site (36) (1) Scan parquet default.web_sales @@ -171,67 +171,67 @@ Join condition: None Output [5]: [ws_ship_date_sk#1, ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7] Input [7]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7, ca_address_sk#18] -(29) Scan parquet default.web_site -Output [2]: [web_site_sk#21, web_company_name#22] +(29) Scan parquet default.date_dim +Output [2]: [d_date_sk#21, d_date#22] Batched: true -Location [not included in comparison]/{warehouse_dir}/web_site] -PushedFilters: [IsNotNull(web_company_name), EqualTo(web_company_name,pri ), IsNotNull(web_site_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,1999-02-01), LessThanOrEqual(d_date,1999-04-02), IsNotNull(d_date_sk)] +ReadSchema: struct (30) ColumnarToRow [codegen id : 10] -Input [2]: [web_site_sk#21, web_company_name#22] +Input [2]: [d_date_sk#21, d_date#22] (31) Filter [codegen id : 10] -Input [2]: [web_site_sk#21, web_company_name#22] -Condition : ((isnotnull(web_company_name#22) AND (web_company_name#22 = pri )) AND isnotnull(web_site_sk#21)) +Input [2]: [d_date_sk#21, d_date#22] +Condition : (((isnotnull(d_date#22) AND (d_date#22 >= 1999-02-01)) AND (d_date#22 <= 1999-04-02)) AND isnotnull(d_date_sk#21)) (32) Project [codegen id : 10] -Output [1]: [web_site_sk#21] -Input [2]: [web_site_sk#21, web_company_name#22] +Output [1]: [d_date_sk#21] +Input [2]: [d_date_sk#21, d_date#22] (33) BroadcastExchange -Input [1]: [web_site_sk#21] +Input [1]: [d_date_sk#21] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#23] (34) BroadcastHashJoin [codegen id : 12] -Left keys [1]: [ws_web_site_sk#3] -Right keys [1]: [web_site_sk#21] +Left keys [1]: [ws_ship_date_sk#1] +Right keys [1]: [d_date_sk#21] Join condition: None (35) Project [codegen id : 12] -Output [4]: [ws_ship_date_sk#1, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7] -Input [6]: [ws_ship_date_sk#1, ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7, web_site_sk#21] +Output [4]: [ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7] +Input [6]: [ws_ship_date_sk#1, ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7, d_date_sk#21] -(36) Scan parquet default.date_dim -Output [2]: [d_date_sk#24, d_date#25] +(36) Scan parquet default.web_site +Output [2]: [web_site_sk#24, web_company_name#25] Batched: true -Location [not included in comparison]/{warehouse_dir}/date_dim] -PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,1999-02-01), LessThanOrEqual(d_date,1999-04-02), IsNotNull(d_date_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/web_site] +PushedFilters: [IsNotNull(web_company_name), EqualTo(web_company_name,pri ), IsNotNull(web_site_sk)] +ReadSchema: struct (37) ColumnarToRow [codegen id : 11] -Input [2]: [d_date_sk#24, d_date#25] +Input [2]: [web_site_sk#24, web_company_name#25] (38) Filter [codegen id : 11] -Input [2]: [d_date_sk#24, d_date#25] -Condition : (((isnotnull(d_date#25) AND (d_date#25 >= 1999-02-01)) AND (d_date#25 <= 1999-04-02)) AND isnotnull(d_date_sk#24)) +Input [2]: [web_site_sk#24, web_company_name#25] +Condition : ((isnotnull(web_company_name#25) AND (web_company_name#25 = pri )) AND isnotnull(web_site_sk#24)) (39) Project [codegen id : 11] -Output [1]: [d_date_sk#24] -Input [2]: [d_date_sk#24, d_date#25] +Output [1]: [web_site_sk#24] +Input [2]: [web_site_sk#24, web_company_name#25] (40) BroadcastExchange -Input [1]: [d_date_sk#24] +Input [1]: [web_site_sk#24] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#26] (41) BroadcastHashJoin [codegen id : 12] -Left keys [1]: [ws_ship_date_sk#1] -Right keys [1]: [d_date_sk#24] +Left keys [1]: [ws_web_site_sk#3] +Right keys [1]: [web_site_sk#24] Join condition: None (42) Project [codegen id : 12] Output [3]: [ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7] -Input [5]: [ws_ship_date_sk#1, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7, d_date_sk#24] +Input [5]: [ws_web_site_sk#3, ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7, web_site_sk#24] (43) HashAggregate [codegen id : 12] Input [3]: [ws_order_number#5, ws_ext_ship_cost#6, ws_net_profit#7] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94.sf100/simplified.txt index 3ef7977c4bc64..c579440e35a97 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q94.sf100/simplified.txt @@ -11,9 +11,9 @@ WholeStageCodegen (14) WholeStageCodegen (12) HashAggregate [ws_order_number,ws_ext_ship_cost,ws_net_profit] [sum(UnscaledValue(ws_ext_ship_cost)),sum(UnscaledValue(ws_net_profit)),sum,sum,sum,sum] Project [ws_order_number,ws_ext_ship_cost,ws_net_profit] - BroadcastHashJoin [ws_ship_date_sk,d_date_sk] - Project [ws_ship_date_sk,ws_order_number,ws_ext_ship_cost,ws_net_profit] - BroadcastHashJoin [ws_web_site_sk,web_site_sk] + BroadcastHashJoin [ws_web_site_sk,web_site_sk] + Project [ws_web_site_sk,ws_order_number,ws_ext_ship_cost,ws_net_profit] + BroadcastHashJoin [ws_ship_date_sk,d_date_sk] Project [ws_ship_date_sk,ws_web_site_sk,ws_order_number,ws_ext_ship_cost,ws_net_profit] BroadcastHashJoin [ws_ship_addr_sk,ca_address_sk] InputAdapter @@ -65,16 +65,16 @@ WholeStageCodegen (14) InputAdapter BroadcastExchange #8 WholeStageCodegen (10) - Project [web_site_sk] - Filter [web_company_name,web_site_sk] + Project [d_date_sk] + Filter [d_date,d_date_sk] ColumnarToRow InputAdapter - Scan parquet default.web_site [web_site_sk,web_company_name] + Scan parquet default.date_dim [d_date_sk,d_date] InputAdapter BroadcastExchange #9 WholeStageCodegen (11) - Project [d_date_sk] - Filter [d_date,d_date_sk] + Project [web_site_sk] + Filter [web_company_name,web_site_sk] ColumnarToRow InputAdapter - Scan parquet default.date_dim [d_date_sk,d_date] + Scan parquet default.web_site [web_site_sk,web_company_name] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95.sf100/explain.txt index ee82855f8c010..414d2246f1946 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95.sf100/explain.txt @@ -57,12 +57,12 @@ : +- * Project (47) : +- * Filter (46) : +- * ColumnarToRow (45) - : +- Scan parquet default.web_site (44) + : +- Scan parquet default.date_dim (44) +- BroadcastExchange (55) +- * Project (54) +- * Filter (53) +- * ColumnarToRow (52) - +- Scan parquet default.date_dim (51) + +- Scan parquet default.web_site (51) (1) Scan parquet default.web_sales @@ -248,67 +248,67 @@ Join condition: None Output [5]: [ws_ship_date_sk#1, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6] Input [7]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, ca_address_sk#24] -(44) Scan parquet default.web_site -Output [2]: [web_site_sk#27, web_company_name#28] +(44) Scan parquet default.date_dim +Output [2]: [d_date_sk#27, d_date#28] Batched: true -Location [not included in comparison]/{warehouse_dir}/web_site] -PushedFilters: [IsNotNull(web_company_name), EqualTo(web_company_name,pri ), IsNotNull(web_site_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,1999-02-01), LessThanOrEqual(d_date,1999-04-02), IsNotNull(d_date_sk)] +ReadSchema: struct (45) ColumnarToRow [codegen id : 19] -Input [2]: [web_site_sk#27, web_company_name#28] +Input [2]: [d_date_sk#27, d_date#28] (46) Filter [codegen id : 19] -Input [2]: [web_site_sk#27, web_company_name#28] -Condition : ((isnotnull(web_company_name#28) AND (web_company_name#28 = pri )) AND isnotnull(web_site_sk#27)) +Input [2]: [d_date_sk#27, d_date#28] +Condition : (((isnotnull(d_date#28) AND (d_date#28 >= 1999-02-01)) AND (d_date#28 <= 1999-04-02)) AND isnotnull(d_date_sk#27)) (47) Project [codegen id : 19] -Output [1]: [web_site_sk#27] -Input [2]: [web_site_sk#27, web_company_name#28] +Output [1]: [d_date_sk#27] +Input [2]: [d_date_sk#27, d_date#28] (48) BroadcastExchange -Input [1]: [web_site_sk#27] +Input [1]: [d_date_sk#27] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#29] (49) BroadcastHashJoin [codegen id : 21] -Left keys [1]: [ws_web_site_sk#3] -Right keys [1]: [web_site_sk#27] +Left keys [1]: [ws_ship_date_sk#1] +Right keys [1]: [d_date_sk#27] Join condition: None (50) Project [codegen id : 21] -Output [4]: [ws_ship_date_sk#1, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6] -Input [6]: [ws_ship_date_sk#1, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, web_site_sk#27] +Output [4]: [ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6] +Input [6]: [ws_ship_date_sk#1, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, d_date_sk#27] -(51) Scan parquet default.date_dim -Output [2]: [d_date_sk#30, d_date#31] +(51) Scan parquet default.web_site +Output [2]: [web_site_sk#30, web_company_name#31] Batched: true -Location [not included in comparison]/{warehouse_dir}/date_dim] -PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,1999-02-01), LessThanOrEqual(d_date,1999-04-02), IsNotNull(d_date_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/web_site] +PushedFilters: [IsNotNull(web_company_name), EqualTo(web_company_name,pri ), IsNotNull(web_site_sk)] +ReadSchema: struct (52) ColumnarToRow [codegen id : 20] -Input [2]: [d_date_sk#30, d_date#31] +Input [2]: [web_site_sk#30, web_company_name#31] (53) Filter [codegen id : 20] -Input [2]: [d_date_sk#30, d_date#31] -Condition : (((isnotnull(d_date#31) AND (d_date#31 >= 1999-02-01)) AND (d_date#31 <= 1999-04-02)) AND isnotnull(d_date_sk#30)) +Input [2]: [web_site_sk#30, web_company_name#31] +Condition : ((isnotnull(web_company_name#31) AND (web_company_name#31 = pri )) AND isnotnull(web_site_sk#30)) (54) Project [codegen id : 20] -Output [1]: [d_date_sk#30] -Input [2]: [d_date_sk#30, d_date#31] +Output [1]: [web_site_sk#30] +Input [2]: [web_site_sk#30, web_company_name#31] (55) BroadcastExchange -Input [1]: [d_date_sk#30] +Input [1]: [web_site_sk#30] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#32] (56) BroadcastHashJoin [codegen id : 21] -Left keys [1]: [ws_ship_date_sk#1] -Right keys [1]: [d_date_sk#30] +Left keys [1]: [ws_web_site_sk#3] +Right keys [1]: [web_site_sk#30] Join condition: None (57) Project [codegen id : 21] Output [3]: [ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6] -Input [5]: [ws_ship_date_sk#1, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, d_date_sk#30] +Input [5]: [ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, web_site_sk#30] (58) HashAggregate [codegen id : 21] Input [3]: [ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95.sf100/simplified.txt index 439f3935c65a3..9c642269f6931 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q95.sf100/simplified.txt @@ -11,9 +11,9 @@ WholeStageCodegen (23) WholeStageCodegen (21) HashAggregate [ws_order_number,ws_ext_ship_cost,ws_net_profit] [sum(UnscaledValue(ws_ext_ship_cost)),sum(UnscaledValue(ws_net_profit)),sum,sum,sum,sum] Project [ws_order_number,ws_ext_ship_cost,ws_net_profit] - BroadcastHashJoin [ws_ship_date_sk,d_date_sk] - Project [ws_ship_date_sk,ws_order_number,ws_ext_ship_cost,ws_net_profit] - BroadcastHashJoin [ws_web_site_sk,web_site_sk] + BroadcastHashJoin [ws_web_site_sk,web_site_sk] + Project [ws_web_site_sk,ws_order_number,ws_ext_ship_cost,ws_net_profit] + BroadcastHashJoin [ws_ship_date_sk,d_date_sk] Project [ws_ship_date_sk,ws_web_site_sk,ws_order_number,ws_ext_ship_cost,ws_net_profit] BroadcastHashJoin [ws_ship_addr_sk,ca_address_sk] InputAdapter @@ -95,16 +95,16 @@ WholeStageCodegen (23) InputAdapter BroadcastExchange #9 WholeStageCodegen (19) - Project [web_site_sk] - Filter [web_company_name,web_site_sk] + Project [d_date_sk] + Filter [d_date,d_date_sk] ColumnarToRow InputAdapter - Scan parquet default.web_site [web_site_sk,web_company_name] + Scan parquet default.date_dim [d_date_sk,d_date] InputAdapter BroadcastExchange #10 WholeStageCodegen (20) - Project [d_date_sk] - Filter [d_date,d_date_sk] + Project [web_site_sk] + Filter [web_company_name,web_site_sk] ColumnarToRow InputAdapter - Scan parquet default.date_dim [d_date_sk,d_date] + Scan parquet default.web_site [web_site_sk,web_company_name] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22a.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22a.sf100/explain.txt index f5a7a9135cf29..c0bf2984919fc 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22a.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22a.sf100/explain.txt @@ -12,20 +12,20 @@ TakeOrderedAndProject (52) : : +- Exchange (17) : : +- * Project (16) : : +- * BroadcastHashJoin Inner BuildRight (15) - : : :- * Project (9) - : : : +- * BroadcastHashJoin Inner BuildRight (8) + : : :- * Project (10) + : : : +- * BroadcastHashJoin Inner BuildRight (9) : : : :- * Filter (3) : : : : +- * ColumnarToRow (2) : : : : +- Scan parquet default.inventory (1) - : : : +- BroadcastExchange (7) - : : : +- * Filter (6) - : : : +- * ColumnarToRow (5) - : : : +- Scan parquet default.warehouse (4) + : : : +- BroadcastExchange (8) + : : : +- * Project (7) + : : : +- * Filter (6) + : : : +- * ColumnarToRow (5) + : : : +- Scan parquet default.date_dim (4) : : +- BroadcastExchange (14) - : : +- * Project (13) - : : +- * Filter (12) - : : +- * ColumnarToRow (11) - : : +- Scan parquet default.date_dim (10) + : : +- * Filter (13) + : : +- * ColumnarToRow (12) + : : +- Scan parquet default.warehouse (11) : +- * Sort (23) : +- Exchange (22) : +- * Filter (21) @@ -68,63 +68,63 @@ Input [4]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3, inv_date_ Input [4]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3, inv_date_sk#4] Condition : (isnotnull(inv_item_sk#1) AND isnotnull(inv_warehouse_sk#2)) -(4) Scan parquet default.warehouse -Output [1]: [w_warehouse_sk#6] +(4) Scan parquet default.date_dim +Output [2]: [d_date_sk#6, d_month_seq#7] Batched: true -Location [not included in comparison]/{warehouse_dir}/warehouse] -PushedFilters: [IsNotNull(w_warehouse_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_month_seq), GreaterThanOrEqual(d_month_seq,1212), LessThanOrEqual(d_month_seq,1223), IsNotNull(d_date_sk)] +ReadSchema: struct (5) ColumnarToRow [codegen id : 1] -Input [1]: [w_warehouse_sk#6] +Input [2]: [d_date_sk#6, d_month_seq#7] (6) Filter [codegen id : 1] -Input [1]: [w_warehouse_sk#6] -Condition : isnotnull(w_warehouse_sk#6) +Input [2]: [d_date_sk#6, d_month_seq#7] +Condition : (((isnotnull(d_month_seq#7) AND (d_month_seq#7 >= 1212)) AND (d_month_seq#7 <= 1223)) AND isnotnull(d_date_sk#6)) -(7) BroadcastExchange -Input [1]: [w_warehouse_sk#6] -Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#7] +(7) Project [codegen id : 1] +Output [1]: [d_date_sk#6] +Input [2]: [d_date_sk#6, d_month_seq#7] -(8) BroadcastHashJoin [codegen id : 3] -Left keys [1]: [inv_warehouse_sk#2] -Right keys [1]: [w_warehouse_sk#6] +(8) BroadcastExchange +Input [1]: [d_date_sk#6] +Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#8] + +(9) BroadcastHashJoin [codegen id : 3] +Left keys [1]: [inv_date_sk#4] +Right keys [1]: [d_date_sk#6] Join condition: None -(9) Project [codegen id : 3] -Output [3]: [inv_item_sk#1, inv_quantity_on_hand#3, inv_date_sk#4] -Input [5]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3, inv_date_sk#4, w_warehouse_sk#6] +(10) Project [codegen id : 3] +Output [3]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3] +Input [5]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3, inv_date_sk#4, d_date_sk#6] -(10) Scan parquet default.date_dim -Output [2]: [d_date_sk#8, d_month_seq#9] +(11) Scan parquet default.warehouse +Output [1]: [w_warehouse_sk#9] Batched: true -Location [not included in comparison]/{warehouse_dir}/date_dim] -PushedFilters: [IsNotNull(d_month_seq), GreaterThanOrEqual(d_month_seq,1212), LessThanOrEqual(d_month_seq,1223), IsNotNull(d_date_sk)] -ReadSchema: struct - -(11) ColumnarToRow [codegen id : 2] -Input [2]: [d_date_sk#8, d_month_seq#9] +Location [not included in comparison]/{warehouse_dir}/warehouse] +PushedFilters: [IsNotNull(w_warehouse_sk)] +ReadSchema: struct -(12) Filter [codegen id : 2] -Input [2]: [d_date_sk#8, d_month_seq#9] -Condition : (((isnotnull(d_month_seq#9) AND (d_month_seq#9 >= 1212)) AND (d_month_seq#9 <= 1223)) AND isnotnull(d_date_sk#8)) +(12) ColumnarToRow [codegen id : 2] +Input [1]: [w_warehouse_sk#9] -(13) Project [codegen id : 2] -Output [1]: [d_date_sk#8] -Input [2]: [d_date_sk#8, d_month_seq#9] +(13) Filter [codegen id : 2] +Input [1]: [w_warehouse_sk#9] +Condition : isnotnull(w_warehouse_sk#9) (14) BroadcastExchange -Input [1]: [d_date_sk#8] -Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#10] +Input [1]: [w_warehouse_sk#9] +Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#10] (15) BroadcastHashJoin [codegen id : 3] -Left keys [1]: [inv_date_sk#4] -Right keys [1]: [d_date_sk#8] +Left keys [1]: [inv_warehouse_sk#2] +Right keys [1]: [w_warehouse_sk#9] Join condition: None (16) Project [codegen id : 3] Output [2]: [inv_item_sk#1, inv_quantity_on_hand#3] -Input [4]: [inv_item_sk#1, inv_quantity_on_hand#3, inv_date_sk#4, d_date_sk#8] +Input [4]: [inv_item_sk#1, inv_warehouse_sk#2, inv_quantity_on_hand#3, w_warehouse_sk#9] (17) Exchange Input [2]: [inv_item_sk#1, inv_quantity_on_hand#3] @@ -321,7 +321,7 @@ Subquery:1 Hosting operator id = 1 Hosting Expression = inv_date_sk#4 IN dynamic ReusedExchange (53) -(53) ReusedExchange [Reuses operator id: 14] -Output [1]: [d_date_sk#8] +(53) ReusedExchange [Reuses operator id: 8] +Output [1]: [d_date_sk#6] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22a.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22a.sf100/simplified.txt index 492883dbb392b..fa861d6246c07 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22a.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22a.sf100/simplified.txt @@ -17,9 +17,9 @@ TakeOrderedAndProject [qoh,i_product_name,i_brand,i_class,i_category] Exchange [inv_item_sk] #2 WholeStageCodegen (3) Project [inv_item_sk,inv_quantity_on_hand] - BroadcastHashJoin [inv_date_sk,d_date_sk] - Project [inv_item_sk,inv_quantity_on_hand,inv_date_sk] - BroadcastHashJoin [inv_warehouse_sk,w_warehouse_sk] + BroadcastHashJoin [inv_warehouse_sk,w_warehouse_sk] + Project [inv_item_sk,inv_warehouse_sk,inv_quantity_on_hand] + BroadcastHashJoin [inv_date_sk,d_date_sk] Filter [inv_item_sk,inv_warehouse_sk] ColumnarToRow InputAdapter @@ -27,20 +27,20 @@ TakeOrderedAndProject [qoh,i_product_name,i_brand,i_class,i_category] SubqueryBroadcast [d_date_sk] #1 ReusedExchange [d_date_sk] #3 InputAdapter - BroadcastExchange #4 + BroadcastExchange #3 WholeStageCodegen (1) - Filter [w_warehouse_sk] - ColumnarToRow - InputAdapter - Scan parquet default.warehouse [w_warehouse_sk] + Project [d_date_sk] + Filter [d_month_seq,d_date_sk] + ColumnarToRow + InputAdapter + Scan parquet default.date_dim [d_date_sk,d_month_seq] InputAdapter - BroadcastExchange #3 + BroadcastExchange #4 WholeStageCodegen (2) - Project [d_date_sk] - Filter [d_month_seq,d_date_sk] - ColumnarToRow - InputAdapter - Scan parquet default.date_dim [d_date_sk,d_month_seq] + Filter [w_warehouse_sk] + ColumnarToRow + InputAdapter + Scan parquet default.warehouse [w_warehouse_sk] InputAdapter WholeStageCodegen (6) Sort [i_item_sk] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q27a.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q27a.sf100/explain.txt index 1fb9533024b2f..f05f4e9f2e43e 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q27a.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q27a.sf100/explain.txt @@ -40,20 +40,20 @@ TakeOrderedAndProject (77) : +- * BroadcastHashJoin Inner BuildRight (50) : :- * Project (48) : : +- * BroadcastHashJoin Inner BuildRight (47) - : : :- * Project (45) - : : : +- * BroadcastHashJoin Inner BuildRight (44) + : : :- * Project (41) + : : : +- * BroadcastHashJoin Inner BuildRight (40) : : : :- * Project (38) : : : : +- * BroadcastHashJoin Inner BuildRight (37) : : : : :- * Filter (35) : : : : : +- * ColumnarToRow (34) : : : : : +- Scan parquet default.store_sales (33) : : : : +- ReusedExchange (36) - : : : +- BroadcastExchange (43) - : : : +- * Project (42) - : : : +- * Filter (41) - : : : +- * ColumnarToRow (40) - : : : +- Scan parquet default.store (39) - : : +- ReusedExchange (46) + : : : +- ReusedExchange (39) + : : +- BroadcastExchange (46) + : : +- * Project (45) + : : +- * Filter (44) + : : +- * ColumnarToRow (43) + : : +- Scan parquet default.store (42) : +- ReusedExchange (49) +- * HashAggregate (75) +- Exchange (74) @@ -254,48 +254,48 @@ Join condition: None Output [7]: [ss_item_sk#54, ss_store_sk#56, ss_quantity#57, ss_list_price#58, ss_sales_price#59, ss_coupon_amt#60, ss_sold_date_sk#61] Input [9]: [ss_item_sk#54, ss_cdemo_sk#55, ss_store_sk#56, ss_quantity#57, ss_list_price#58, ss_sales_price#59, ss_coupon_amt#60, ss_sold_date_sk#61, cd_demo_sk#62] -(39) Scan parquet default.store -Output [2]: [s_store_sk#63, s_state#64] +(39) ReusedExchange [Reuses operator id: 15] +Output [1]: [d_date_sk#63] + +(40) BroadcastHashJoin [codegen id : 11] +Left keys [1]: [ss_sold_date_sk#61] +Right keys [1]: [d_date_sk#63] +Join condition: None + +(41) Project [codegen id : 11] +Output [6]: [ss_item_sk#54, ss_store_sk#56, ss_quantity#57, ss_list_price#58, ss_sales_price#59, ss_coupon_amt#60] +Input [8]: [ss_item_sk#54, ss_store_sk#56, ss_quantity#57, ss_list_price#58, ss_sales_price#59, ss_coupon_amt#60, ss_sold_date_sk#61, d_date_sk#63] + +(42) Scan parquet default.store +Output [2]: [s_store_sk#64, s_state#65] Batched: true Location [not included in comparison]/{warehouse_dir}/store] PushedFilters: [IsNotNull(s_state), EqualTo(s_state,TN), IsNotNull(s_store_sk)] ReadSchema: struct -(40) ColumnarToRow [codegen id : 8] -Input [2]: [s_store_sk#63, s_state#64] - -(41) Filter [codegen id : 8] -Input [2]: [s_store_sk#63, s_state#64] -Condition : ((isnotnull(s_state#64) AND (s_state#64 = TN)) AND isnotnull(s_store_sk#63)) - -(42) Project [codegen id : 8] -Output [1]: [s_store_sk#63] -Input [2]: [s_store_sk#63, s_state#64] - -(43) BroadcastExchange -Input [1]: [s_store_sk#63] -Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#65] +(43) ColumnarToRow [codegen id : 9] +Input [2]: [s_store_sk#64, s_state#65] -(44) BroadcastHashJoin [codegen id : 11] -Left keys [1]: [ss_store_sk#56] -Right keys [1]: [s_store_sk#63] -Join condition: None +(44) Filter [codegen id : 9] +Input [2]: [s_store_sk#64, s_state#65] +Condition : ((isnotnull(s_state#65) AND (s_state#65 = TN)) AND isnotnull(s_store_sk#64)) -(45) Project [codegen id : 11] -Output [6]: [ss_item_sk#54, ss_quantity#57, ss_list_price#58, ss_sales_price#59, ss_coupon_amt#60, ss_sold_date_sk#61] -Input [8]: [ss_item_sk#54, ss_store_sk#56, ss_quantity#57, ss_list_price#58, ss_sales_price#59, ss_coupon_amt#60, ss_sold_date_sk#61, s_store_sk#63] +(45) Project [codegen id : 9] +Output [1]: [s_store_sk#64] +Input [2]: [s_store_sk#64, s_state#65] -(46) ReusedExchange [Reuses operator id: 15] -Output [1]: [d_date_sk#66] +(46) BroadcastExchange +Input [1]: [s_store_sk#64] +Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#66] (47) BroadcastHashJoin [codegen id : 11] -Left keys [1]: [ss_sold_date_sk#61] -Right keys [1]: [d_date_sk#66] +Left keys [1]: [ss_store_sk#56] +Right keys [1]: [s_store_sk#64] Join condition: None (48) Project [codegen id : 11] Output [5]: [ss_item_sk#54, ss_quantity#57, ss_list_price#58, ss_sales_price#59, ss_coupon_amt#60] -Input [7]: [ss_item_sk#54, ss_quantity#57, ss_list_price#58, ss_sales_price#59, ss_coupon_amt#60, ss_sold_date_sk#61, d_date_sk#66] +Input [7]: [ss_item_sk#54, ss_store_sk#56, ss_quantity#57, ss_list_price#58, ss_sales_price#59, ss_coupon_amt#60, s_store_sk#64] (49) ReusedExchange [Reuses operator id: 27] Output [2]: [i_item_sk#67, i_item_id#68] @@ -354,29 +354,29 @@ Join condition: None Output [7]: [ss_item_sk#96, ss_store_sk#98, ss_quantity#99, ss_list_price#100, ss_sales_price#101, ss_coupon_amt#102, ss_sold_date_sk#103] Input [9]: [ss_item_sk#96, ss_cdemo_sk#97, ss_store_sk#98, ss_quantity#99, ss_list_price#100, ss_sales_price#101, ss_coupon_amt#102, ss_sold_date_sk#103, cd_demo_sk#104] -(61) ReusedExchange [Reuses operator id: 43] -Output [1]: [s_store_sk#105] +(61) ReusedExchange [Reuses operator id: 15] +Output [1]: [d_date_sk#105] (62) BroadcastHashJoin [codegen id : 17] -Left keys [1]: [ss_store_sk#98] -Right keys [1]: [s_store_sk#105] +Left keys [1]: [ss_sold_date_sk#103] +Right keys [1]: [d_date_sk#105] Join condition: None (63) Project [codegen id : 17] -Output [6]: [ss_item_sk#96, ss_quantity#99, ss_list_price#100, ss_sales_price#101, ss_coupon_amt#102, ss_sold_date_sk#103] -Input [8]: [ss_item_sk#96, ss_store_sk#98, ss_quantity#99, ss_list_price#100, ss_sales_price#101, ss_coupon_amt#102, ss_sold_date_sk#103, s_store_sk#105] +Output [6]: [ss_item_sk#96, ss_store_sk#98, ss_quantity#99, ss_list_price#100, ss_sales_price#101, ss_coupon_amt#102] +Input [8]: [ss_item_sk#96, ss_store_sk#98, ss_quantity#99, ss_list_price#100, ss_sales_price#101, ss_coupon_amt#102, ss_sold_date_sk#103, d_date_sk#105] -(64) ReusedExchange [Reuses operator id: 15] -Output [1]: [d_date_sk#106] +(64) ReusedExchange [Reuses operator id: 46] +Output [1]: [s_store_sk#106] (65) BroadcastHashJoin [codegen id : 17] -Left keys [1]: [ss_sold_date_sk#103] -Right keys [1]: [d_date_sk#106] +Left keys [1]: [ss_store_sk#98] +Right keys [1]: [s_store_sk#106] Join condition: None (66) Project [codegen id : 17] Output [5]: [ss_item_sk#96, ss_quantity#99, ss_list_price#100, ss_sales_price#101, ss_coupon_amt#102] -Input [7]: [ss_item_sk#96, ss_quantity#99, ss_list_price#100, ss_sales_price#101, ss_coupon_amt#102, ss_sold_date_sk#103, d_date_sk#106] +Input [7]: [ss_item_sk#96, ss_store_sk#98, ss_quantity#99, ss_list_price#100, ss_sales_price#101, ss_coupon_amt#102, s_store_sk#106] (67) Scan parquet default.item Output [1]: [i_item_sk#107] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q27a.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q27a.sf100/simplified.txt index e134318874eb8..ac6635c260051 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q27a.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q27a.sf100/simplified.txt @@ -59,9 +59,9 @@ TakeOrderedAndProject [i_item_id,s_state,g_state,agg1,agg2,agg3,agg4] Project [i_item_id,ss_quantity,ss_list_price,ss_coupon_amt,ss_sales_price] BroadcastHashJoin [ss_item_sk,i_item_sk] Project [ss_item_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt] - BroadcastHashJoin [ss_sold_date_sk,d_date_sk] - Project [ss_item_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastHashJoin [ss_store_sk,s_store_sk] + BroadcastHashJoin [ss_store_sk,s_store_sk] + Project [ss_item_sk,ss_store_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt] + BroadcastHashJoin [ss_sold_date_sk,d_date_sk] Project [ss_item_sk,ss_store_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt,ss_sold_date_sk] BroadcastHashJoin [ss_cdemo_sk,cd_demo_sk] Filter [ss_cdemo_sk,ss_store_sk,ss_item_sk] @@ -72,15 +72,15 @@ TakeOrderedAndProject [i_item_id,s_state,g_state,agg1,agg2,agg3,agg4] InputAdapter ReusedExchange [cd_demo_sk] #3 InputAdapter - BroadcastExchange #7 - WholeStageCodegen (8) - Project [s_store_sk] - Filter [s_state,s_store_sk] - ColumnarToRow - InputAdapter - Scan parquet default.store [s_store_sk,s_state] + ReusedExchange [d_date_sk] #2 InputAdapter - ReusedExchange [d_date_sk] #2 + BroadcastExchange #7 + WholeStageCodegen (9) + Project [s_store_sk] + Filter [s_state,s_store_sk] + ColumnarToRow + InputAdapter + Scan parquet default.store [s_store_sk,s_state] InputAdapter ReusedExchange [i_item_sk,i_item_id] #5 WholeStageCodegen (18) @@ -92,9 +92,9 @@ TakeOrderedAndProject [i_item_id,s_state,g_state,agg1,agg2,agg3,agg4] Project [ss_quantity,ss_list_price,ss_coupon_amt,ss_sales_price] BroadcastHashJoin [ss_item_sk,i_item_sk] Project [ss_item_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt] - BroadcastHashJoin [ss_sold_date_sk,d_date_sk] - Project [ss_item_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastHashJoin [ss_store_sk,s_store_sk] + BroadcastHashJoin [ss_store_sk,s_store_sk] + Project [ss_item_sk,ss_store_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt] + BroadcastHashJoin [ss_sold_date_sk,d_date_sk] Project [ss_item_sk,ss_store_sk,ss_quantity,ss_list_price,ss_sales_price,ss_coupon_amt,ss_sold_date_sk] BroadcastHashJoin [ss_cdemo_sk,cd_demo_sk] Filter [ss_cdemo_sk,ss_store_sk,ss_item_sk] @@ -105,9 +105,9 @@ TakeOrderedAndProject [i_item_id,s_state,g_state,agg1,agg2,agg3,agg4] InputAdapter ReusedExchange [cd_demo_sk] #3 InputAdapter - ReusedExchange [s_store_sk] #7 + ReusedExchange [d_date_sk] #2 InputAdapter - ReusedExchange [d_date_sk] #2 + ReusedExchange [s_store_sk] #7 InputAdapter BroadcastExchange #9 WholeStageCodegen (16) diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q6.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q6.sf100/explain.txt index 3f2b62a7b8fa4..8a6890fea05f2 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q6.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q6.sf100/explain.txt @@ -11,30 +11,30 @@ TakeOrderedAndProject (50) : +- Exchange (27) : +- * Project (26) : +- * BroadcastHashJoin Inner BuildRight (25) - : :- * Project (19) - : : +- * BroadcastHashJoin Inner BuildRight (18) + : :- * Project (10) + : : +- * BroadcastHashJoin Inner BuildRight (9) : : :- * Filter (3) : : : +- * ColumnarToRow (2) : : : +- Scan parquet default.store_sales (1) - : : +- BroadcastExchange (17) - : : +- * Project (16) - : : +- * Filter (15) - : : +- * BroadcastHashJoin LeftOuter BuildRight (14) - : : :- * Filter (6) - : : : +- * ColumnarToRow (5) - : : : +- Scan parquet default.item (4) - : : +- BroadcastExchange (13) - : : +- * HashAggregate (12) - : : +- Exchange (11) - : : +- * HashAggregate (10) - : : +- * Filter (9) - : : +- * ColumnarToRow (8) - : : +- Scan parquet default.item (7) + : : +- BroadcastExchange (8) + : : +- * Project (7) + : : +- * Filter (6) + : : +- * ColumnarToRow (5) + : : +- Scan parquet default.date_dim (4) : +- BroadcastExchange (24) : +- * Project (23) : +- * Filter (22) - : +- * ColumnarToRow (21) - : +- Scan parquet default.date_dim (20) + : +- * BroadcastHashJoin LeftOuter BuildRight (21) + : :- * Filter (13) + : : +- * ColumnarToRow (12) + : : +- Scan parquet default.item (11) + : +- BroadcastExchange (20) + : +- * HashAggregate (19) + : +- Exchange (18) + : +- * HashAggregate (17) + : +- * Filter (16) + : +- * ColumnarToRow (15) + : +- Scan parquet default.item (14) +- * Sort (42) +- Exchange (41) +- * Project (40) @@ -66,112 +66,112 @@ Input [3]: [ss_item_sk#1, ss_customer_sk#2, ss_sold_date_sk#3] Input [3]: [ss_item_sk#1, ss_customer_sk#2, ss_sold_date_sk#3] Condition : (isnotnull(ss_customer_sk#2) AND isnotnull(ss_item_sk#1)) -(4) Scan parquet default.item -Output [3]: [i_item_sk#5, i_current_price#6, i_category#7] +(4) Scan parquet default.date_dim +Output [2]: [d_date_sk#5, d_month_seq#6] Batched: true -Location [not included in comparison]/{warehouse_dir}/item] -PushedFilters: [IsNotNull(i_current_price), IsNotNull(i_item_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_month_seq), IsNotNull(d_date_sk)] +ReadSchema: struct -(5) ColumnarToRow [codegen id : 3] -Input [3]: [i_item_sk#5, i_current_price#6, i_category#7] +(5) ColumnarToRow [codegen id : 1] +Input [2]: [d_date_sk#5, d_month_seq#6] -(6) Filter [codegen id : 3] -Input [3]: [i_item_sk#5, i_current_price#6, i_category#7] -Condition : (isnotnull(i_current_price#6) AND isnotnull(i_item_sk#5)) +(6) Filter [codegen id : 1] +Input [2]: [d_date_sk#5, d_month_seq#6] +Condition : ((isnotnull(d_month_seq#6) AND (d_month_seq#6 = Subquery scalar-subquery#7, [id=#8])) AND isnotnull(d_date_sk#5)) -(7) Scan parquet default.item -Output [2]: [i_current_price#8, i_category#9] -Batched: true -Location [not included in comparison]/{warehouse_dir}/item] -PushedFilters: [IsNotNull(i_category)] -ReadSchema: struct +(7) Project [codegen id : 1] +Output [1]: [d_date_sk#5] +Input [2]: [d_date_sk#5, d_month_seq#6] -(8) ColumnarToRow [codegen id : 1] -Input [2]: [i_current_price#8, i_category#9] - -(9) Filter [codegen id : 1] -Input [2]: [i_current_price#8, i_category#9] -Condition : isnotnull(i_category#9) - -(10) HashAggregate [codegen id : 1] -Input [2]: [i_current_price#8, i_category#9] -Keys [1]: [i_category#9] -Functions [1]: [partial_avg(UnscaledValue(i_current_price#8))] -Aggregate Attributes [2]: [sum#10, count#11] -Results [3]: [i_category#9, sum#12, count#13] - -(11) Exchange -Input [3]: [i_category#9, sum#12, count#13] -Arguments: hashpartitioning(i_category#9, 5), ENSURE_REQUIREMENTS, [id=#14] - -(12) HashAggregate [codegen id : 2] -Input [3]: [i_category#9, sum#12, count#13] -Keys [1]: [i_category#9] -Functions [1]: [avg(UnscaledValue(i_current_price#8))] -Aggregate Attributes [1]: [avg(UnscaledValue(i_current_price#8))#15] -Results [2]: [cast((avg(UnscaledValue(i_current_price#8))#15 / 100.0) as decimal(11,6)) AS avg(i_current_price)#16, i_category#9] - -(13) BroadcastExchange -Input [2]: [avg(i_current_price)#16, i_category#9] -Arguments: HashedRelationBroadcastMode(List(input[1, string, true]),false), [id=#17] - -(14) BroadcastHashJoin [codegen id : 3] -Left keys [1]: [i_category#7] -Right keys [1]: [i_category#9] -Join condition: None +(8) BroadcastExchange +Input [1]: [d_date_sk#5] +Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#9] -(15) Filter [codegen id : 3] -Input [5]: [i_item_sk#5, i_current_price#6, i_category#7, avg(i_current_price)#16, i_category#9] -Condition : (cast(i_current_price#6 as decimal(14,7)) > CheckOverflow((1.200000 * promote_precision(avg(i_current_price)#16)), DecimalType(14,7), true)) +(9) BroadcastHashJoin [codegen id : 5] +Left keys [1]: [ss_sold_date_sk#3] +Right keys [1]: [d_date_sk#5] +Join condition: None -(16) Project [codegen id : 3] -Output [1]: [i_item_sk#5] -Input [5]: [i_item_sk#5, i_current_price#6, i_category#7, avg(i_current_price)#16, i_category#9] +(10) Project [codegen id : 5] +Output [2]: [ss_item_sk#1, ss_customer_sk#2] +Input [4]: [ss_item_sk#1, ss_customer_sk#2, ss_sold_date_sk#3, d_date_sk#5] -(17) BroadcastExchange -Input [1]: [i_item_sk#5] -Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#18] +(11) Scan parquet default.item +Output [3]: [i_item_sk#10, i_current_price#11, i_category#12] +Batched: true +Location [not included in comparison]/{warehouse_dir}/item] +PushedFilters: [IsNotNull(i_current_price), IsNotNull(i_item_sk)] +ReadSchema: struct -(18) BroadcastHashJoin [codegen id : 5] -Left keys [1]: [ss_item_sk#1] -Right keys [1]: [i_item_sk#5] -Join condition: None +(12) ColumnarToRow [codegen id : 4] +Input [3]: [i_item_sk#10, i_current_price#11, i_category#12] -(19) Project [codegen id : 5] -Output [2]: [ss_customer_sk#2, ss_sold_date_sk#3] -Input [4]: [ss_item_sk#1, ss_customer_sk#2, ss_sold_date_sk#3, i_item_sk#5] +(13) Filter [codegen id : 4] +Input [3]: [i_item_sk#10, i_current_price#11, i_category#12] +Condition : (isnotnull(i_current_price#11) AND isnotnull(i_item_sk#10)) -(20) Scan parquet default.date_dim -Output [2]: [d_date_sk#19, d_month_seq#20] +(14) Scan parquet default.item +Output [2]: [i_current_price#13, i_category#14] Batched: true -Location [not included in comparison]/{warehouse_dir}/date_dim] -PushedFilters: [IsNotNull(d_month_seq), IsNotNull(d_date_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/item] +PushedFilters: [IsNotNull(i_category)] +ReadSchema: struct -(21) ColumnarToRow [codegen id : 4] -Input [2]: [d_date_sk#19, d_month_seq#20] +(15) ColumnarToRow [codegen id : 2] +Input [2]: [i_current_price#13, i_category#14] + +(16) Filter [codegen id : 2] +Input [2]: [i_current_price#13, i_category#14] +Condition : isnotnull(i_category#14) + +(17) HashAggregate [codegen id : 2] +Input [2]: [i_current_price#13, i_category#14] +Keys [1]: [i_category#14] +Functions [1]: [partial_avg(UnscaledValue(i_current_price#13))] +Aggregate Attributes [2]: [sum#15, count#16] +Results [3]: [i_category#14, sum#17, count#18] + +(18) Exchange +Input [3]: [i_category#14, sum#17, count#18] +Arguments: hashpartitioning(i_category#14, 5), ENSURE_REQUIREMENTS, [id=#19] + +(19) HashAggregate [codegen id : 3] +Input [3]: [i_category#14, sum#17, count#18] +Keys [1]: [i_category#14] +Functions [1]: [avg(UnscaledValue(i_current_price#13))] +Aggregate Attributes [1]: [avg(UnscaledValue(i_current_price#13))#20] +Results [2]: [cast((avg(UnscaledValue(i_current_price#13))#20 / 100.0) as decimal(11,6)) AS avg(i_current_price)#21, i_category#14] + +(20) BroadcastExchange +Input [2]: [avg(i_current_price)#21, i_category#14] +Arguments: HashedRelationBroadcastMode(List(input[1, string, true]),false), [id=#22] + +(21) BroadcastHashJoin [codegen id : 4] +Left keys [1]: [i_category#12] +Right keys [1]: [i_category#14] +Join condition: None (22) Filter [codegen id : 4] -Input [2]: [d_date_sk#19, d_month_seq#20] -Condition : ((isnotnull(d_month_seq#20) AND (d_month_seq#20 = Subquery scalar-subquery#21, [id=#22])) AND isnotnull(d_date_sk#19)) +Input [5]: [i_item_sk#10, i_current_price#11, i_category#12, avg(i_current_price)#21, i_category#14] +Condition : (cast(i_current_price#11 as decimal(14,7)) > CheckOverflow((1.200000 * promote_precision(avg(i_current_price)#21)), DecimalType(14,7), true)) (23) Project [codegen id : 4] -Output [1]: [d_date_sk#19] -Input [2]: [d_date_sk#19, d_month_seq#20] +Output [1]: [i_item_sk#10] +Input [5]: [i_item_sk#10, i_current_price#11, i_category#12, avg(i_current_price)#21, i_category#14] (24) BroadcastExchange -Input [1]: [d_date_sk#19] +Input [1]: [i_item_sk#10] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#23] (25) BroadcastHashJoin [codegen id : 5] -Left keys [1]: [ss_sold_date_sk#3] -Right keys [1]: [d_date_sk#19] +Left keys [1]: [ss_item_sk#1] +Right keys [1]: [i_item_sk#10] Join condition: None (26) Project [codegen id : 5] Output [1]: [ss_customer_sk#2] -Input [3]: [ss_customer_sk#2, ss_sold_date_sk#3, d_date_sk#19] +Input [3]: [ss_item_sk#1, ss_customer_sk#2, i_item_sk#10] (27) Exchange Input [1]: [ss_customer_sk#2] @@ -287,10 +287,10 @@ Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#3 IN dyn ReusedExchange (51) -(51) ReusedExchange [Reuses operator id: 24] -Output [1]: [d_date_sk#19] +(51) ReusedExchange [Reuses operator id: 8] +Output [1]: [d_date_sk#5] -Subquery:2 Hosting operator id = 22 Hosting Expression = Subquery scalar-subquery#21, [id=#22] +Subquery:2 Hosting operator id = 6 Hosting Expression = Subquery scalar-subquery#7, [id=#8] * HashAggregate (58) +- Exchange (57) +- * HashAggregate (56) diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q6.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q6.sf100/simplified.txt index f3badf6efe6b6..a1dd7020b9d02 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q6.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q6.sf100/simplified.txt @@ -16,9 +16,9 @@ TakeOrderedAndProject [cnt,ca_state,state] Exchange [ss_customer_sk] #2 WholeStageCodegen (5) Project [ss_customer_sk] - BroadcastHashJoin [ss_sold_date_sk,d_date_sk] - Project [ss_customer_sk,ss_sold_date_sk] - BroadcastHashJoin [ss_item_sk,i_item_sk] + BroadcastHashJoin [ss_item_sk,i_item_sk] + Project [ss_item_sk,ss_customer_sk] + BroadcastHashJoin [ss_sold_date_sk,d_date_sk] Filter [ss_customer_sk,ss_item_sk] ColumnarToRow InputAdapter @@ -26,47 +26,47 @@ TakeOrderedAndProject [cnt,ca_state,state] SubqueryBroadcast [d_date_sk] #1 ReusedExchange [d_date_sk] #3 InputAdapter - BroadcastExchange #4 - WholeStageCodegen (3) - Project [i_item_sk] - Filter [i_current_price,avg(i_current_price)] - BroadcastHashJoin [i_category,i_category] - Filter [i_current_price,i_item_sk] - ColumnarToRow + BroadcastExchange #3 + WholeStageCodegen (1) + Project [d_date_sk] + Filter [d_month_seq,d_date_sk] + Subquery #2 + WholeStageCodegen (2) + HashAggregate [d_month_seq] InputAdapter - Scan parquet default.item [i_item_sk,i_current_price,i_category] + Exchange [d_month_seq] #4 + WholeStageCodegen (1) + HashAggregate [d_month_seq] + Project [d_month_seq] + Filter [d_year,d_moy] + ColumnarToRow + InputAdapter + Scan parquet default.date_dim [d_month_seq,d_year,d_moy] + ColumnarToRow InputAdapter - BroadcastExchange #5 - WholeStageCodegen (2) - HashAggregate [i_category,sum,count] [avg(UnscaledValue(i_current_price)),avg(i_current_price),sum,count] - InputAdapter - Exchange [i_category] #6 - WholeStageCodegen (1) - HashAggregate [i_category,i_current_price] [sum,count,sum,count] - Filter [i_category] - ColumnarToRow - InputAdapter - Scan parquet default.item [i_current_price,i_category] + Scan parquet default.date_dim [d_date_sk,d_month_seq] InputAdapter - BroadcastExchange #3 + BroadcastExchange #5 WholeStageCodegen (4) - Project [d_date_sk] - Filter [d_month_seq,d_date_sk] - Subquery #2 - WholeStageCodegen (2) - HashAggregate [d_month_seq] + Project [i_item_sk] + Filter [i_current_price,avg(i_current_price)] + BroadcastHashJoin [i_category,i_category] + Filter [i_current_price,i_item_sk] + ColumnarToRow InputAdapter - Exchange [d_month_seq] #7 - WholeStageCodegen (1) - HashAggregate [d_month_seq] - Project [d_month_seq] - Filter [d_year,d_moy] - ColumnarToRow - InputAdapter - Scan parquet default.date_dim [d_month_seq,d_year,d_moy] - ColumnarToRow + Scan parquet default.item [i_item_sk,i_current_price,i_category] InputAdapter - Scan parquet default.date_dim [d_date_sk,d_month_seq] + BroadcastExchange #6 + WholeStageCodegen (3) + HashAggregate [i_category,sum,count] [avg(UnscaledValue(i_current_price)),avg(i_current_price),sum,count] + InputAdapter + Exchange [i_category] #7 + WholeStageCodegen (2) + HashAggregate [i_category,i_current_price] [sum,count,sum,count] + Filter [i_category] + ColumnarToRow + InputAdapter + Scan parquet default.item [i_current_price,i_category] InputAdapter WholeStageCodegen (12) Sort [c_customer_sk] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q80a.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q80a.sf100/explain.txt index a5d47ede475ca..55d45d24518f6 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q80a.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q80a.sf100/explain.txt @@ -41,12 +41,12 @@ TakeOrderedAndProject (124) : : : : +- * Project (24) : : : : +- * Filter (23) : : : : +- * ColumnarToRow (22) - : : : : +- Scan parquet default.promotion (21) + : : : : +- Scan parquet default.date_dim (21) : : : +- BroadcastExchange (32) : : : +- * Project (31) : : : +- * Filter (30) : : : +- * ColumnarToRow (29) - : : : +- Scan parquet default.date_dim (28) + : : : +- Scan parquet default.promotion (28) : : +- BroadcastExchange (38) : : +- * Filter (37) : : +- * ColumnarToRow (36) @@ -214,67 +214,67 @@ Join condition: None Output [7]: [ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13] Input [9]: [ss_item_sk#1, ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13, i_item_sk#16] -(21) Scan parquet default.promotion -Output [2]: [p_promo_sk#19, p_channel_tv#20] +(21) Scan parquet default.date_dim +Output [2]: [d_date_sk#19, d_date#20] Batched: true -Location [not included in comparison]/{warehouse_dir}/promotion] -PushedFilters: [IsNotNull(p_channel_tv), EqualTo(p_channel_tv,N), IsNotNull(p_promo_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/date_dim] +PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,1998-08-04), LessThanOrEqual(d_date,1998-09-03), IsNotNull(d_date_sk)] +ReadSchema: struct (22) ColumnarToRow [codegen id : 6] -Input [2]: [p_promo_sk#19, p_channel_tv#20] +Input [2]: [d_date_sk#19, d_date#20] (23) Filter [codegen id : 6] -Input [2]: [p_promo_sk#19, p_channel_tv#20] -Condition : ((isnotnull(p_channel_tv#20) AND (p_channel_tv#20 = N)) AND isnotnull(p_promo_sk#19)) +Input [2]: [d_date_sk#19, d_date#20] +Condition : (((isnotnull(d_date#20) AND (d_date#20 >= 1998-08-04)) AND (d_date#20 <= 1998-09-03)) AND isnotnull(d_date_sk#19)) (24) Project [codegen id : 6] -Output [1]: [p_promo_sk#19] -Input [2]: [p_promo_sk#19, p_channel_tv#20] +Output [1]: [d_date_sk#19] +Input [2]: [d_date_sk#19, d_date#20] (25) BroadcastExchange -Input [1]: [p_promo_sk#19] +Input [1]: [d_date_sk#19] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#21] (26) BroadcastHashJoin [codegen id : 9] -Left keys [1]: [ss_promo_sk#3] -Right keys [1]: [p_promo_sk#19] +Left keys [1]: [ss_sold_date_sk#7] +Right keys [1]: [d_date_sk#19] Join condition: None (27) Project [codegen id : 9] -Output [6]: [ss_store_sk#2, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13] -Input [8]: [ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13, p_promo_sk#19] +Output [6]: [ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#12, sr_net_loss#13] +Input [8]: [ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13, d_date_sk#19] -(28) Scan parquet default.date_dim -Output [2]: [d_date_sk#22, d_date#23] +(28) Scan parquet default.promotion +Output [2]: [p_promo_sk#22, p_channel_tv#23] Batched: true -Location [not included in comparison]/{warehouse_dir}/date_dim] -PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,1998-08-04), LessThanOrEqual(d_date,1998-09-03), IsNotNull(d_date_sk)] -ReadSchema: struct +Location [not included in comparison]/{warehouse_dir}/promotion] +PushedFilters: [IsNotNull(p_channel_tv), EqualTo(p_channel_tv,N), IsNotNull(p_promo_sk)] +ReadSchema: struct (29) ColumnarToRow [codegen id : 7] -Input [2]: [d_date_sk#22, d_date#23] +Input [2]: [p_promo_sk#22, p_channel_tv#23] (30) Filter [codegen id : 7] -Input [2]: [d_date_sk#22, d_date#23] -Condition : (((isnotnull(d_date#23) AND (d_date#23 >= 1998-08-04)) AND (d_date#23 <= 1998-09-03)) AND isnotnull(d_date_sk#22)) +Input [2]: [p_promo_sk#22, p_channel_tv#23] +Condition : ((isnotnull(p_channel_tv#23) AND (p_channel_tv#23 = N)) AND isnotnull(p_promo_sk#22)) (31) Project [codegen id : 7] -Output [1]: [d_date_sk#22] -Input [2]: [d_date_sk#22, d_date#23] +Output [1]: [p_promo_sk#22] +Input [2]: [p_promo_sk#22, p_channel_tv#23] (32) BroadcastExchange -Input [1]: [d_date_sk#22] +Input [1]: [p_promo_sk#22] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#24] (33) BroadcastHashJoin [codegen id : 9] -Left keys [1]: [ss_sold_date_sk#7] -Right keys [1]: [d_date_sk#22] +Left keys [1]: [ss_promo_sk#3] +Right keys [1]: [p_promo_sk#22] Join condition: None (34) Project [codegen id : 9] Output [5]: [ss_store_sk#2, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#12, sr_net_loss#13] -Input [7]: [ss_store_sk#2, ss_ext_sales_price#5, ss_net_profit#6, ss_sold_date_sk#7, sr_return_amt#12, sr_net_loss#13, d_date_sk#22] +Input [7]: [ss_store_sk#2, ss_promo_sk#3, ss_ext_sales_price#5, ss_net_profit#6, sr_return_amt#12, sr_net_loss#13, p_promo_sk#22] (35) Scan parquet default.store Output [2]: [s_store_sk#25, s_store_id#26] @@ -392,28 +392,28 @@ Output [7]: [cs_catalog_page_sk#47, cs_promo_sk#49, cs_ext_sales_price#51, cs_ne Input [9]: [cs_catalog_page_sk#47, cs_item_sk#48, cs_promo_sk#49, cs_ext_sales_price#51, cs_net_profit#52, cs_sold_date_sk#53, cr_return_amount#57, cr_net_loss#58, i_item_sk#61] (60) ReusedExchange [Reuses operator id: 25] -Output [1]: [p_promo_sk#62] +Output [1]: [d_date_sk#62] (61) BroadcastHashJoin [codegen id : 19] -Left keys [1]: [cs_promo_sk#49] -Right keys [1]: [p_promo_sk#62] +Left keys [1]: [cs_sold_date_sk#53] +Right keys [1]: [d_date_sk#62] Join condition: None (62) Project [codegen id : 19] -Output [6]: [cs_catalog_page_sk#47, cs_ext_sales_price#51, cs_net_profit#52, cs_sold_date_sk#53, cr_return_amount#57, cr_net_loss#58] -Input [8]: [cs_catalog_page_sk#47, cs_promo_sk#49, cs_ext_sales_price#51, cs_net_profit#52, cs_sold_date_sk#53, cr_return_amount#57, cr_net_loss#58, p_promo_sk#62] +Output [6]: [cs_catalog_page_sk#47, cs_promo_sk#49, cs_ext_sales_price#51, cs_net_profit#52, cr_return_amount#57, cr_net_loss#58] +Input [8]: [cs_catalog_page_sk#47, cs_promo_sk#49, cs_ext_sales_price#51, cs_net_profit#52, cs_sold_date_sk#53, cr_return_amount#57, cr_net_loss#58, d_date_sk#62] (63) ReusedExchange [Reuses operator id: 32] -Output [1]: [d_date_sk#63] +Output [1]: [p_promo_sk#63] (64) BroadcastHashJoin [codegen id : 19] -Left keys [1]: [cs_sold_date_sk#53] -Right keys [1]: [d_date_sk#63] +Left keys [1]: [cs_promo_sk#49] +Right keys [1]: [p_promo_sk#63] Join condition: None (65) Project [codegen id : 19] Output [5]: [cs_catalog_page_sk#47, cs_ext_sales_price#51, cs_net_profit#52, cr_return_amount#57, cr_net_loss#58] -Input [7]: [cs_catalog_page_sk#47, cs_ext_sales_price#51, cs_net_profit#52, cs_sold_date_sk#53, cr_return_amount#57, cr_net_loss#58, d_date_sk#63] +Input [7]: [cs_catalog_page_sk#47, cs_promo_sk#49, cs_ext_sales_price#51, cs_net_profit#52, cr_return_amount#57, cr_net_loss#58, p_promo_sk#63] (66) Scan parquet default.catalog_page Output [2]: [cp_catalog_page_sk#64, cp_catalog_page_id#65] @@ -531,28 +531,28 @@ Output [7]: [ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_pr Input [9]: [ws_item_sk#86, ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_profit#91, ws_sold_date_sk#92, wr_return_amt#96, wr_net_loss#97, i_item_sk#100] (91) ReusedExchange [Reuses operator id: 25] -Output [1]: [p_promo_sk#101] +Output [1]: [d_date_sk#101] (92) BroadcastHashJoin [codegen id : 29] -Left keys [1]: [ws_promo_sk#88] -Right keys [1]: [p_promo_sk#101] +Left keys [1]: [ws_sold_date_sk#92] +Right keys [1]: [d_date_sk#101] Join condition: None (93) Project [codegen id : 29] -Output [6]: [ws_web_site_sk#87, ws_ext_sales_price#90, ws_net_profit#91, ws_sold_date_sk#92, wr_return_amt#96, wr_net_loss#97] -Input [8]: [ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_profit#91, ws_sold_date_sk#92, wr_return_amt#96, wr_net_loss#97, p_promo_sk#101] +Output [6]: [ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_profit#91, wr_return_amt#96, wr_net_loss#97] +Input [8]: [ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_profit#91, ws_sold_date_sk#92, wr_return_amt#96, wr_net_loss#97, d_date_sk#101] (94) ReusedExchange [Reuses operator id: 32] -Output [1]: [d_date_sk#102] +Output [1]: [p_promo_sk#102] (95) BroadcastHashJoin [codegen id : 29] -Left keys [1]: [ws_sold_date_sk#92] -Right keys [1]: [d_date_sk#102] +Left keys [1]: [ws_promo_sk#88] +Right keys [1]: [p_promo_sk#102] Join condition: None (96) Project [codegen id : 29] Output [5]: [ws_web_site_sk#87, ws_ext_sales_price#90, ws_net_profit#91, wr_return_amt#96, wr_net_loss#97] -Input [7]: [ws_web_site_sk#87, ws_ext_sales_price#90, ws_net_profit#91, ws_sold_date_sk#92, wr_return_amt#96, wr_net_loss#97, d_date_sk#102] +Input [7]: [ws_web_site_sk#87, ws_promo_sk#88, ws_ext_sales_price#90, ws_net_profit#91, wr_return_amt#96, wr_net_loss#97, p_promo_sk#102] (97) Scan parquet default.web_site Output [2]: [web_site_sk#103, web_site_id#104] @@ -705,8 +705,8 @@ Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#7 IN dyn ReusedExchange (125) -(125) ReusedExchange [Reuses operator id: 32] -Output [1]: [d_date_sk#22] +(125) ReusedExchange [Reuses operator id: 25] +Output [1]: [d_date_sk#19] Subquery:2 Hosting operator id = 44 Hosting Expression = cs_sold_date_sk#53 IN dynamicpruning#8 diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q80a.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q80a.sf100/simplified.txt index 7e82ecbf47429..3f98262652bb4 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q80a.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q80a.sf100/simplified.txt @@ -24,9 +24,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] Project [ss_ext_sales_price,ss_net_profit,sr_return_amt,sr_net_loss,s_store_id] BroadcastHashJoin [ss_store_sk,s_store_sk] Project [ss_store_sk,ss_ext_sales_price,ss_net_profit,sr_return_amt,sr_net_loss] - BroadcastHashJoin [ss_sold_date_sk,d_date_sk] - Project [ss_store_sk,ss_ext_sales_price,ss_net_profit,ss_sold_date_sk,sr_return_amt,sr_net_loss] - BroadcastHashJoin [ss_promo_sk,p_promo_sk] + BroadcastHashJoin [ss_promo_sk,p_promo_sk] + Project [ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_net_profit,sr_return_amt,sr_net_loss] + BroadcastHashJoin [ss_sold_date_sk,d_date_sk] Project [ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_net_profit,ss_sold_date_sk,sr_return_amt,sr_net_loss] BroadcastHashJoin [ss_item_sk,i_item_sk] Project [ss_item_sk,ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_net_profit,ss_sold_date_sk,sr_return_amt,sr_net_loss] @@ -62,21 +62,21 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] InputAdapter Scan parquet default.item [i_item_sk,i_current_price] InputAdapter - BroadcastExchange #8 + BroadcastExchange #5 WholeStageCodegen (6) - Project [p_promo_sk] - Filter [p_channel_tv,p_promo_sk] + Project [d_date_sk] + Filter [d_date,d_date_sk] ColumnarToRow InputAdapter - Scan parquet default.promotion [p_promo_sk,p_channel_tv] + Scan parquet default.date_dim [d_date_sk,d_date] InputAdapter - BroadcastExchange #5 + BroadcastExchange #8 WholeStageCodegen (7) - Project [d_date_sk] - Filter [d_date,d_date_sk] + Project [p_promo_sk] + Filter [p_channel_tv,p_promo_sk] ColumnarToRow InputAdapter - Scan parquet default.date_dim [d_date_sk,d_date] + Scan parquet default.promotion [p_promo_sk,p_channel_tv] InputAdapter BroadcastExchange #9 WholeStageCodegen (8) @@ -93,9 +93,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] Project [cs_ext_sales_price,cs_net_profit,cr_return_amount,cr_net_loss,cp_catalog_page_id] BroadcastHashJoin [cs_catalog_page_sk,cp_catalog_page_sk] Project [cs_catalog_page_sk,cs_ext_sales_price,cs_net_profit,cr_return_amount,cr_net_loss] - BroadcastHashJoin [cs_sold_date_sk,d_date_sk] - Project [cs_catalog_page_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk,cr_return_amount,cr_net_loss] - BroadcastHashJoin [cs_promo_sk,p_promo_sk] + BroadcastHashJoin [cs_promo_sk,p_promo_sk] + Project [cs_catalog_page_sk,cs_promo_sk,cs_ext_sales_price,cs_net_profit,cr_return_amount,cr_net_loss] + BroadcastHashJoin [cs_sold_date_sk,d_date_sk] Project [cs_catalog_page_sk,cs_promo_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk,cr_return_amount,cr_net_loss] BroadcastHashJoin [cs_item_sk,i_item_sk] Project [cs_catalog_page_sk,cs_item_sk,cs_promo_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk,cr_return_amount,cr_net_loss] @@ -124,9 +124,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] InputAdapter ReusedExchange [i_item_sk] #7 InputAdapter - ReusedExchange [p_promo_sk] #8 + ReusedExchange [d_date_sk] #5 InputAdapter - ReusedExchange [d_date_sk] #5 + ReusedExchange [p_promo_sk] #8 InputAdapter BroadcastExchange #13 WholeStageCodegen (18) @@ -143,9 +143,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] Project [ws_ext_sales_price,ws_net_profit,wr_return_amt,wr_net_loss,web_site_id] BroadcastHashJoin [ws_web_site_sk,web_site_sk] Project [ws_web_site_sk,ws_ext_sales_price,ws_net_profit,wr_return_amt,wr_net_loss] - BroadcastHashJoin [ws_sold_date_sk,d_date_sk] - Project [ws_web_site_sk,ws_ext_sales_price,ws_net_profit,ws_sold_date_sk,wr_return_amt,wr_net_loss] - BroadcastHashJoin [ws_promo_sk,p_promo_sk] + BroadcastHashJoin [ws_promo_sk,p_promo_sk] + Project [ws_web_site_sk,ws_promo_sk,ws_ext_sales_price,ws_net_profit,wr_return_amt,wr_net_loss] + BroadcastHashJoin [ws_sold_date_sk,d_date_sk] Project [ws_web_site_sk,ws_promo_sk,ws_ext_sales_price,ws_net_profit,ws_sold_date_sk,wr_return_amt,wr_net_loss] BroadcastHashJoin [ws_item_sk,i_item_sk] Project [ws_item_sk,ws_web_site_sk,ws_promo_sk,ws_ext_sales_price,ws_net_profit,ws_sold_date_sk,wr_return_amt,wr_net_loss] @@ -174,9 +174,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] InputAdapter ReusedExchange [i_item_sk] #7 InputAdapter - ReusedExchange [p_promo_sk] #8 + ReusedExchange [d_date_sk] #5 InputAdapter - ReusedExchange [d_date_sk] #5 + ReusedExchange [p_promo_sk] #8 InputAdapter BroadcastExchange #17 WholeStageCodegen (28)