From fd60d4fa6c516496a60d6979edd1b4630bf721bd Mon Sep 17 00:00:00 2001 From: Xingbo Jiang Date: Tue, 5 Sep 2017 13:12:39 -0700 Subject: [PATCH] [SPARK-21652][SQL] Fix rule confliction between InferFiltersFromConstraints and ConstantPropagation ## What changes were proposed in this pull request? For the given example below, the predicate added by `InferFiltersFromConstraints` is folded by `ConstantPropagation` later, this leads to unconverged optimize iteration: ``` Seq((1, 1)).toDF("col1", "col2").createOrReplaceTempView("t1") Seq(1, 2).toDF("col").createOrReplaceTempView("t2") sql("SELECT * FROM t1, t2 WHERE t1.col1 = 1 AND 1 = t1.col2 AND t1.col1 = t2.col AND t1.col2 = t2.col") ``` We can fix this by adjusting the indent of the optimize rules. ## How was this patch tested? Add test case that would have failed in `SQLQuerySuite`. Author: Xingbo Jiang Closes #19099 from jiangxb1987/unconverge-optimization. --- .../spark/sql/catalyst/optimizer/Optimizer.scala | 3 ++- .../scala/org/apache/spark/sql/SQLQuerySuite.scala | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala index b73f70a351..d7e5906f67 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala @@ -79,11 +79,12 @@ abstract class Optimizer(sessionCatalog: SessionCatalog) PushProjectionThroughUnion, ReorderJoin, EliminateOuterJoin, + InferFiltersFromConstraints, + BooleanSimplification, PushPredicateThroughJoin, PushDownPredicate, LimitPushDown, ColumnPruning, - InferFiltersFromConstraints, // Operator combine CollapseRepartition, CollapseProject, diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala index 923c6d8eb7..93a7777b70 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala @@ -2663,4 +2663,18 @@ class SQLQuerySuite extends QueryTest with SharedSQLContext { // In unit test, Spark will fail the query if memory leak detected. spark.range(100).groupBy("id").count().limit(1).collect() } + + test("SPARK-21652: rule confliction of InferFiltersFromConstraints and ConstantPropagation") { + withTempView("t1", "t2") { + Seq((1, 1)).toDF("col1", "col2").createOrReplaceTempView("t1") + Seq(1, 2).toDF("col").createOrReplaceTempView("t2") + val df = sql( + """ + |SELECT * + |FROM t1, t2 + |WHERE t1.col1 = 1 AND 1 = t1.col2 AND t1.col1 = t2.col AND t1.col2 = t2.col + """.stripMargin) + checkAnswer(df, Row(1, 1, 1)) + } + } }