diff --git a/sql/core/benchmarks/JoinBenchmark-jdk11-results.txt b/sql/core/benchmarks/JoinBenchmark-jdk11-results.txt index 1e61017425aa..529fc1364c9a 100644 --- a/sql/core/benchmarks/JoinBenchmark-jdk11-results.txt +++ b/sql/core/benchmarks/JoinBenchmark-jdk11-results.txt @@ -2,74 +2,81 @@ Join Benchmark ================================================================================================ -OpenJDK 64-Bit Server VM 11.0.5+10-post-Ubuntu-0ubuntu1.118.04 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 11.0.9+11-LTS on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz Join w long: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -Join w long wholestage off 4441 4572 185 4.7 211.8 1.0X -Join w long wholestage on 1409 1500 96 14.9 67.2 3.2X +Join w long wholestage off 3931 3998 95 5.3 187.4 1.0X +Join w long wholestage on 1507 1769 178 13.9 71.9 2.6X -OpenJDK 64-Bit Server VM 11.0.5+10-post-Ubuntu-0ubuntu1.118.04 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 11.0.9+11-LTS on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz Join w long duplicated: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -Join w long duplicated wholestage off 5111 5116 7 4.1 243.7 1.0X -Join w long duplicated wholestage on 1493 1518 22 14.0 71.2 3.4X +Join w long duplicated wholestage off 5582 5617 50 3.8 266.2 1.0X +Join w long duplicated wholestage on 1435 1451 19 14.6 68.4 3.9X -OpenJDK 64-Bit Server VM 11.0.5+10-post-Ubuntu-0ubuntu1.118.04 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 11.0.9+11-LTS on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz Join w 2 ints: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -Join w 2 ints wholestage off 171821 171906 121 0.1 8193.0 1.0X -Join w 2 ints wholestage on 166559 166975 263 0.1 7942.1 1.0X +Join w 2 ints wholestage off 171470 171478 11 0.1 8176.3 1.0X +Join w 2 ints wholestage on 166612 166762 123 0.1 7944.7 1.0X -OpenJDK 64-Bit Server VM 11.0.5+10-post-Ubuntu-0ubuntu1.118.04 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 11.0.9+11-LTS on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz Join w 2 longs: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -Join w 2 longs wholestage off 7511 7555 62 2.8 358.2 1.0X -Join w 2 longs wholestage on 3776 4119 232 5.6 180.1 2.0X +Join w 2 longs wholestage off 6065 6093 40 3.5 289.2 1.0X +Join w 2 longs wholestage on 3285 3375 97 6.4 156.7 1.8X -OpenJDK 64-Bit Server VM 11.0.5+10-post-Ubuntu-0ubuntu1.118.04 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 11.0.9+11-LTS on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz Join w 2 longs duplicated: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -Join w 2 longs duplicated wholestage off 13563 13617 77 1.5 646.7 1.0X -Join w 2 longs duplicated wholestage on 7947 8053 71 2.6 378.9 1.7X +Join w 2 longs duplicated wholestage off 14969 15027 82 1.4 713.8 1.0X +Join w 2 longs duplicated wholestage on 7902 8151 406 2.7 376.8 1.9X -OpenJDK 64-Bit Server VM 11.0.5+10-post-Ubuntu-0ubuntu1.118.04 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 11.0.9+11-LTS on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz outer join w long: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -outer join w long wholestage off 3915 3923 12 5.4 186.7 1.0X -outer join w long wholestage on 1421 1461 30 14.8 67.8 2.8X +outer join w long wholestage off 2822 2823 1 7.4 134.6 1.0X +outer join w long wholestage on 1419 1436 19 14.8 67.7 2.0X -OpenJDK 64-Bit Server VM 11.0.5+10-post-Ubuntu-0ubuntu1.118.04 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 11.0.9+11-LTS on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz semi join w long: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -semi join w long wholestage off 2310 2332 30 9.1 110.2 1.0X -semi join w long wholestage on 835 860 34 25.1 39.8 2.8X +semi join w long wholestage off 1821 1832 15 11.5 86.8 1.0X +semi join w long wholestage on 828 853 36 25.3 39.5 2.2X -OpenJDK 64-Bit Server VM 11.0.5+10-post-Ubuntu-0ubuntu1.118.04 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 11.0.9+11-LTS on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz sort merge join: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -sort merge join wholestage off 1846 1886 56 1.1 880.5 1.0X -sort merge join wholestage on 1402 1654 234 1.5 668.3 1.3X +sort merge join wholestage off 1371 1380 13 1.5 653.7 1.0X +sort merge join wholestage on 1197 1244 37 1.8 570.9 1.1X -OpenJDK 64-Bit Server VM 11.0.5+10-post-Ubuntu-0ubuntu1.118.04 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 11.0.9+11-LTS on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz -sort merge join with duplicates: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------- -sort merge join with duplicates wholestage off 2852 2879 38 0.7 1360.0 1.0X -sort merge join with duplicates wholestage on 2645 2742 156 0.8 1261.0 1.1X +sort merge join with duplicates: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative +------------------------------------------------------------------------------------------------------------------------------ +sort merge join with duplicates wholestage off 1920 1933 20 1.1 915.3 1.0X +sort merge join with duplicates wholestage on 1871 1912 27 1.1 892.0 1.0X -OpenJDK 64-Bit Server VM 11.0.5+10-post-Ubuntu-0ubuntu1.118.04 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 11.0.9+11-LTS on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz shuffle hash join: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -shuffle hash join wholestage off 1506 1564 82 2.8 359.1 1.0X -shuffle hash join wholestage on 1303 1330 23 3.2 310.6 1.2X +shuffle hash join wholestage off 1102 1122 28 3.8 262.8 1.0X +shuffle hash join wholestage on 657 674 13 6.4 156.6 1.7X + +OpenJDK 64-Bit Server VM 11.0.9+11-LTS on Linux 4.14.219-161.340.amzn2.x86_64 +Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz +broadcast nested loop join: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative +------------------------------------------------------------------------------------------------------------------------- +broadcast nested loop join wholestage off 62922 63052 184 0.3 3000.3 1.0X +broadcast nested loop join wholestage on 30946 30972 26 0.7 1475.6 2.0X diff --git a/sql/core/benchmarks/JoinBenchmark-results.txt b/sql/core/benchmarks/JoinBenchmark-results.txt index c19dd4f12bb3..76b6a9468426 100644 --- a/sql/core/benchmarks/JoinBenchmark-results.txt +++ b/sql/core/benchmarks/JoinBenchmark-results.txt @@ -2,74 +2,81 @@ Join Benchmark ================================================================================================ -OpenJDK 64-Bit Server VM 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 1.8.0_272-b10 on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz Join w long: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -Join w long wholestage off 4531 4557 37 4.6 216.1 1.0X -Join w long wholestage on 1214 1310 95 17.3 57.9 3.7X +Join w long wholestage off 3717 3779 88 5.6 177.2 1.0X +Join w long wholestage on 1283 1458 109 16.3 61.2 2.9X -OpenJDK 64-Bit Server VM 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 1.8.0_272-b10 on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz Join w long duplicated: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -Join w long duplicated wholestage off 5200 5239 55 4.0 248.0 1.0X -Join w long duplicated wholestage on 1535 1547 11 13.7 73.2 3.4X +Join w long duplicated wholestage off 5342 5378 50 3.9 254.7 1.0X +Join w long duplicated wholestage on 1559 1594 24 13.5 74.3 3.4X -OpenJDK 64-Bit Server VM 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 1.8.0_272-b10 on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz Join w 2 ints: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -Join w 2 ints wholestage off 170776 170795 27 0.1 8143.2 1.0X -Join w 2 ints wholestage on 165134 165183 36 0.1 7874.2 1.0X +Join w 2 ints wholestage off 169393 169454 86 0.1 8077.3 1.0X +Join w 2 ints wholestage on 165629 165648 19 0.1 7897.8 1.0X -OpenJDK 64-Bit Server VM 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 1.8.0_272-b10 on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz Join w 2 longs: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -Join w 2 longs wholestage off 6561 6595 48 3.2 312.8 1.0X -Join w 2 longs wholestage on 2999 3070 85 7.0 143.0 2.2X +Join w 2 longs wholestage off 6194 6240 66 3.4 295.3 1.0X +Join w 2 longs wholestage on 3389 3447 55 6.2 161.6 1.8X -OpenJDK 64-Bit Server VM 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 1.8.0_272-b10 on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz Join w 2 longs duplicated: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -Join w 2 longs duplicated wholestage off 15731 15757 38 1.3 750.1 1.0X -Join w 2 longs duplicated wholestage on 8017 8112 80 2.6 382.3 2.0X +Join w 2 longs duplicated wholestage off 14445 14511 93 1.5 688.8 1.0X +Join w 2 longs duplicated wholestage on 8465 8554 120 2.5 403.6 1.7X -OpenJDK 64-Bit Server VM 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 1.8.0_272-b10 on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz outer join w long: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -outer join w long wholestage off 3573 3577 6 5.9 170.4 1.0X -outer join w long wholestage on 1310 1325 15 16.0 62.5 2.7X +outer join w long wholestage off 2565 2582 23 8.2 122.3 1.0X +outer join w long wholestage on 1323 1339 19 15.8 63.1 1.9X -OpenJDK 64-Bit Server VM 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 1.8.0_272-b10 on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz semi join w long: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -semi join w long wholestage off 1893 1916 33 11.1 90.3 1.0X -semi join w long wholestage on 819 842 30 25.6 39.0 2.3X +semi join w long wholestage off 1754 1761 11 12.0 83.6 1.0X +semi join w long wholestage on 846 859 21 24.8 40.3 2.1X -OpenJDK 64-Bit Server VM 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 1.8.0_272-b10 on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz sort merge join: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -sort merge join wholestage off 1302 1312 13 1.6 620.9 1.0X -sort merge join wholestage on 1168 1233 62 1.8 557.0 1.1X +sort merge join wholestage off 1283 1294 16 1.6 611.8 1.0X +sort merge join wholestage on 1185 1210 26 1.8 565.0 1.1X -OpenJDK 64-Bit Server VM 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 1.8.0_272-b10 on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz -sort merge join with duplicates: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------- -sort merge join with duplicates wholestage off 1996 2005 12 1.1 951.7 1.0X -sort merge join with duplicates wholestage on 1766 1803 42 1.2 842.0 1.1X +sort merge join with duplicates: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative +------------------------------------------------------------------------------------------------------------------------------ +sort merge join with duplicates wholestage off 1915 1934 27 1.1 913.1 1.0X +sort merge join with duplicates wholestage on 1742 1778 36 1.2 830.7 1.1X -OpenJDK 64-Bit Server VM 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09 on Linux 4.15.0-1044-aws +OpenJDK 64-Bit Server VM 1.8.0_272-b10 on Linux 4.14.219-161.340.amzn2.x86_64 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz shuffle hash join: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ -shuffle hash join wholestage off 1298 1300 3 3.2 309.6 1.0X -shuffle hash join wholestage on 1201 1210 10 3.5 286.4 1.1X +shuffle hash join wholestage off 1037 1047 14 4.0 247.3 1.0X +shuffle hash join wholestage on 652 668 15 6.4 155.4 1.6X + +OpenJDK 64-Bit Server VM 1.8.0_272-b10 on Linux 4.14.219-161.340.amzn2.x86_64 +Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz +broadcast nested loop join: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative +------------------------------------------------------------------------------------------------------------------------- +broadcast nested loop join wholestage off 65666 66140 671 0.3 3131.2 1.0X +broadcast nested loop join wholestage on 29429 29523 64 0.7 1403.3 2.2X diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/WholeStageCodegenExec.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/WholeStageCodegenExec.scala index c6ea99cfdad7..f0c9cc268cdd 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/WholeStageCodegenExec.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/WholeStageCodegenExec.scala @@ -33,7 +33,7 @@ import org.apache.spark.sql.catalyst.plans.physical.Partitioning import org.apache.spark.sql.catalyst.rules.Rule import org.apache.spark.sql.execution.aggregate.HashAggregateExec import org.apache.spark.sql.execution.columnar.InMemoryTableScanExec -import org.apache.spark.sql.execution.joins.{BroadcastHashJoinExec, ShuffledHashJoinExec, SortMergeJoinExec} +import org.apache.spark.sql.execution.joins.{BroadcastHashJoinExec, BroadcastNestedLoopJoinExec, ShuffledHashJoinExec, SortMergeJoinExec} import org.apache.spark.sql.execution.metric.SQLMetrics import org.apache.spark.sql.internal.SQLConf import org.apache.spark.sql.types._ @@ -51,6 +51,7 @@ trait CodegenSupport extends SparkPlan { case _: BroadcastHashJoinExec => "bhj" case _: ShuffledHashJoinExec => "shj" case _: SortMergeJoinExec => "smj" + case _: BroadcastNestedLoopJoinExec => "bnlj" case _: RDDScanExec => "rdd" case _: DataSourceScanExec => "scan" case _: InMemoryTableScanExec => "memoryScan" diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/joins/BroadcastNestedLoopJoinExec.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/joins/BroadcastNestedLoopJoinExec.scala index efcdd408215f..d4ed4d0ddbcf 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/joins/BroadcastNestedLoopJoinExec.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/joins/BroadcastNestedLoopJoinExec.scala @@ -21,10 +21,11 @@ import org.apache.spark.broadcast.Broadcast import org.apache.spark.rdd.RDD import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions._ +import org.apache.spark.sql.catalyst.expressions.codegen.{CodegenContext, ExprCode} import org.apache.spark.sql.catalyst.optimizer.{BuildLeft, BuildRight, BuildSide} import org.apache.spark.sql.catalyst.plans._ import org.apache.spark.sql.catalyst.plans.physical._ -import org.apache.spark.sql.execution.{ExplainUtils, SparkPlan} +import org.apache.spark.sql.execution.{CodegenSupport, ExplainUtils, SparkPlan} import org.apache.spark.sql.execution.metric.SQLMetrics import org.apache.spark.util.collection.{BitSet, CompactBuffer} @@ -33,7 +34,7 @@ case class BroadcastNestedLoopJoinExec( right: SparkPlan, buildSide: BuildSide, joinType: JoinType, - condition: Option[Expression]) extends BaseJoinExec { + condition: Option[Expression]) extends JoinCodegenSupport { override def leftKeys: Seq[Expression] = Nil override def rightKeys: Seq[Expression] = Nil @@ -393,4 +394,62 @@ case class BroadcastNestedLoopJoinExec( } } } + + override def supportCodegen: Boolean = { + joinType.isInstanceOf[InnerLike] + } + + override def inputRDDs(): Seq[RDD[InternalRow]] = { + streamed.asInstanceOf[CodegenSupport].inputRDDs() + } + + override def needCopyResult: Boolean = true + + override def doProduce(ctx: CodegenContext): String = { + streamed.asInstanceOf[CodegenSupport].produce(ctx, this) + } + + override def doConsume(ctx: CodegenContext, input: Seq[ExprCode], row: ExprCode): String = { + joinType match { + case _: InnerLike => codegenInner(ctx, input) + case _ => + throw new IllegalArgumentException( + s"BroadcastNestedLoopJoin code-gen should not take $joinType as the JoinType") + } + } + + /** + * Returns the variable name for [[Broadcast]] side. + */ + private def prepareBroadcast(ctx: CodegenContext): String = { + // Create a name for broadcast side + val broadcastArray = broadcast.executeBroadcast[Array[InternalRow]]() + val broadcastTerm = ctx.addReferenceObj("broadcastTerm", broadcastArray) + + // Inline mutable state since not many join operations in a task + ctx.addMutableState("InternalRow[]", "buildRowArray", + v => s"$v = (InternalRow[]) $broadcastTerm.value();", forceInline = true) + } + + private def codegenInner(ctx: CodegenContext, input: Seq[ExprCode]): String = { + val buildRowArrayTerm = prepareBroadcast(ctx) + val (buildRow, checkCondition, buildVars) = getJoinCondition(ctx, input, streamed, broadcast) + + val resultVars = buildSide match { + case BuildLeft => buildVars ++ input + case BuildRight => input ++ buildVars + } + val arrayIndex = ctx.freshName("arrayIndex") + val numOutput = metricTerm(ctx, "numOutputRows") + + s""" + |for (int $arrayIndex = 0; $arrayIndex < $buildRowArrayTerm.length; $arrayIndex++) { + | UnsafeRow $buildRow = (UnsafeRow) $buildRowArrayTerm[$arrayIndex]; + | $checkCondition { + | $numOutput.add(1); + | ${consume(ctx, resultVars)} + | } + |} + """.stripMargin + } } diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/joins/HashJoin.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/joins/HashJoin.scala index 53bd591d98a2..bd0ff3d093c9 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/joins/HashJoin.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/joins/HashJoin.scala @@ -22,7 +22,6 @@ import org.apache.spark.sql.catalyst.analysis.CastSupport import org.apache.spark.sql.catalyst.expressions._ import org.apache.spark.sql.catalyst.expressions.BindReferences.bindReferences import org.apache.spark.sql.catalyst.expressions.codegen._ -import org.apache.spark.sql.catalyst.expressions.codegen.Block._ import org.apache.spark.sql.catalyst.optimizer.{BuildLeft, BuildRight, BuildSide} import org.apache.spark.sql.catalyst.plans._ import org.apache.spark.sql.catalyst.plans.physical.Partitioning @@ -40,7 +39,7 @@ private[joins] case class HashedRelationInfo( keyIsUnique: Boolean, isEmpty: Boolean) -trait HashJoin extends BaseJoinExec with CodegenSupport { +trait HashJoin extends JoinCodegenSupport { def buildSide: BuildSide override def simpleStringWithNodeId(): String = { @@ -378,71 +377,13 @@ trait HashJoin extends BaseJoinExec with CodegenSupport { } } - /** - * Generates the code for variable of build side. - */ - private def genBuildSideVars(ctx: CodegenContext, matched: String): Seq[ExprCode] = { - ctx.currentVars = null - ctx.INPUT_ROW = matched - buildPlan.output.zipWithIndex.map { case (a, i) => - val ev = BoundReference(i, a.dataType, a.nullable).genCode(ctx) - if (joinType.isInstanceOf[InnerLike]) { - ev - } else { - // the variables are needed even there is no matched rows - val isNull = ctx.freshName("isNull") - val value = ctx.freshName("value") - val javaType = CodeGenerator.javaType(a.dataType) - val code = code""" - |boolean $isNull = true; - |$javaType $value = ${CodeGenerator.defaultValue(a.dataType)}; - |if ($matched != null) { - | ${ev.code} - | $isNull = ${ev.isNull}; - | $value = ${ev.value}; - |} - """.stripMargin - ExprCode(code, JavaCode.isNullVariable(isNull), JavaCode.variable(value, a.dataType)) - } - } - } - - /** - * Generate the (non-equi) condition used to filter joined rows. This is used in Inner, Left Semi - * and Left Anti joins. - */ - protected def getJoinCondition( - ctx: CodegenContext, - input: Seq[ExprCode]): (String, String, Seq[ExprCode]) = { - val matched = ctx.freshName("matched") - val buildVars = genBuildSideVars(ctx, matched) - val checkCondition = if (condition.isDefined) { - val expr = condition.get - // evaluate the variables from build side that used by condition - val eval = evaluateRequiredVariables(buildPlan.output, buildVars, expr.references) - // filter the output via condition - ctx.currentVars = input ++ buildVars - val ev = - BindReferences.bindReference(expr, streamedPlan.output ++ buildPlan.output).genCode(ctx) - val skipRow = s"${ev.isNull} || !${ev.value}" - s""" - |$eval - |${ev.code} - |if (!($skipRow)) - """.stripMargin - } else { - "" - } - (matched, checkCondition, buildVars) - } - /** * Generates the code for Inner join. */ protected def codegenInner(ctx: CodegenContext, input: Seq[ExprCode]): String = { val HashedRelationInfo(relationTerm, keyIsUnique, isEmptyHashedRelation) = prepareRelation(ctx) val (keyEv, anyNull) = genStreamSideJoinKey(ctx, input) - val (matched, checkCondition, buildVars) = getJoinCondition(ctx, input) + val (matched, checkCondition, buildVars) = getJoinCondition(ctx, input, streamedPlan, buildPlan) val numOutput = metricTerm(ctx, "numOutputRows") val resultVars = buildSide match { @@ -497,7 +438,7 @@ trait HashJoin extends BaseJoinExec with CodegenSupport { val HashedRelationInfo(relationTerm, keyIsUnique, _) = prepareRelation(ctx) val (keyEv, anyNull) = genStreamSideJoinKey(ctx, input) val matched = ctx.freshName("matched") - val buildVars = genBuildSideVars(ctx, matched) + val buildVars = genBuildSideVars(ctx, matched, buildPlan) val numOutput = metricTerm(ctx, "numOutputRows") // filter the output via condition @@ -573,7 +514,7 @@ trait HashJoin extends BaseJoinExec with CodegenSupport { protected def codegenSemi(ctx: CodegenContext, input: Seq[ExprCode]): String = { val HashedRelationInfo(relationTerm, keyIsUnique, isEmptyHashedRelation) = prepareRelation(ctx) val (keyEv, anyNull) = genStreamSideJoinKey(ctx, input) - val (matched, checkCondition, _) = getJoinCondition(ctx, input) + val (matched, checkCondition, _) = getJoinCondition(ctx, input, streamedPlan, buildPlan) val numOutput = metricTerm(ctx, "numOutputRows") if (isEmptyHashedRelation) { @@ -635,7 +576,7 @@ trait HashJoin extends BaseJoinExec with CodegenSupport { } val (keyEv, anyNull) = genStreamSideJoinKey(ctx, input) - val (matched, checkCondition, _) = getJoinCondition(ctx, input) + val (matched, checkCondition, _) = getJoinCondition(ctx, input, streamedPlan, buildPlan) if (keyIsUnique) { val found = ctx.freshName("found") @@ -699,7 +640,7 @@ trait HashJoin extends BaseJoinExec with CodegenSupport { val existsVar = ctx.freshName("exists") val matched = ctx.freshName("matched") - val buildVars = genBuildSideVars(ctx, matched) + val buildVars = genBuildSideVars(ctx, matched, buildPlan) val checkCondition = if (condition.isDefined) { val expr = condition.get // evaluate the variables from build side that used by condition diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/joins/JoinCodegenSupport.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/joins/JoinCodegenSupport.scala new file mode 100644 index 000000000000..6af4e119cb04 --- /dev/null +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/joins/JoinCodegenSupport.scala @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.execution.joins + +import org.apache.spark.sql.catalyst.expressions.{BindReferences, BoundReference} +import org.apache.spark.sql.catalyst.expressions.codegen._ +import org.apache.spark.sql.catalyst.expressions.codegen.Block._ +import org.apache.spark.sql.catalyst.plans.InnerLike +import org.apache.spark.sql.execution.{CodegenSupport, SparkPlan} + +/** + * An interface for those join physical operators that support codegen. + */ +trait JoinCodegenSupport extends CodegenSupport with BaseJoinExec { + + /** + * Generate the (non-equi) condition used to filter joined rows. + * This is used in Inner, Left Semi and Left Anti joins. + * + * @return Tuple of variable name for row of build side, generated code for condition, + * and generated code for variables of build side. + */ + protected def getJoinCondition( + ctx: CodegenContext, + streamVars: Seq[ExprCode], + streamPlan: SparkPlan, + buildPlan: SparkPlan): (String, String, Seq[ExprCode]) = { + val buildRow = ctx.freshName("buildRow") + val buildVars = genBuildSideVars(ctx, buildRow, buildPlan) + val checkCondition = if (condition.isDefined) { + val expr = condition.get + // evaluate the variables from build side that used by condition + val eval = evaluateRequiredVariables(buildPlan.output, buildVars, expr.references) + // filter the output via condition + ctx.currentVars = streamVars ++ buildVars + val ev = + BindReferences.bindReference(expr, streamPlan.output ++ buildPlan.output).genCode(ctx) + val skipRow = s"${ev.isNull} || !${ev.value}" + s""" + |$eval + |${ev.code} + |if (!($skipRow)) + """.stripMargin + } else { + "" + } + (buildRow, checkCondition, buildVars) + } + + /** + * Generates the code for variables of build side. + */ + protected def genBuildSideVars( + ctx: CodegenContext, + buildRow: String, + buildPlan: SparkPlan): Seq[ExprCode] = { + ctx.currentVars = null + ctx.INPUT_ROW = buildRow + buildPlan.output.zipWithIndex.map { case (a, i) => + val ev = BoundReference(i, a.dataType, a.nullable).genCode(ctx) + if (joinType.isInstanceOf[InnerLike]) { + ev + } else { + // the variables are needed even there is no matched rows + val isNull = ctx.freshName("isNull") + val value = ctx.freshName("value") + val javaType = CodeGenerator.javaType(a.dataType) + val code = code""" + |boolean $isNull = true; + |$javaType $value = ${CodeGenerator.defaultValue(a.dataType)}; + |if ($buildRow != null) { + | ${ev.code} + | $isNull = ${ev.isNull}; + | $value = ${ev.value}; + |} + """.stripMargin + ExprCode(code, JavaCode.isNullVariable(isNull), JavaCode.variable(value, a.dataType)) + } + } + } +} diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28.sf100/explain.txt index 7e4516d213be..9f15199d8c8b 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28.sf100/explain.txt @@ -1,9 +1,9 @@ == Physical Plan == -BroadcastNestedLoopJoin Inner BuildRight (70) -:- BroadcastNestedLoopJoin Inner BuildRight (58) -: :- BroadcastNestedLoopJoin Inner BuildRight (46) -: : :- BroadcastNestedLoopJoin Inner BuildRight (34) -: : : :- BroadcastNestedLoopJoin Inner BuildRight (22) +* BroadcastNestedLoopJoin Inner BuildRight (70) +:- * BroadcastNestedLoopJoin Inner BuildRight (58) +: :- * BroadcastNestedLoopJoin Inner BuildRight (46) +: : :- * BroadcastNestedLoopJoin Inner BuildRight (34) +: : : :- * BroadcastNestedLoopJoin Inner BuildRight (22) : : : : :- * HashAggregate (10) : : : : : +- Exchange (9) : : : : : +- * HashAggregate (8) @@ -118,7 +118,7 @@ Results [4]: [sum#8, count#9, count#10, count#13] Input [4]: [sum#8, count#9, count#10, count#13] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#14] -(10) HashAggregate [codegen id : 3] +(10) HashAggregate [codegen id : 18] Input [4]: [sum#8, count#9, count#10, count#13] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -132,18 +132,18 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,6), LessThanOrEqual(ss_quantity,10), Or(Or(And(GreaterThanOrEqual(ss_list_price,90.00),LessThanOrEqual(ss_list_price,100.00)),And(GreaterThanOrEqual(ss_coupon_amt,2323.00),LessThanOrEqual(ss_coupon_amt,3323.00))),And(GreaterThanOrEqual(ss_wholesale_cost,31.00),LessThanOrEqual(ss_wholesale_cost,51.00)))] ReadSchema: struct -(12) ColumnarToRow [codegen id : 4] +(12) ColumnarToRow [codegen id : 3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(13) Filter [codegen id : 4] +(13) Filter [codegen id : 3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] Condition : (((isnotnull(ss_quantity#1) AND (ss_quantity#1 >= 6)) AND (ss_quantity#1 <= 10)) AND ((((ss_list_price#3 >= 90.00) AND (ss_list_price#3 <= 100.00)) OR ((ss_coupon_amt#4 >= 2323.00) AND (ss_coupon_amt#4 <= 3323.00))) OR ((ss_wholesale_cost#2 >= 31.00) AND (ss_wholesale_cost#2 <= 51.00)))) -(14) Project [codegen id : 4] +(14) Project [codegen id : 3] Output [1]: [ss_list_price#3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(15) HashAggregate [codegen id : 4] +(15) HashAggregate [codegen id : 3] Input [1]: [ss_list_price#3] Keys [1]: [ss_list_price#3] Functions [2]: [partial_avg(UnscaledValue(ss_list_price#3)), partial_count(ss_list_price#3)] @@ -154,14 +154,14 @@ Results [4]: [ss_list_price#3, sum#20, count#21, count#22] Input [4]: [ss_list_price#3, sum#20, count#21, count#22] Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, [id=#23] -(17) HashAggregate [codegen id : 5] +(17) HashAggregate [codegen id : 4] Input [4]: [ss_list_price#3, sum#20, count#21, count#22] Keys [1]: [ss_list_price#3] Functions [2]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3)] Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#3))#18, count(ss_list_price#3)#19] Results [4]: [ss_list_price#3, sum#20, count#21, count#22] -(18) HashAggregate [codegen id : 5] +(18) HashAggregate [codegen id : 4] Input [4]: [ss_list_price#3, sum#20, count#21, count#22] Keys: [] Functions [3]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3), partial_count(distinct ss_list_price#3)] @@ -172,7 +172,7 @@ Results [4]: [sum#20, count#21, count#22, count#25] Input [4]: [sum#20, count#21, count#22, count#25] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#26] -(20) HashAggregate [codegen id : 6] +(20) HashAggregate [codegen id : 5] Input [4]: [sum#20, count#21, count#22, count#25] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -183,7 +183,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#3))#18 / 100.0) as decimal(1 Input [3]: [B2_LP#27, B2_CNT#28, B2_CNTD#29] Arguments: IdentityBroadcastMode, [id=#30] -(22) BroadcastNestedLoopJoin +(22) BroadcastNestedLoopJoin [codegen id : 18] Join condition: None (23) Scan parquet default.store_sales @@ -193,18 +193,18 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,11), LessThanOrEqual(ss_quantity,15), Or(Or(And(GreaterThanOrEqual(ss_list_price,142.00),LessThanOrEqual(ss_list_price,152.00)),And(GreaterThanOrEqual(ss_coupon_amt,12214.00),LessThanOrEqual(ss_coupon_amt,13214.00))),And(GreaterThanOrEqual(ss_wholesale_cost,79.00),LessThanOrEqual(ss_wholesale_cost,99.00)))] ReadSchema: struct -(24) ColumnarToRow [codegen id : 7] +(24) ColumnarToRow [codegen id : 6] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(25) Filter [codegen id : 7] +(25) Filter [codegen id : 6] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] Condition : (((isnotnull(ss_quantity#1) AND (ss_quantity#1 >= 11)) AND (ss_quantity#1 <= 15)) AND ((((ss_list_price#3 >= 142.00) AND (ss_list_price#3 <= 152.00)) OR ((ss_coupon_amt#4 >= 12214.00) AND (ss_coupon_amt#4 <= 13214.00))) OR ((ss_wholesale_cost#2 >= 79.00) AND (ss_wholesale_cost#2 <= 99.00)))) -(26) Project [codegen id : 7] +(26) Project [codegen id : 6] Output [1]: [ss_list_price#3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(27) HashAggregate [codegen id : 7] +(27) HashAggregate [codegen id : 6] Input [1]: [ss_list_price#3] Keys [1]: [ss_list_price#3] Functions [2]: [partial_avg(UnscaledValue(ss_list_price#3)), partial_count(ss_list_price#3)] @@ -215,14 +215,14 @@ Results [4]: [ss_list_price#3, sum#33, count#34, count#35] Input [4]: [ss_list_price#3, sum#33, count#34, count#35] Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, [id=#36] -(29) HashAggregate [codegen id : 8] +(29) HashAggregate [codegen id : 7] Input [4]: [ss_list_price#3, sum#33, count#34, count#35] Keys [1]: [ss_list_price#3] Functions [2]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3)] Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#3))#31, count(ss_list_price#3)#32] Results [4]: [ss_list_price#3, sum#33, count#34, count#35] -(30) HashAggregate [codegen id : 8] +(30) HashAggregate [codegen id : 7] Input [4]: [ss_list_price#3, sum#33, count#34, count#35] Keys: [] Functions [3]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3), partial_count(distinct ss_list_price#3)] @@ -233,7 +233,7 @@ Results [4]: [sum#33, count#34, count#35, count#38] Input [4]: [sum#33, count#34, count#35, count#38] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#39] -(32) HashAggregate [codegen id : 9] +(32) HashAggregate [codegen id : 8] Input [4]: [sum#33, count#34, count#35, count#38] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -244,7 +244,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#3))#31 / 100.0) as decimal(1 Input [3]: [B3_LP#40, B3_CNT#41, B3_CNTD#42] Arguments: IdentityBroadcastMode, [id=#43] -(34) BroadcastNestedLoopJoin +(34) BroadcastNestedLoopJoin [codegen id : 18] Join condition: None (35) Scan parquet default.store_sales @@ -254,18 +254,18 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,16), LessThanOrEqual(ss_quantity,20), Or(Or(And(GreaterThanOrEqual(ss_list_price,135.00),LessThanOrEqual(ss_list_price,145.00)),And(GreaterThanOrEqual(ss_coupon_amt,6071.00),LessThanOrEqual(ss_coupon_amt,7071.00))),And(GreaterThanOrEqual(ss_wholesale_cost,38.00),LessThanOrEqual(ss_wholesale_cost,58.00)))] ReadSchema: struct -(36) ColumnarToRow [codegen id : 10] +(36) ColumnarToRow [codegen id : 9] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(37) Filter [codegen id : 10] +(37) Filter [codegen id : 9] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] Condition : (((isnotnull(ss_quantity#1) AND (ss_quantity#1 >= 16)) AND (ss_quantity#1 <= 20)) AND ((((ss_list_price#3 >= 135.00) AND (ss_list_price#3 <= 145.00)) OR ((ss_coupon_amt#4 >= 6071.00) AND (ss_coupon_amt#4 <= 7071.00))) OR ((ss_wholesale_cost#2 >= 38.00) AND (ss_wholesale_cost#2 <= 58.00)))) -(38) Project [codegen id : 10] +(38) Project [codegen id : 9] Output [1]: [ss_list_price#3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(39) HashAggregate [codegen id : 10] +(39) HashAggregate [codegen id : 9] Input [1]: [ss_list_price#3] Keys [1]: [ss_list_price#3] Functions [2]: [partial_avg(UnscaledValue(ss_list_price#3)), partial_count(ss_list_price#3)] @@ -276,14 +276,14 @@ Results [4]: [ss_list_price#3, sum#46, count#47, count#48] Input [4]: [ss_list_price#3, sum#46, count#47, count#48] Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, [id=#49] -(41) HashAggregate [codegen id : 11] +(41) HashAggregate [codegen id : 10] Input [4]: [ss_list_price#3, sum#46, count#47, count#48] Keys [1]: [ss_list_price#3] Functions [2]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3)] Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#3))#44, count(ss_list_price#3)#45] Results [4]: [ss_list_price#3, sum#46, count#47, count#48] -(42) HashAggregate [codegen id : 11] +(42) HashAggregate [codegen id : 10] Input [4]: [ss_list_price#3, sum#46, count#47, count#48] Keys: [] Functions [3]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3), partial_count(distinct ss_list_price#3)] @@ -294,7 +294,7 @@ Results [4]: [sum#46, count#47, count#48, count#51] Input [4]: [sum#46, count#47, count#48, count#51] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#52] -(44) HashAggregate [codegen id : 12] +(44) HashAggregate [codegen id : 11] Input [4]: [sum#46, count#47, count#48, count#51] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -305,7 +305,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#3))#44 / 100.0) as decimal(1 Input [3]: [B4_LP#53, B4_CNT#54, B4_CNTD#55] Arguments: IdentityBroadcastMode, [id=#56] -(46) BroadcastNestedLoopJoin +(46) BroadcastNestedLoopJoin [codegen id : 18] Join condition: None (47) Scan parquet default.store_sales @@ -315,18 +315,18 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,21), LessThanOrEqual(ss_quantity,25), Or(Or(And(GreaterThanOrEqual(ss_list_price,122.00),LessThanOrEqual(ss_list_price,132.00)),And(GreaterThanOrEqual(ss_coupon_amt,836.00),LessThanOrEqual(ss_coupon_amt,1836.00))),And(GreaterThanOrEqual(ss_wholesale_cost,17.00),LessThanOrEqual(ss_wholesale_cost,37.00)))] ReadSchema: struct -(48) ColumnarToRow [codegen id : 13] +(48) ColumnarToRow [codegen id : 12] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(49) Filter [codegen id : 13] +(49) Filter [codegen id : 12] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] Condition : (((isnotnull(ss_quantity#1) AND (ss_quantity#1 >= 21)) AND (ss_quantity#1 <= 25)) AND ((((ss_list_price#3 >= 122.00) AND (ss_list_price#3 <= 132.00)) OR ((ss_coupon_amt#4 >= 836.00) AND (ss_coupon_amt#4 <= 1836.00))) OR ((ss_wholesale_cost#2 >= 17.00) AND (ss_wholesale_cost#2 <= 37.00)))) -(50) Project [codegen id : 13] +(50) Project [codegen id : 12] Output [1]: [ss_list_price#3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(51) HashAggregate [codegen id : 13] +(51) HashAggregate [codegen id : 12] Input [1]: [ss_list_price#3] Keys [1]: [ss_list_price#3] Functions [2]: [partial_avg(UnscaledValue(ss_list_price#3)), partial_count(ss_list_price#3)] @@ -337,14 +337,14 @@ Results [4]: [ss_list_price#3, sum#59, count#60, count#61] Input [4]: [ss_list_price#3, sum#59, count#60, count#61] Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, [id=#62] -(53) HashAggregate [codegen id : 14] +(53) HashAggregate [codegen id : 13] Input [4]: [ss_list_price#3, sum#59, count#60, count#61] Keys [1]: [ss_list_price#3] Functions [2]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3)] Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#3))#57, count(ss_list_price#3)#58] Results [4]: [ss_list_price#3, sum#59, count#60, count#61] -(54) HashAggregate [codegen id : 14] +(54) HashAggregate [codegen id : 13] Input [4]: [ss_list_price#3, sum#59, count#60, count#61] Keys: [] Functions [3]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3), partial_count(distinct ss_list_price#3)] @@ -355,7 +355,7 @@ Results [4]: [sum#59, count#60, count#61, count#64] Input [4]: [sum#59, count#60, count#61, count#64] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#65] -(56) HashAggregate [codegen id : 15] +(56) HashAggregate [codegen id : 14] Input [4]: [sum#59, count#60, count#61, count#64] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -366,7 +366,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#3))#57 / 100.0) as decimal(1 Input [3]: [B5_LP#66, B5_CNT#67, B5_CNTD#68] Arguments: IdentityBroadcastMode, [id=#69] -(58) BroadcastNestedLoopJoin +(58) BroadcastNestedLoopJoin [codegen id : 18] Join condition: None (59) Scan parquet default.store_sales @@ -376,18 +376,18 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,26), LessThanOrEqual(ss_quantity,30), Or(Or(And(GreaterThanOrEqual(ss_list_price,154.00),LessThanOrEqual(ss_list_price,164.00)),And(GreaterThanOrEqual(ss_coupon_amt,7326.00),LessThanOrEqual(ss_coupon_amt,8326.00))),And(GreaterThanOrEqual(ss_wholesale_cost,7.00),LessThanOrEqual(ss_wholesale_cost,27.00)))] ReadSchema: struct -(60) ColumnarToRow [codegen id : 16] +(60) ColumnarToRow [codegen id : 15] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(61) Filter [codegen id : 16] +(61) Filter [codegen id : 15] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] Condition : (((isnotnull(ss_quantity#1) AND (ss_quantity#1 >= 26)) AND (ss_quantity#1 <= 30)) AND ((((ss_list_price#3 >= 154.00) AND (ss_list_price#3 <= 164.00)) OR ((ss_coupon_amt#4 >= 7326.00) AND (ss_coupon_amt#4 <= 8326.00))) OR ((ss_wholesale_cost#2 >= 7.00) AND (ss_wholesale_cost#2 <= 27.00)))) -(62) Project [codegen id : 16] +(62) Project [codegen id : 15] Output [1]: [ss_list_price#3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(63) HashAggregate [codegen id : 16] +(63) HashAggregate [codegen id : 15] Input [1]: [ss_list_price#3] Keys [1]: [ss_list_price#3] Functions [2]: [partial_avg(UnscaledValue(ss_list_price#3)), partial_count(ss_list_price#3)] @@ -398,14 +398,14 @@ Results [4]: [ss_list_price#3, sum#72, count#73, count#74] Input [4]: [ss_list_price#3, sum#72, count#73, count#74] Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, [id=#75] -(65) HashAggregate [codegen id : 17] +(65) HashAggregate [codegen id : 16] Input [4]: [ss_list_price#3, sum#72, count#73, count#74] Keys [1]: [ss_list_price#3] Functions [2]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3)] Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#3))#70, count(ss_list_price#3)#71] Results [4]: [ss_list_price#3, sum#72, count#73, count#74] -(66) HashAggregate [codegen id : 17] +(66) HashAggregate [codegen id : 16] Input [4]: [ss_list_price#3, sum#72, count#73, count#74] Keys: [] Functions [3]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3), partial_count(distinct ss_list_price#3)] @@ -416,7 +416,7 @@ Results [4]: [sum#72, count#73, count#74, count#77] Input [4]: [sum#72, count#73, count#74, count#77] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#78] -(68) HashAggregate [codegen id : 18] +(68) HashAggregate [codegen id : 17] Input [4]: [sum#72, count#73, count#74, count#77] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -427,6 +427,6 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#3))#70 / 100.0) as decimal(1 Input [3]: [B6_LP#79, B6_CNT#80, B6_CNTD#81] Arguments: IdentityBroadcastMode, [id=#82] -(70) BroadcastNestedLoopJoin +(70) BroadcastNestedLoopJoin [codegen id : 18] Join condition: None diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28.sf100/simplified.txt index a44103b585d7..25317a944a6f 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28.sf100/simplified.txt @@ -1,9 +1,9 @@ -BroadcastNestedLoopJoin +WholeStageCodegen (18) BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin - WholeStageCodegen (3) + BroadcastNestedLoopJoin HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B1_LP,B1_CNT,B1_CNTD,sum,count,count,count] InputAdapter Exchange #1 @@ -19,88 +19,93 @@ BroadcastNestedLoopJoin ColumnarToRow InputAdapter Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastExchange #3 - WholeStageCodegen (6) - HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B2_LP,B2_CNT,B2_CNTD,sum,count,count,count] + InputAdapter + BroadcastExchange #3 + WholeStageCodegen (5) + HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B2_LP,B2_CNT,B2_CNTD,sum,count,count,count] + InputAdapter + Exchange #4 + WholeStageCodegen (4) + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] + InputAdapter + Exchange [ss_list_price] #5 + WholeStageCodegen (3) + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] + Project [ss_list_price] + Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] + ColumnarToRow + InputAdapter + Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] + InputAdapter + BroadcastExchange #6 + WholeStageCodegen (8) + HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B3_LP,B3_CNT,B3_CNTD,sum,count,count,count] + InputAdapter + Exchange #7 + WholeStageCodegen (7) + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] + InputAdapter + Exchange [ss_list_price] #8 + WholeStageCodegen (6) + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] + Project [ss_list_price] + Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] + ColumnarToRow + InputAdapter + Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] + InputAdapter + BroadcastExchange #9 + WholeStageCodegen (11) + HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B4_LP,B4_CNT,B4_CNTD,sum,count,count,count] InputAdapter - Exchange #4 - WholeStageCodegen (5) + Exchange #10 + WholeStageCodegen (10) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] InputAdapter - Exchange [ss_list_price] #5 - WholeStageCodegen (4) + Exchange [ss_list_price] #11 + WholeStageCodegen (9) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] Project [ss_list_price] Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] ColumnarToRow InputAdapter Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastExchange #6 - WholeStageCodegen (9) - HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B3_LP,B3_CNT,B3_CNTD,sum,count,count,count] + InputAdapter + BroadcastExchange #12 + WholeStageCodegen (14) + HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B5_LP,B5_CNT,B5_CNTD,sum,count,count,count] InputAdapter - Exchange #7 - WholeStageCodegen (8) + Exchange #13 + WholeStageCodegen (13) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] InputAdapter - Exchange [ss_list_price] #8 - WholeStageCodegen (7) + Exchange [ss_list_price] #14 + WholeStageCodegen (12) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] Project [ss_list_price] Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] ColumnarToRow InputAdapter Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastExchange #9 - WholeStageCodegen (12) - HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B4_LP,B4_CNT,B4_CNTD,sum,count,count,count] + InputAdapter + BroadcastExchange #15 + WholeStageCodegen (17) + HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B6_LP,B6_CNT,B6_CNTD,sum,count,count,count] InputAdapter - Exchange #10 - WholeStageCodegen (11) + Exchange #16 + WholeStageCodegen (16) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] InputAdapter - Exchange [ss_list_price] #11 - WholeStageCodegen (10) + Exchange [ss_list_price] #17 + WholeStageCodegen (15) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] Project [ss_list_price] Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] ColumnarToRow InputAdapter Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastExchange #12 - WholeStageCodegen (15) - HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B5_LP,B5_CNT,B5_CNTD,sum,count,count,count] - InputAdapter - Exchange #13 - WholeStageCodegen (14) - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] - InputAdapter - Exchange [ss_list_price] #14 - WholeStageCodegen (13) - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] - Project [ss_list_price] - Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] - ColumnarToRow - InputAdapter - Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastExchange #15 - WholeStageCodegen (18) - HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B6_LP,B6_CNT,B6_CNTD,sum,count,count,count] - InputAdapter - Exchange #16 - WholeStageCodegen (17) - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] - InputAdapter - Exchange [ss_list_price] #17 - WholeStageCodegen (16) - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] - Project [ss_list_price] - Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] - ColumnarToRow - InputAdapter - Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/explain.txt index 7e4516d213be..9f15199d8c8b 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/explain.txt @@ -1,9 +1,9 @@ == Physical Plan == -BroadcastNestedLoopJoin Inner BuildRight (70) -:- BroadcastNestedLoopJoin Inner BuildRight (58) -: :- BroadcastNestedLoopJoin Inner BuildRight (46) -: : :- BroadcastNestedLoopJoin Inner BuildRight (34) -: : : :- BroadcastNestedLoopJoin Inner BuildRight (22) +* BroadcastNestedLoopJoin Inner BuildRight (70) +:- * BroadcastNestedLoopJoin Inner BuildRight (58) +: :- * BroadcastNestedLoopJoin Inner BuildRight (46) +: : :- * BroadcastNestedLoopJoin Inner BuildRight (34) +: : : :- * BroadcastNestedLoopJoin Inner BuildRight (22) : : : : :- * HashAggregate (10) : : : : : +- Exchange (9) : : : : : +- * HashAggregate (8) @@ -118,7 +118,7 @@ Results [4]: [sum#8, count#9, count#10, count#13] Input [4]: [sum#8, count#9, count#10, count#13] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#14] -(10) HashAggregate [codegen id : 3] +(10) HashAggregate [codegen id : 18] Input [4]: [sum#8, count#9, count#10, count#13] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -132,18 +132,18 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,6), LessThanOrEqual(ss_quantity,10), Or(Or(And(GreaterThanOrEqual(ss_list_price,90.00),LessThanOrEqual(ss_list_price,100.00)),And(GreaterThanOrEqual(ss_coupon_amt,2323.00),LessThanOrEqual(ss_coupon_amt,3323.00))),And(GreaterThanOrEqual(ss_wholesale_cost,31.00),LessThanOrEqual(ss_wholesale_cost,51.00)))] ReadSchema: struct -(12) ColumnarToRow [codegen id : 4] +(12) ColumnarToRow [codegen id : 3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(13) Filter [codegen id : 4] +(13) Filter [codegen id : 3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] Condition : (((isnotnull(ss_quantity#1) AND (ss_quantity#1 >= 6)) AND (ss_quantity#1 <= 10)) AND ((((ss_list_price#3 >= 90.00) AND (ss_list_price#3 <= 100.00)) OR ((ss_coupon_amt#4 >= 2323.00) AND (ss_coupon_amt#4 <= 3323.00))) OR ((ss_wholesale_cost#2 >= 31.00) AND (ss_wholesale_cost#2 <= 51.00)))) -(14) Project [codegen id : 4] +(14) Project [codegen id : 3] Output [1]: [ss_list_price#3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(15) HashAggregate [codegen id : 4] +(15) HashAggregate [codegen id : 3] Input [1]: [ss_list_price#3] Keys [1]: [ss_list_price#3] Functions [2]: [partial_avg(UnscaledValue(ss_list_price#3)), partial_count(ss_list_price#3)] @@ -154,14 +154,14 @@ Results [4]: [ss_list_price#3, sum#20, count#21, count#22] Input [4]: [ss_list_price#3, sum#20, count#21, count#22] Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, [id=#23] -(17) HashAggregate [codegen id : 5] +(17) HashAggregate [codegen id : 4] Input [4]: [ss_list_price#3, sum#20, count#21, count#22] Keys [1]: [ss_list_price#3] Functions [2]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3)] Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#3))#18, count(ss_list_price#3)#19] Results [4]: [ss_list_price#3, sum#20, count#21, count#22] -(18) HashAggregate [codegen id : 5] +(18) HashAggregate [codegen id : 4] Input [4]: [ss_list_price#3, sum#20, count#21, count#22] Keys: [] Functions [3]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3), partial_count(distinct ss_list_price#3)] @@ -172,7 +172,7 @@ Results [4]: [sum#20, count#21, count#22, count#25] Input [4]: [sum#20, count#21, count#22, count#25] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#26] -(20) HashAggregate [codegen id : 6] +(20) HashAggregate [codegen id : 5] Input [4]: [sum#20, count#21, count#22, count#25] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -183,7 +183,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#3))#18 / 100.0) as decimal(1 Input [3]: [B2_LP#27, B2_CNT#28, B2_CNTD#29] Arguments: IdentityBroadcastMode, [id=#30] -(22) BroadcastNestedLoopJoin +(22) BroadcastNestedLoopJoin [codegen id : 18] Join condition: None (23) Scan parquet default.store_sales @@ -193,18 +193,18 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,11), LessThanOrEqual(ss_quantity,15), Or(Or(And(GreaterThanOrEqual(ss_list_price,142.00),LessThanOrEqual(ss_list_price,152.00)),And(GreaterThanOrEqual(ss_coupon_amt,12214.00),LessThanOrEqual(ss_coupon_amt,13214.00))),And(GreaterThanOrEqual(ss_wholesale_cost,79.00),LessThanOrEqual(ss_wholesale_cost,99.00)))] ReadSchema: struct -(24) ColumnarToRow [codegen id : 7] +(24) ColumnarToRow [codegen id : 6] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(25) Filter [codegen id : 7] +(25) Filter [codegen id : 6] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] Condition : (((isnotnull(ss_quantity#1) AND (ss_quantity#1 >= 11)) AND (ss_quantity#1 <= 15)) AND ((((ss_list_price#3 >= 142.00) AND (ss_list_price#3 <= 152.00)) OR ((ss_coupon_amt#4 >= 12214.00) AND (ss_coupon_amt#4 <= 13214.00))) OR ((ss_wholesale_cost#2 >= 79.00) AND (ss_wholesale_cost#2 <= 99.00)))) -(26) Project [codegen id : 7] +(26) Project [codegen id : 6] Output [1]: [ss_list_price#3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(27) HashAggregate [codegen id : 7] +(27) HashAggregate [codegen id : 6] Input [1]: [ss_list_price#3] Keys [1]: [ss_list_price#3] Functions [2]: [partial_avg(UnscaledValue(ss_list_price#3)), partial_count(ss_list_price#3)] @@ -215,14 +215,14 @@ Results [4]: [ss_list_price#3, sum#33, count#34, count#35] Input [4]: [ss_list_price#3, sum#33, count#34, count#35] Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, [id=#36] -(29) HashAggregate [codegen id : 8] +(29) HashAggregate [codegen id : 7] Input [4]: [ss_list_price#3, sum#33, count#34, count#35] Keys [1]: [ss_list_price#3] Functions [2]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3)] Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#3))#31, count(ss_list_price#3)#32] Results [4]: [ss_list_price#3, sum#33, count#34, count#35] -(30) HashAggregate [codegen id : 8] +(30) HashAggregate [codegen id : 7] Input [4]: [ss_list_price#3, sum#33, count#34, count#35] Keys: [] Functions [3]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3), partial_count(distinct ss_list_price#3)] @@ -233,7 +233,7 @@ Results [4]: [sum#33, count#34, count#35, count#38] Input [4]: [sum#33, count#34, count#35, count#38] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#39] -(32) HashAggregate [codegen id : 9] +(32) HashAggregate [codegen id : 8] Input [4]: [sum#33, count#34, count#35, count#38] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -244,7 +244,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#3))#31 / 100.0) as decimal(1 Input [3]: [B3_LP#40, B3_CNT#41, B3_CNTD#42] Arguments: IdentityBroadcastMode, [id=#43] -(34) BroadcastNestedLoopJoin +(34) BroadcastNestedLoopJoin [codegen id : 18] Join condition: None (35) Scan parquet default.store_sales @@ -254,18 +254,18 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,16), LessThanOrEqual(ss_quantity,20), Or(Or(And(GreaterThanOrEqual(ss_list_price,135.00),LessThanOrEqual(ss_list_price,145.00)),And(GreaterThanOrEqual(ss_coupon_amt,6071.00),LessThanOrEqual(ss_coupon_amt,7071.00))),And(GreaterThanOrEqual(ss_wholesale_cost,38.00),LessThanOrEqual(ss_wholesale_cost,58.00)))] ReadSchema: struct -(36) ColumnarToRow [codegen id : 10] +(36) ColumnarToRow [codegen id : 9] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(37) Filter [codegen id : 10] +(37) Filter [codegen id : 9] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] Condition : (((isnotnull(ss_quantity#1) AND (ss_quantity#1 >= 16)) AND (ss_quantity#1 <= 20)) AND ((((ss_list_price#3 >= 135.00) AND (ss_list_price#3 <= 145.00)) OR ((ss_coupon_amt#4 >= 6071.00) AND (ss_coupon_amt#4 <= 7071.00))) OR ((ss_wholesale_cost#2 >= 38.00) AND (ss_wholesale_cost#2 <= 58.00)))) -(38) Project [codegen id : 10] +(38) Project [codegen id : 9] Output [1]: [ss_list_price#3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(39) HashAggregate [codegen id : 10] +(39) HashAggregate [codegen id : 9] Input [1]: [ss_list_price#3] Keys [1]: [ss_list_price#3] Functions [2]: [partial_avg(UnscaledValue(ss_list_price#3)), partial_count(ss_list_price#3)] @@ -276,14 +276,14 @@ Results [4]: [ss_list_price#3, sum#46, count#47, count#48] Input [4]: [ss_list_price#3, sum#46, count#47, count#48] Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, [id=#49] -(41) HashAggregate [codegen id : 11] +(41) HashAggregate [codegen id : 10] Input [4]: [ss_list_price#3, sum#46, count#47, count#48] Keys [1]: [ss_list_price#3] Functions [2]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3)] Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#3))#44, count(ss_list_price#3)#45] Results [4]: [ss_list_price#3, sum#46, count#47, count#48] -(42) HashAggregate [codegen id : 11] +(42) HashAggregate [codegen id : 10] Input [4]: [ss_list_price#3, sum#46, count#47, count#48] Keys: [] Functions [3]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3), partial_count(distinct ss_list_price#3)] @@ -294,7 +294,7 @@ Results [4]: [sum#46, count#47, count#48, count#51] Input [4]: [sum#46, count#47, count#48, count#51] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#52] -(44) HashAggregate [codegen id : 12] +(44) HashAggregate [codegen id : 11] Input [4]: [sum#46, count#47, count#48, count#51] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -305,7 +305,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#3))#44 / 100.0) as decimal(1 Input [3]: [B4_LP#53, B4_CNT#54, B4_CNTD#55] Arguments: IdentityBroadcastMode, [id=#56] -(46) BroadcastNestedLoopJoin +(46) BroadcastNestedLoopJoin [codegen id : 18] Join condition: None (47) Scan parquet default.store_sales @@ -315,18 +315,18 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,21), LessThanOrEqual(ss_quantity,25), Or(Or(And(GreaterThanOrEqual(ss_list_price,122.00),LessThanOrEqual(ss_list_price,132.00)),And(GreaterThanOrEqual(ss_coupon_amt,836.00),LessThanOrEqual(ss_coupon_amt,1836.00))),And(GreaterThanOrEqual(ss_wholesale_cost,17.00),LessThanOrEqual(ss_wholesale_cost,37.00)))] ReadSchema: struct -(48) ColumnarToRow [codegen id : 13] +(48) ColumnarToRow [codegen id : 12] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(49) Filter [codegen id : 13] +(49) Filter [codegen id : 12] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] Condition : (((isnotnull(ss_quantity#1) AND (ss_quantity#1 >= 21)) AND (ss_quantity#1 <= 25)) AND ((((ss_list_price#3 >= 122.00) AND (ss_list_price#3 <= 132.00)) OR ((ss_coupon_amt#4 >= 836.00) AND (ss_coupon_amt#4 <= 1836.00))) OR ((ss_wholesale_cost#2 >= 17.00) AND (ss_wholesale_cost#2 <= 37.00)))) -(50) Project [codegen id : 13] +(50) Project [codegen id : 12] Output [1]: [ss_list_price#3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(51) HashAggregate [codegen id : 13] +(51) HashAggregate [codegen id : 12] Input [1]: [ss_list_price#3] Keys [1]: [ss_list_price#3] Functions [2]: [partial_avg(UnscaledValue(ss_list_price#3)), partial_count(ss_list_price#3)] @@ -337,14 +337,14 @@ Results [4]: [ss_list_price#3, sum#59, count#60, count#61] Input [4]: [ss_list_price#3, sum#59, count#60, count#61] Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, [id=#62] -(53) HashAggregate [codegen id : 14] +(53) HashAggregate [codegen id : 13] Input [4]: [ss_list_price#3, sum#59, count#60, count#61] Keys [1]: [ss_list_price#3] Functions [2]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3)] Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#3))#57, count(ss_list_price#3)#58] Results [4]: [ss_list_price#3, sum#59, count#60, count#61] -(54) HashAggregate [codegen id : 14] +(54) HashAggregate [codegen id : 13] Input [4]: [ss_list_price#3, sum#59, count#60, count#61] Keys: [] Functions [3]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3), partial_count(distinct ss_list_price#3)] @@ -355,7 +355,7 @@ Results [4]: [sum#59, count#60, count#61, count#64] Input [4]: [sum#59, count#60, count#61, count#64] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#65] -(56) HashAggregate [codegen id : 15] +(56) HashAggregate [codegen id : 14] Input [4]: [sum#59, count#60, count#61, count#64] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -366,7 +366,7 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#3))#57 / 100.0) as decimal(1 Input [3]: [B5_LP#66, B5_CNT#67, B5_CNTD#68] Arguments: IdentityBroadcastMode, [id=#69] -(58) BroadcastNestedLoopJoin +(58) BroadcastNestedLoopJoin [codegen id : 18] Join condition: None (59) Scan parquet default.store_sales @@ -376,18 +376,18 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_quantity), GreaterThanOrEqual(ss_quantity,26), LessThanOrEqual(ss_quantity,30), Or(Or(And(GreaterThanOrEqual(ss_list_price,154.00),LessThanOrEqual(ss_list_price,164.00)),And(GreaterThanOrEqual(ss_coupon_amt,7326.00),LessThanOrEqual(ss_coupon_amt,8326.00))),And(GreaterThanOrEqual(ss_wholesale_cost,7.00),LessThanOrEqual(ss_wholesale_cost,27.00)))] ReadSchema: struct -(60) ColumnarToRow [codegen id : 16] +(60) ColumnarToRow [codegen id : 15] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(61) Filter [codegen id : 16] +(61) Filter [codegen id : 15] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] Condition : (((isnotnull(ss_quantity#1) AND (ss_quantity#1 >= 26)) AND (ss_quantity#1 <= 30)) AND ((((ss_list_price#3 >= 154.00) AND (ss_list_price#3 <= 164.00)) OR ((ss_coupon_amt#4 >= 7326.00) AND (ss_coupon_amt#4 <= 8326.00))) OR ((ss_wholesale_cost#2 >= 7.00) AND (ss_wholesale_cost#2 <= 27.00)))) -(62) Project [codegen id : 16] +(62) Project [codegen id : 15] Output [1]: [ss_list_price#3] Input [5]: [ss_quantity#1, ss_wholesale_cost#2, ss_list_price#3, ss_coupon_amt#4, ss_sold_date_sk#5] -(63) HashAggregate [codegen id : 16] +(63) HashAggregate [codegen id : 15] Input [1]: [ss_list_price#3] Keys [1]: [ss_list_price#3] Functions [2]: [partial_avg(UnscaledValue(ss_list_price#3)), partial_count(ss_list_price#3)] @@ -398,14 +398,14 @@ Results [4]: [ss_list_price#3, sum#72, count#73, count#74] Input [4]: [ss_list_price#3, sum#72, count#73, count#74] Arguments: hashpartitioning(ss_list_price#3, 5), ENSURE_REQUIREMENTS, [id=#75] -(65) HashAggregate [codegen id : 17] +(65) HashAggregate [codegen id : 16] Input [4]: [ss_list_price#3, sum#72, count#73, count#74] Keys [1]: [ss_list_price#3] Functions [2]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3)] Aggregate Attributes [2]: [avg(UnscaledValue(ss_list_price#3))#70, count(ss_list_price#3)#71] Results [4]: [ss_list_price#3, sum#72, count#73, count#74] -(66) HashAggregate [codegen id : 17] +(66) HashAggregate [codegen id : 16] Input [4]: [ss_list_price#3, sum#72, count#73, count#74] Keys: [] Functions [3]: [merge_avg(UnscaledValue(ss_list_price#3)), merge_count(ss_list_price#3), partial_count(distinct ss_list_price#3)] @@ -416,7 +416,7 @@ Results [4]: [sum#72, count#73, count#74, count#77] Input [4]: [sum#72, count#73, count#74, count#77] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#78] -(68) HashAggregate [codegen id : 18] +(68) HashAggregate [codegen id : 17] Input [4]: [sum#72, count#73, count#74, count#77] Keys: [] Functions [3]: [avg(UnscaledValue(ss_list_price#3)), count(ss_list_price#3), count(distinct ss_list_price#3)] @@ -427,6 +427,6 @@ Results [3]: [cast((avg(UnscaledValue(ss_list_price#3))#70 / 100.0) as decimal(1 Input [3]: [B6_LP#79, B6_CNT#80, B6_CNTD#81] Arguments: IdentityBroadcastMode, [id=#82] -(70) BroadcastNestedLoopJoin +(70) BroadcastNestedLoopJoin [codegen id : 18] Join condition: None diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/simplified.txt index a44103b585d7..25317a944a6f 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q28/simplified.txt @@ -1,9 +1,9 @@ -BroadcastNestedLoopJoin +WholeStageCodegen (18) BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin - WholeStageCodegen (3) + BroadcastNestedLoopJoin HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B1_LP,B1_CNT,B1_CNTD,sum,count,count,count] InputAdapter Exchange #1 @@ -19,88 +19,93 @@ BroadcastNestedLoopJoin ColumnarToRow InputAdapter Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastExchange #3 - WholeStageCodegen (6) - HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B2_LP,B2_CNT,B2_CNTD,sum,count,count,count] + InputAdapter + BroadcastExchange #3 + WholeStageCodegen (5) + HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B2_LP,B2_CNT,B2_CNTD,sum,count,count,count] + InputAdapter + Exchange #4 + WholeStageCodegen (4) + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] + InputAdapter + Exchange [ss_list_price] #5 + WholeStageCodegen (3) + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] + Project [ss_list_price] + Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] + ColumnarToRow + InputAdapter + Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] + InputAdapter + BroadcastExchange #6 + WholeStageCodegen (8) + HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B3_LP,B3_CNT,B3_CNTD,sum,count,count,count] + InputAdapter + Exchange #7 + WholeStageCodegen (7) + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] + InputAdapter + Exchange [ss_list_price] #8 + WholeStageCodegen (6) + HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] + Project [ss_list_price] + Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] + ColumnarToRow + InputAdapter + Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] + InputAdapter + BroadcastExchange #9 + WholeStageCodegen (11) + HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B4_LP,B4_CNT,B4_CNTD,sum,count,count,count] InputAdapter - Exchange #4 - WholeStageCodegen (5) + Exchange #10 + WholeStageCodegen (10) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] InputAdapter - Exchange [ss_list_price] #5 - WholeStageCodegen (4) + Exchange [ss_list_price] #11 + WholeStageCodegen (9) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] Project [ss_list_price] Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] ColumnarToRow InputAdapter Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastExchange #6 - WholeStageCodegen (9) - HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B3_LP,B3_CNT,B3_CNTD,sum,count,count,count] + InputAdapter + BroadcastExchange #12 + WholeStageCodegen (14) + HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B5_LP,B5_CNT,B5_CNTD,sum,count,count,count] InputAdapter - Exchange #7 - WholeStageCodegen (8) + Exchange #13 + WholeStageCodegen (13) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] InputAdapter - Exchange [ss_list_price] #8 - WholeStageCodegen (7) + Exchange [ss_list_price] #14 + WholeStageCodegen (12) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] Project [ss_list_price] Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] ColumnarToRow InputAdapter Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastExchange #9 - WholeStageCodegen (12) - HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B4_LP,B4_CNT,B4_CNTD,sum,count,count,count] + InputAdapter + BroadcastExchange #15 + WholeStageCodegen (17) + HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B6_LP,B6_CNT,B6_CNTD,sum,count,count,count] InputAdapter - Exchange #10 - WholeStageCodegen (11) + Exchange #16 + WholeStageCodegen (16) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] InputAdapter - Exchange [ss_list_price] #11 - WholeStageCodegen (10) + Exchange [ss_list_price] #17 + WholeStageCodegen (15) HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] Project [ss_list_price] Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] ColumnarToRow InputAdapter Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastExchange #12 - WholeStageCodegen (15) - HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B5_LP,B5_CNT,B5_CNTD,sum,count,count,count] - InputAdapter - Exchange #13 - WholeStageCodegen (14) - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] - InputAdapter - Exchange [ss_list_price] #14 - WholeStageCodegen (13) - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] - Project [ss_list_price] - Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] - ColumnarToRow - InputAdapter - Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_sk] - BroadcastExchange #15 - WholeStageCodegen (18) - HashAggregate [sum,count,count,count] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),B6_LP,B6_CNT,B6_CNTD,sum,count,count,count] - InputAdapter - Exchange #16 - WholeStageCodegen (17) - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),count(ss_list_price),sum,count,count,count,sum,count,count,count] - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] - InputAdapter - Exchange [ss_list_price] #17 - WholeStageCodegen (16) - HashAggregate [ss_list_price] [avg(UnscaledValue(ss_list_price)),count(ss_list_price),sum,count,count,sum,count,count] - Project [ss_list_price] - Filter [ss_quantity,ss_list_price,ss_coupon_amt,ss_wholesale_cost] - ColumnarToRow - InputAdapter - Scan parquet default.store_sales [ss_quantity,ss_wholesale_cost,ss_list_price,ss_coupon_amt,ss_sold_date_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 b8ecb21518f7..23807f056155 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 @@ -1,7 +1,7 @@ == Physical Plan == * Sort (69) +- * Project (68) - +- BroadcastNestedLoopJoin Inner BuildRight (67) + +- * BroadcastNestedLoopJoin Inner BuildRight (67) :- * HashAggregate (47) : +- Exchange (46) : +- * HashAggregate (45) @@ -278,7 +278,7 @@ Results [1]: [sum#30] Input [1]: [sum#30] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#31] -(47) HashAggregate [codegen id : 8] +(47) HashAggregate [codegen id : 15] Input [1]: [sum#30] Keys: [] Functions [1]: [sum(UnscaledValue(ss_ext_sales_price#5))] @@ -293,62 +293,62 @@ PartitionFilters: [isnotnull(ss_sold_date_sk#6), dynamicpruningexpression(ss_sol PushedFilters: [IsNotNull(ss_store_sk), IsNotNull(ss_customer_sk), IsNotNull(ss_item_sk)] ReadSchema: struct -(49) ColumnarToRow [codegen id : 14] +(49) ColumnarToRow [codegen id : 13] Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ext_sales_price#5, ss_sold_date_sk#6] -(50) Filter [codegen id : 14] +(50) Filter [codegen id : 13] Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ext_sales_price#5, ss_sold_date_sk#6] Condition : ((isnotnull(ss_store_sk#3) AND isnotnull(ss_customer_sk#2)) AND isnotnull(ss_item_sk#1)) (51) ReusedExchange [Reuses operator id: 8] Output [1]: [d_date_sk#8] -(52) BroadcastHashJoin [codegen id : 14] +(52) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_sold_date_sk#6] Right keys [1]: [d_date_sk#8] Join condition: None -(53) Project [codegen id : 14] +(53) Project [codegen id : 13] 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_ext_sales_price#5, ss_sold_date_sk#6, d_date_sk#8] (54) ReusedExchange [Reuses operator id: 15] Output [1]: [i_item_sk#12] -(55) BroadcastHashJoin [codegen id : 14] +(55) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_item_sk#1] Right keys [1]: [i_item_sk#12] Join condition: None -(56) Project [codegen id : 14] +(56) Project [codegen id : 13] Output [3]: [ss_customer_sk#2, ss_store_sk#3, ss_ext_sales_price#5] Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ext_sales_price#5, i_item_sk#12] (57) ReusedExchange [Reuses operator id: 29] Output [1]: [s_store_sk#20] -(58) BroadcastHashJoin [codegen id : 14] +(58) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#20] Join condition: None -(59) Project [codegen id : 14] +(59) Project [codegen id : 13] Output [2]: [ss_customer_sk#2, ss_ext_sales_price#5] Input [4]: [ss_customer_sk#2, ss_store_sk#3, ss_ext_sales_price#5, s_store_sk#20] (60) ReusedExchange [Reuses operator id: 42] Output [1]: [c_customer_sk#23] -(61) BroadcastHashJoin [codegen id : 14] +(61) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_customer_sk#2] Right keys [1]: [c_customer_sk#23] Join condition: None -(62) Project [codegen id : 14] +(62) Project [codegen id : 13] Output [1]: [ss_ext_sales_price#5] Input [3]: [ss_customer_sk#2, ss_ext_sales_price#5, c_customer_sk#23] -(63) HashAggregate [codegen id : 14] +(63) HashAggregate [codegen id : 13] Input [1]: [ss_ext_sales_price#5] Keys: [] Functions [1]: [partial_sum(UnscaledValue(ss_ext_sales_price#5))] @@ -359,7 +359,7 @@ Results [1]: [sum#35] Input [1]: [sum#35] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#36] -(65) HashAggregate [codegen id : 15] +(65) HashAggregate [codegen id : 14] Input [1]: [sum#35] Keys: [] Functions [1]: [sum(UnscaledValue(ss_ext_sales_price#5))] @@ -370,14 +370,14 @@ Results [1]: [MakeDecimal(sum(UnscaledValue(ss_ext_sales_price#5))#37,17,2) AS t Input [1]: [total#38] Arguments: IdentityBroadcastMode, [id=#39] -(67) BroadcastNestedLoopJoin +(67) BroadcastNestedLoopJoin [codegen id : 15] Join condition: None -(68) Project [codegen id : 16] +(68) Project [codegen id : 15] Output [3]: [promotions#33, total#38, CheckOverflow((promote_precision(CheckOverflow((promote_precision(cast(promotions#33 as decimal(15,4))) / promote_precision(cast(total#38 as decimal(15,4)))), DecimalType(35,20), true)) * 100.00000000000000000000), DecimalType(38,19), true) AS ((CAST(promotions AS DECIMAL(15,4)) / CAST(total AS DECIMAL(15,4))) * 100)#40] Input [2]: [promotions#33, total#38] -(69) Sort [codegen id : 16] +(69) Sort [codegen id : 15] Input [3]: [promotions#33, total#38, ((CAST(promotions AS DECIMAL(15,4)) / CAST(total AS DECIMAL(15,4))) * 100)#40] Arguments: [promotions#33 ASC NULLS FIRST, total#38 ASC NULLS FIRST], true, 0 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 ce3cc2fa9ec6..b4e4877c12ee 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 @@ -1,85 +1,84 @@ -WholeStageCodegen (16) +WholeStageCodegen (15) Sort [promotions,total] Project [promotions,total] - InputAdapter - BroadcastNestedLoopJoin - WholeStageCodegen (8) - HashAggregate [sum] [sum(UnscaledValue(ss_ext_sales_price)),promotions,sum] - InputAdapter - Exchange #1 - WholeStageCodegen (7) - HashAggregate [ss_ext_sales_price] [sum,sum] - Project [ss_ext_sales_price] - BroadcastHashJoin [ss_customer_sk,c_customer_sk] - 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] - 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] - ColumnarToRow - InputAdapter - Scan parquet default.store_sales [ss_item_sk,ss_customer_sk,ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_sold_date_sk] - SubqueryBroadcast [d_date_sk] #1 - ReusedExchange [d_date_sk] #2 + BroadcastNestedLoopJoin + HashAggregate [sum] [sum(UnscaledValue(ss_ext_sales_price)),promotions,sum] + InputAdapter + Exchange #1 + WholeStageCodegen (7) + HashAggregate [ss_ext_sales_price] [sum,sum] + Project [ss_ext_sales_price] + BroadcastHashJoin [ss_customer_sk,c_customer_sk] + 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] + 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] + ColumnarToRow InputAdapter - BroadcastExchange #2 - WholeStageCodegen (1) - Project [d_date_sk] - Filter [d_year,d_moy,d_date_sk] - ColumnarToRow - InputAdapter - Scan parquet default.date_dim [d_date_sk,d_year,d_moy] + Scan parquet default.store_sales [ss_item_sk,ss_customer_sk,ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_sold_date_sk] + SubqueryBroadcast [d_date_sk] #1 + ReusedExchange [d_date_sk] #2 InputAdapter - BroadcastExchange #3 - WholeStageCodegen (2) - Project [i_item_sk] - Filter [i_category,i_item_sk] + BroadcastExchange #2 + WholeStageCodegen (1) + Project [d_date_sk] + Filter [d_year,d_moy,d_date_sk] ColumnarToRow InputAdapter - Scan parquet default.item [i_item_sk,i_category] + Scan parquet default.date_dim [d_date_sk,d_year,d_moy] InputAdapter - BroadcastExchange #4 - WholeStageCodegen (3) - Project [p_promo_sk] - Filter [p_channel_dmail,p_channel_email,p_channel_tv,p_promo_sk] + BroadcastExchange #3 + WholeStageCodegen (2) + 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) - Project [s_store_sk] - Filter [s_gmt_offset,s_store_sk] + BroadcastExchange #4 + WholeStageCodegen (3) + Project [p_promo_sk] + Filter [p_channel_dmail,p_channel_email,p_channel_tv,p_promo_sk] ColumnarToRow InputAdapter - Scan parquet default.store [s_store_sk,s_gmt_offset] + Scan parquet default.promotion [p_promo_sk,p_channel_dmail,p_channel_email,p_channel_tv] InputAdapter - BroadcastExchange #6 - WholeStageCodegen (6) - Project [c_customer_sk] - BroadcastHashJoin [c_current_addr_sk,ca_address_sk] - Filter [c_customer_sk,c_current_addr_sk] - ColumnarToRow - InputAdapter - Scan parquet default.customer [c_customer_sk,c_current_addr_sk] + BroadcastExchange #5 + WholeStageCodegen (4) + Project [s_store_sk] + Filter [s_gmt_offset,s_store_sk] + ColumnarToRow + InputAdapter + Scan parquet default.store [s_store_sk,s_gmt_offset] + InputAdapter + BroadcastExchange #6 + WholeStageCodegen (6) + Project [c_customer_sk] + BroadcastHashJoin [c_current_addr_sk,ca_address_sk] + Filter [c_customer_sk,c_current_addr_sk] + ColumnarToRow InputAdapter - BroadcastExchange #7 - WholeStageCodegen (5) - Project [ca_address_sk] - Filter [ca_gmt_offset,ca_address_sk] - ColumnarToRow - InputAdapter - Scan parquet default.customer_address [ca_address_sk,ca_gmt_offset] + Scan parquet default.customer [c_customer_sk,c_current_addr_sk] + InputAdapter + BroadcastExchange #7 + WholeStageCodegen (5) + Project [ca_address_sk] + Filter [ca_gmt_offset,ca_address_sk] + ColumnarToRow + InputAdapter + Scan parquet default.customer_address [ca_address_sk,ca_gmt_offset] + InputAdapter BroadcastExchange #8 - WholeStageCodegen (15) + WholeStageCodegen (14) HashAggregate [sum] [sum(UnscaledValue(ss_ext_sales_price)),total,sum] InputAdapter Exchange #9 - WholeStageCodegen (14) + WholeStageCodegen (13) HashAggregate [ss_ext_sales_price] [sum,sum] Project [ss_ext_sales_price] BroadcastHashJoin [ss_customer_sk,c_customer_sk] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61/explain.txt index 817731a6c645..c0fad04ce402 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61/explain.txt @@ -1,7 +1,7 @@ == Physical Plan == * Sort (72) +- * Project (71) - +- BroadcastNestedLoopJoin Inner BuildRight (70) + +- * BroadcastNestedLoopJoin Inner BuildRight (70) :- * HashAggregate (47) : +- Exchange (46) : +- * HashAggregate (45) @@ -281,7 +281,7 @@ Results [1]: [sum#30] Input [1]: [sum#30] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#31] -(47) HashAggregate [codegen id : 8] +(47) HashAggregate [codegen id : 15] Input [1]: [sum#30] Keys: [] Functions [1]: [sum(UnscaledValue(ss_ext_sales_price#5))] @@ -296,74 +296,74 @@ PartitionFilters: [isnotnull(ss_sold_date_sk#6), dynamicpruningexpression(ss_sol PushedFilters: [IsNotNull(ss_store_sk), IsNotNull(ss_customer_sk), IsNotNull(ss_item_sk)] ReadSchema: struct -(49) ColumnarToRow [codegen id : 14] +(49) ColumnarToRow [codegen id : 13] Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ext_sales_price#5, ss_sold_date_sk#6] -(50) Filter [codegen id : 14] +(50) Filter [codegen id : 13] Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ext_sales_price#5, ss_sold_date_sk#6] Condition : ((isnotnull(ss_store_sk#3) AND isnotnull(ss_customer_sk#2)) AND isnotnull(ss_item_sk#1)) (51) ReusedExchange [Reuses operator id: 8] Output [1]: [s_store_sk#8] -(52) BroadcastHashJoin [codegen id : 14] +(52) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#8] Join condition: None -(53) Project [codegen id : 14] +(53) Project [codegen id : 13] Output [4]: [ss_item_sk#1, ss_customer_sk#2, ss_ext_sales_price#5, ss_sold_date_sk#6] Input [6]: [ss_item_sk#1, ss_customer_sk#2, ss_store_sk#3, ss_ext_sales_price#5, ss_sold_date_sk#6, s_store_sk#8] (54) ReusedExchange [Reuses operator id: 22] Output [1]: [d_date_sk#16] -(55) BroadcastHashJoin [codegen id : 14] +(55) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_sold_date_sk#6] Right keys [1]: [d_date_sk#16] Join condition: None -(56) Project [codegen id : 14] +(56) Project [codegen id : 13] Output [3]: [ss_item_sk#1, ss_customer_sk#2, ss_ext_sales_price#5] Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_ext_sales_price#5, ss_sold_date_sk#6, d_date_sk#16] (57) ReusedExchange [Reuses operator id: 28] Output [2]: [c_customer_sk#20, c_current_addr_sk#21] -(58) BroadcastHashJoin [codegen id : 14] +(58) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_customer_sk#2] Right keys [1]: [c_customer_sk#20] Join condition: None -(59) Project [codegen id : 14] +(59) Project [codegen id : 13] Output [3]: [ss_item_sk#1, ss_ext_sales_price#5, c_current_addr_sk#21] Input [5]: [ss_item_sk#1, ss_customer_sk#2, ss_ext_sales_price#5, c_customer_sk#20, c_current_addr_sk#21] (60) ReusedExchange [Reuses operator id: 35] Output [1]: [ca_address_sk#23] -(61) BroadcastHashJoin [codegen id : 14] +(61) BroadcastHashJoin [codegen id : 13] Left keys [1]: [c_current_addr_sk#21] Right keys [1]: [ca_address_sk#23] Join condition: None -(62) Project [codegen id : 14] +(62) Project [codegen id : 13] Output [2]: [ss_item_sk#1, ss_ext_sales_price#5] Input [4]: [ss_item_sk#1, ss_ext_sales_price#5, c_current_addr_sk#21, ca_address_sk#23] (63) ReusedExchange [Reuses operator id: 42] Output [1]: [i_item_sk#26] -(64) BroadcastHashJoin [codegen id : 14] +(64) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_item_sk#1] Right keys [1]: [i_item_sk#26] Join condition: None -(65) Project [codegen id : 14] +(65) Project [codegen id : 13] Output [1]: [ss_ext_sales_price#5] Input [3]: [ss_item_sk#1, ss_ext_sales_price#5, i_item_sk#26] -(66) HashAggregate [codegen id : 14] +(66) HashAggregate [codegen id : 13] Input [1]: [ss_ext_sales_price#5] Keys: [] Functions [1]: [partial_sum(UnscaledValue(ss_ext_sales_price#5))] @@ -374,7 +374,7 @@ Results [1]: [sum#35] Input [1]: [sum#35] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#36] -(68) HashAggregate [codegen id : 15] +(68) HashAggregate [codegen id : 14] Input [1]: [sum#35] Keys: [] Functions [1]: [sum(UnscaledValue(ss_ext_sales_price#5))] @@ -385,14 +385,14 @@ Results [1]: [MakeDecimal(sum(UnscaledValue(ss_ext_sales_price#5))#37,17,2) AS t Input [1]: [total#38] Arguments: IdentityBroadcastMode, [id=#39] -(70) BroadcastNestedLoopJoin +(70) BroadcastNestedLoopJoin [codegen id : 15] Join condition: None -(71) Project [codegen id : 16] +(71) Project [codegen id : 15] Output [3]: [promotions#33, total#38, CheckOverflow((promote_precision(CheckOverflow((promote_precision(cast(promotions#33 as decimal(15,4))) / promote_precision(cast(total#38 as decimal(15,4)))), DecimalType(35,20), true)) * 100.00000000000000000000), DecimalType(38,19), true) AS ((CAST(promotions AS DECIMAL(15,4)) / CAST(total AS DECIMAL(15,4))) * 100)#40] Input [2]: [promotions#33, total#38] -(72) Sort [codegen id : 16] +(72) Sort [codegen id : 15] Input [3]: [promotions#33, total#38, ((CAST(promotions AS DECIMAL(15,4)) / CAST(total AS DECIMAL(15,4))) * 100)#40] Arguments: [promotions#33 ASC NULLS FIRST, total#38 ASC NULLS FIRST], true, 0 diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61/simplified.txt index 686ae911fd3e..5a96e4d5b419 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q61/simplified.txt @@ -1,85 +1,84 @@ -WholeStageCodegen (16) +WholeStageCodegen (15) Sort [promotions,total] Project [promotions,total] - InputAdapter - BroadcastNestedLoopJoin - WholeStageCodegen (8) - HashAggregate [sum] [sum(UnscaledValue(ss_ext_sales_price)),promotions,sum] - InputAdapter - Exchange #1 - WholeStageCodegen (7) - HashAggregate [ss_ext_sales_price] [sum,sum] - Project [ss_ext_sales_price] - BroadcastHashJoin [ss_item_sk,i_item_sk] - Project [ss_item_sk,ss_ext_sales_price] - BroadcastHashJoin [c_current_addr_sk,ca_address_sk] - Project [ss_item_sk,ss_ext_sales_price,c_current_addr_sk] - BroadcastHashJoin [ss_customer_sk,c_customer_sk] - Project [ss_item_sk,ss_customer_sk,ss_ext_sales_price] - BroadcastHashJoin [ss_sold_date_sk,d_date_sk] - Project [ss_item_sk,ss_customer_sk,ss_ext_sales_price,ss_sold_date_sk] - BroadcastHashJoin [ss_promo_sk,p_promo_sk] - Project [ss_item_sk,ss_customer_sk,ss_promo_sk,ss_ext_sales_price,ss_sold_date_sk] - BroadcastHashJoin [ss_store_sk,s_store_sk] - Filter [ss_store_sk,ss_promo_sk,ss_customer_sk,ss_item_sk] - ColumnarToRow - InputAdapter - Scan parquet default.store_sales [ss_item_sk,ss_customer_sk,ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_sold_date_sk] - SubqueryBroadcast [d_date_sk] #1 - ReusedExchange [d_date_sk] #2 + BroadcastNestedLoopJoin + HashAggregate [sum] [sum(UnscaledValue(ss_ext_sales_price)),promotions,sum] + InputAdapter + Exchange #1 + WholeStageCodegen (7) + HashAggregate [ss_ext_sales_price] [sum,sum] + Project [ss_ext_sales_price] + BroadcastHashJoin [ss_item_sk,i_item_sk] + Project [ss_item_sk,ss_ext_sales_price] + BroadcastHashJoin [c_current_addr_sk,ca_address_sk] + Project [ss_item_sk,ss_ext_sales_price,c_current_addr_sk] + BroadcastHashJoin [ss_customer_sk,c_customer_sk] + Project [ss_item_sk,ss_customer_sk,ss_ext_sales_price] + BroadcastHashJoin [ss_sold_date_sk,d_date_sk] + Project [ss_item_sk,ss_customer_sk,ss_ext_sales_price,ss_sold_date_sk] + BroadcastHashJoin [ss_promo_sk,p_promo_sk] + Project [ss_item_sk,ss_customer_sk,ss_promo_sk,ss_ext_sales_price,ss_sold_date_sk] + BroadcastHashJoin [ss_store_sk,s_store_sk] + Filter [ss_store_sk,ss_promo_sk,ss_customer_sk,ss_item_sk] + ColumnarToRow InputAdapter - BroadcastExchange #3 - WholeStageCodegen (1) - Project [s_store_sk] - Filter [s_gmt_offset,s_store_sk] - ColumnarToRow - InputAdapter - Scan parquet default.store [s_store_sk,s_gmt_offset] + Scan parquet default.store_sales [ss_item_sk,ss_customer_sk,ss_store_sk,ss_promo_sk,ss_ext_sales_price,ss_sold_date_sk] + SubqueryBroadcast [d_date_sk] #1 + ReusedExchange [d_date_sk] #2 InputAdapter - BroadcastExchange #4 - WholeStageCodegen (2) - Project [p_promo_sk] - Filter [p_channel_dmail,p_channel_email,p_channel_tv,p_promo_sk] + BroadcastExchange #3 + WholeStageCodegen (1) + Project [s_store_sk] + Filter [s_gmt_offset,s_store_sk] ColumnarToRow InputAdapter - Scan parquet default.promotion [p_promo_sk,p_channel_dmail,p_channel_email,p_channel_tv] + Scan parquet default.store [s_store_sk,s_gmt_offset] InputAdapter - BroadcastExchange #2 - WholeStageCodegen (3) - Project [d_date_sk] - Filter [d_year,d_moy,d_date_sk] + BroadcastExchange #4 + WholeStageCodegen (2) + Project [p_promo_sk] + Filter [p_channel_dmail,p_channel_email,p_channel_tv,p_promo_sk] ColumnarToRow InputAdapter - Scan parquet default.date_dim [d_date_sk,d_year,d_moy] + Scan parquet default.promotion [p_promo_sk,p_channel_dmail,p_channel_email,p_channel_tv] InputAdapter - BroadcastExchange #5 - WholeStageCodegen (4) - Filter [c_customer_sk,c_current_addr_sk] - ColumnarToRow - InputAdapter - Scan parquet default.customer [c_customer_sk,c_current_addr_sk] + BroadcastExchange #2 + WholeStageCodegen (3) + Project [d_date_sk] + Filter [d_year,d_moy,d_date_sk] + ColumnarToRow + InputAdapter + Scan parquet default.date_dim [d_date_sk,d_year,d_moy] InputAdapter - BroadcastExchange #6 - WholeStageCodegen (5) - Project [ca_address_sk] - Filter [ca_gmt_offset,ca_address_sk] - ColumnarToRow - InputAdapter - Scan parquet default.customer_address [ca_address_sk,ca_gmt_offset] + BroadcastExchange #5 + WholeStageCodegen (4) + Filter [c_customer_sk,c_current_addr_sk] + ColumnarToRow + InputAdapter + Scan parquet default.customer [c_customer_sk,c_current_addr_sk] InputAdapter - BroadcastExchange #7 - WholeStageCodegen (6) - Project [i_item_sk] - Filter [i_category,i_item_sk] + BroadcastExchange #6 + WholeStageCodegen (5) + Project [ca_address_sk] + Filter [ca_gmt_offset,ca_address_sk] ColumnarToRow InputAdapter - Scan parquet default.item [i_item_sk,i_category] + Scan parquet default.customer_address [ca_address_sk,ca_gmt_offset] + InputAdapter + BroadcastExchange #7 + WholeStageCodegen (6) + Project [i_item_sk] + Filter [i_category,i_item_sk] + ColumnarToRow + InputAdapter + Scan parquet default.item [i_item_sk,i_category] + InputAdapter BroadcastExchange #8 - WholeStageCodegen (15) + WholeStageCodegen (14) HashAggregate [sum] [sum(UnscaledValue(ss_ext_sales_price)),total,sum] InputAdapter Exchange #9 - WholeStageCodegen (14) + WholeStageCodegen (13) HashAggregate [ss_ext_sales_price] [sum,sum] Project [ss_ext_sales_price] BroadcastHashJoin [ss_item_sk,i_item_sk] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77.sf100/explain.txt index 35c791c4f5e3..a3626dfe3293 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77.sf100/explain.txt @@ -40,7 +40,7 @@ TakeOrderedAndProject (89) : : +- ReusedExchange (23) : +- ReusedExchange (26) :- * Project (53) - : +- BroadcastNestedLoopJoin Inner BuildRight (52) + : +- * BroadcastNestedLoopJoin Inner BuildRight (52) : :- * HashAggregate (42) : : +- Exchange (41) : : +- * HashAggregate (40) @@ -117,7 +117,7 @@ Input [2]: [d_date_sk#6, d_date#7] (6) Filter [codegen id : 1] Input [2]: [d_date_sk#6, d_date#7] -Condition : (((isnotnull(d_date#7) AND (d_date#7 >= 11172)) AND (d_date#7 <= 11202)) AND isnotnull(d_date_sk#6)) +Condition : (((isnotnull(d_date#7) AND (d_date#7 >= 2000-08-03)) AND (d_date#7 <= 2000-09-02)) AND isnotnull(d_date_sk#6)) (7) Project [codegen id : 1] Output [1]: [d_date_sk#6] @@ -284,7 +284,7 @@ Results [3]: [cs_call_center_sk#40, sum#46, sum#47] Input [3]: [cs_call_center_sk#40, sum#46, sum#47] Arguments: hashpartitioning(cs_call_center_sk#40, 5), ENSURE_REQUIREMENTS, [id=#48] -(42) HashAggregate [codegen id : 11] +(42) HashAggregate [codegen id : 14] Input [3]: [cs_call_center_sk#40, sum#46, sum#47] Keys [1]: [cs_call_center_sk#40] Functions [2]: [sum(UnscaledValue(cs_ext_sales_price#41)), sum(UnscaledValue(cs_net_profit#42))] @@ -298,22 +298,22 @@ Location: InMemoryFileIndex [] PartitionFilters: [isnotnull(cr_returned_date_sk#55), dynamicpruningexpression(cr_returned_date_sk#55 IN dynamicpruning#5)] ReadSchema: struct -(44) ColumnarToRow [codegen id : 13] +(44) ColumnarToRow [codegen id : 12] Input [3]: [cr_return_amount#53, cr_net_loss#54, cr_returned_date_sk#55] (45) ReusedExchange [Reuses operator id: 8] Output [1]: [d_date_sk#6] -(46) BroadcastHashJoin [codegen id : 13] +(46) BroadcastHashJoin [codegen id : 12] Left keys [1]: [cr_returned_date_sk#55] Right keys [1]: [d_date_sk#6] Join condition: None -(47) Project [codegen id : 13] +(47) Project [codegen id : 12] Output [2]: [cr_return_amount#53, cr_net_loss#54] Input [4]: [cr_return_amount#53, cr_net_loss#54, cr_returned_date_sk#55, d_date_sk#6] -(48) HashAggregate [codegen id : 13] +(48) HashAggregate [codegen id : 12] Input [2]: [cr_return_amount#53, cr_net_loss#54] Keys: [] Functions [2]: [partial_sum(UnscaledValue(cr_return_amount#53)), partial_sum(UnscaledValue(cr_net_loss#54))] @@ -324,7 +324,7 @@ Results [2]: [sum#58, sum#59] Input [2]: [sum#58, sum#59] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#60] -(50) HashAggregate [codegen id : 14] +(50) HashAggregate [codegen id : 13] Input [2]: [sum#58, sum#59] Keys: [] Functions [2]: [sum(UnscaledValue(cr_return_amount#53)), sum(UnscaledValue(cr_net_loss#54))] @@ -335,10 +335,10 @@ Results [2]: [MakeDecimal(sum(UnscaledValue(cr_return_amount#53))#61,17,2) AS re Input [2]: [returns#63, profit_loss#64] Arguments: IdentityBroadcastMode, [id=#65] -(52) BroadcastNestedLoopJoin +(52) BroadcastNestedLoopJoin [codegen id : 14] Join condition: None -(53) Project [codegen id : 15] +(53) Project [codegen id : 14] Output [5]: [sales#51, returns#63, CheckOverflow((promote_precision(cast(profit#52 as decimal(18,2))) - promote_precision(cast(profit_loss#64 as decimal(18,2)))), DecimalType(18,2), true) AS profit#66, catalog channel AS channel#67, cs_call_center_sk#40 AS id#68] Input [5]: [cs_call_center_sk#40, sales#51, profit#52, returns#63, profit_loss#64] @@ -350,22 +350,22 @@ PartitionFilters: [isnotnull(ws_sold_date_sk#72), dynamicpruningexpression(ws_so PushedFilters: [IsNotNull(ws_web_page_sk)] ReadSchema: struct -(55) ColumnarToRow [codegen id : 18] +(55) ColumnarToRow [codegen id : 17] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72] -(56) Filter [codegen id : 18] +(56) Filter [codegen id : 17] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72] Condition : isnotnull(ws_web_page_sk#69) (57) ReusedExchange [Reuses operator id: 8] Output [1]: [d_date_sk#6] -(58) BroadcastHashJoin [codegen id : 18] +(58) BroadcastHashJoin [codegen id : 17] Left keys [1]: [ws_sold_date_sk#72] Right keys [1]: [d_date_sk#6] Join condition: None -(59) Project [codegen id : 18] +(59) Project [codegen id : 17] Output [3]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71] Input [5]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72, d_date_sk#6] @@ -376,10 +376,10 @@ Location [not included in comparison]/{warehouse_dir}/web_page] PushedFilters: [IsNotNull(wp_web_page_sk)] ReadSchema: struct -(61) ColumnarToRow [codegen id : 17] +(61) ColumnarToRow [codegen id : 16] Input [1]: [wp_web_page_sk#73] -(62) Filter [codegen id : 17] +(62) Filter [codegen id : 16] Input [1]: [wp_web_page_sk#73] Condition : isnotnull(wp_web_page_sk#73) @@ -387,16 +387,16 @@ Condition : isnotnull(wp_web_page_sk#73) Input [1]: [wp_web_page_sk#73] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#74] -(64) BroadcastHashJoin [codegen id : 18] +(64) BroadcastHashJoin [codegen id : 17] Left keys [1]: [ws_web_page_sk#69] Right keys [1]: [wp_web_page_sk#73] Join condition: None -(65) Project [codegen id : 18] +(65) Project [codegen id : 17] Output [3]: [ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] -(66) HashAggregate [codegen id : 18] +(66) HashAggregate [codegen id : 17] Input [3]: [ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] Keys [1]: [wp_web_page_sk#73] Functions [2]: [partial_sum(UnscaledValue(ws_ext_sales_price#70)), partial_sum(UnscaledValue(ws_net_profit#71))] @@ -407,7 +407,7 @@ Results [3]: [wp_web_page_sk#73, sum#77, sum#78] Input [3]: [wp_web_page_sk#73, sum#77, sum#78] Arguments: hashpartitioning(wp_web_page_sk#73, 5), ENSURE_REQUIREMENTS, [id=#79] -(68) HashAggregate [codegen id : 23] +(68) HashAggregate [codegen id : 22] Input [3]: [wp_web_page_sk#73, sum#77, sum#78] Keys [1]: [wp_web_page_sk#73] Functions [2]: [sum(UnscaledValue(ws_ext_sales_price#70)), sum(UnscaledValue(ws_net_profit#71))] @@ -422,38 +422,38 @@ PartitionFilters: [isnotnull(wr_returned_date_sk#87), dynamicpruningexpression(w PushedFilters: [IsNotNull(wr_web_page_sk)] ReadSchema: struct -(70) ColumnarToRow [codegen id : 21] +(70) ColumnarToRow [codegen id : 20] Input [4]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87] -(71) Filter [codegen id : 21] +(71) Filter [codegen id : 20] Input [4]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87] Condition : isnotnull(wr_web_page_sk#84) (72) ReusedExchange [Reuses operator id: 63] Output [1]: [wp_web_page_sk#88] -(73) BroadcastHashJoin [codegen id : 21] +(73) BroadcastHashJoin [codegen id : 20] Left keys [1]: [wr_web_page_sk#84] Right keys [1]: [cast(wp_web_page_sk#88 as bigint)] Join condition: None -(74) Project [codegen id : 21] +(74) Project [codegen id : 20] Output [4]: [wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87, wp_web_page_sk#88] Input [5]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87, wp_web_page_sk#88] (75) ReusedExchange [Reuses operator id: 8] Output [1]: [d_date_sk#6] -(76) BroadcastHashJoin [codegen id : 21] +(76) BroadcastHashJoin [codegen id : 20] Left keys [1]: [wr_returned_date_sk#87] Right keys [1]: [cast(d_date_sk#6 as bigint)] Join condition: None -(77) Project [codegen id : 21] +(77) Project [codegen id : 20] Output [3]: [wr_return_amt#85, wr_net_loss#86, wp_web_page_sk#88] Input [5]: [wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87, wp_web_page_sk#88, d_date_sk#6] -(78) HashAggregate [codegen id : 21] +(78) HashAggregate [codegen id : 20] Input [3]: [wr_return_amt#85, wr_net_loss#86, wp_web_page_sk#88] Keys [1]: [wp_web_page_sk#88] Functions [2]: [partial_sum(UnscaledValue(wr_return_amt#85)), partial_sum(UnscaledValue(wr_net_loss#86))] @@ -464,7 +464,7 @@ Results [3]: [wp_web_page_sk#88, sum#91, sum#92] Input [3]: [wp_web_page_sk#88, sum#91, sum#92] Arguments: hashpartitioning(wp_web_page_sk#88, 5), ENSURE_REQUIREMENTS, [id=#93] -(80) HashAggregate [codegen id : 22] +(80) HashAggregate [codegen id : 21] Input [3]: [wp_web_page_sk#88, sum#91, sum#92] Keys [1]: [wp_web_page_sk#88] Functions [2]: [sum(UnscaledValue(wr_return_amt#85)), sum(UnscaledValue(wr_net_loss#86))] @@ -475,22 +475,22 @@ Results [3]: [wp_web_page_sk#88, MakeDecimal(sum(UnscaledValue(wr_return_amt#85) Input [3]: [wp_web_page_sk#88, returns#96, profit_loss#97] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#98] -(82) BroadcastHashJoin [codegen id : 23] +(82) BroadcastHashJoin [codegen id : 22] Left keys [1]: [wp_web_page_sk#73] Right keys [1]: [wp_web_page_sk#88] Join condition: None -(83) Project [codegen id : 23] +(83) Project [codegen id : 22] Output [5]: [sales#82, coalesce(returns#96, 0.00) AS returns#99, CheckOverflow((promote_precision(cast(profit#83 as decimal(18,2))) - promote_precision(cast(coalesce(profit_loss#97, 0.00) as decimal(18,2)))), DecimalType(18,2), true) AS profit#100, web channel AS channel#101, wp_web_page_sk#73 AS id#102] Input [6]: [wp_web_page_sk#73, sales#82, profit#83, wp_web_page_sk#88, returns#96, profit_loss#97] (84) Union -(85) Expand [codegen id : 24] +(85) Expand [codegen id : 23] Input [5]: [sales#18, returns#36, profit#37, channel#38, id#39] Arguments: [List(sales#18, returns#36, profit#37, channel#38, id#39, 0), List(sales#18, returns#36, profit#37, channel#38, null, 1), List(sales#18, returns#36, profit#37, null, null, 3)], [sales#18, returns#36, profit#37, channel#103, id#104, spark_grouping_id#105] -(86) HashAggregate [codegen id : 24] +(86) HashAggregate [codegen id : 23] Input [6]: [sales#18, returns#36, profit#37, channel#103, id#104, spark_grouping_id#105] Keys [3]: [channel#103, id#104, spark_grouping_id#105] Functions [3]: [partial_sum(sales#18), partial_sum(returns#36), partial_sum(profit#37)] @@ -501,7 +501,7 @@ Results [9]: [channel#103, id#104, spark_grouping_id#105, sum#112, isEmpty#113, Input [9]: [channel#103, id#104, spark_grouping_id#105, sum#112, isEmpty#113, sum#114, isEmpty#115, sum#116, isEmpty#117] Arguments: hashpartitioning(channel#103, id#104, spark_grouping_id#105, 5), ENSURE_REQUIREMENTS, [id=#118] -(88) HashAggregate [codegen id : 25] +(88) HashAggregate [codegen id : 24] Input [9]: [channel#103, id#104, spark_grouping_id#105, sum#112, isEmpty#113, sum#114, isEmpty#115, sum#116, isEmpty#117] Keys [3]: [channel#103, id#104, spark_grouping_id#105] Functions [3]: [sum(sales#18), sum(returns#36), sum(profit#37)] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77.sf100/simplified.txt index 9a5fe0ba79f1..86b7f43ac074 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77.sf100/simplified.txt @@ -1,9 +1,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] - WholeStageCodegen (25) + WholeStageCodegen (24) HashAggregate [channel,id,spark_grouping_id,sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter Exchange [channel,id,spark_grouping_id] #1 - WholeStageCodegen (24) + WholeStageCodegen (23) HashAggregate [channel,id,spark_grouping_id,sales,returns,profit] [sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty] Expand [sales,returns,profit,channel,id] InputAdapter @@ -63,30 +63,29 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedExchange [s_store_sk] #4 InputAdapter ReusedExchange [d_date_sk] #3 - WholeStageCodegen (15) + WholeStageCodegen (14) Project [sales,returns,profit,profit_loss,cs_call_center_sk] - InputAdapter - BroadcastNestedLoopJoin - WholeStageCodegen (11) - HashAggregate [cs_call_center_sk,sum,sum] [sum(UnscaledValue(cs_ext_sales_price)),sum(UnscaledValue(cs_net_profit)),sales,profit,sum,sum] - InputAdapter - Exchange [cs_call_center_sk] #7 - WholeStageCodegen (10) - HashAggregate [cs_call_center_sk,cs_ext_sales_price,cs_net_profit] [sum,sum,sum,sum] - Project [cs_call_center_sk,cs_ext_sales_price,cs_net_profit] - BroadcastHashJoin [cs_sold_date_sk,d_date_sk] - ColumnarToRow - InputAdapter - Scan parquet default.catalog_sales [cs_call_center_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk] - ReusedSubquery [d_date_sk] #1 - InputAdapter - ReusedExchange [d_date_sk] #3 + BroadcastNestedLoopJoin + HashAggregate [cs_call_center_sk,sum,sum] [sum(UnscaledValue(cs_ext_sales_price)),sum(UnscaledValue(cs_net_profit)),sales,profit,sum,sum] + InputAdapter + Exchange [cs_call_center_sk] #7 + WholeStageCodegen (10) + HashAggregate [cs_call_center_sk,cs_ext_sales_price,cs_net_profit] [sum,sum,sum,sum] + Project [cs_call_center_sk,cs_ext_sales_price,cs_net_profit] + BroadcastHashJoin [cs_sold_date_sk,d_date_sk] + ColumnarToRow + InputAdapter + Scan parquet default.catalog_sales [cs_call_center_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk] + ReusedSubquery [d_date_sk] #1 + InputAdapter + ReusedExchange [d_date_sk] #3 + InputAdapter BroadcastExchange #8 - WholeStageCodegen (14) + WholeStageCodegen (13) HashAggregate [sum,sum] [sum(UnscaledValue(cr_return_amount)),sum(UnscaledValue(cr_net_loss)),returns,profit_loss,sum,sum] InputAdapter Exchange #9 - WholeStageCodegen (13) + WholeStageCodegen (12) HashAggregate [cr_return_amount,cr_net_loss] [sum,sum,sum,sum] Project [cr_return_amount,cr_net_loss] BroadcastHashJoin [cr_returned_date_sk,d_date_sk] @@ -96,13 +95,13 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedSubquery [d_date_sk] #1 InputAdapter ReusedExchange [d_date_sk] #3 - WholeStageCodegen (23) + WholeStageCodegen (22) Project [sales,returns,profit,profit_loss,wp_web_page_sk] BroadcastHashJoin [wp_web_page_sk,wp_web_page_sk] HashAggregate [wp_web_page_sk,sum,sum] [sum(UnscaledValue(ws_ext_sales_price)),sum(UnscaledValue(ws_net_profit)),sales,profit,sum,sum] InputAdapter Exchange [wp_web_page_sk] #10 - WholeStageCodegen (18) + WholeStageCodegen (17) HashAggregate [wp_web_page_sk,ws_ext_sales_price,ws_net_profit] [sum,sum,sum,sum] Project [ws_ext_sales_price,ws_net_profit,wp_web_page_sk] BroadcastHashJoin [ws_web_page_sk,wp_web_page_sk] @@ -117,18 +116,18 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedExchange [d_date_sk] #3 InputAdapter BroadcastExchange #11 - WholeStageCodegen (17) + WholeStageCodegen (16) Filter [wp_web_page_sk] ColumnarToRow InputAdapter Scan parquet default.web_page [wp_web_page_sk] InputAdapter BroadcastExchange #12 - WholeStageCodegen (22) + WholeStageCodegen (21) HashAggregate [wp_web_page_sk,sum,sum] [sum(UnscaledValue(wr_return_amt)),sum(UnscaledValue(wr_net_loss)),returns,profit_loss,sum,sum] InputAdapter Exchange [wp_web_page_sk] #13 - WholeStageCodegen (21) + WholeStageCodegen (20) HashAggregate [wp_web_page_sk,wr_return_amt,wr_net_loss] [sum,sum,sum,sum] Project [wr_return_amt,wr_net_loss,wp_web_page_sk] BroadcastHashJoin [wr_returned_date_sk,d_date_sk] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77/explain.txt index a8f373b7f782..7a277d5362e3 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77/explain.txt @@ -40,7 +40,7 @@ TakeOrderedAndProject (89) : : +- ReusedExchange (23) : +- ReusedExchange (26) :- * Project (53) - : +- BroadcastNestedLoopJoin Inner BuildLeft (52) + : +- * BroadcastNestedLoopJoin Inner BuildLeft (52) : :- BroadcastExchange (43) : : +- * HashAggregate (42) : : +- Exchange (41) @@ -117,7 +117,7 @@ Input [2]: [d_date_sk#6, d_date#7] (6) Filter [codegen id : 1] Input [2]: [d_date_sk#6, d_date#7] -Condition : (((isnotnull(d_date#7) AND (d_date#7 >= 11172)) AND (d_date#7 <= 11202)) AND isnotnull(d_date_sk#6)) +Condition : (((isnotnull(d_date#7) AND (d_date#7 >= 2000-08-03)) AND (d_date#7 <= 2000-09-02)) AND isnotnull(d_date_sk#6)) (7) Project [codegen id : 1] Output [1]: [d_date_sk#6] @@ -328,17 +328,17 @@ Results [2]: [sum#59, sum#60] Input [2]: [sum#59, sum#60] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#61] -(51) HashAggregate [codegen id : 14] +(51) HashAggregate Input [2]: [sum#59, sum#60] Keys: [] Functions [2]: [sum(UnscaledValue(cr_return_amount#54)), sum(UnscaledValue(cr_net_loss#55))] Aggregate Attributes [2]: [sum(UnscaledValue(cr_return_amount#54))#62, sum(UnscaledValue(cr_net_loss#55))#63] Results [2]: [MakeDecimal(sum(UnscaledValue(cr_return_amount#54))#62,17,2) AS returns#64, MakeDecimal(sum(UnscaledValue(cr_net_loss#55))#63,17,2) AS profit_loss#65] -(52) BroadcastNestedLoopJoin +(52) BroadcastNestedLoopJoin [codegen id : 14] Join condition: None -(53) Project [codegen id : 15] +(53) Project [codegen id : 14] Output [5]: [sales#51, returns#64, CheckOverflow((promote_precision(cast(profit#52 as decimal(18,2))) - promote_precision(cast(profit_loss#65 as decimal(18,2)))), DecimalType(18,2), true) AS profit#66, catalog channel AS channel#67, cs_call_center_sk#40 AS id#68] Input [5]: [cs_call_center_sk#40, sales#51, profit#52, returns#64, profit_loss#65] @@ -350,22 +350,22 @@ PartitionFilters: [isnotnull(ws_sold_date_sk#72), dynamicpruningexpression(ws_so PushedFilters: [IsNotNull(ws_web_page_sk)] ReadSchema: struct -(55) ColumnarToRow [codegen id : 18] +(55) ColumnarToRow [codegen id : 17] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72] -(56) Filter [codegen id : 18] +(56) Filter [codegen id : 17] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72] Condition : isnotnull(ws_web_page_sk#69) (57) ReusedExchange [Reuses operator id: 8] Output [1]: [d_date_sk#6] -(58) BroadcastHashJoin [codegen id : 18] +(58) BroadcastHashJoin [codegen id : 17] Left keys [1]: [ws_sold_date_sk#72] Right keys [1]: [d_date_sk#6] Join condition: None -(59) Project [codegen id : 18] +(59) Project [codegen id : 17] Output [3]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71] Input [5]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72, d_date_sk#6] @@ -376,10 +376,10 @@ Location [not included in comparison]/{warehouse_dir}/web_page] PushedFilters: [IsNotNull(wp_web_page_sk)] ReadSchema: struct -(61) ColumnarToRow [codegen id : 17] +(61) ColumnarToRow [codegen id : 16] Input [1]: [wp_web_page_sk#73] -(62) Filter [codegen id : 17] +(62) Filter [codegen id : 16] Input [1]: [wp_web_page_sk#73] Condition : isnotnull(wp_web_page_sk#73) @@ -387,16 +387,16 @@ Condition : isnotnull(wp_web_page_sk#73) Input [1]: [wp_web_page_sk#73] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#74] -(64) BroadcastHashJoin [codegen id : 18] +(64) BroadcastHashJoin [codegen id : 17] Left keys [1]: [ws_web_page_sk#69] Right keys [1]: [wp_web_page_sk#73] Join condition: None -(65) Project [codegen id : 18] +(65) Project [codegen id : 17] Output [3]: [ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] -(66) HashAggregate [codegen id : 18] +(66) HashAggregate [codegen id : 17] Input [3]: [ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] Keys [1]: [wp_web_page_sk#73] Functions [2]: [partial_sum(UnscaledValue(ws_ext_sales_price#70)), partial_sum(UnscaledValue(ws_net_profit#71))] @@ -407,7 +407,7 @@ Results [3]: [wp_web_page_sk#73, sum#77, sum#78] Input [3]: [wp_web_page_sk#73, sum#77, sum#78] Arguments: hashpartitioning(wp_web_page_sk#73, 5), ENSURE_REQUIREMENTS, [id=#79] -(68) HashAggregate [codegen id : 23] +(68) HashAggregate [codegen id : 22] Input [3]: [wp_web_page_sk#73, sum#77, sum#78] Keys [1]: [wp_web_page_sk#73] Functions [2]: [sum(UnscaledValue(ws_ext_sales_price#70)), sum(UnscaledValue(ws_net_profit#71))] @@ -422,38 +422,38 @@ PartitionFilters: [isnotnull(wr_returned_date_sk#87), dynamicpruningexpression(w PushedFilters: [IsNotNull(wr_web_page_sk)] ReadSchema: struct -(70) ColumnarToRow [codegen id : 21] +(70) ColumnarToRow [codegen id : 20] Input [4]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87] -(71) Filter [codegen id : 21] +(71) Filter [codegen id : 20] Input [4]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87] Condition : isnotnull(wr_web_page_sk#84) (72) ReusedExchange [Reuses operator id: 8] Output [1]: [d_date_sk#6] -(73) BroadcastHashJoin [codegen id : 21] +(73) BroadcastHashJoin [codegen id : 20] Left keys [1]: [wr_returned_date_sk#87] Right keys [1]: [cast(d_date_sk#6 as bigint)] Join condition: None -(74) Project [codegen id : 21] +(74) Project [codegen id : 20] Output [3]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86] Input [5]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87, d_date_sk#6] (75) ReusedExchange [Reuses operator id: 63] Output [1]: [wp_web_page_sk#88] -(76) BroadcastHashJoin [codegen id : 21] +(76) BroadcastHashJoin [codegen id : 20] Left keys [1]: [wr_web_page_sk#84] Right keys [1]: [cast(wp_web_page_sk#88 as bigint)] Join condition: None -(77) Project [codegen id : 21] +(77) Project [codegen id : 20] Output [3]: [wr_return_amt#85, wr_net_loss#86, wp_web_page_sk#88] Input [4]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wp_web_page_sk#88] -(78) HashAggregate [codegen id : 21] +(78) HashAggregate [codegen id : 20] Input [3]: [wr_return_amt#85, wr_net_loss#86, wp_web_page_sk#88] Keys [1]: [wp_web_page_sk#88] Functions [2]: [partial_sum(UnscaledValue(wr_return_amt#85)), partial_sum(UnscaledValue(wr_net_loss#86))] @@ -464,7 +464,7 @@ Results [3]: [wp_web_page_sk#88, sum#91, sum#92] Input [3]: [wp_web_page_sk#88, sum#91, sum#92] Arguments: hashpartitioning(wp_web_page_sk#88, 5), ENSURE_REQUIREMENTS, [id=#93] -(80) HashAggregate [codegen id : 22] +(80) HashAggregate [codegen id : 21] Input [3]: [wp_web_page_sk#88, sum#91, sum#92] Keys [1]: [wp_web_page_sk#88] Functions [2]: [sum(UnscaledValue(wr_return_amt#85)), sum(UnscaledValue(wr_net_loss#86))] @@ -475,22 +475,22 @@ Results [3]: [wp_web_page_sk#88, MakeDecimal(sum(UnscaledValue(wr_return_amt#85) Input [3]: [wp_web_page_sk#88, returns#96, profit_loss#97] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#98] -(82) BroadcastHashJoin [codegen id : 23] +(82) BroadcastHashJoin [codegen id : 22] Left keys [1]: [wp_web_page_sk#73] Right keys [1]: [wp_web_page_sk#88] Join condition: None -(83) Project [codegen id : 23] +(83) Project [codegen id : 22] Output [5]: [sales#82, coalesce(returns#96, 0.00) AS returns#99, CheckOverflow((promote_precision(cast(profit#83 as decimal(18,2))) - promote_precision(cast(coalesce(profit_loss#97, 0.00) as decimal(18,2)))), DecimalType(18,2), true) AS profit#100, web channel AS channel#101, wp_web_page_sk#73 AS id#102] Input [6]: [wp_web_page_sk#73, sales#82, profit#83, wp_web_page_sk#88, returns#96, profit_loss#97] (84) Union -(85) Expand [codegen id : 24] +(85) Expand [codegen id : 23] Input [5]: [sales#18, returns#36, profit#37, channel#38, id#39] Arguments: [List(sales#18, returns#36, profit#37, channel#38, id#39, 0), List(sales#18, returns#36, profit#37, channel#38, null, 1), List(sales#18, returns#36, profit#37, null, null, 3)], [sales#18, returns#36, profit#37, channel#103, id#104, spark_grouping_id#105] -(86) HashAggregate [codegen id : 24] +(86) HashAggregate [codegen id : 23] Input [6]: [sales#18, returns#36, profit#37, channel#103, id#104, spark_grouping_id#105] Keys [3]: [channel#103, id#104, spark_grouping_id#105] Functions [3]: [partial_sum(sales#18), partial_sum(returns#36), partial_sum(profit#37)] @@ -501,7 +501,7 @@ Results [9]: [channel#103, id#104, spark_grouping_id#105, sum#112, isEmpty#113, Input [9]: [channel#103, id#104, spark_grouping_id#105, sum#112, isEmpty#113, sum#114, isEmpty#115, sum#116, isEmpty#117] Arguments: hashpartitioning(channel#103, id#104, spark_grouping_id#105, 5), ENSURE_REQUIREMENTS, [id=#118] -(88) HashAggregate [codegen id : 25] +(88) HashAggregate [codegen id : 24] Input [9]: [channel#103, id#104, spark_grouping_id#105, sum#112, isEmpty#113, sum#114, isEmpty#115, sum#116, isEmpty#117] Keys [3]: [channel#103, id#104, spark_grouping_id#105] Functions [3]: [sum(sales#18), sum(returns#36), sum(profit#37)] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77/simplified.txt index 628581792bde..cf2be9145a20 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q77/simplified.txt @@ -1,9 +1,9 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] - WholeStageCodegen (25) + WholeStageCodegen (24) HashAggregate [channel,id,spark_grouping_id,sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter Exchange [channel,id,spark_grouping_id] #1 - WholeStageCodegen (24) + WholeStageCodegen (23) HashAggregate [channel,id,spark_grouping_id,sales,returns,profit] [sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty] Expand [sales,returns,profit,channel,id] InputAdapter @@ -63,10 +63,10 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedExchange [d_date_sk] #3 InputAdapter ReusedExchange [s_store_sk] #4 - WholeStageCodegen (15) + WholeStageCodegen (14) Project [sales,returns,profit,profit_loss,cs_call_center_sk] - InputAdapter - BroadcastNestedLoopJoin + BroadcastNestedLoopJoin + InputAdapter BroadcastExchange #7 WholeStageCodegen (11) HashAggregate [cs_call_center_sk,sum,sum] [sum(UnscaledValue(cs_ext_sales_price)),sum(UnscaledValue(cs_net_profit)),sales,profit,sum,sum] @@ -82,27 +82,26 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedSubquery [d_date_sk] #1 InputAdapter ReusedExchange [d_date_sk] #3 - WholeStageCodegen (14) - HashAggregate [sum,sum] [sum(UnscaledValue(cr_return_amount)),sum(UnscaledValue(cr_net_loss)),returns,profit_loss,sum,sum] - InputAdapter - Exchange #9 - WholeStageCodegen (13) - HashAggregate [cr_return_amount,cr_net_loss] [sum,sum,sum,sum] - Project [cr_return_amount,cr_net_loss] - BroadcastHashJoin [cr_returned_date_sk,d_date_sk] - ColumnarToRow - InputAdapter - Scan parquet default.catalog_returns [cr_return_amount,cr_net_loss,cr_returned_date_sk] - ReusedSubquery [d_date_sk] #1 - InputAdapter - ReusedExchange [d_date_sk] #3 - WholeStageCodegen (23) + HashAggregate [sum,sum] [sum(UnscaledValue(cr_return_amount)),sum(UnscaledValue(cr_net_loss)),returns,profit_loss,sum,sum] + InputAdapter + Exchange #9 + WholeStageCodegen (13) + HashAggregate [cr_return_amount,cr_net_loss] [sum,sum,sum,sum] + Project [cr_return_amount,cr_net_loss] + BroadcastHashJoin [cr_returned_date_sk,d_date_sk] + ColumnarToRow + InputAdapter + Scan parquet default.catalog_returns [cr_return_amount,cr_net_loss,cr_returned_date_sk] + ReusedSubquery [d_date_sk] #1 + InputAdapter + ReusedExchange [d_date_sk] #3 + WholeStageCodegen (22) Project [sales,returns,profit,profit_loss,wp_web_page_sk] BroadcastHashJoin [wp_web_page_sk,wp_web_page_sk] HashAggregate [wp_web_page_sk,sum,sum] [sum(UnscaledValue(ws_ext_sales_price)),sum(UnscaledValue(ws_net_profit)),sales,profit,sum,sum] InputAdapter Exchange [wp_web_page_sk] #10 - WholeStageCodegen (18) + WholeStageCodegen (17) HashAggregate [wp_web_page_sk,ws_ext_sales_price,ws_net_profit] [sum,sum,sum,sum] Project [ws_ext_sales_price,ws_net_profit,wp_web_page_sk] BroadcastHashJoin [ws_web_page_sk,wp_web_page_sk] @@ -117,18 +116,18 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedExchange [d_date_sk] #3 InputAdapter BroadcastExchange #11 - WholeStageCodegen (17) + WholeStageCodegen (16) Filter [wp_web_page_sk] ColumnarToRow InputAdapter Scan parquet default.web_page [wp_web_page_sk] InputAdapter BroadcastExchange #12 - WholeStageCodegen (22) + WholeStageCodegen (21) HashAggregate [wp_web_page_sk,sum,sum] [sum(UnscaledValue(wr_return_amt)),sum(UnscaledValue(wr_net_loss)),returns,profit_loss,sum,sum] InputAdapter Exchange [wp_web_page_sk] #13 - WholeStageCodegen (21) + WholeStageCodegen (20) HashAggregate [wp_web_page_sk,wr_return_amt,wr_net_loss] [sum,sum,sum,sum] Project [wr_return_amt,wr_net_loss,wp_web_page_sk] BroadcastHashJoin [wr_web_page_sk,wp_web_page_sk] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88.sf100/explain.txt index 51e1671bd47b..f9d73c29db3d 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88.sf100/explain.txt @@ -1,11 +1,11 @@ == Physical Plan == -BroadcastNestedLoopJoin Inner BuildRight (182) -:- BroadcastNestedLoopJoin Inner BuildRight (160) -: :- BroadcastNestedLoopJoin Inner BuildRight (138) -: : :- BroadcastNestedLoopJoin Inner BuildRight (116) -: : : :- BroadcastNestedLoopJoin Inner BuildRight (94) -: : : : :- BroadcastNestedLoopJoin Inner BuildRight (72) -: : : : : :- BroadcastNestedLoopJoin Inner BuildRight (50) +* BroadcastNestedLoopJoin Inner BuildRight (182) +:- * BroadcastNestedLoopJoin Inner BuildRight (160) +: :- * BroadcastNestedLoopJoin Inner BuildRight (138) +: : :- * BroadcastNestedLoopJoin Inner BuildRight (116) +: : : :- * BroadcastNestedLoopJoin Inner BuildRight (94) +: : : : :- * BroadcastNestedLoopJoin Inner BuildRight (72) +: : : : : :- * BroadcastNestedLoopJoin Inner BuildRight (50) : : : : : : :- * HashAggregate (28) : : : : : : : +- Exchange (27) : : : : : : : +- * HashAggregate (26) @@ -305,7 +305,7 @@ Results [1]: [count#17] Input [1]: [count#17] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#18] -(28) HashAggregate [codegen id : 5] +(28) HashAggregate [codegen id : 40] Input [1]: [count#17] Keys: [] Functions [1]: [count(1)] @@ -319,14 +319,14 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(30) ColumnarToRow [codegen id : 9] +(30) ColumnarToRow [codegen id : 8] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(31) Filter [codegen id : 9] +(31) Filter [codegen id : 8] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(32) Project [codegen id : 9] +(32) Project [codegen id : 8] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] @@ -337,14 +337,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,9), LessThan(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(34) ColumnarToRow [codegen id : 6] +(34) ColumnarToRow [codegen id : 5] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] -(35) Filter [codegen id : 6] +(35) Filter [codegen id : 5] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Condition : ((((isnotnull(t_hour#6) AND isnotnull(t_minute#7)) AND (t_hour#6 = 9)) AND (t_minute#7 < 30)) AND isnotnull(t_time_sk#5)) -(36) Project [codegen id : 6] +(36) Project [codegen id : 5] Output [1]: [t_time_sk#5] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] @@ -352,40 +352,40 @@ Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Input [1]: [t_time_sk#5] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#21] -(38) BroadcastHashJoin [codegen id : 9] +(38) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#5] Join condition: None -(39) Project [codegen id : 9] +(39) Project [codegen id : 8] Output [2]: [ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, t_time_sk#5] (40) ReusedExchange [Reuses operator id: 16] Output [1]: [s_store_sk#9] -(41) BroadcastHashJoin [codegen id : 9] +(41) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#9] Join condition: None -(42) Project [codegen id : 9] +(42) Project [codegen id : 8] Output [1]: [ss_hdemo_sk#2] Input [3]: [ss_hdemo_sk#2, ss_store_sk#3, s_store_sk#9] (43) ReusedExchange [Reuses operator id: 23] Output [1]: [hd_demo_sk#12] -(44) BroadcastHashJoin [codegen id : 9] +(44) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#12] Join condition: None -(45) Project [codegen id : 9] +(45) Project [codegen id : 8] Output: [] Input [2]: [ss_hdemo_sk#2, hd_demo_sk#12] -(46) HashAggregate [codegen id : 9] +(46) HashAggregate [codegen id : 8] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -396,7 +396,7 @@ Results [1]: [count#23] Input [1]: [count#23] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#24] -(48) HashAggregate [codegen id : 10] +(48) HashAggregate [codegen id : 9] Input [1]: [count#23] Keys: [] Functions [1]: [count(1)] @@ -407,7 +407,7 @@ Results [1]: [count(1)#25 AS h9_to_9_30#26] Input [1]: [h9_to_9_30#26] Arguments: IdentityBroadcastMode, [id=#27] -(50) BroadcastNestedLoopJoin +(50) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (51) Scan parquet default.store_sales @@ -417,14 +417,14 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(52) ColumnarToRow [codegen id : 14] +(52) ColumnarToRow [codegen id : 13] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(53) Filter [codegen id : 14] +(53) Filter [codegen id : 13] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(54) Project [codegen id : 14] +(54) Project [codegen id : 13] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] @@ -435,14 +435,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,9), GreaterThanOrEqual(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(56) ColumnarToRow [codegen id : 11] +(56) ColumnarToRow [codegen id : 10] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] -(57) Filter [codegen id : 11] +(57) Filter [codegen id : 10] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Condition : ((((isnotnull(t_hour#6) AND isnotnull(t_minute#7)) AND (t_hour#6 = 9)) AND (t_minute#7 >= 30)) AND isnotnull(t_time_sk#5)) -(58) Project [codegen id : 11] +(58) Project [codegen id : 10] Output [1]: [t_time_sk#5] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] @@ -450,40 +450,40 @@ Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Input [1]: [t_time_sk#5] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#28] -(60) BroadcastHashJoin [codegen id : 14] +(60) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#5] Join condition: None -(61) Project [codegen id : 14] +(61) Project [codegen id : 13] Output [2]: [ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, t_time_sk#5] (62) ReusedExchange [Reuses operator id: 16] Output [1]: [s_store_sk#9] -(63) BroadcastHashJoin [codegen id : 14] +(63) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#9] Join condition: None -(64) Project [codegen id : 14] +(64) Project [codegen id : 13] Output [1]: [ss_hdemo_sk#2] Input [3]: [ss_hdemo_sk#2, ss_store_sk#3, s_store_sk#9] (65) ReusedExchange [Reuses operator id: 23] Output [1]: [hd_demo_sk#12] -(66) BroadcastHashJoin [codegen id : 14] +(66) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#12] Join condition: None -(67) Project [codegen id : 14] +(67) Project [codegen id : 13] Output: [] Input [2]: [ss_hdemo_sk#2, hd_demo_sk#12] -(68) HashAggregate [codegen id : 14] +(68) HashAggregate [codegen id : 13] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -494,7 +494,7 @@ Results [1]: [count#30] Input [1]: [count#30] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#31] -(70) HashAggregate [codegen id : 15] +(70) HashAggregate [codegen id : 14] Input [1]: [count#30] Keys: [] Functions [1]: [count(1)] @@ -505,7 +505,7 @@ Results [1]: [count(1)#32 AS h9_30_to_10#33] Input [1]: [h9_30_to_10#33] Arguments: IdentityBroadcastMode, [id=#34] -(72) BroadcastNestedLoopJoin +(72) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (73) Scan parquet default.store_sales @@ -515,14 +515,14 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(74) ColumnarToRow [codegen id : 19] +(74) ColumnarToRow [codegen id : 18] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(75) Filter [codegen id : 19] +(75) Filter [codegen id : 18] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(76) Project [codegen id : 19] +(76) Project [codegen id : 18] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] @@ -533,14 +533,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,10), LessThan(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(78) ColumnarToRow [codegen id : 16] +(78) ColumnarToRow [codegen id : 15] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] -(79) Filter [codegen id : 16] +(79) Filter [codegen id : 15] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Condition : ((((isnotnull(t_hour#6) AND isnotnull(t_minute#7)) AND (t_hour#6 = 10)) AND (t_minute#7 < 30)) AND isnotnull(t_time_sk#5)) -(80) Project [codegen id : 16] +(80) Project [codegen id : 15] Output [1]: [t_time_sk#5] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] @@ -548,40 +548,40 @@ Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Input [1]: [t_time_sk#5] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#35] -(82) BroadcastHashJoin [codegen id : 19] +(82) BroadcastHashJoin [codegen id : 18] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#5] Join condition: None -(83) Project [codegen id : 19] +(83) Project [codegen id : 18] Output [2]: [ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, t_time_sk#5] (84) ReusedExchange [Reuses operator id: 16] Output [1]: [s_store_sk#9] -(85) BroadcastHashJoin [codegen id : 19] +(85) BroadcastHashJoin [codegen id : 18] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#9] Join condition: None -(86) Project [codegen id : 19] +(86) Project [codegen id : 18] Output [1]: [ss_hdemo_sk#2] Input [3]: [ss_hdemo_sk#2, ss_store_sk#3, s_store_sk#9] (87) ReusedExchange [Reuses operator id: 23] Output [1]: [hd_demo_sk#12] -(88) BroadcastHashJoin [codegen id : 19] +(88) BroadcastHashJoin [codegen id : 18] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#12] Join condition: None -(89) Project [codegen id : 19] +(89) Project [codegen id : 18] Output: [] Input [2]: [ss_hdemo_sk#2, hd_demo_sk#12] -(90) HashAggregate [codegen id : 19] +(90) HashAggregate [codegen id : 18] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -592,7 +592,7 @@ Results [1]: [count#37] Input [1]: [count#37] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#38] -(92) HashAggregate [codegen id : 20] +(92) HashAggregate [codegen id : 19] Input [1]: [count#37] Keys: [] Functions [1]: [count(1)] @@ -603,7 +603,7 @@ Results [1]: [count(1)#39 AS h10_to_10_30#40] Input [1]: [h10_to_10_30#40] Arguments: IdentityBroadcastMode, [id=#41] -(94) BroadcastNestedLoopJoin +(94) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (95) Scan parquet default.store_sales @@ -613,14 +613,14 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(96) ColumnarToRow [codegen id : 24] +(96) ColumnarToRow [codegen id : 23] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(97) Filter [codegen id : 24] +(97) Filter [codegen id : 23] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(98) Project [codegen id : 24] +(98) Project [codegen id : 23] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] @@ -631,14 +631,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,10), GreaterThanOrEqual(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(100) ColumnarToRow [codegen id : 21] +(100) ColumnarToRow [codegen id : 20] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] -(101) Filter [codegen id : 21] +(101) Filter [codegen id : 20] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Condition : ((((isnotnull(t_hour#6) AND isnotnull(t_minute#7)) AND (t_hour#6 = 10)) AND (t_minute#7 >= 30)) AND isnotnull(t_time_sk#5)) -(102) Project [codegen id : 21] +(102) Project [codegen id : 20] Output [1]: [t_time_sk#5] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] @@ -646,40 +646,40 @@ Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Input [1]: [t_time_sk#5] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#42] -(104) BroadcastHashJoin [codegen id : 24] +(104) BroadcastHashJoin [codegen id : 23] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#5] Join condition: None -(105) Project [codegen id : 24] +(105) Project [codegen id : 23] Output [2]: [ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, t_time_sk#5] (106) ReusedExchange [Reuses operator id: 16] Output [1]: [s_store_sk#9] -(107) BroadcastHashJoin [codegen id : 24] +(107) BroadcastHashJoin [codegen id : 23] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#9] Join condition: None -(108) Project [codegen id : 24] +(108) Project [codegen id : 23] Output [1]: [ss_hdemo_sk#2] Input [3]: [ss_hdemo_sk#2, ss_store_sk#3, s_store_sk#9] (109) ReusedExchange [Reuses operator id: 23] Output [1]: [hd_demo_sk#12] -(110) BroadcastHashJoin [codegen id : 24] +(110) BroadcastHashJoin [codegen id : 23] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#12] Join condition: None -(111) Project [codegen id : 24] +(111) Project [codegen id : 23] Output: [] Input [2]: [ss_hdemo_sk#2, hd_demo_sk#12] -(112) HashAggregate [codegen id : 24] +(112) HashAggregate [codegen id : 23] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -690,7 +690,7 @@ Results [1]: [count#44] Input [1]: [count#44] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#45] -(114) HashAggregate [codegen id : 25] +(114) HashAggregate [codegen id : 24] Input [1]: [count#44] Keys: [] Functions [1]: [count(1)] @@ -701,7 +701,7 @@ Results [1]: [count(1)#46 AS h10_30_to_11#47] Input [1]: [h10_30_to_11#47] Arguments: IdentityBroadcastMode, [id=#48] -(116) BroadcastNestedLoopJoin +(116) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (117) Scan parquet default.store_sales @@ -711,14 +711,14 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(118) ColumnarToRow [codegen id : 29] +(118) ColumnarToRow [codegen id : 28] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(119) Filter [codegen id : 29] +(119) Filter [codegen id : 28] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(120) Project [codegen id : 29] +(120) Project [codegen id : 28] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] @@ -729,14 +729,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,11), LessThan(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(122) ColumnarToRow [codegen id : 26] +(122) ColumnarToRow [codegen id : 25] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] -(123) Filter [codegen id : 26] +(123) Filter [codegen id : 25] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Condition : ((((isnotnull(t_hour#6) AND isnotnull(t_minute#7)) AND (t_hour#6 = 11)) AND (t_minute#7 < 30)) AND isnotnull(t_time_sk#5)) -(124) Project [codegen id : 26] +(124) Project [codegen id : 25] Output [1]: [t_time_sk#5] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] @@ -744,40 +744,40 @@ Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Input [1]: [t_time_sk#5] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#49] -(126) BroadcastHashJoin [codegen id : 29] +(126) BroadcastHashJoin [codegen id : 28] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#5] Join condition: None -(127) Project [codegen id : 29] +(127) Project [codegen id : 28] Output [2]: [ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, t_time_sk#5] (128) ReusedExchange [Reuses operator id: 16] Output [1]: [s_store_sk#9] -(129) BroadcastHashJoin [codegen id : 29] +(129) BroadcastHashJoin [codegen id : 28] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#9] Join condition: None -(130) Project [codegen id : 29] +(130) Project [codegen id : 28] Output [1]: [ss_hdemo_sk#2] Input [3]: [ss_hdemo_sk#2, ss_store_sk#3, s_store_sk#9] (131) ReusedExchange [Reuses operator id: 23] Output [1]: [hd_demo_sk#12] -(132) BroadcastHashJoin [codegen id : 29] +(132) BroadcastHashJoin [codegen id : 28] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#12] Join condition: None -(133) Project [codegen id : 29] +(133) Project [codegen id : 28] Output: [] Input [2]: [ss_hdemo_sk#2, hd_demo_sk#12] -(134) HashAggregate [codegen id : 29] +(134) HashAggregate [codegen id : 28] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -788,7 +788,7 @@ Results [1]: [count#51] Input [1]: [count#51] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#52] -(136) HashAggregate [codegen id : 30] +(136) HashAggregate [codegen id : 29] Input [1]: [count#51] Keys: [] Functions [1]: [count(1)] @@ -799,7 +799,7 @@ Results [1]: [count(1)#53 AS h11_to_11_30#54] Input [1]: [h11_to_11_30#54] Arguments: IdentityBroadcastMode, [id=#55] -(138) BroadcastNestedLoopJoin +(138) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (139) Scan parquet default.store_sales @@ -809,14 +809,14 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(140) ColumnarToRow [codegen id : 34] +(140) ColumnarToRow [codegen id : 33] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(141) Filter [codegen id : 34] +(141) Filter [codegen id : 33] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(142) Project [codegen id : 34] +(142) Project [codegen id : 33] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] @@ -827,14 +827,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,11), GreaterThanOrEqual(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(144) ColumnarToRow [codegen id : 31] +(144) ColumnarToRow [codegen id : 30] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] -(145) Filter [codegen id : 31] +(145) Filter [codegen id : 30] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Condition : ((((isnotnull(t_hour#6) AND isnotnull(t_minute#7)) AND (t_hour#6 = 11)) AND (t_minute#7 >= 30)) AND isnotnull(t_time_sk#5)) -(146) Project [codegen id : 31] +(146) Project [codegen id : 30] Output [1]: [t_time_sk#5] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] @@ -842,40 +842,40 @@ Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Input [1]: [t_time_sk#5] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#56] -(148) BroadcastHashJoin [codegen id : 34] +(148) BroadcastHashJoin [codegen id : 33] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#5] Join condition: None -(149) Project [codegen id : 34] +(149) Project [codegen id : 33] Output [2]: [ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, t_time_sk#5] (150) ReusedExchange [Reuses operator id: 16] Output [1]: [s_store_sk#9] -(151) BroadcastHashJoin [codegen id : 34] +(151) BroadcastHashJoin [codegen id : 33] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#9] Join condition: None -(152) Project [codegen id : 34] +(152) Project [codegen id : 33] Output [1]: [ss_hdemo_sk#2] Input [3]: [ss_hdemo_sk#2, ss_store_sk#3, s_store_sk#9] (153) ReusedExchange [Reuses operator id: 23] Output [1]: [hd_demo_sk#12] -(154) BroadcastHashJoin [codegen id : 34] +(154) BroadcastHashJoin [codegen id : 33] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#12] Join condition: None -(155) Project [codegen id : 34] +(155) Project [codegen id : 33] Output: [] Input [2]: [ss_hdemo_sk#2, hd_demo_sk#12] -(156) HashAggregate [codegen id : 34] +(156) HashAggregate [codegen id : 33] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -886,7 +886,7 @@ Results [1]: [count#58] Input [1]: [count#58] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#59] -(158) HashAggregate [codegen id : 35] +(158) HashAggregate [codegen id : 34] Input [1]: [count#58] Keys: [] Functions [1]: [count(1)] @@ -897,7 +897,7 @@ Results [1]: [count(1)#60 AS h11_30_to_12#61] Input [1]: [h11_30_to_12#61] Arguments: IdentityBroadcastMode, [id=#62] -(160) BroadcastNestedLoopJoin +(160) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (161) Scan parquet default.store_sales @@ -907,14 +907,14 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(162) ColumnarToRow [codegen id : 39] +(162) ColumnarToRow [codegen id : 38] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(163) Filter [codegen id : 39] +(163) Filter [codegen id : 38] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(164) Project [codegen id : 39] +(164) Project [codegen id : 38] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] @@ -925,14 +925,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,12), LessThan(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(166) ColumnarToRow [codegen id : 36] +(166) ColumnarToRow [codegen id : 35] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] -(167) Filter [codegen id : 36] +(167) Filter [codegen id : 35] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Condition : ((((isnotnull(t_hour#6) AND isnotnull(t_minute#7)) AND (t_hour#6 = 12)) AND (t_minute#7 < 30)) AND isnotnull(t_time_sk#5)) -(168) Project [codegen id : 36] +(168) Project [codegen id : 35] Output [1]: [t_time_sk#5] Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] @@ -940,40 +940,40 @@ Input [3]: [t_time_sk#5, t_hour#6, t_minute#7] Input [1]: [t_time_sk#5] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#63] -(170) BroadcastHashJoin [codegen id : 39] +(170) BroadcastHashJoin [codegen id : 38] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#5] Join condition: None -(171) Project [codegen id : 39] +(171) Project [codegen id : 38] Output [2]: [ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, t_time_sk#5] (172) ReusedExchange [Reuses operator id: 16] Output [1]: [s_store_sk#9] -(173) BroadcastHashJoin [codegen id : 39] +(173) BroadcastHashJoin [codegen id : 38] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#9] Join condition: None -(174) Project [codegen id : 39] +(174) Project [codegen id : 38] Output [1]: [ss_hdemo_sk#2] Input [3]: [ss_hdemo_sk#2, ss_store_sk#3, s_store_sk#9] (175) ReusedExchange [Reuses operator id: 23] Output [1]: [hd_demo_sk#12] -(176) BroadcastHashJoin [codegen id : 39] +(176) BroadcastHashJoin [codegen id : 38] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#12] Join condition: None -(177) Project [codegen id : 39] +(177) Project [codegen id : 38] Output: [] Input [2]: [ss_hdemo_sk#2, hd_demo_sk#12] -(178) HashAggregate [codegen id : 39] +(178) HashAggregate [codegen id : 38] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -984,7 +984,7 @@ Results [1]: [count#65] Input [1]: [count#65] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#66] -(180) HashAggregate [codegen id : 40] +(180) HashAggregate [codegen id : 39] Input [1]: [count#65] Keys: [] Functions [1]: [count(1)] @@ -995,6 +995,6 @@ Results [1]: [count(1)#67 AS h12_to_12_30#68] Input [1]: [h12_to_12_30#68] Arguments: IdentityBroadcastMode, [id=#69] -(182) BroadcastNestedLoopJoin +(182) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88.sf100/simplified.txt index 39c2ad15503c..41fef687d30b 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88.sf100/simplified.txt @@ -1,11 +1,11 @@ -BroadcastNestedLoopJoin +WholeStageCodegen (40) BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin - WholeStageCodegen (5) + BroadcastNestedLoopJoin HashAggregate [count] [count(1),h8_30_to_9,count] InputAdapter Exchange #1 @@ -46,12 +46,75 @@ BroadcastNestedLoopJoin ColumnarToRow InputAdapter Scan parquet default.household_demographics [hd_demo_sk,hd_dep_count,hd_vehicle_count] - BroadcastExchange #5 - WholeStageCodegen (10) - HashAggregate [count] [count(1),h9_to_9_30,count] + InputAdapter + BroadcastExchange #5 + WholeStageCodegen (9) + HashAggregate [count] [count(1),h9_to_9_30,count] + InputAdapter + Exchange #6 + WholeStageCodegen (8) + HashAggregate [count,count] + Project + BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] + Project [ss_hdemo_sk] + BroadcastHashJoin [ss_store_sk,s_store_sk] + Project [ss_hdemo_sk,ss_store_sk] + BroadcastHashJoin [ss_sold_time_sk,t_time_sk] + Project [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk] + Filter [ss_hdemo_sk,ss_sold_time_sk,ss_store_sk] + ColumnarToRow + InputAdapter + Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] + InputAdapter + BroadcastExchange #7 + WholeStageCodegen (5) + Project [t_time_sk] + Filter [t_hour,t_minute,t_time_sk] + ColumnarToRow + InputAdapter + Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] + InputAdapter + ReusedExchange [s_store_sk] #3 + InputAdapter + ReusedExchange [hd_demo_sk] #4 + InputAdapter + BroadcastExchange #8 + WholeStageCodegen (14) + HashAggregate [count] [count(1),h9_30_to_10,count] + InputAdapter + Exchange #9 + WholeStageCodegen (13) + HashAggregate [count,count] + Project + BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] + Project [ss_hdemo_sk] + BroadcastHashJoin [ss_store_sk,s_store_sk] + Project [ss_hdemo_sk,ss_store_sk] + BroadcastHashJoin [ss_sold_time_sk,t_time_sk] + Project [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk] + Filter [ss_hdemo_sk,ss_sold_time_sk,ss_store_sk] + ColumnarToRow + InputAdapter + Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] + InputAdapter + BroadcastExchange #10 + WholeStageCodegen (10) + Project [t_time_sk] + Filter [t_hour,t_minute,t_time_sk] + ColumnarToRow + InputAdapter + Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] + InputAdapter + ReusedExchange [s_store_sk] #3 + InputAdapter + ReusedExchange [hd_demo_sk] #4 + InputAdapter + BroadcastExchange #11 + WholeStageCodegen (19) + HashAggregate [count] [count(1),h10_to_10_30,count] InputAdapter - Exchange #6 - WholeStageCodegen (9) + Exchange #12 + WholeStageCodegen (18) HashAggregate [count,count] Project BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] @@ -65,8 +128,8 @@ BroadcastNestedLoopJoin InputAdapter Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] InputAdapter - BroadcastExchange #7 - WholeStageCodegen (6) + BroadcastExchange #13 + WholeStageCodegen (15) Project [t_time_sk] Filter [t_hour,t_minute,t_time_sk] ColumnarToRow @@ -76,12 +139,13 @@ BroadcastNestedLoopJoin ReusedExchange [s_store_sk] #3 InputAdapter ReusedExchange [hd_demo_sk] #4 - BroadcastExchange #8 - WholeStageCodegen (15) - HashAggregate [count] [count(1),h9_30_to_10,count] + InputAdapter + BroadcastExchange #14 + WholeStageCodegen (24) + HashAggregate [count] [count(1),h10_30_to_11,count] InputAdapter - Exchange #9 - WholeStageCodegen (14) + Exchange #15 + WholeStageCodegen (23) HashAggregate [count,count] Project BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] @@ -95,8 +159,8 @@ BroadcastNestedLoopJoin InputAdapter Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] InputAdapter - BroadcastExchange #10 - WholeStageCodegen (11) + BroadcastExchange #16 + WholeStageCodegen (20) Project [t_time_sk] Filter [t_hour,t_minute,t_time_sk] ColumnarToRow @@ -106,12 +170,13 @@ BroadcastNestedLoopJoin ReusedExchange [s_store_sk] #3 InputAdapter ReusedExchange [hd_demo_sk] #4 - BroadcastExchange #11 - WholeStageCodegen (20) - HashAggregate [count] [count(1),h10_to_10_30,count] + InputAdapter + BroadcastExchange #17 + WholeStageCodegen (29) + HashAggregate [count] [count(1),h11_to_11_30,count] InputAdapter - Exchange #12 - WholeStageCodegen (19) + Exchange #18 + WholeStageCodegen (28) HashAggregate [count,count] Project BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] @@ -125,8 +190,8 @@ BroadcastNestedLoopJoin InputAdapter Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] InputAdapter - BroadcastExchange #13 - WholeStageCodegen (16) + BroadcastExchange #19 + WholeStageCodegen (25) Project [t_time_sk] Filter [t_hour,t_minute,t_time_sk] ColumnarToRow @@ -136,12 +201,13 @@ BroadcastNestedLoopJoin ReusedExchange [s_store_sk] #3 InputAdapter ReusedExchange [hd_demo_sk] #4 - BroadcastExchange #14 - WholeStageCodegen (25) - HashAggregate [count] [count(1),h10_30_to_11,count] + InputAdapter + BroadcastExchange #20 + WholeStageCodegen (34) + HashAggregate [count] [count(1),h11_30_to_12,count] InputAdapter - Exchange #15 - WholeStageCodegen (24) + Exchange #21 + WholeStageCodegen (33) HashAggregate [count,count] Project BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] @@ -155,8 +221,8 @@ BroadcastNestedLoopJoin InputAdapter Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] InputAdapter - BroadcastExchange #16 - WholeStageCodegen (21) + BroadcastExchange #22 + WholeStageCodegen (30) Project [t_time_sk] Filter [t_hour,t_minute,t_time_sk] ColumnarToRow @@ -166,12 +232,13 @@ BroadcastNestedLoopJoin ReusedExchange [s_store_sk] #3 InputAdapter ReusedExchange [hd_demo_sk] #4 - BroadcastExchange #17 - WholeStageCodegen (30) - HashAggregate [count] [count(1),h11_to_11_30,count] + InputAdapter + BroadcastExchange #23 + WholeStageCodegen (39) + HashAggregate [count] [count(1),h12_to_12_30,count] InputAdapter - Exchange #18 - WholeStageCodegen (29) + Exchange #24 + WholeStageCodegen (38) HashAggregate [count,count] Project BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] @@ -185,8 +252,8 @@ BroadcastNestedLoopJoin InputAdapter Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] InputAdapter - BroadcastExchange #19 - WholeStageCodegen (26) + BroadcastExchange #25 + WholeStageCodegen (35) Project [t_time_sk] Filter [t_hour,t_minute,t_time_sk] ColumnarToRow @@ -196,63 +263,3 @@ BroadcastNestedLoopJoin ReusedExchange [s_store_sk] #3 InputAdapter ReusedExchange [hd_demo_sk] #4 - BroadcastExchange #20 - WholeStageCodegen (35) - HashAggregate [count] [count(1),h11_30_to_12,count] - InputAdapter - Exchange #21 - WholeStageCodegen (34) - HashAggregate [count,count] - Project - BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] - Project [ss_hdemo_sk] - BroadcastHashJoin [ss_store_sk,s_store_sk] - Project [ss_hdemo_sk,ss_store_sk] - BroadcastHashJoin [ss_sold_time_sk,t_time_sk] - Project [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk] - Filter [ss_hdemo_sk,ss_sold_time_sk,ss_store_sk] - ColumnarToRow - InputAdapter - Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] - InputAdapter - BroadcastExchange #22 - WholeStageCodegen (31) - Project [t_time_sk] - Filter [t_hour,t_minute,t_time_sk] - ColumnarToRow - InputAdapter - Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] - InputAdapter - ReusedExchange [s_store_sk] #3 - InputAdapter - ReusedExchange [hd_demo_sk] #4 - BroadcastExchange #23 - WholeStageCodegen (40) - HashAggregate [count] [count(1),h12_to_12_30,count] - InputAdapter - Exchange #24 - WholeStageCodegen (39) - HashAggregate [count,count] - Project - BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] - Project [ss_hdemo_sk] - BroadcastHashJoin [ss_store_sk,s_store_sk] - Project [ss_hdemo_sk,ss_store_sk] - BroadcastHashJoin [ss_sold_time_sk,t_time_sk] - Project [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk] - Filter [ss_hdemo_sk,ss_sold_time_sk,ss_store_sk] - ColumnarToRow - InputAdapter - Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] - InputAdapter - BroadcastExchange #25 - WholeStageCodegen (36) - Project [t_time_sk] - Filter [t_hour,t_minute,t_time_sk] - ColumnarToRow - InputAdapter - Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] - InputAdapter - ReusedExchange [s_store_sk] #3 - InputAdapter - ReusedExchange [hd_demo_sk] #4 diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88/explain.txt index b14e5f1df92f..453906c2b5f3 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88/explain.txt @@ -1,11 +1,11 @@ == Physical Plan == -BroadcastNestedLoopJoin Inner BuildRight (182) -:- BroadcastNestedLoopJoin Inner BuildRight (160) -: :- BroadcastNestedLoopJoin Inner BuildRight (138) -: : :- BroadcastNestedLoopJoin Inner BuildRight (116) -: : : :- BroadcastNestedLoopJoin Inner BuildRight (94) -: : : : :- BroadcastNestedLoopJoin Inner BuildRight (72) -: : : : : :- BroadcastNestedLoopJoin Inner BuildRight (50) +* BroadcastNestedLoopJoin Inner BuildRight (182) +:- * BroadcastNestedLoopJoin Inner BuildRight (160) +: :- * BroadcastNestedLoopJoin Inner BuildRight (138) +: : :- * BroadcastNestedLoopJoin Inner BuildRight (116) +: : : :- * BroadcastNestedLoopJoin Inner BuildRight (94) +: : : : :- * BroadcastNestedLoopJoin Inner BuildRight (72) +: : : : : :- * BroadcastNestedLoopJoin Inner BuildRight (50) : : : : : : :- * HashAggregate (28) : : : : : : : +- Exchange (27) : : : : : : : +- * HashAggregate (26) @@ -305,7 +305,7 @@ Results [1]: [count#17] Input [1]: [count#17] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#18] -(28) HashAggregate [codegen id : 5] +(28) HashAggregate [codegen id : 40] Input [1]: [count#17] Keys: [] Functions [1]: [count(1)] @@ -319,26 +319,26 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(30) ColumnarToRow [codegen id : 9] +(30) ColumnarToRow [codegen id : 8] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(31) Filter [codegen id : 9] +(31) Filter [codegen id : 8] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(32) Project [codegen id : 9] +(32) Project [codegen id : 8] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] (33) ReusedExchange [Reuses operator id: 9] Output [1]: [hd_demo_sk#5] -(34) BroadcastHashJoin [codegen id : 9] +(34) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#5] Join condition: None -(35) Project [codegen id : 9] +(35) Project [codegen id : 8] Output [2]: [ss_sold_time_sk#1, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, hd_demo_sk#5] @@ -349,14 +349,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,9), LessThan(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(37) ColumnarToRow [codegen id : 7] +(37) ColumnarToRow [codegen id : 6] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] -(38) Filter [codegen id : 7] +(38) Filter [codegen id : 6] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Condition : ((((isnotnull(t_hour#10) AND isnotnull(t_minute#11)) AND (t_hour#10 = 9)) AND (t_minute#11 < 30)) AND isnotnull(t_time_sk#9)) -(39) Project [codegen id : 7] +(39) Project [codegen id : 6] Output [1]: [t_time_sk#9] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] @@ -364,28 +364,28 @@ Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Input [1]: [t_time_sk#9] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#21] -(41) BroadcastHashJoin [codegen id : 9] +(41) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#9] Join condition: None -(42) Project [codegen id : 9] +(42) Project [codegen id : 8] Output [1]: [ss_store_sk#3] Input [3]: [ss_sold_time_sk#1, ss_store_sk#3, t_time_sk#9] (43) ReusedExchange [Reuses operator id: 23] Output [1]: [s_store_sk#13] -(44) BroadcastHashJoin [codegen id : 9] +(44) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#13] Join condition: None -(45) Project [codegen id : 9] +(45) Project [codegen id : 8] Output: [] Input [2]: [ss_store_sk#3, s_store_sk#13] -(46) HashAggregate [codegen id : 9] +(46) HashAggregate [codegen id : 8] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -396,7 +396,7 @@ Results [1]: [count#23] Input [1]: [count#23] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#24] -(48) HashAggregate [codegen id : 10] +(48) HashAggregate [codegen id : 9] Input [1]: [count#23] Keys: [] Functions [1]: [count(1)] @@ -407,7 +407,7 @@ Results [1]: [count(1)#25 AS h9_to_9_30#26] Input [1]: [h9_to_9_30#26] Arguments: IdentityBroadcastMode, [id=#27] -(50) BroadcastNestedLoopJoin +(50) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (51) Scan parquet default.store_sales @@ -417,26 +417,26 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(52) ColumnarToRow [codegen id : 14] +(52) ColumnarToRow [codegen id : 13] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(53) Filter [codegen id : 14] +(53) Filter [codegen id : 13] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(54) Project [codegen id : 14] +(54) Project [codegen id : 13] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] (55) ReusedExchange [Reuses operator id: 9] Output [1]: [hd_demo_sk#5] -(56) BroadcastHashJoin [codegen id : 14] +(56) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#5] Join condition: None -(57) Project [codegen id : 14] +(57) Project [codegen id : 13] Output [2]: [ss_sold_time_sk#1, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, hd_demo_sk#5] @@ -447,14 +447,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,9), GreaterThanOrEqual(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(59) ColumnarToRow [codegen id : 12] +(59) ColumnarToRow [codegen id : 11] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] -(60) Filter [codegen id : 12] +(60) Filter [codegen id : 11] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Condition : ((((isnotnull(t_hour#10) AND isnotnull(t_minute#11)) AND (t_hour#10 = 9)) AND (t_minute#11 >= 30)) AND isnotnull(t_time_sk#9)) -(61) Project [codegen id : 12] +(61) Project [codegen id : 11] Output [1]: [t_time_sk#9] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] @@ -462,28 +462,28 @@ Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Input [1]: [t_time_sk#9] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#28] -(63) BroadcastHashJoin [codegen id : 14] +(63) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#9] Join condition: None -(64) Project [codegen id : 14] +(64) Project [codegen id : 13] Output [1]: [ss_store_sk#3] Input [3]: [ss_sold_time_sk#1, ss_store_sk#3, t_time_sk#9] (65) ReusedExchange [Reuses operator id: 23] Output [1]: [s_store_sk#13] -(66) BroadcastHashJoin [codegen id : 14] +(66) BroadcastHashJoin [codegen id : 13] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#13] Join condition: None -(67) Project [codegen id : 14] +(67) Project [codegen id : 13] Output: [] Input [2]: [ss_store_sk#3, s_store_sk#13] -(68) HashAggregate [codegen id : 14] +(68) HashAggregate [codegen id : 13] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -494,7 +494,7 @@ Results [1]: [count#30] Input [1]: [count#30] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#31] -(70) HashAggregate [codegen id : 15] +(70) HashAggregate [codegen id : 14] Input [1]: [count#30] Keys: [] Functions [1]: [count(1)] @@ -505,7 +505,7 @@ Results [1]: [count(1)#32 AS h9_30_to_10#33] Input [1]: [h9_30_to_10#33] Arguments: IdentityBroadcastMode, [id=#34] -(72) BroadcastNestedLoopJoin +(72) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (73) Scan parquet default.store_sales @@ -515,26 +515,26 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(74) ColumnarToRow [codegen id : 19] +(74) ColumnarToRow [codegen id : 18] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(75) Filter [codegen id : 19] +(75) Filter [codegen id : 18] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(76) Project [codegen id : 19] +(76) Project [codegen id : 18] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] (77) ReusedExchange [Reuses operator id: 9] Output [1]: [hd_demo_sk#5] -(78) BroadcastHashJoin [codegen id : 19] +(78) BroadcastHashJoin [codegen id : 18] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#5] Join condition: None -(79) Project [codegen id : 19] +(79) Project [codegen id : 18] Output [2]: [ss_sold_time_sk#1, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, hd_demo_sk#5] @@ -545,14 +545,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,10), LessThan(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(81) ColumnarToRow [codegen id : 17] +(81) ColumnarToRow [codegen id : 16] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] -(82) Filter [codegen id : 17] +(82) Filter [codegen id : 16] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Condition : ((((isnotnull(t_hour#10) AND isnotnull(t_minute#11)) AND (t_hour#10 = 10)) AND (t_minute#11 < 30)) AND isnotnull(t_time_sk#9)) -(83) Project [codegen id : 17] +(83) Project [codegen id : 16] Output [1]: [t_time_sk#9] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] @@ -560,28 +560,28 @@ Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Input [1]: [t_time_sk#9] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#35] -(85) BroadcastHashJoin [codegen id : 19] +(85) BroadcastHashJoin [codegen id : 18] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#9] Join condition: None -(86) Project [codegen id : 19] +(86) Project [codegen id : 18] Output [1]: [ss_store_sk#3] Input [3]: [ss_sold_time_sk#1, ss_store_sk#3, t_time_sk#9] (87) ReusedExchange [Reuses operator id: 23] Output [1]: [s_store_sk#13] -(88) BroadcastHashJoin [codegen id : 19] +(88) BroadcastHashJoin [codegen id : 18] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#13] Join condition: None -(89) Project [codegen id : 19] +(89) Project [codegen id : 18] Output: [] Input [2]: [ss_store_sk#3, s_store_sk#13] -(90) HashAggregate [codegen id : 19] +(90) HashAggregate [codegen id : 18] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -592,7 +592,7 @@ Results [1]: [count#37] Input [1]: [count#37] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#38] -(92) HashAggregate [codegen id : 20] +(92) HashAggregate [codegen id : 19] Input [1]: [count#37] Keys: [] Functions [1]: [count(1)] @@ -603,7 +603,7 @@ Results [1]: [count(1)#39 AS h10_to_10_30#40] Input [1]: [h10_to_10_30#40] Arguments: IdentityBroadcastMode, [id=#41] -(94) BroadcastNestedLoopJoin +(94) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (95) Scan parquet default.store_sales @@ -613,26 +613,26 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(96) ColumnarToRow [codegen id : 24] +(96) ColumnarToRow [codegen id : 23] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(97) Filter [codegen id : 24] +(97) Filter [codegen id : 23] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(98) Project [codegen id : 24] +(98) Project [codegen id : 23] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] (99) ReusedExchange [Reuses operator id: 9] Output [1]: [hd_demo_sk#5] -(100) BroadcastHashJoin [codegen id : 24] +(100) BroadcastHashJoin [codegen id : 23] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#5] Join condition: None -(101) Project [codegen id : 24] +(101) Project [codegen id : 23] Output [2]: [ss_sold_time_sk#1, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, hd_demo_sk#5] @@ -643,14 +643,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,10), GreaterThanOrEqual(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(103) ColumnarToRow [codegen id : 22] +(103) ColumnarToRow [codegen id : 21] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] -(104) Filter [codegen id : 22] +(104) Filter [codegen id : 21] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Condition : ((((isnotnull(t_hour#10) AND isnotnull(t_minute#11)) AND (t_hour#10 = 10)) AND (t_minute#11 >= 30)) AND isnotnull(t_time_sk#9)) -(105) Project [codegen id : 22] +(105) Project [codegen id : 21] Output [1]: [t_time_sk#9] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] @@ -658,28 +658,28 @@ Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Input [1]: [t_time_sk#9] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#42] -(107) BroadcastHashJoin [codegen id : 24] +(107) BroadcastHashJoin [codegen id : 23] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#9] Join condition: None -(108) Project [codegen id : 24] +(108) Project [codegen id : 23] Output [1]: [ss_store_sk#3] Input [3]: [ss_sold_time_sk#1, ss_store_sk#3, t_time_sk#9] (109) ReusedExchange [Reuses operator id: 23] Output [1]: [s_store_sk#13] -(110) BroadcastHashJoin [codegen id : 24] +(110) BroadcastHashJoin [codegen id : 23] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#13] Join condition: None -(111) Project [codegen id : 24] +(111) Project [codegen id : 23] Output: [] Input [2]: [ss_store_sk#3, s_store_sk#13] -(112) HashAggregate [codegen id : 24] +(112) HashAggregate [codegen id : 23] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -690,7 +690,7 @@ Results [1]: [count#44] Input [1]: [count#44] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#45] -(114) HashAggregate [codegen id : 25] +(114) HashAggregate [codegen id : 24] Input [1]: [count#44] Keys: [] Functions [1]: [count(1)] @@ -701,7 +701,7 @@ Results [1]: [count(1)#46 AS h10_30_to_11#47] Input [1]: [h10_30_to_11#47] Arguments: IdentityBroadcastMode, [id=#48] -(116) BroadcastNestedLoopJoin +(116) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (117) Scan parquet default.store_sales @@ -711,26 +711,26 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(118) ColumnarToRow [codegen id : 29] +(118) ColumnarToRow [codegen id : 28] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(119) Filter [codegen id : 29] +(119) Filter [codegen id : 28] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(120) Project [codegen id : 29] +(120) Project [codegen id : 28] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] (121) ReusedExchange [Reuses operator id: 9] Output [1]: [hd_demo_sk#5] -(122) BroadcastHashJoin [codegen id : 29] +(122) BroadcastHashJoin [codegen id : 28] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#5] Join condition: None -(123) Project [codegen id : 29] +(123) Project [codegen id : 28] Output [2]: [ss_sold_time_sk#1, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, hd_demo_sk#5] @@ -741,14 +741,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,11), LessThan(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(125) ColumnarToRow [codegen id : 27] +(125) ColumnarToRow [codegen id : 26] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] -(126) Filter [codegen id : 27] +(126) Filter [codegen id : 26] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Condition : ((((isnotnull(t_hour#10) AND isnotnull(t_minute#11)) AND (t_hour#10 = 11)) AND (t_minute#11 < 30)) AND isnotnull(t_time_sk#9)) -(127) Project [codegen id : 27] +(127) Project [codegen id : 26] Output [1]: [t_time_sk#9] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] @@ -756,28 +756,28 @@ Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Input [1]: [t_time_sk#9] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#49] -(129) BroadcastHashJoin [codegen id : 29] +(129) BroadcastHashJoin [codegen id : 28] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#9] Join condition: None -(130) Project [codegen id : 29] +(130) Project [codegen id : 28] Output [1]: [ss_store_sk#3] Input [3]: [ss_sold_time_sk#1, ss_store_sk#3, t_time_sk#9] (131) ReusedExchange [Reuses operator id: 23] Output [1]: [s_store_sk#13] -(132) BroadcastHashJoin [codegen id : 29] +(132) BroadcastHashJoin [codegen id : 28] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#13] Join condition: None -(133) Project [codegen id : 29] +(133) Project [codegen id : 28] Output: [] Input [2]: [ss_store_sk#3, s_store_sk#13] -(134) HashAggregate [codegen id : 29] +(134) HashAggregate [codegen id : 28] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -788,7 +788,7 @@ Results [1]: [count#51] Input [1]: [count#51] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#52] -(136) HashAggregate [codegen id : 30] +(136) HashAggregate [codegen id : 29] Input [1]: [count#51] Keys: [] Functions [1]: [count(1)] @@ -799,7 +799,7 @@ Results [1]: [count(1)#53 AS h11_to_11_30#54] Input [1]: [h11_to_11_30#54] Arguments: IdentityBroadcastMode, [id=#55] -(138) BroadcastNestedLoopJoin +(138) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (139) Scan parquet default.store_sales @@ -809,26 +809,26 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(140) ColumnarToRow [codegen id : 34] +(140) ColumnarToRow [codegen id : 33] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(141) Filter [codegen id : 34] +(141) Filter [codegen id : 33] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(142) Project [codegen id : 34] +(142) Project [codegen id : 33] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] (143) ReusedExchange [Reuses operator id: 9] Output [1]: [hd_demo_sk#5] -(144) BroadcastHashJoin [codegen id : 34] +(144) BroadcastHashJoin [codegen id : 33] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#5] Join condition: None -(145) Project [codegen id : 34] +(145) Project [codegen id : 33] Output [2]: [ss_sold_time_sk#1, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, hd_demo_sk#5] @@ -839,14 +839,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,11), GreaterThanOrEqual(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(147) ColumnarToRow [codegen id : 32] +(147) ColumnarToRow [codegen id : 31] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] -(148) Filter [codegen id : 32] +(148) Filter [codegen id : 31] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Condition : ((((isnotnull(t_hour#10) AND isnotnull(t_minute#11)) AND (t_hour#10 = 11)) AND (t_minute#11 >= 30)) AND isnotnull(t_time_sk#9)) -(149) Project [codegen id : 32] +(149) Project [codegen id : 31] Output [1]: [t_time_sk#9] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] @@ -854,28 +854,28 @@ Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Input [1]: [t_time_sk#9] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#56] -(151) BroadcastHashJoin [codegen id : 34] +(151) BroadcastHashJoin [codegen id : 33] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#9] Join condition: None -(152) Project [codegen id : 34] +(152) Project [codegen id : 33] Output [1]: [ss_store_sk#3] Input [3]: [ss_sold_time_sk#1, ss_store_sk#3, t_time_sk#9] (153) ReusedExchange [Reuses operator id: 23] Output [1]: [s_store_sk#13] -(154) BroadcastHashJoin [codegen id : 34] +(154) BroadcastHashJoin [codegen id : 33] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#13] Join condition: None -(155) Project [codegen id : 34] +(155) Project [codegen id : 33] Output: [] Input [2]: [ss_store_sk#3, s_store_sk#13] -(156) HashAggregate [codegen id : 34] +(156) HashAggregate [codegen id : 33] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -886,7 +886,7 @@ Results [1]: [count#58] Input [1]: [count#58] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#59] -(158) HashAggregate [codegen id : 35] +(158) HashAggregate [codegen id : 34] Input [1]: [count#58] Keys: [] Functions [1]: [count(1)] @@ -897,7 +897,7 @@ Results [1]: [count(1)#60 AS h11_30_to_12#61] Input [1]: [h11_30_to_12#61] Arguments: IdentityBroadcastMode, [id=#62] -(160) BroadcastNestedLoopJoin +(160) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None (161) Scan parquet default.store_sales @@ -907,26 +907,26 @@ Location [not included in comparison]/{warehouse_dir}/store_sales] PushedFilters: [IsNotNull(ss_hdemo_sk), IsNotNull(ss_sold_time_sk), IsNotNull(ss_store_sk)] ReadSchema: struct -(162) ColumnarToRow [codegen id : 39] +(162) ColumnarToRow [codegen id : 38] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] -(163) Filter [codegen id : 39] +(163) Filter [codegen id : 38] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] Condition : ((isnotnull(ss_hdemo_sk#2) AND isnotnull(ss_sold_time_sk#1)) AND isnotnull(ss_store_sk#3)) -(164) Project [codegen id : 39] +(164) Project [codegen id : 38] Output [3]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, ss_sold_date_sk#4] (165) ReusedExchange [Reuses operator id: 9] Output [1]: [hd_demo_sk#5] -(166) BroadcastHashJoin [codegen id : 39] +(166) BroadcastHashJoin [codegen id : 38] Left keys [1]: [ss_hdemo_sk#2] Right keys [1]: [hd_demo_sk#5] Join condition: None -(167) Project [codegen id : 39] +(167) Project [codegen id : 38] Output [2]: [ss_sold_time_sk#1, ss_store_sk#3] Input [4]: [ss_sold_time_sk#1, ss_hdemo_sk#2, ss_store_sk#3, hd_demo_sk#5] @@ -937,14 +937,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), IsNotNull(t_minute), EqualTo(t_hour,12), LessThan(t_minute,30), IsNotNull(t_time_sk)] ReadSchema: struct -(169) ColumnarToRow [codegen id : 37] +(169) ColumnarToRow [codegen id : 36] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] -(170) Filter [codegen id : 37] +(170) Filter [codegen id : 36] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Condition : ((((isnotnull(t_hour#10) AND isnotnull(t_minute#11)) AND (t_hour#10 = 12)) AND (t_minute#11 < 30)) AND isnotnull(t_time_sk#9)) -(171) Project [codegen id : 37] +(171) Project [codegen id : 36] Output [1]: [t_time_sk#9] Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] @@ -952,28 +952,28 @@ Input [3]: [t_time_sk#9, t_hour#10, t_minute#11] Input [1]: [t_time_sk#9] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#63] -(173) BroadcastHashJoin [codegen id : 39] +(173) BroadcastHashJoin [codegen id : 38] Left keys [1]: [ss_sold_time_sk#1] Right keys [1]: [t_time_sk#9] Join condition: None -(174) Project [codegen id : 39] +(174) Project [codegen id : 38] Output [1]: [ss_store_sk#3] Input [3]: [ss_sold_time_sk#1, ss_store_sk#3, t_time_sk#9] (175) ReusedExchange [Reuses operator id: 23] Output [1]: [s_store_sk#13] -(176) BroadcastHashJoin [codegen id : 39] +(176) BroadcastHashJoin [codegen id : 38] Left keys [1]: [ss_store_sk#3] Right keys [1]: [s_store_sk#13] Join condition: None -(177) Project [codegen id : 39] +(177) Project [codegen id : 38] Output: [] Input [2]: [ss_store_sk#3, s_store_sk#13] -(178) HashAggregate [codegen id : 39] +(178) HashAggregate [codegen id : 38] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -984,7 +984,7 @@ Results [1]: [count#65] Input [1]: [count#65] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#66] -(180) HashAggregate [codegen id : 40] +(180) HashAggregate [codegen id : 39] Input [1]: [count#65] Keys: [] Functions [1]: [count(1)] @@ -995,6 +995,6 @@ Results [1]: [count(1)#67 AS h12_to_12_30#68] Input [1]: [h12_to_12_30#68] Arguments: IdentityBroadcastMode, [id=#69] -(182) BroadcastNestedLoopJoin +(182) BroadcastNestedLoopJoin [codegen id : 40] Join condition: None diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88/simplified.txt index caaf8edd11d9..4bbd80c7a884 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q88/simplified.txt @@ -1,11 +1,11 @@ -BroadcastNestedLoopJoin +WholeStageCodegen (40) BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin BroadcastNestedLoopJoin - WholeStageCodegen (5) + BroadcastNestedLoopJoin HashAggregate [count] [count(1),h8_30_to_9,count] InputAdapter Exchange #1 @@ -46,12 +46,75 @@ BroadcastNestedLoopJoin ColumnarToRow InputAdapter Scan parquet default.store [s_store_sk,s_store_name] - BroadcastExchange #5 - WholeStageCodegen (10) - HashAggregate [count] [count(1),h9_to_9_30,count] + InputAdapter + BroadcastExchange #5 + WholeStageCodegen (9) + HashAggregate [count] [count(1),h9_to_9_30,count] + InputAdapter + Exchange #6 + WholeStageCodegen (8) + HashAggregate [count,count] + Project + BroadcastHashJoin [ss_store_sk,s_store_sk] + Project [ss_store_sk] + BroadcastHashJoin [ss_sold_time_sk,t_time_sk] + Project [ss_sold_time_sk,ss_store_sk] + BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] + Project [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk] + Filter [ss_hdemo_sk,ss_sold_time_sk,ss_store_sk] + ColumnarToRow + InputAdapter + Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] + InputAdapter + ReusedExchange [hd_demo_sk] #2 + InputAdapter + BroadcastExchange #7 + WholeStageCodegen (6) + Project [t_time_sk] + Filter [t_hour,t_minute,t_time_sk] + ColumnarToRow + InputAdapter + Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] + InputAdapter + ReusedExchange [s_store_sk] #4 + InputAdapter + BroadcastExchange #8 + WholeStageCodegen (14) + HashAggregate [count] [count(1),h9_30_to_10,count] + InputAdapter + Exchange #9 + WholeStageCodegen (13) + HashAggregate [count,count] + Project + BroadcastHashJoin [ss_store_sk,s_store_sk] + Project [ss_store_sk] + BroadcastHashJoin [ss_sold_time_sk,t_time_sk] + Project [ss_sold_time_sk,ss_store_sk] + BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] + Project [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk] + Filter [ss_hdemo_sk,ss_sold_time_sk,ss_store_sk] + ColumnarToRow + InputAdapter + Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] + InputAdapter + ReusedExchange [hd_demo_sk] #2 + InputAdapter + BroadcastExchange #10 + WholeStageCodegen (11) + Project [t_time_sk] + Filter [t_hour,t_minute,t_time_sk] + ColumnarToRow + InputAdapter + Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] + InputAdapter + ReusedExchange [s_store_sk] #4 + InputAdapter + BroadcastExchange #11 + WholeStageCodegen (19) + HashAggregate [count] [count(1),h10_to_10_30,count] InputAdapter - Exchange #6 - WholeStageCodegen (9) + Exchange #12 + WholeStageCodegen (18) HashAggregate [count,count] Project BroadcastHashJoin [ss_store_sk,s_store_sk] @@ -67,8 +130,8 @@ BroadcastNestedLoopJoin InputAdapter ReusedExchange [hd_demo_sk] #2 InputAdapter - BroadcastExchange #7 - WholeStageCodegen (7) + BroadcastExchange #13 + WholeStageCodegen (16) Project [t_time_sk] Filter [t_hour,t_minute,t_time_sk] ColumnarToRow @@ -76,12 +139,13 @@ BroadcastNestedLoopJoin Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] InputAdapter ReusedExchange [s_store_sk] #4 - BroadcastExchange #8 - WholeStageCodegen (15) - HashAggregate [count] [count(1),h9_30_to_10,count] + InputAdapter + BroadcastExchange #14 + WholeStageCodegen (24) + HashAggregate [count] [count(1),h10_30_to_11,count] InputAdapter - Exchange #9 - WholeStageCodegen (14) + Exchange #15 + WholeStageCodegen (23) HashAggregate [count,count] Project BroadcastHashJoin [ss_store_sk,s_store_sk] @@ -97,8 +161,8 @@ BroadcastNestedLoopJoin InputAdapter ReusedExchange [hd_demo_sk] #2 InputAdapter - BroadcastExchange #10 - WholeStageCodegen (12) + BroadcastExchange #16 + WholeStageCodegen (21) Project [t_time_sk] Filter [t_hour,t_minute,t_time_sk] ColumnarToRow @@ -106,12 +170,13 @@ BroadcastNestedLoopJoin Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] InputAdapter ReusedExchange [s_store_sk] #4 - BroadcastExchange #11 - WholeStageCodegen (20) - HashAggregate [count] [count(1),h10_to_10_30,count] + InputAdapter + BroadcastExchange #17 + WholeStageCodegen (29) + HashAggregate [count] [count(1),h11_to_11_30,count] InputAdapter - Exchange #12 - WholeStageCodegen (19) + Exchange #18 + WholeStageCodegen (28) HashAggregate [count,count] Project BroadcastHashJoin [ss_store_sk,s_store_sk] @@ -127,8 +192,8 @@ BroadcastNestedLoopJoin InputAdapter ReusedExchange [hd_demo_sk] #2 InputAdapter - BroadcastExchange #13 - WholeStageCodegen (17) + BroadcastExchange #19 + WholeStageCodegen (26) Project [t_time_sk] Filter [t_hour,t_minute,t_time_sk] ColumnarToRow @@ -136,12 +201,13 @@ BroadcastNestedLoopJoin Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] InputAdapter ReusedExchange [s_store_sk] #4 - BroadcastExchange #14 - WholeStageCodegen (25) - HashAggregate [count] [count(1),h10_30_to_11,count] + InputAdapter + BroadcastExchange #20 + WholeStageCodegen (34) + HashAggregate [count] [count(1),h11_30_to_12,count] InputAdapter - Exchange #15 - WholeStageCodegen (24) + Exchange #21 + WholeStageCodegen (33) HashAggregate [count,count] Project BroadcastHashJoin [ss_store_sk,s_store_sk] @@ -157,8 +223,8 @@ BroadcastNestedLoopJoin InputAdapter ReusedExchange [hd_demo_sk] #2 InputAdapter - BroadcastExchange #16 - WholeStageCodegen (22) + BroadcastExchange #22 + WholeStageCodegen (31) Project [t_time_sk] Filter [t_hour,t_minute,t_time_sk] ColumnarToRow @@ -166,12 +232,13 @@ BroadcastNestedLoopJoin Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] InputAdapter ReusedExchange [s_store_sk] #4 - BroadcastExchange #17 - WholeStageCodegen (30) - HashAggregate [count] [count(1),h11_to_11_30,count] + InputAdapter + BroadcastExchange #23 + WholeStageCodegen (39) + HashAggregate [count] [count(1),h12_to_12_30,count] InputAdapter - Exchange #18 - WholeStageCodegen (29) + Exchange #24 + WholeStageCodegen (38) HashAggregate [count,count] Project BroadcastHashJoin [ss_store_sk,s_store_sk] @@ -187,8 +254,8 @@ BroadcastNestedLoopJoin InputAdapter ReusedExchange [hd_demo_sk] #2 InputAdapter - BroadcastExchange #19 - WholeStageCodegen (27) + BroadcastExchange #25 + WholeStageCodegen (36) Project [t_time_sk] Filter [t_hour,t_minute,t_time_sk] ColumnarToRow @@ -196,63 +263,3 @@ BroadcastNestedLoopJoin Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] InputAdapter ReusedExchange [s_store_sk] #4 - BroadcastExchange #20 - WholeStageCodegen (35) - HashAggregate [count] [count(1),h11_30_to_12,count] - InputAdapter - Exchange #21 - WholeStageCodegen (34) - HashAggregate [count,count] - Project - BroadcastHashJoin [ss_store_sk,s_store_sk] - Project [ss_store_sk] - BroadcastHashJoin [ss_sold_time_sk,t_time_sk] - Project [ss_sold_time_sk,ss_store_sk] - BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] - Project [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk] - Filter [ss_hdemo_sk,ss_sold_time_sk,ss_store_sk] - ColumnarToRow - InputAdapter - Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] - InputAdapter - ReusedExchange [hd_demo_sk] #2 - InputAdapter - BroadcastExchange #22 - WholeStageCodegen (32) - Project [t_time_sk] - Filter [t_hour,t_minute,t_time_sk] - ColumnarToRow - InputAdapter - Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] - InputAdapter - ReusedExchange [s_store_sk] #4 - BroadcastExchange #23 - WholeStageCodegen (40) - HashAggregate [count] [count(1),h12_to_12_30,count] - InputAdapter - Exchange #24 - WholeStageCodegen (39) - HashAggregate [count,count] - Project - BroadcastHashJoin [ss_store_sk,s_store_sk] - Project [ss_store_sk] - BroadcastHashJoin [ss_sold_time_sk,t_time_sk] - Project [ss_sold_time_sk,ss_store_sk] - BroadcastHashJoin [ss_hdemo_sk,hd_demo_sk] - Project [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk] - Filter [ss_hdemo_sk,ss_sold_time_sk,ss_store_sk] - ColumnarToRow - InputAdapter - Scan parquet default.store_sales [ss_sold_time_sk,ss_hdemo_sk,ss_store_sk,ss_sold_date_sk] - InputAdapter - ReusedExchange [hd_demo_sk] #2 - InputAdapter - BroadcastExchange #25 - WholeStageCodegen (37) - Project [t_time_sk] - Filter [t_hour,t_minute,t_time_sk] - ColumnarToRow - InputAdapter - Scan parquet default.time_dim [t_time_sk,t_hour,t_minute] - InputAdapter - ReusedExchange [s_store_sk] #4 diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90.sf100/explain.txt index ff79100617ef..a74b232e8c66 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90.sf100/explain.txt @@ -1,7 +1,7 @@ == Physical Plan == * Sort (52) +- * Project (51) - +- BroadcastNestedLoopJoin Inner BuildRight (50) + +- * BroadcastNestedLoopJoin Inner BuildRight (50) :- * HashAggregate (28) : +- Exchange (27) : +- * HashAggregate (26) @@ -175,7 +175,7 @@ Results [1]: [count#15] Input [1]: [count#15] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#16] -(28) HashAggregate [codegen id : 5] +(28) HashAggregate [codegen id : 10] Input [1]: [count#15] Keys: [] Functions [1]: [count(1)] @@ -189,38 +189,38 @@ Location [not included in comparison]/{warehouse_dir}/web_sales] PushedFilters: [IsNotNull(ws_ship_hdemo_sk), IsNotNull(ws_sold_time_sk), IsNotNull(ws_web_page_sk)] ReadSchema: struct -(30) ColumnarToRow [codegen id : 9] +(30) ColumnarToRow [codegen id : 8] Input [4]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2, ws_web_page_sk#3, ws_sold_date_sk#4] -(31) Filter [codegen id : 9] +(31) Filter [codegen id : 8] Input [4]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2, ws_web_page_sk#3, ws_sold_date_sk#4] Condition : ((isnotnull(ws_ship_hdemo_sk#2) AND isnotnull(ws_sold_time_sk#1)) AND isnotnull(ws_web_page_sk#3)) -(32) Project [codegen id : 9] +(32) Project [codegen id : 8] Output [3]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2, ws_web_page_sk#3] Input [4]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2, ws_web_page_sk#3, ws_sold_date_sk#4] (33) ReusedExchange [Reuses operator id: 9] Output [1]: [wp_web_page_sk#5] -(34) BroadcastHashJoin [codegen id : 9] +(34) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ws_web_page_sk#3] Right keys [1]: [wp_web_page_sk#5] Join condition: None -(35) Project [codegen id : 9] +(35) Project [codegen id : 8] Output [2]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2] Input [4]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2, ws_web_page_sk#3, wp_web_page_sk#5] (36) ReusedExchange [Reuses operator id: 16] Output [1]: [hd_demo_sk#8] -(37) BroadcastHashJoin [codegen id : 9] +(37) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ws_ship_hdemo_sk#2] Right keys [1]: [hd_demo_sk#8] Join condition: None -(38) Project [codegen id : 9] +(38) Project [codegen id : 8] Output [1]: [ws_sold_time_sk#1] Input [3]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2, hd_demo_sk#8] @@ -231,14 +231,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), GreaterThanOrEqual(t_hour,19), LessThanOrEqual(t_hour,20), IsNotNull(t_time_sk)] ReadSchema: struct -(40) ColumnarToRow [codegen id : 8] +(40) ColumnarToRow [codegen id : 7] Input [2]: [t_time_sk#11, t_hour#12] -(41) Filter [codegen id : 8] +(41) Filter [codegen id : 7] Input [2]: [t_time_sk#11, t_hour#12] Condition : (((isnotnull(t_hour#12) AND (t_hour#12 >= 19)) AND (t_hour#12 <= 20)) AND isnotnull(t_time_sk#11)) -(42) Project [codegen id : 8] +(42) Project [codegen id : 7] Output [1]: [t_time_sk#11] Input [2]: [t_time_sk#11, t_hour#12] @@ -246,16 +246,16 @@ Input [2]: [t_time_sk#11, t_hour#12] Input [1]: [t_time_sk#11] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#19] -(44) BroadcastHashJoin [codegen id : 9] +(44) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ws_sold_time_sk#1] Right keys [1]: [t_time_sk#11] Join condition: None -(45) Project [codegen id : 9] +(45) Project [codegen id : 8] Output: [] Input [2]: [ws_sold_time_sk#1, t_time_sk#11] -(46) HashAggregate [codegen id : 9] +(46) HashAggregate [codegen id : 8] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -266,7 +266,7 @@ Results [1]: [count#21] Input [1]: [count#21] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#22] -(48) HashAggregate [codegen id : 10] +(48) HashAggregate [codegen id : 9] Input [1]: [count#21] Keys: [] Functions [1]: [count(1)] @@ -277,14 +277,14 @@ Results [1]: [count(1)#23 AS pmc#24] Input [1]: [pmc#24] Arguments: IdentityBroadcastMode, [id=#25] -(50) BroadcastNestedLoopJoin +(50) BroadcastNestedLoopJoin [codegen id : 10] Join condition: None -(51) Project [codegen id : 11] +(51) Project [codegen id : 10] Output [1]: [CheckOverflow((promote_precision(cast(amc#18 as decimal(15,4))) / promote_precision(cast(pmc#24 as decimal(15,4)))), DecimalType(35,20), true) AS am_pm_ratio#26] Input [2]: [amc#18, pmc#24] -(52) Sort [codegen id : 11] +(52) Sort [codegen id : 10] Input [1]: [am_pm_ratio#26] Arguments: [am_pm_ratio#26 ASC NULLS FIRST], true, 0 diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90.sf100/simplified.txt index 8e8873038bd6..6fed86d7cea4 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90.sf100/simplified.txt @@ -1,55 +1,54 @@ -WholeStageCodegen (11) +WholeStageCodegen (10) Sort [am_pm_ratio] Project [amc,pmc] - InputAdapter - BroadcastNestedLoopJoin - WholeStageCodegen (5) - HashAggregate [count] [count(1),amc,count] - InputAdapter - Exchange #1 - WholeStageCodegen (4) - HashAggregate [count,count] - Project - BroadcastHashJoin [ws_sold_time_sk,t_time_sk] - Project [ws_sold_time_sk] - BroadcastHashJoin [ws_ship_hdemo_sk,hd_demo_sk] - Project [ws_sold_time_sk,ws_ship_hdemo_sk] - BroadcastHashJoin [ws_web_page_sk,wp_web_page_sk] - Project [ws_sold_time_sk,ws_ship_hdemo_sk,ws_web_page_sk] - Filter [ws_ship_hdemo_sk,ws_sold_time_sk,ws_web_page_sk] - ColumnarToRow - InputAdapter - Scan parquet default.web_sales [ws_sold_time_sk,ws_ship_hdemo_sk,ws_web_page_sk,ws_sold_date_sk] - InputAdapter - BroadcastExchange #2 - WholeStageCodegen (1) - Project [wp_web_page_sk] - Filter [wp_char_count,wp_web_page_sk] - ColumnarToRow - InputAdapter - Scan parquet default.web_page [wp_web_page_sk,wp_char_count] + BroadcastNestedLoopJoin + HashAggregate [count] [count(1),amc,count] + InputAdapter + Exchange #1 + WholeStageCodegen (4) + HashAggregate [count,count] + Project + BroadcastHashJoin [ws_sold_time_sk,t_time_sk] + Project [ws_sold_time_sk] + BroadcastHashJoin [ws_ship_hdemo_sk,hd_demo_sk] + Project [ws_sold_time_sk,ws_ship_hdemo_sk] + BroadcastHashJoin [ws_web_page_sk,wp_web_page_sk] + Project [ws_sold_time_sk,ws_ship_hdemo_sk,ws_web_page_sk] + Filter [ws_ship_hdemo_sk,ws_sold_time_sk,ws_web_page_sk] + ColumnarToRow + InputAdapter + Scan parquet default.web_sales [ws_sold_time_sk,ws_ship_hdemo_sk,ws_web_page_sk,ws_sold_date_sk] InputAdapter - BroadcastExchange #3 - WholeStageCodegen (2) - Project [hd_demo_sk] - Filter [hd_dep_count,hd_demo_sk] + BroadcastExchange #2 + WholeStageCodegen (1) + Project [wp_web_page_sk] + Filter [wp_char_count,wp_web_page_sk] ColumnarToRow InputAdapter - Scan parquet default.household_demographics [hd_demo_sk,hd_dep_count] + Scan parquet default.web_page [wp_web_page_sk,wp_char_count] InputAdapter - BroadcastExchange #4 - WholeStageCodegen (3) - Project [t_time_sk] - Filter [t_hour,t_time_sk] + BroadcastExchange #3 + WholeStageCodegen (2) + Project [hd_demo_sk] + Filter [hd_dep_count,hd_demo_sk] ColumnarToRow InputAdapter - Scan parquet default.time_dim [t_time_sk,t_hour] + Scan parquet default.household_demographics [hd_demo_sk,hd_dep_count] + InputAdapter + BroadcastExchange #4 + WholeStageCodegen (3) + Project [t_time_sk] + Filter [t_hour,t_time_sk] + ColumnarToRow + InputAdapter + Scan parquet default.time_dim [t_time_sk,t_hour] + InputAdapter BroadcastExchange #5 - WholeStageCodegen (10) + WholeStageCodegen (9) HashAggregate [count] [count(1),pmc,count] InputAdapter Exchange #6 - WholeStageCodegen (9) + WholeStageCodegen (8) HashAggregate [count,count] Project BroadcastHashJoin [ws_sold_time_sk,t_time_sk] @@ -68,7 +67,7 @@ WholeStageCodegen (11) ReusedExchange [hd_demo_sk] #3 InputAdapter BroadcastExchange #7 - WholeStageCodegen (8) + WholeStageCodegen (7) Project [t_time_sk] Filter [t_hour,t_time_sk] ColumnarToRow diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90/explain.txt index 3ce1529ea679..070b497ac4d1 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90/explain.txt @@ -1,7 +1,7 @@ == Physical Plan == * Sort (52) +- * Project (51) - +- BroadcastNestedLoopJoin Inner BuildRight (50) + +- * BroadcastNestedLoopJoin Inner BuildRight (50) :- * HashAggregate (28) : +- Exchange (27) : +- * HashAggregate (26) @@ -175,7 +175,7 @@ Results [1]: [count#15] Input [1]: [count#15] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#16] -(28) HashAggregate [codegen id : 5] +(28) HashAggregate [codegen id : 10] Input [1]: [count#15] Keys: [] Functions [1]: [count(1)] @@ -189,26 +189,26 @@ Location [not included in comparison]/{warehouse_dir}/web_sales] PushedFilters: [IsNotNull(ws_ship_hdemo_sk), IsNotNull(ws_sold_time_sk), IsNotNull(ws_web_page_sk)] ReadSchema: struct -(30) ColumnarToRow [codegen id : 9] +(30) ColumnarToRow [codegen id : 8] Input [4]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2, ws_web_page_sk#3, ws_sold_date_sk#4] -(31) Filter [codegen id : 9] +(31) Filter [codegen id : 8] Input [4]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2, ws_web_page_sk#3, ws_sold_date_sk#4] Condition : ((isnotnull(ws_ship_hdemo_sk#2) AND isnotnull(ws_sold_time_sk#1)) AND isnotnull(ws_web_page_sk#3)) -(32) Project [codegen id : 9] +(32) Project [codegen id : 8] Output [3]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2, ws_web_page_sk#3] Input [4]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2, ws_web_page_sk#3, ws_sold_date_sk#4] (33) ReusedExchange [Reuses operator id: 9] Output [1]: [hd_demo_sk#5] -(34) BroadcastHashJoin [codegen id : 9] +(34) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ws_ship_hdemo_sk#2] Right keys [1]: [hd_demo_sk#5] Join condition: None -(35) Project [codegen id : 9] +(35) Project [codegen id : 8] Output [2]: [ws_sold_time_sk#1, ws_web_page_sk#3] Input [4]: [ws_sold_time_sk#1, ws_ship_hdemo_sk#2, ws_web_page_sk#3, hd_demo_sk#5] @@ -219,14 +219,14 @@ Location [not included in comparison]/{warehouse_dir}/time_dim] PushedFilters: [IsNotNull(t_hour), GreaterThanOrEqual(t_hour,19), LessThanOrEqual(t_hour,20), IsNotNull(t_time_sk)] ReadSchema: struct -(37) ColumnarToRow [codegen id : 7] +(37) ColumnarToRow [codegen id : 6] Input [2]: [t_time_sk#8, t_hour#9] -(38) Filter [codegen id : 7] +(38) Filter [codegen id : 6] Input [2]: [t_time_sk#8, t_hour#9] Condition : (((isnotnull(t_hour#9) AND (t_hour#9 >= 19)) AND (t_hour#9 <= 20)) AND isnotnull(t_time_sk#8)) -(39) Project [codegen id : 7] +(39) Project [codegen id : 6] Output [1]: [t_time_sk#8] Input [2]: [t_time_sk#8, t_hour#9] @@ -234,28 +234,28 @@ Input [2]: [t_time_sk#8, t_hour#9] Input [1]: [t_time_sk#8] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#19] -(41) BroadcastHashJoin [codegen id : 9] +(41) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ws_sold_time_sk#1] Right keys [1]: [t_time_sk#8] Join condition: None -(42) Project [codegen id : 9] +(42) Project [codegen id : 8] Output [1]: [ws_web_page_sk#3] Input [3]: [ws_sold_time_sk#1, ws_web_page_sk#3, t_time_sk#8] (43) ReusedExchange [Reuses operator id: 23] Output [1]: [wp_web_page_sk#11] -(44) BroadcastHashJoin [codegen id : 9] +(44) BroadcastHashJoin [codegen id : 8] Left keys [1]: [ws_web_page_sk#3] Right keys [1]: [wp_web_page_sk#11] Join condition: None -(45) Project [codegen id : 9] +(45) Project [codegen id : 8] Output: [] Input [2]: [ws_web_page_sk#3, wp_web_page_sk#11] -(46) HashAggregate [codegen id : 9] +(46) HashAggregate [codegen id : 8] Input: [] Keys: [] Functions [1]: [partial_count(1)] @@ -266,7 +266,7 @@ Results [1]: [count#21] Input [1]: [count#21] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#22] -(48) HashAggregate [codegen id : 10] +(48) HashAggregate [codegen id : 9] Input [1]: [count#21] Keys: [] Functions [1]: [count(1)] @@ -277,14 +277,14 @@ Results [1]: [count(1)#23 AS pmc#24] Input [1]: [pmc#24] Arguments: IdentityBroadcastMode, [id=#25] -(50) BroadcastNestedLoopJoin +(50) BroadcastNestedLoopJoin [codegen id : 10] Join condition: None -(51) Project [codegen id : 11] +(51) Project [codegen id : 10] Output [1]: [CheckOverflow((promote_precision(cast(amc#18 as decimal(15,4))) / promote_precision(cast(pmc#24 as decimal(15,4)))), DecimalType(35,20), true) AS am_pm_ratio#26] Input [2]: [amc#18, pmc#24] -(52) Sort [codegen id : 11] +(52) Sort [codegen id : 10] Input [1]: [am_pm_ratio#26] Arguments: [am_pm_ratio#26 ASC NULLS FIRST], true, 0 diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90/simplified.txt index 02cfa1946b21..0964189da3cf 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v1_4/q90/simplified.txt @@ -1,55 +1,54 @@ -WholeStageCodegen (11) +WholeStageCodegen (10) Sort [am_pm_ratio] Project [amc,pmc] - InputAdapter - BroadcastNestedLoopJoin - WholeStageCodegen (5) - HashAggregate [count] [count(1),amc,count] - InputAdapter - Exchange #1 - WholeStageCodegen (4) - HashAggregate [count,count] - Project - BroadcastHashJoin [ws_web_page_sk,wp_web_page_sk] - Project [ws_web_page_sk] - BroadcastHashJoin [ws_sold_time_sk,t_time_sk] - Project [ws_sold_time_sk,ws_web_page_sk] - BroadcastHashJoin [ws_ship_hdemo_sk,hd_demo_sk] - Project [ws_sold_time_sk,ws_ship_hdemo_sk,ws_web_page_sk] - Filter [ws_ship_hdemo_sk,ws_sold_time_sk,ws_web_page_sk] - ColumnarToRow - InputAdapter - Scan parquet default.web_sales [ws_sold_time_sk,ws_ship_hdemo_sk,ws_web_page_sk,ws_sold_date_sk] - InputAdapter - BroadcastExchange #2 - WholeStageCodegen (1) - Project [hd_demo_sk] - Filter [hd_dep_count,hd_demo_sk] - ColumnarToRow - InputAdapter - Scan parquet default.household_demographics [hd_demo_sk,hd_dep_count] + BroadcastNestedLoopJoin + HashAggregate [count] [count(1),amc,count] + InputAdapter + Exchange #1 + WholeStageCodegen (4) + HashAggregate [count,count] + Project + BroadcastHashJoin [ws_web_page_sk,wp_web_page_sk] + Project [ws_web_page_sk] + BroadcastHashJoin [ws_sold_time_sk,t_time_sk] + Project [ws_sold_time_sk,ws_web_page_sk] + BroadcastHashJoin [ws_ship_hdemo_sk,hd_demo_sk] + Project [ws_sold_time_sk,ws_ship_hdemo_sk,ws_web_page_sk] + Filter [ws_ship_hdemo_sk,ws_sold_time_sk,ws_web_page_sk] + ColumnarToRow + InputAdapter + Scan parquet default.web_sales [ws_sold_time_sk,ws_ship_hdemo_sk,ws_web_page_sk,ws_sold_date_sk] InputAdapter - BroadcastExchange #3 - WholeStageCodegen (2) - Project [t_time_sk] - Filter [t_hour,t_time_sk] + BroadcastExchange #2 + WholeStageCodegen (1) + Project [hd_demo_sk] + Filter [hd_dep_count,hd_demo_sk] ColumnarToRow InputAdapter - Scan parquet default.time_dim [t_time_sk,t_hour] + Scan parquet default.household_demographics [hd_demo_sk,hd_dep_count] InputAdapter - BroadcastExchange #4 - WholeStageCodegen (3) - Project [wp_web_page_sk] - Filter [wp_char_count,wp_web_page_sk] + BroadcastExchange #3 + WholeStageCodegen (2) + Project [t_time_sk] + Filter [t_hour,t_time_sk] ColumnarToRow InputAdapter - Scan parquet default.web_page [wp_web_page_sk,wp_char_count] + Scan parquet default.time_dim [t_time_sk,t_hour] + InputAdapter + BroadcastExchange #4 + WholeStageCodegen (3) + Project [wp_web_page_sk] + Filter [wp_char_count,wp_web_page_sk] + ColumnarToRow + InputAdapter + Scan parquet default.web_page [wp_web_page_sk,wp_char_count] + InputAdapter BroadcastExchange #5 - WholeStageCodegen (10) + WholeStageCodegen (9) HashAggregate [count] [count(1),pmc,count] InputAdapter Exchange #6 - WholeStageCodegen (9) + WholeStageCodegen (8) HashAggregate [count,count] Project BroadcastHashJoin [ws_web_page_sk,wp_web_page_sk] @@ -66,7 +65,7 @@ WholeStageCodegen (11) ReusedExchange [hd_demo_sk] #2 InputAdapter BroadcastExchange #7 - WholeStageCodegen (7) + WholeStageCodegen (6) Project [t_time_sk] Filter [t_hour,t_time_sk] ColumnarToRow diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22.sf100/explain.txt index d876cd321845..8f9ec9e9cd68 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22.sf100/explain.txt @@ -4,7 +4,7 @@ TakeOrderedAndProject (28) +- Exchange (26) +- * HashAggregate (25) +- * Expand (24) - +- BroadcastNestedLoopJoin Inner BuildRight (23) + +- * BroadcastNestedLoopJoin Inner BuildRight (23) :- * Project (19) : +- * SortMergeJoin Inner (18) : :- * Sort (12) @@ -105,12 +105,12 @@ Arguments: hashpartitioning(i_item_sk#9, 5), ENSURE_REQUIREMENTS, [id=#14] Input [5]: [i_item_sk#9, i_brand#10, i_class#11, i_category#12, i_product_name#13] Arguments: [i_item_sk#9 ASC NULLS FIRST], false, 0 -(18) SortMergeJoin [codegen id : 6] +(18) SortMergeJoin [codegen id : 7] Left keys [1]: [inv_item_sk#1] Right keys [1]: [i_item_sk#9] Join condition: None -(19) Project [codegen id : 6] +(19) Project [codegen id : 7] Output [5]: [inv_quantity_on_hand#2, i_brand#10, i_class#11, i_category#12, i_product_name#13] Input [7]: [inv_item_sk#1, inv_quantity_on_hand#2, i_item_sk#9, i_brand#10, i_class#11, i_category#12, i_product_name#13] @@ -120,21 +120,21 @@ Batched: true Location [not included in comparison]/{warehouse_dir}/warehouse] ReadSchema: struct<> -(21) ColumnarToRow [codegen id : 7] +(21) ColumnarToRow [codegen id : 6] Input: [] (22) BroadcastExchange Input: [] Arguments: IdentityBroadcastMode, [id=#15] -(23) BroadcastNestedLoopJoin +(23) BroadcastNestedLoopJoin [codegen id : 7] Join condition: None -(24) Expand [codegen id : 8] +(24) Expand [codegen id : 7] Input [5]: [inv_quantity_on_hand#2, i_brand#10, i_class#11, i_category#12, i_product_name#13] Arguments: [List(inv_quantity_on_hand#2, i_product_name#13, i_brand#10, i_class#11, i_category#12, 0), List(inv_quantity_on_hand#2, i_product_name#13, i_brand#10, i_class#11, null, 1), List(inv_quantity_on_hand#2, i_product_name#13, i_brand#10, null, null, 3), List(inv_quantity_on_hand#2, i_product_name#13, null, null, null, 7), List(inv_quantity_on_hand#2, null, null, null, null, 15)], [inv_quantity_on_hand#2, i_product_name#16, i_brand#17, i_class#18, i_category#19, spark_grouping_id#20] -(25) HashAggregate [codegen id : 8] +(25) HashAggregate [codegen id : 7] Input [6]: [inv_quantity_on_hand#2, i_product_name#16, i_brand#17, i_class#18, i_category#19, spark_grouping_id#20] Keys [5]: [i_product_name#16, i_brand#17, i_class#18, i_category#19, spark_grouping_id#20] Functions [1]: [partial_avg(inv_quantity_on_hand#2)] @@ -145,7 +145,7 @@ Results [7]: [i_product_name#16, i_brand#17, i_class#18, i_category#19, spark_gr Input [7]: [i_product_name#16, i_brand#17, i_class#18, i_category#19, spark_grouping_id#20, sum#23, count#24] Arguments: hashpartitioning(i_product_name#16, i_brand#17, i_class#18, i_category#19, spark_grouping_id#20, 5), ENSURE_REQUIREMENTS, [id=#25] -(27) HashAggregate [codegen id : 9] +(27) HashAggregate [codegen id : 8] Input [7]: [i_product_name#16, i_brand#17, i_class#18, i_category#19, spark_grouping_id#20, sum#23, count#24] Keys [5]: [i_product_name#16, i_brand#17, i_class#18, i_category#19, spark_grouping_id#20] Functions [1]: [avg(inv_quantity_on_hand#2)] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22.sf100/simplified.txt index 2cf896003b83..ca9a5d054602 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22.sf100/simplified.txt @@ -1,50 +1,49 @@ TakeOrderedAndProject [qoh,i_product_name,i_brand,i_class,i_category] - WholeStageCodegen (9) + WholeStageCodegen (8) HashAggregate [i_product_name,i_brand,i_class,i_category,spark_grouping_id,sum,count] [avg(inv_quantity_on_hand),qoh,sum,count] InputAdapter Exchange [i_product_name,i_brand,i_class,i_category,spark_grouping_id] #1 - WholeStageCodegen (8) + WholeStageCodegen (7) HashAggregate [i_product_name,i_brand,i_class,i_category,spark_grouping_id,inv_quantity_on_hand] [sum,count,sum,count] Expand [inv_quantity_on_hand,i_product_name,i_brand,i_class,i_category] - InputAdapter - BroadcastNestedLoopJoin - WholeStageCodegen (6) - Project [inv_quantity_on_hand,i_brand,i_class,i_category,i_product_name] - SortMergeJoin [inv_item_sk,i_item_sk] - InputAdapter - WholeStageCodegen (3) - Sort [inv_item_sk] - InputAdapter - Exchange [inv_item_sk] #2 - WholeStageCodegen (2) - Project [inv_item_sk,inv_quantity_on_hand] - BroadcastHashJoin [inv_date_sk,d_date_sk] - Filter [inv_item_sk] - ColumnarToRow - InputAdapter - Scan parquet default.inventory [inv_item_sk,inv_quantity_on_hand,inv_date_sk] - SubqueryBroadcast [d_date_sk] #1 - ReusedExchange [d_date_sk] #3 - InputAdapter - BroadcastExchange #3 - WholeStageCodegen (1) - 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 - WholeStageCodegen (5) - Sort [i_item_sk] - InputAdapter - Exchange [i_item_sk] #4 - WholeStageCodegen (4) - Filter [i_item_sk] + BroadcastNestedLoopJoin + Project [inv_quantity_on_hand,i_brand,i_class,i_category,i_product_name] + SortMergeJoin [inv_item_sk,i_item_sk] + InputAdapter + WholeStageCodegen (3) + Sort [inv_item_sk] + InputAdapter + Exchange [inv_item_sk] #2 + WholeStageCodegen (2) + Project [inv_item_sk,inv_quantity_on_hand] + BroadcastHashJoin [inv_date_sk,d_date_sk] + Filter [inv_item_sk] ColumnarToRow InputAdapter - Scan parquet default.item [i_item_sk,i_brand,i_class,i_category,i_product_name] + Scan parquet default.inventory [inv_item_sk,inv_quantity_on_hand,inv_date_sk] + SubqueryBroadcast [d_date_sk] #1 + ReusedExchange [d_date_sk] #3 + InputAdapter + BroadcastExchange #3 + WholeStageCodegen (1) + 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 + WholeStageCodegen (5) + Sort [i_item_sk] + InputAdapter + Exchange [i_item_sk] #4 + WholeStageCodegen (4) + Filter [i_item_sk] + ColumnarToRow + InputAdapter + Scan parquet default.item [i_item_sk,i_brand,i_class,i_category,i_product_name] + InputAdapter BroadcastExchange #5 - WholeStageCodegen (7) + WholeStageCodegen (6) ColumnarToRow InputAdapter Scan parquet default.warehouse diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22/explain.txt index affec322cbbe..7cd7526e9da6 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22/explain.txt @@ -4,7 +4,7 @@ TakeOrderedAndProject (25) +- Exchange (23) +- * HashAggregate (22) +- * Expand (21) - +- BroadcastNestedLoopJoin Inner BuildRight (20) + +- * BroadcastNestedLoopJoin Inner BuildRight (20) :- * Project (16) : +- * BroadcastHashJoin Inner BuildRight (15) : :- * Project (10) @@ -34,10 +34,10 @@ PartitionFilters: [isnotnull(inv_date_sk#3), dynamicpruningexpression(inv_date_s PushedFilters: [IsNotNull(inv_item_sk)] ReadSchema: struct -(2) ColumnarToRow [codegen id : 3] +(2) ColumnarToRow [codegen id : 4] Input [3]: [inv_item_sk#1, inv_quantity_on_hand#2, inv_date_sk#3] -(3) Filter [codegen id : 3] +(3) Filter [codegen id : 4] Input [3]: [inv_item_sk#1, inv_quantity_on_hand#2, inv_date_sk#3] Condition : isnotnull(inv_item_sk#1) @@ -63,12 +63,12 @@ Input [2]: [d_date_sk#5, d_month_seq#6] Input [1]: [d_date_sk#5] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#7] -(9) BroadcastHashJoin [codegen id : 3] +(9) BroadcastHashJoin [codegen id : 4] Left keys [1]: [inv_date_sk#3] Right keys [1]: [d_date_sk#5] Join condition: None -(10) Project [codegen id : 3] +(10) Project [codegen id : 4] Output [2]: [inv_item_sk#1, inv_quantity_on_hand#2] Input [4]: [inv_item_sk#1, inv_quantity_on_hand#2, inv_date_sk#3, d_date_sk#5] @@ -90,12 +90,12 @@ Condition : isnotnull(i_item_sk#8) Input [5]: [i_item_sk#8, i_brand#9, i_class#10, i_category#11, i_product_name#12] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#13] -(15) BroadcastHashJoin [codegen id : 3] +(15) BroadcastHashJoin [codegen id : 4] Left keys [1]: [inv_item_sk#1] Right keys [1]: [i_item_sk#8] Join condition: None -(16) Project [codegen id : 3] +(16) Project [codegen id : 4] Output [5]: [inv_quantity_on_hand#2, i_brand#9, i_class#10, i_category#11, i_product_name#12] Input [7]: [inv_item_sk#1, inv_quantity_on_hand#2, i_item_sk#8, i_brand#9, i_class#10, i_category#11, i_product_name#12] @@ -105,21 +105,21 @@ Batched: true Location [not included in comparison]/{warehouse_dir}/warehouse] ReadSchema: struct<> -(18) ColumnarToRow [codegen id : 4] +(18) ColumnarToRow [codegen id : 3] Input: [] (19) BroadcastExchange Input: [] Arguments: IdentityBroadcastMode, [id=#14] -(20) BroadcastNestedLoopJoin +(20) BroadcastNestedLoopJoin [codegen id : 4] Join condition: None -(21) Expand [codegen id : 5] +(21) Expand [codegen id : 4] Input [5]: [inv_quantity_on_hand#2, i_brand#9, i_class#10, i_category#11, i_product_name#12] Arguments: [List(inv_quantity_on_hand#2, i_product_name#12, i_brand#9, i_class#10, i_category#11, 0), List(inv_quantity_on_hand#2, i_product_name#12, i_brand#9, i_class#10, null, 1), List(inv_quantity_on_hand#2, i_product_name#12, i_brand#9, null, null, 3), List(inv_quantity_on_hand#2, i_product_name#12, null, null, null, 7), List(inv_quantity_on_hand#2, null, null, null, null, 15)], [inv_quantity_on_hand#2, i_product_name#15, i_brand#16, i_class#17, i_category#18, spark_grouping_id#19] -(22) HashAggregate [codegen id : 5] +(22) HashAggregate [codegen id : 4] Input [6]: [inv_quantity_on_hand#2, i_product_name#15, i_brand#16, i_class#17, i_category#18, spark_grouping_id#19] Keys [5]: [i_product_name#15, i_brand#16, i_class#17, i_category#18, spark_grouping_id#19] Functions [1]: [partial_avg(inv_quantity_on_hand#2)] @@ -130,7 +130,7 @@ Results [7]: [i_product_name#15, i_brand#16, i_class#17, i_category#18, spark_gr Input [7]: [i_product_name#15, i_brand#16, i_class#17, i_category#18, spark_grouping_id#19, sum#22, count#23] Arguments: hashpartitioning(i_product_name#15, i_brand#16, i_class#17, i_category#18, spark_grouping_id#19, 5), ENSURE_REQUIREMENTS, [id=#24] -(24) HashAggregate [codegen id : 6] +(24) HashAggregate [codegen id : 5] Input [7]: [i_product_name#15, i_brand#16, i_class#17, i_category#18, spark_grouping_id#19, sum#22, count#23] Keys [5]: [i_product_name#15, i_brand#16, i_class#17, i_category#18, spark_grouping_id#19] Functions [1]: [avg(inv_quantity_on_hand#2)] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22/simplified.txt index 8bb7e01edd7a..c8ef4786f2a7 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q22/simplified.txt @@ -1,41 +1,40 @@ TakeOrderedAndProject [qoh,i_product_name,i_brand,i_class,i_category] - WholeStageCodegen (6) + WholeStageCodegen (5) HashAggregate [i_product_name,i_brand,i_class,i_category,spark_grouping_id,sum,count] [avg(inv_quantity_on_hand),qoh,sum,count] InputAdapter Exchange [i_product_name,i_brand,i_class,i_category,spark_grouping_id] #1 - WholeStageCodegen (5) + WholeStageCodegen (4) HashAggregate [i_product_name,i_brand,i_class,i_category,spark_grouping_id,inv_quantity_on_hand] [sum,count,sum,count] Expand [inv_quantity_on_hand,i_product_name,i_brand,i_class,i_category] - InputAdapter - BroadcastNestedLoopJoin - WholeStageCodegen (3) - Project [inv_quantity_on_hand,i_brand,i_class,i_category,i_product_name] - BroadcastHashJoin [inv_item_sk,i_item_sk] - Project [inv_item_sk,inv_quantity_on_hand] - BroadcastHashJoin [inv_date_sk,d_date_sk] - Filter [inv_item_sk] - ColumnarToRow - InputAdapter - Scan parquet default.inventory [inv_item_sk,inv_quantity_on_hand,inv_date_sk] - SubqueryBroadcast [d_date_sk] #1 - ReusedExchange [d_date_sk] #2 + BroadcastNestedLoopJoin + Project [inv_quantity_on_hand,i_brand,i_class,i_category,i_product_name] + BroadcastHashJoin [inv_item_sk,i_item_sk] + Project [inv_item_sk,inv_quantity_on_hand] + BroadcastHashJoin [inv_date_sk,d_date_sk] + Filter [inv_item_sk] + ColumnarToRow InputAdapter - BroadcastExchange #2 - WholeStageCodegen (1) - Project [d_date_sk] - Filter [d_month_seq,d_date_sk] - ColumnarToRow - InputAdapter - Scan parquet default.date_dim [d_date_sk,d_month_seq] + Scan parquet default.inventory [inv_item_sk,inv_quantity_on_hand,inv_date_sk] + SubqueryBroadcast [d_date_sk] #1 + ReusedExchange [d_date_sk] #2 InputAdapter - BroadcastExchange #3 - WholeStageCodegen (2) - Filter [i_item_sk] - ColumnarToRow - InputAdapter - Scan parquet default.item [i_item_sk,i_brand,i_class,i_category,i_product_name] + BroadcastExchange #2 + WholeStageCodegen (1) + 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 + WholeStageCodegen (2) + Filter [i_item_sk] + ColumnarToRow + InputAdapter + Scan parquet default.item [i_item_sk,i_brand,i_class,i_category,i_product_name] + InputAdapter BroadcastExchange #4 - WholeStageCodegen (4) + WholeStageCodegen (3) ColumnarToRow InputAdapter Scan parquet default.warehouse diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a.sf100/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a.sf100/explain.txt index c1bc17041a35..e6ade3880e2d 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a.sf100/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a.sf100/explain.txt @@ -43,7 +43,7 @@ TakeOrderedAndProject (102) : : : +- ReusedExchange (23) : : +- ReusedExchange (26) : :- * Project (53) - : : +- BroadcastNestedLoopJoin Inner BuildRight (52) + : : +- * BroadcastNestedLoopJoin Inner BuildRight (52) : : :- * HashAggregate (42) : : : +- Exchange (41) : : : +- * HashAggregate (40) @@ -130,7 +130,7 @@ Input [2]: [d_date_sk#6, d_date#7] (6) Filter [codegen id : 1] Input [2]: [d_date_sk#6, d_date#7] -Condition : (((isnotnull(d_date#7) AND (d_date#7 >= 10442)) AND (d_date#7 <= 10472)) AND isnotnull(d_date_sk#6)) +Condition : (((isnotnull(d_date#7) AND (d_date#7 >= 1998-08-04)) AND (d_date#7 <= 1998-09-03)) AND isnotnull(d_date_sk#6)) (7) Project [codegen id : 1] Output [1]: [d_date_sk#6] @@ -297,7 +297,7 @@ Results [3]: [cs_call_center_sk#40, sum#46, sum#47] Input [3]: [cs_call_center_sk#40, sum#46, sum#47] Arguments: hashpartitioning(cs_call_center_sk#40, 5), ENSURE_REQUIREMENTS, [id=#48] -(42) HashAggregate [codegen id : 11] +(42) HashAggregate [codegen id : 14] Input [3]: [cs_call_center_sk#40, sum#46, sum#47] Keys [1]: [cs_call_center_sk#40] Functions [2]: [sum(UnscaledValue(cs_ext_sales_price#41)), sum(UnscaledValue(cs_net_profit#42))] @@ -311,22 +311,22 @@ Location: InMemoryFileIndex [] PartitionFilters: [isnotnull(cr_returned_date_sk#55), dynamicpruningexpression(cr_returned_date_sk#55 IN dynamicpruning#5)] ReadSchema: struct -(44) ColumnarToRow [codegen id : 13] +(44) ColumnarToRow [codegen id : 12] Input [3]: [cr_return_amount#53, cr_net_loss#54, cr_returned_date_sk#55] (45) ReusedExchange [Reuses operator id: 8] Output [1]: [d_date_sk#6] -(46) BroadcastHashJoin [codegen id : 13] +(46) BroadcastHashJoin [codegen id : 12] Left keys [1]: [cr_returned_date_sk#55] Right keys [1]: [d_date_sk#6] Join condition: None -(47) Project [codegen id : 13] +(47) Project [codegen id : 12] Output [2]: [cr_return_amount#53, cr_net_loss#54] Input [4]: [cr_return_amount#53, cr_net_loss#54, cr_returned_date_sk#55, d_date_sk#6] -(48) HashAggregate [codegen id : 13] +(48) HashAggregate [codegen id : 12] Input [2]: [cr_return_amount#53, cr_net_loss#54] Keys: [] Functions [2]: [partial_sum(UnscaledValue(cr_return_amount#53)), partial_sum(UnscaledValue(cr_net_loss#54))] @@ -337,7 +337,7 @@ Results [2]: [sum#58, sum#59] Input [2]: [sum#58, sum#59] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#60] -(50) HashAggregate [codegen id : 14] +(50) HashAggregate [codegen id : 13] Input [2]: [sum#58, sum#59] Keys: [] Functions [2]: [sum(UnscaledValue(cr_return_amount#53)), sum(UnscaledValue(cr_net_loss#54))] @@ -348,10 +348,10 @@ Results [2]: [MakeDecimal(sum(UnscaledValue(cr_return_amount#53))#61,17,2) AS re Input [2]: [returns#63, profit_loss#64] Arguments: IdentityBroadcastMode, [id=#65] -(52) BroadcastNestedLoopJoin +(52) BroadcastNestedLoopJoin [codegen id : 14] Join condition: None -(53) Project [codegen id : 15] +(53) Project [codegen id : 14] Output [5]: [catalog channel AS channel#66, cs_call_center_sk#40 AS id#67, sales#51, returns#63, CheckOverflow((promote_precision(cast(profit#52 as decimal(18,2))) - promote_precision(cast(profit_loss#64 as decimal(18,2)))), DecimalType(18,2), true) AS profit#68] Input [5]: [cs_call_center_sk#40, sales#51, profit#52, returns#63, profit_loss#64] @@ -363,22 +363,22 @@ PartitionFilters: [isnotnull(ws_sold_date_sk#72), dynamicpruningexpression(ws_so PushedFilters: [IsNotNull(ws_web_page_sk)] ReadSchema: struct -(55) ColumnarToRow [codegen id : 18] +(55) ColumnarToRow [codegen id : 17] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72] -(56) Filter [codegen id : 18] +(56) Filter [codegen id : 17] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72] Condition : isnotnull(ws_web_page_sk#69) (57) ReusedExchange [Reuses operator id: 8] Output [1]: [d_date_sk#6] -(58) BroadcastHashJoin [codegen id : 18] +(58) BroadcastHashJoin [codegen id : 17] Left keys [1]: [ws_sold_date_sk#72] Right keys [1]: [d_date_sk#6] Join condition: None -(59) Project [codegen id : 18] +(59) Project [codegen id : 17] Output [3]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71] Input [5]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72, d_date_sk#6] @@ -389,10 +389,10 @@ Location [not included in comparison]/{warehouse_dir}/web_page] PushedFilters: [IsNotNull(wp_web_page_sk)] ReadSchema: struct -(61) ColumnarToRow [codegen id : 17] +(61) ColumnarToRow [codegen id : 16] Input [1]: [wp_web_page_sk#73] -(62) Filter [codegen id : 17] +(62) Filter [codegen id : 16] Input [1]: [wp_web_page_sk#73] Condition : isnotnull(wp_web_page_sk#73) @@ -400,16 +400,16 @@ Condition : isnotnull(wp_web_page_sk#73) Input [1]: [wp_web_page_sk#73] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#74] -(64) BroadcastHashJoin [codegen id : 18] +(64) BroadcastHashJoin [codegen id : 17] Left keys [1]: [ws_web_page_sk#69] Right keys [1]: [wp_web_page_sk#73] Join condition: None -(65) Project [codegen id : 18] +(65) Project [codegen id : 17] Output [3]: [ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] -(66) HashAggregate [codegen id : 18] +(66) HashAggregate [codegen id : 17] Input [3]: [ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] Keys [1]: [wp_web_page_sk#73] Functions [2]: [partial_sum(UnscaledValue(ws_ext_sales_price#70)), partial_sum(UnscaledValue(ws_net_profit#71))] @@ -420,7 +420,7 @@ Results [3]: [wp_web_page_sk#73, sum#77, sum#78] Input [3]: [wp_web_page_sk#73, sum#77, sum#78] Arguments: hashpartitioning(wp_web_page_sk#73, 5), ENSURE_REQUIREMENTS, [id=#79] -(68) HashAggregate [codegen id : 23] +(68) HashAggregate [codegen id : 22] Input [3]: [wp_web_page_sk#73, sum#77, sum#78] Keys [1]: [wp_web_page_sk#73] Functions [2]: [sum(UnscaledValue(ws_ext_sales_price#70)), sum(UnscaledValue(ws_net_profit#71))] @@ -435,38 +435,38 @@ PartitionFilters: [isnotnull(wr_returned_date_sk#87), dynamicpruningexpression(w PushedFilters: [IsNotNull(wr_web_page_sk)] ReadSchema: struct -(70) ColumnarToRow [codegen id : 21] +(70) ColumnarToRow [codegen id : 20] Input [4]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87] -(71) Filter [codegen id : 21] +(71) Filter [codegen id : 20] Input [4]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87] Condition : isnotnull(wr_web_page_sk#84) (72) ReusedExchange [Reuses operator id: 63] Output [1]: [wp_web_page_sk#88] -(73) BroadcastHashJoin [codegen id : 21] +(73) BroadcastHashJoin [codegen id : 20] Left keys [1]: [wr_web_page_sk#84] Right keys [1]: [cast(wp_web_page_sk#88 as bigint)] Join condition: None -(74) Project [codegen id : 21] +(74) Project [codegen id : 20] Output [4]: [wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87, wp_web_page_sk#88] Input [5]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87, wp_web_page_sk#88] (75) ReusedExchange [Reuses operator id: 8] Output [1]: [d_date_sk#6] -(76) BroadcastHashJoin [codegen id : 21] +(76) BroadcastHashJoin [codegen id : 20] Left keys [1]: [wr_returned_date_sk#87] Right keys [1]: [cast(d_date_sk#6 as bigint)] Join condition: None -(77) Project [codegen id : 21] +(77) Project [codegen id : 20] Output [3]: [wr_return_amt#85, wr_net_loss#86, wp_web_page_sk#88] Input [5]: [wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87, wp_web_page_sk#88, d_date_sk#6] -(78) HashAggregate [codegen id : 21] +(78) HashAggregate [codegen id : 20] Input [3]: [wr_return_amt#85, wr_net_loss#86, wp_web_page_sk#88] Keys [1]: [wp_web_page_sk#88] Functions [2]: [partial_sum(UnscaledValue(wr_return_amt#85)), partial_sum(UnscaledValue(wr_net_loss#86))] @@ -477,7 +477,7 @@ Results [3]: [wp_web_page_sk#88, sum#91, sum#92] Input [3]: [wp_web_page_sk#88, sum#91, sum#92] Arguments: hashpartitioning(wp_web_page_sk#88, 5), ENSURE_REQUIREMENTS, [id=#93] -(80) HashAggregate [codegen id : 22] +(80) HashAggregate [codegen id : 21] Input [3]: [wp_web_page_sk#88, sum#91, sum#92] Keys [1]: [wp_web_page_sk#88] Functions [2]: [sum(UnscaledValue(wr_return_amt#85)), sum(UnscaledValue(wr_net_loss#86))] @@ -488,18 +488,18 @@ Results [3]: [wp_web_page_sk#88, MakeDecimal(sum(UnscaledValue(wr_return_amt#85) Input [3]: [wp_web_page_sk#88, returns#96, profit_loss#97] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#98] -(82) BroadcastHashJoin [codegen id : 23] +(82) BroadcastHashJoin [codegen id : 22] Left keys [1]: [wp_web_page_sk#73] Right keys [1]: [wp_web_page_sk#88] Join condition: None -(83) Project [codegen id : 23] +(83) Project [codegen id : 22] Output [5]: [web channel AS channel#99, wp_web_page_sk#73 AS id#100, sales#82, coalesce(returns#96, 0.00) AS returns#101, CheckOverflow((promote_precision(cast(profit#83 as decimal(18,2))) - promote_precision(cast(coalesce(profit_loss#97, 0.00) as decimal(18,2)))), DecimalType(18,2), true) AS profit#102] Input [6]: [wp_web_page_sk#73, sales#82, profit#83, wp_web_page_sk#88, returns#96, profit_loss#97] (84) Union -(85) HashAggregate [codegen id : 24] +(85) HashAggregate [codegen id : 23] Input [5]: [channel#36, id#37, sales#18, returns#38, profit#39] Keys [2]: [channel#36, id#37] Functions [3]: [partial_sum(sales#18), partial_sum(returns#38), partial_sum(profit#39)] @@ -510,7 +510,7 @@ Results [8]: [channel#36, id#37, sum#109, isEmpty#110, sum#111, isEmpty#112, sum Input [8]: [channel#36, id#37, sum#109, isEmpty#110, sum#111, isEmpty#112, sum#113, isEmpty#114] Arguments: hashpartitioning(channel#36, id#37, 5), ENSURE_REQUIREMENTS, [id=#115] -(87) HashAggregate [codegen id : 25] +(87) HashAggregate [codegen id : 24] Input [8]: [channel#36, id#37, sum#109, isEmpty#110, sum#111, isEmpty#112, sum#113, isEmpty#114] Keys [2]: [channel#36, id#37] Functions [3]: [sum(sales#18), sum(returns#38), sum(profit#39)] @@ -520,14 +520,14 @@ Results [5]: [channel#36, id#37, cast(sum(sales#18)#116 as decimal(37,2)) AS sal (88) ReusedExchange [Reuses operator id: unknown] Output [8]: [channel#36, id#37, sum#122, isEmpty#123, sum#124, isEmpty#125, sum#126, isEmpty#127] -(89) HashAggregate [codegen id : 50] +(89) HashAggregate [codegen id : 48] Input [8]: [channel#36, id#37, sum#122, isEmpty#123, sum#124, isEmpty#125, sum#126, isEmpty#127] Keys [2]: [channel#36, id#37] Functions [3]: [sum(sales#18), sum(returns#38), sum(profit#128)] Aggregate Attributes [3]: [sum(sales#18)#129, sum(returns#38)#130, sum(profit#128)#131] Results [4]: [channel#36, sum(sales#18)#129 AS sales#132, sum(returns#38)#130 AS returns#133, sum(profit#128)#131 AS profit#134] -(90) HashAggregate [codegen id : 50] +(90) HashAggregate [codegen id : 48] Input [4]: [channel#36, sales#132, returns#133, profit#134] Keys [1]: [channel#36] Functions [3]: [partial_sum(sales#132), partial_sum(returns#133), partial_sum(profit#134)] @@ -538,7 +538,7 @@ Results [7]: [channel#36, sum#141, isEmpty#142, sum#143, isEmpty#144, sum#145, i Input [7]: [channel#36, sum#141, isEmpty#142, sum#143, isEmpty#144, sum#145, isEmpty#146] Arguments: hashpartitioning(channel#36, 5), ENSURE_REQUIREMENTS, [id=#147] -(92) HashAggregate [codegen id : 51] +(92) HashAggregate [codegen id : 49] Input [7]: [channel#36, sum#141, isEmpty#142, sum#143, isEmpty#144, sum#145, isEmpty#146] Keys [1]: [channel#36] Functions [3]: [sum(sales#132), sum(returns#133), sum(profit#134)] @@ -548,14 +548,14 @@ Results [5]: [channel#36, null AS id#151, sum(sales#132)#148 AS sales#152, sum(r (93) ReusedExchange [Reuses operator id: unknown] Output [8]: [channel#36, id#37, sum#155, isEmpty#156, sum#157, isEmpty#158, sum#159, isEmpty#160] -(94) HashAggregate [codegen id : 76] +(94) HashAggregate [codegen id : 73] Input [8]: [channel#36, id#37, sum#155, isEmpty#156, sum#157, isEmpty#158, sum#159, isEmpty#160] Keys [2]: [channel#36, id#37] Functions [3]: [sum(sales#18), sum(returns#38), sum(profit#161)] Aggregate Attributes [3]: [sum(sales#18)#162, sum(returns#38)#163, sum(profit#161)#164] Results [3]: [sum(sales#18)#162 AS sales#132, sum(returns#38)#163 AS returns#133, sum(profit#161)#164 AS profit#134] -(95) HashAggregate [codegen id : 76] +(95) HashAggregate [codegen id : 73] Input [3]: [sales#132, returns#133, profit#134] Keys: [] Functions [3]: [partial_sum(sales#132), partial_sum(returns#133), partial_sum(profit#134)] @@ -566,7 +566,7 @@ Results [6]: [sum#171, isEmpty#172, sum#173, isEmpty#174, sum#175, isEmpty#176] Input [6]: [sum#171, isEmpty#172, sum#173, isEmpty#174, sum#175, isEmpty#176] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#177] -(97) HashAggregate [codegen id : 77] +(97) HashAggregate [codegen id : 74] Input [6]: [sum#171, isEmpty#172, sum#173, isEmpty#174, sum#175, isEmpty#176] Keys: [] Functions [3]: [sum(sales#132), sum(returns#133), sum(profit#134)] @@ -575,7 +575,7 @@ Results [5]: [null AS channel#181, null AS id#182, sum(sales#132)#178 AS sales#1 (98) Union -(99) HashAggregate [codegen id : 78] +(99) HashAggregate [codegen id : 75] Input [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Keys [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Functions: [] @@ -586,7 +586,7 @@ Results [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Input [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Arguments: hashpartitioning(channel#36, id#37, sales#119, returns#120, profit#121, 5), ENSURE_REQUIREMENTS, [id=#186] -(101) HashAggregate [codegen id : 79] +(101) HashAggregate [codegen id : 76] Input [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Keys [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Functions: [] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a.sf100/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a.sf100/simplified.txt index 0eb3ed2380e5..88605e50dd04 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a.sf100/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a.sf100/simplified.txt @@ -1,17 +1,17 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] - WholeStageCodegen (79) + WholeStageCodegen (76) HashAggregate [channel,id,sales,returns,profit] InputAdapter Exchange [channel,id,sales,returns,profit] #1 - WholeStageCodegen (78) + WholeStageCodegen (75) HashAggregate [channel,id,sales,returns,profit] InputAdapter Union - WholeStageCodegen (25) + WholeStageCodegen (24) HashAggregate [channel,id,sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter Exchange [channel,id] #2 - WholeStageCodegen (24) + WholeStageCodegen (23) HashAggregate [channel,id,sales,returns,profit] [sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter Union @@ -70,30 +70,29 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedExchange [s_store_sk] #5 InputAdapter ReusedExchange [d_date_sk] #4 - WholeStageCodegen (15) + WholeStageCodegen (14) Project [cs_call_center_sk,sales,returns,profit,profit_loss] - InputAdapter - BroadcastNestedLoopJoin - WholeStageCodegen (11) - HashAggregate [cs_call_center_sk,sum,sum] [sum(UnscaledValue(cs_ext_sales_price)),sum(UnscaledValue(cs_net_profit)),sales,profit,sum,sum] - InputAdapter - Exchange [cs_call_center_sk] #8 - WholeStageCodegen (10) - HashAggregate [cs_call_center_sk,cs_ext_sales_price,cs_net_profit] [sum,sum,sum,sum] - Project [cs_call_center_sk,cs_ext_sales_price,cs_net_profit] - BroadcastHashJoin [cs_sold_date_sk,d_date_sk] - ColumnarToRow - InputAdapter - Scan parquet default.catalog_sales [cs_call_center_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk] - ReusedSubquery [d_date_sk] #1 - InputAdapter - ReusedExchange [d_date_sk] #4 + BroadcastNestedLoopJoin + HashAggregate [cs_call_center_sk,sum,sum] [sum(UnscaledValue(cs_ext_sales_price)),sum(UnscaledValue(cs_net_profit)),sales,profit,sum,sum] + InputAdapter + Exchange [cs_call_center_sk] #8 + WholeStageCodegen (10) + HashAggregate [cs_call_center_sk,cs_ext_sales_price,cs_net_profit] [sum,sum,sum,sum] + Project [cs_call_center_sk,cs_ext_sales_price,cs_net_profit] + BroadcastHashJoin [cs_sold_date_sk,d_date_sk] + ColumnarToRow + InputAdapter + Scan parquet default.catalog_sales [cs_call_center_sk,cs_ext_sales_price,cs_net_profit,cs_sold_date_sk] + ReusedSubquery [d_date_sk] #1 + InputAdapter + ReusedExchange [d_date_sk] #4 + InputAdapter BroadcastExchange #9 - WholeStageCodegen (14) + WholeStageCodegen (13) HashAggregate [sum,sum] [sum(UnscaledValue(cr_return_amount)),sum(UnscaledValue(cr_net_loss)),returns,profit_loss,sum,sum] InputAdapter Exchange #10 - WholeStageCodegen (13) + WholeStageCodegen (12) HashAggregate [cr_return_amount,cr_net_loss] [sum,sum,sum,sum] Project [cr_return_amount,cr_net_loss] BroadcastHashJoin [cr_returned_date_sk,d_date_sk] @@ -103,13 +102,13 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedSubquery [d_date_sk] #1 InputAdapter ReusedExchange [d_date_sk] #4 - WholeStageCodegen (23) + WholeStageCodegen (22) Project [wp_web_page_sk,sales,returns,profit,profit_loss] BroadcastHashJoin [wp_web_page_sk,wp_web_page_sk] HashAggregate [wp_web_page_sk,sum,sum] [sum(UnscaledValue(ws_ext_sales_price)),sum(UnscaledValue(ws_net_profit)),sales,profit,sum,sum] InputAdapter Exchange [wp_web_page_sk] #11 - WholeStageCodegen (18) + WholeStageCodegen (17) HashAggregate [wp_web_page_sk,ws_ext_sales_price,ws_net_profit] [sum,sum,sum,sum] Project [ws_ext_sales_price,ws_net_profit,wp_web_page_sk] BroadcastHashJoin [ws_web_page_sk,wp_web_page_sk] @@ -124,18 +123,18 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedExchange [d_date_sk] #4 InputAdapter BroadcastExchange #12 - WholeStageCodegen (17) + WholeStageCodegen (16) Filter [wp_web_page_sk] ColumnarToRow InputAdapter Scan parquet default.web_page [wp_web_page_sk] InputAdapter BroadcastExchange #13 - WholeStageCodegen (22) + WholeStageCodegen (21) HashAggregate [wp_web_page_sk,sum,sum] [sum(UnscaledValue(wr_return_amt)),sum(UnscaledValue(wr_net_loss)),returns,profit_loss,sum,sum] InputAdapter Exchange [wp_web_page_sk] #14 - WholeStageCodegen (21) + WholeStageCodegen (20) HashAggregate [wp_web_page_sk,wr_return_amt,wr_net_loss] [sum,sum,sum,sum] Project [wr_return_amt,wr_net_loss,wp_web_page_sk] BroadcastHashJoin [wr_returned_date_sk,d_date_sk] @@ -150,20 +149,20 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedExchange [wp_web_page_sk] #12 InputAdapter ReusedExchange [d_date_sk] #4 - WholeStageCodegen (51) + WholeStageCodegen (49) HashAggregate [channel,sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),id,sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter Exchange [channel] #15 - WholeStageCodegen (50) + WholeStageCodegen (48) HashAggregate [channel,sales,returns,profit] [sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty] HashAggregate [channel,id,sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter ReusedExchange [channel,id,sum,isEmpty,sum,isEmpty,sum,isEmpty] #16 - WholeStageCodegen (77) + WholeStageCodegen (74) HashAggregate [sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),channel,id,sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter Exchange #17 - WholeStageCodegen (76) + WholeStageCodegen (73) HashAggregate [sales,returns,profit] [sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty] HashAggregate [channel,id,sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a/explain.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a/explain.txt index 0a8a995b8cd2..0ec2ed7cca35 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a/explain.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a/explain.txt @@ -43,7 +43,7 @@ TakeOrderedAndProject (102) : : : +- ReusedExchange (23) : : +- ReusedExchange (26) : :- * Project (53) - : : +- BroadcastNestedLoopJoin Inner BuildLeft (52) + : : +- * BroadcastNestedLoopJoin Inner BuildLeft (52) : : :- BroadcastExchange (43) : : : +- * HashAggregate (42) : : : +- Exchange (41) @@ -130,7 +130,7 @@ Input [2]: [d_date_sk#6, d_date#7] (6) Filter [codegen id : 1] Input [2]: [d_date_sk#6, d_date#7] -Condition : (((isnotnull(d_date#7) AND (d_date#7 >= 10442)) AND (d_date#7 <= 10472)) AND isnotnull(d_date_sk#6)) +Condition : (((isnotnull(d_date#7) AND (d_date#7 >= 1998-08-04)) AND (d_date#7 <= 1998-09-03)) AND isnotnull(d_date_sk#6)) (7) Project [codegen id : 1] Output [1]: [d_date_sk#6] @@ -341,17 +341,17 @@ Results [2]: [sum#59, sum#60] Input [2]: [sum#59, sum#60] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#61] -(51) HashAggregate [codegen id : 14] +(51) HashAggregate Input [2]: [sum#59, sum#60] Keys: [] Functions [2]: [sum(UnscaledValue(cr_return_amount#54)), sum(UnscaledValue(cr_net_loss#55))] Aggregate Attributes [2]: [sum(UnscaledValue(cr_return_amount#54))#62, sum(UnscaledValue(cr_net_loss#55))#63] Results [2]: [MakeDecimal(sum(UnscaledValue(cr_return_amount#54))#62,17,2) AS returns#64, MakeDecimal(sum(UnscaledValue(cr_net_loss#55))#63,17,2) AS profit_loss#65] -(52) BroadcastNestedLoopJoin +(52) BroadcastNestedLoopJoin [codegen id : 14] Join condition: None -(53) Project [codegen id : 15] +(53) Project [codegen id : 14] Output [5]: [catalog channel AS channel#66, cs_call_center_sk#40 AS id#67, sales#51, returns#64, CheckOverflow((promote_precision(cast(profit#52 as decimal(18,2))) - promote_precision(cast(profit_loss#65 as decimal(18,2)))), DecimalType(18,2), true) AS profit#68] Input [5]: [cs_call_center_sk#40, sales#51, profit#52, returns#64, profit_loss#65] @@ -363,22 +363,22 @@ PartitionFilters: [isnotnull(ws_sold_date_sk#72), dynamicpruningexpression(ws_so PushedFilters: [IsNotNull(ws_web_page_sk)] ReadSchema: struct -(55) ColumnarToRow [codegen id : 18] +(55) ColumnarToRow [codegen id : 17] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72] -(56) Filter [codegen id : 18] +(56) Filter [codegen id : 17] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72] Condition : isnotnull(ws_web_page_sk#69) (57) ReusedExchange [Reuses operator id: 8] Output [1]: [d_date_sk#6] -(58) BroadcastHashJoin [codegen id : 18] +(58) BroadcastHashJoin [codegen id : 17] Left keys [1]: [ws_sold_date_sk#72] Right keys [1]: [d_date_sk#6] Join condition: None -(59) Project [codegen id : 18] +(59) Project [codegen id : 17] Output [3]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71] Input [5]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, ws_sold_date_sk#72, d_date_sk#6] @@ -389,10 +389,10 @@ Location [not included in comparison]/{warehouse_dir}/web_page] PushedFilters: [IsNotNull(wp_web_page_sk)] ReadSchema: struct -(61) ColumnarToRow [codegen id : 17] +(61) ColumnarToRow [codegen id : 16] Input [1]: [wp_web_page_sk#73] -(62) Filter [codegen id : 17] +(62) Filter [codegen id : 16] Input [1]: [wp_web_page_sk#73] Condition : isnotnull(wp_web_page_sk#73) @@ -400,16 +400,16 @@ Condition : isnotnull(wp_web_page_sk#73) Input [1]: [wp_web_page_sk#73] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#74] -(64) BroadcastHashJoin [codegen id : 18] +(64) BroadcastHashJoin [codegen id : 17] Left keys [1]: [ws_web_page_sk#69] Right keys [1]: [wp_web_page_sk#73] Join condition: None -(65) Project [codegen id : 18] +(65) Project [codegen id : 17] Output [3]: [ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] Input [4]: [ws_web_page_sk#69, ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] -(66) HashAggregate [codegen id : 18] +(66) HashAggregate [codegen id : 17] Input [3]: [ws_ext_sales_price#70, ws_net_profit#71, wp_web_page_sk#73] Keys [1]: [wp_web_page_sk#73] Functions [2]: [partial_sum(UnscaledValue(ws_ext_sales_price#70)), partial_sum(UnscaledValue(ws_net_profit#71))] @@ -420,7 +420,7 @@ Results [3]: [wp_web_page_sk#73, sum#77, sum#78] Input [3]: [wp_web_page_sk#73, sum#77, sum#78] Arguments: hashpartitioning(wp_web_page_sk#73, 5), ENSURE_REQUIREMENTS, [id=#79] -(68) HashAggregate [codegen id : 23] +(68) HashAggregate [codegen id : 22] Input [3]: [wp_web_page_sk#73, sum#77, sum#78] Keys [1]: [wp_web_page_sk#73] Functions [2]: [sum(UnscaledValue(ws_ext_sales_price#70)), sum(UnscaledValue(ws_net_profit#71))] @@ -435,38 +435,38 @@ PartitionFilters: [isnotnull(wr_returned_date_sk#87), dynamicpruningexpression(w PushedFilters: [IsNotNull(wr_web_page_sk)] ReadSchema: struct -(70) ColumnarToRow [codegen id : 21] +(70) ColumnarToRow [codegen id : 20] Input [4]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87] -(71) Filter [codegen id : 21] +(71) Filter [codegen id : 20] Input [4]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87] Condition : isnotnull(wr_web_page_sk#84) (72) ReusedExchange [Reuses operator id: 8] Output [1]: [d_date_sk#6] -(73) BroadcastHashJoin [codegen id : 21] +(73) BroadcastHashJoin [codegen id : 20] Left keys [1]: [wr_returned_date_sk#87] Right keys [1]: [cast(d_date_sk#6 as bigint)] Join condition: None -(74) Project [codegen id : 21] +(74) Project [codegen id : 20] Output [3]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86] Input [5]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wr_returned_date_sk#87, d_date_sk#6] (75) ReusedExchange [Reuses operator id: 63] Output [1]: [wp_web_page_sk#88] -(76) BroadcastHashJoin [codegen id : 21] +(76) BroadcastHashJoin [codegen id : 20] Left keys [1]: [wr_web_page_sk#84] Right keys [1]: [cast(wp_web_page_sk#88 as bigint)] Join condition: None -(77) Project [codegen id : 21] +(77) Project [codegen id : 20] Output [3]: [wr_return_amt#85, wr_net_loss#86, wp_web_page_sk#88] Input [4]: [wr_web_page_sk#84, wr_return_amt#85, wr_net_loss#86, wp_web_page_sk#88] -(78) HashAggregate [codegen id : 21] +(78) HashAggregate [codegen id : 20] Input [3]: [wr_return_amt#85, wr_net_loss#86, wp_web_page_sk#88] Keys [1]: [wp_web_page_sk#88] Functions [2]: [partial_sum(UnscaledValue(wr_return_amt#85)), partial_sum(UnscaledValue(wr_net_loss#86))] @@ -477,7 +477,7 @@ Results [3]: [wp_web_page_sk#88, sum#91, sum#92] Input [3]: [wp_web_page_sk#88, sum#91, sum#92] Arguments: hashpartitioning(wp_web_page_sk#88, 5), ENSURE_REQUIREMENTS, [id=#93] -(80) HashAggregate [codegen id : 22] +(80) HashAggregate [codegen id : 21] Input [3]: [wp_web_page_sk#88, sum#91, sum#92] Keys [1]: [wp_web_page_sk#88] Functions [2]: [sum(UnscaledValue(wr_return_amt#85)), sum(UnscaledValue(wr_net_loss#86))] @@ -488,18 +488,18 @@ Results [3]: [wp_web_page_sk#88, MakeDecimal(sum(UnscaledValue(wr_return_amt#85) Input [3]: [wp_web_page_sk#88, returns#96, profit_loss#97] Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#98] -(82) BroadcastHashJoin [codegen id : 23] +(82) BroadcastHashJoin [codegen id : 22] Left keys [1]: [wp_web_page_sk#73] Right keys [1]: [wp_web_page_sk#88] Join condition: None -(83) Project [codegen id : 23] +(83) Project [codegen id : 22] Output [5]: [web channel AS channel#99, wp_web_page_sk#73 AS id#100, sales#82, coalesce(returns#96, 0.00) AS returns#101, CheckOverflow((promote_precision(cast(profit#83 as decimal(18,2))) - promote_precision(cast(coalesce(profit_loss#97, 0.00) as decimal(18,2)))), DecimalType(18,2), true) AS profit#102] Input [6]: [wp_web_page_sk#73, sales#82, profit#83, wp_web_page_sk#88, returns#96, profit_loss#97] (84) Union -(85) HashAggregate [codegen id : 24] +(85) HashAggregate [codegen id : 23] Input [5]: [channel#36, id#37, sales#18, returns#38, profit#39] Keys [2]: [channel#36, id#37] Functions [3]: [partial_sum(sales#18), partial_sum(returns#38), partial_sum(profit#39)] @@ -510,7 +510,7 @@ Results [8]: [channel#36, id#37, sum#109, isEmpty#110, sum#111, isEmpty#112, sum Input [8]: [channel#36, id#37, sum#109, isEmpty#110, sum#111, isEmpty#112, sum#113, isEmpty#114] Arguments: hashpartitioning(channel#36, id#37, 5), ENSURE_REQUIREMENTS, [id=#115] -(87) HashAggregate [codegen id : 25] +(87) HashAggregate [codegen id : 24] Input [8]: [channel#36, id#37, sum#109, isEmpty#110, sum#111, isEmpty#112, sum#113, isEmpty#114] Keys [2]: [channel#36, id#37] Functions [3]: [sum(sales#18), sum(returns#38), sum(profit#39)] @@ -520,14 +520,14 @@ Results [5]: [channel#36, id#37, cast(sum(sales#18)#116 as decimal(37,2)) AS sal (88) ReusedExchange [Reuses operator id: unknown] Output [8]: [channel#36, id#37, sum#122, isEmpty#123, sum#124, isEmpty#125, sum#126, isEmpty#127] -(89) HashAggregate [codegen id : 50] +(89) HashAggregate [codegen id : 48] Input [8]: [channel#36, id#37, sum#122, isEmpty#123, sum#124, isEmpty#125, sum#126, isEmpty#127] Keys [2]: [channel#36, id#37] Functions [3]: [sum(sales#18), sum(returns#38), sum(profit#128)] Aggregate Attributes [3]: [sum(sales#18)#129, sum(returns#38)#130, sum(profit#128)#131] Results [4]: [channel#36, sum(sales#18)#129 AS sales#132, sum(returns#38)#130 AS returns#133, sum(profit#128)#131 AS profit#134] -(90) HashAggregate [codegen id : 50] +(90) HashAggregate [codegen id : 48] Input [4]: [channel#36, sales#132, returns#133, profit#134] Keys [1]: [channel#36] Functions [3]: [partial_sum(sales#132), partial_sum(returns#133), partial_sum(profit#134)] @@ -538,7 +538,7 @@ Results [7]: [channel#36, sum#141, isEmpty#142, sum#143, isEmpty#144, sum#145, i Input [7]: [channel#36, sum#141, isEmpty#142, sum#143, isEmpty#144, sum#145, isEmpty#146] Arguments: hashpartitioning(channel#36, 5), ENSURE_REQUIREMENTS, [id=#147] -(92) HashAggregate [codegen id : 51] +(92) HashAggregate [codegen id : 49] Input [7]: [channel#36, sum#141, isEmpty#142, sum#143, isEmpty#144, sum#145, isEmpty#146] Keys [1]: [channel#36] Functions [3]: [sum(sales#132), sum(returns#133), sum(profit#134)] @@ -548,14 +548,14 @@ Results [5]: [channel#36, null AS id#151, sum(sales#132)#148 AS sales#152, sum(r (93) ReusedExchange [Reuses operator id: unknown] Output [8]: [channel#36, id#37, sum#155, isEmpty#156, sum#157, isEmpty#158, sum#159, isEmpty#160] -(94) HashAggregate [codegen id : 76] +(94) HashAggregate [codegen id : 73] Input [8]: [channel#36, id#37, sum#155, isEmpty#156, sum#157, isEmpty#158, sum#159, isEmpty#160] Keys [2]: [channel#36, id#37] Functions [3]: [sum(sales#18), sum(returns#38), sum(profit#161)] Aggregate Attributes [3]: [sum(sales#18)#162, sum(returns#38)#163, sum(profit#161)#164] Results [3]: [sum(sales#18)#162 AS sales#132, sum(returns#38)#163 AS returns#133, sum(profit#161)#164 AS profit#134] -(95) HashAggregate [codegen id : 76] +(95) HashAggregate [codegen id : 73] Input [3]: [sales#132, returns#133, profit#134] Keys: [] Functions [3]: [partial_sum(sales#132), partial_sum(returns#133), partial_sum(profit#134)] @@ -566,7 +566,7 @@ Results [6]: [sum#171, isEmpty#172, sum#173, isEmpty#174, sum#175, isEmpty#176] Input [6]: [sum#171, isEmpty#172, sum#173, isEmpty#174, sum#175, isEmpty#176] Arguments: SinglePartition, ENSURE_REQUIREMENTS, [id=#177] -(97) HashAggregate [codegen id : 77] +(97) HashAggregate [codegen id : 74] Input [6]: [sum#171, isEmpty#172, sum#173, isEmpty#174, sum#175, isEmpty#176] Keys: [] Functions [3]: [sum(sales#132), sum(returns#133), sum(profit#134)] @@ -575,7 +575,7 @@ Results [5]: [null AS channel#181, null AS id#182, sum(sales#132)#178 AS sales#1 (98) Union -(99) HashAggregate [codegen id : 78] +(99) HashAggregate [codegen id : 75] Input [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Keys [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Functions: [] @@ -586,7 +586,7 @@ Results [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Input [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Arguments: hashpartitioning(channel#36, id#37, sales#119, returns#120, profit#121, 5), ENSURE_REQUIREMENTS, [id=#186] -(101) HashAggregate [codegen id : 79] +(101) HashAggregate [codegen id : 76] Input [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Keys [5]: [channel#36, id#37, sales#119, returns#120, profit#121] Functions: [] diff --git a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a/simplified.txt b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a/simplified.txt index 6fe25de08906..56ea3c168621 100644 --- a/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a/simplified.txt +++ b/sql/core/src/test/resources/tpcds-plan-stability/approved-plans-v2_7/q77a/simplified.txt @@ -1,17 +1,17 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] - WholeStageCodegen (79) + WholeStageCodegen (76) HashAggregate [channel,id,sales,returns,profit] InputAdapter Exchange [channel,id,sales,returns,profit] #1 - WholeStageCodegen (78) + WholeStageCodegen (75) HashAggregate [channel,id,sales,returns,profit] InputAdapter Union - WholeStageCodegen (25) + WholeStageCodegen (24) HashAggregate [channel,id,sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter Exchange [channel,id] #2 - WholeStageCodegen (24) + WholeStageCodegen (23) HashAggregate [channel,id,sales,returns,profit] [sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter Union @@ -70,10 +70,10 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedExchange [d_date_sk] #4 InputAdapter ReusedExchange [s_store_sk] #5 - WholeStageCodegen (15) + WholeStageCodegen (14) Project [cs_call_center_sk,sales,returns,profit,profit_loss] - InputAdapter - BroadcastNestedLoopJoin + BroadcastNestedLoopJoin + InputAdapter BroadcastExchange #8 WholeStageCodegen (11) HashAggregate [cs_call_center_sk,sum,sum] [sum(UnscaledValue(cs_ext_sales_price)),sum(UnscaledValue(cs_net_profit)),sales,profit,sum,sum] @@ -89,27 +89,26 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedSubquery [d_date_sk] #1 InputAdapter ReusedExchange [d_date_sk] #4 - WholeStageCodegen (14) - HashAggregate [sum,sum] [sum(UnscaledValue(cr_return_amount)),sum(UnscaledValue(cr_net_loss)),returns,profit_loss,sum,sum] - InputAdapter - Exchange #10 - WholeStageCodegen (13) - HashAggregate [cr_return_amount,cr_net_loss] [sum,sum,sum,sum] - Project [cr_return_amount,cr_net_loss] - BroadcastHashJoin [cr_returned_date_sk,d_date_sk] - ColumnarToRow - InputAdapter - Scan parquet default.catalog_returns [cr_return_amount,cr_net_loss,cr_returned_date_sk] - ReusedSubquery [d_date_sk] #1 - InputAdapter - ReusedExchange [d_date_sk] #4 - WholeStageCodegen (23) + HashAggregate [sum,sum] [sum(UnscaledValue(cr_return_amount)),sum(UnscaledValue(cr_net_loss)),returns,profit_loss,sum,sum] + InputAdapter + Exchange #10 + WholeStageCodegen (13) + HashAggregate [cr_return_amount,cr_net_loss] [sum,sum,sum,sum] + Project [cr_return_amount,cr_net_loss] + BroadcastHashJoin [cr_returned_date_sk,d_date_sk] + ColumnarToRow + InputAdapter + Scan parquet default.catalog_returns [cr_return_amount,cr_net_loss,cr_returned_date_sk] + ReusedSubquery [d_date_sk] #1 + InputAdapter + ReusedExchange [d_date_sk] #4 + WholeStageCodegen (22) Project [wp_web_page_sk,sales,returns,profit,profit_loss] BroadcastHashJoin [wp_web_page_sk,wp_web_page_sk] HashAggregate [wp_web_page_sk,sum,sum] [sum(UnscaledValue(ws_ext_sales_price)),sum(UnscaledValue(ws_net_profit)),sales,profit,sum,sum] InputAdapter Exchange [wp_web_page_sk] #11 - WholeStageCodegen (18) + WholeStageCodegen (17) HashAggregate [wp_web_page_sk,ws_ext_sales_price,ws_net_profit] [sum,sum,sum,sum] Project [ws_ext_sales_price,ws_net_profit,wp_web_page_sk] BroadcastHashJoin [ws_web_page_sk,wp_web_page_sk] @@ -124,18 +123,18 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedExchange [d_date_sk] #4 InputAdapter BroadcastExchange #12 - WholeStageCodegen (17) + WholeStageCodegen (16) Filter [wp_web_page_sk] ColumnarToRow InputAdapter Scan parquet default.web_page [wp_web_page_sk] InputAdapter BroadcastExchange #13 - WholeStageCodegen (22) + WholeStageCodegen (21) HashAggregate [wp_web_page_sk,sum,sum] [sum(UnscaledValue(wr_return_amt)),sum(UnscaledValue(wr_net_loss)),returns,profit_loss,sum,sum] InputAdapter Exchange [wp_web_page_sk] #14 - WholeStageCodegen (21) + WholeStageCodegen (20) HashAggregate [wp_web_page_sk,wr_return_amt,wr_net_loss] [sum,sum,sum,sum] Project [wr_return_amt,wr_net_loss,wp_web_page_sk] BroadcastHashJoin [wr_web_page_sk,wp_web_page_sk] @@ -150,20 +149,20 @@ TakeOrderedAndProject [channel,id,sales,returns,profit] ReusedExchange [d_date_sk] #4 InputAdapter ReusedExchange [wp_web_page_sk] #12 - WholeStageCodegen (51) + WholeStageCodegen (49) HashAggregate [channel,sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),id,sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter Exchange [channel] #15 - WholeStageCodegen (50) + WholeStageCodegen (48) HashAggregate [channel,sales,returns,profit] [sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty] HashAggregate [channel,id,sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter ReusedExchange [channel,id,sum,isEmpty,sum,isEmpty,sum,isEmpty] #16 - WholeStageCodegen (77) + WholeStageCodegen (74) HashAggregate [sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),channel,id,sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter Exchange #17 - WholeStageCodegen (76) + WholeStageCodegen (73) HashAggregate [sales,returns,profit] [sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty,sum,isEmpty] HashAggregate [channel,id,sum,isEmpty,sum,isEmpty,sum,isEmpty] [sum(sales),sum(returns),sum(profit),sales,returns,profit,sum,isEmpty,sum,isEmpty,sum,isEmpty] InputAdapter diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSuite.scala index c073df2017a5..00a517e27d2e 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSuite.scala @@ -22,7 +22,7 @@ import org.apache.spark.sql.catalyst.expressions.codegen.{ByteCodeStats, CodeAnd import org.apache.spark.sql.execution.adaptive.DisableAdaptiveExecutionSuite import org.apache.spark.sql.execution.aggregate.HashAggregateExec import org.apache.spark.sql.execution.columnar.InMemoryTableScanExec -import org.apache.spark.sql.execution.joins.{BroadcastHashJoinExec, ShuffledHashJoinExec, SortMergeJoinExec} +import org.apache.spark.sql.execution.joins.{BroadcastHashJoinExec, BroadcastNestedLoopJoinExec, ShuffledHashJoinExec, SortMergeJoinExec} import org.apache.spark.sql.functions._ import org.apache.spark.sql.internal.SQLConf import org.apache.spark.sql.test.SharedSparkSession @@ -92,6 +92,46 @@ class WholeStageCodegenSuite extends QueryTest with SharedSparkSession Seq(Row(0, 0, 0), Row(1, 1, 1), Row(2, 2, 2), Row(3, 3, 3), Row(4, 4, 4))) } + test("Inner/Cross BroadcastNestedLoopJoinExec should be included in WholeStageCodegen") { + val df1 = spark.range(4).select($"id".as("k1")) + val df2 = spark.range(3).select($"id".as("k2")) + val df3 = spark.range(2).select($"id".as("k3")) + + Seq(true, false).foreach { codegenEnabled => + withSQLConf(SQLConf.WHOLESTAGE_CODEGEN_ENABLED.key -> codegenEnabled.toString) { + // test broadcast nested loop join without condition + val oneJoinDF = df1.join(df2) + var hasJoinInCodegen = oneJoinDF.queryExecution.executedPlan.collect { + case WholeStageCodegenExec(_ : BroadcastNestedLoopJoinExec) => true + }.size === 1 + assert(hasJoinInCodegen == codegenEnabled) + checkAnswer(oneJoinDF, + Seq(Row(0, 0), Row(0, 1), Row(0, 2), Row(1, 0), Row(1, 1), Row(1, 2), + Row(2, 0), Row(2, 1), Row(2, 2), Row(3, 0), Row(3, 1), Row(3, 2))) + + // test broadcast nested loop join with condition + val oneJoinDFWithCondition = df1.join(df2, $"k1" + 1 =!= $"k2") + hasJoinInCodegen = oneJoinDFWithCondition.queryExecution.executedPlan.collect { + case WholeStageCodegenExec(_ : BroadcastNestedLoopJoinExec) => true + }.size === 1 + assert(hasJoinInCodegen == codegenEnabled) + checkAnswer(oneJoinDFWithCondition, + Seq(Row(0, 0), Row(0, 2), Row(1, 0), Row(1, 1), Row(2, 0), Row(2, 1), + Row(2, 2), Row(3, 0), Row(3, 1), Row(3, 2))) + + // test two broadcast nested loop joins + val twoJoinsDF = df1.join(df2, $"k1" < $"k2").crossJoin(df3) + hasJoinInCodegen = twoJoinsDF.queryExecution.executedPlan.collect { + case WholeStageCodegenExec(BroadcastNestedLoopJoinExec( + _: BroadcastNestedLoopJoinExec, _, _, _, _)) => true + }.size === 1 + assert(hasJoinInCodegen == codegenEnabled) + checkAnswer(twoJoinsDF, + Seq(Row(0, 1, 0), Row(0, 2, 0), Row(1, 2, 0), Row(0, 1, 1), Row(0, 2, 1), Row(1, 2, 1))) + } + } + } + test("Sort should be included in WholeStageCodegen") { val df = spark.range(3, 0, -1).toDF().sort(col("id")) val plan = df.queryExecution.executedPlan diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/benchmark/JoinBenchmark.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/benchmark/JoinBenchmark.scala index 1cc92892fe12..e7d662eaecd2 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/benchmark/JoinBenchmark.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/benchmark/JoinBenchmark.scala @@ -166,6 +166,19 @@ object JoinBenchmark extends SqlBasedBenchmark { } } + def broadcastNestedLoopJoin(): Unit = { + val N = 20 << 20 + val M = 1 << 4 + + val dim = broadcast(spark.range(M).selectExpr("id as k", "cast(id as string) as v")) + codegenBenchmark("broadcast nested loop join", N) { + val df = spark.range(N).join(dim) + assert(df.queryExecution.sparkPlan.find( + _.isInstanceOf[BroadcastNestedLoopJoinExec]).isDefined) + df.noop() + } + } + override def runBenchmarkSuite(mainArgs: Array[String]): Unit = { runBenchmark("Join Benchmark") { broadcastHashJoinLongKey() @@ -178,6 +191,7 @@ object JoinBenchmark extends SqlBasedBenchmark { sortMergeJoin() sortMergeJoinWithDuplicates() shuffleHashJoin() + broadcastNestedLoopJoin() } } }