-
- Downloads
[SPARK-18609][SPARK-18841][SQL][BACKPORT-2.1] Fix redundant Alias removal in the optimizer
This is a backport of https://github.com/apache/spark/commit/73ee73945e369a862480ef4ac64e55c797bd7d90 ## What changes were proposed in this pull request? The optimizer tries to remove redundant alias only projections from the query plan using the `RemoveAliasOnlyProject` rule. The current rule identifies removes such a project and rewrites the project's attributes in the **entire** tree. This causes problems when parts of the tree are duplicated (for instance a self join on a temporary view/CTE) and the duplicated part contains the alias only project, in this case the rewrite will break the tree. This PR fixes these problems by using a blacklist for attributes that are not to be moved, and by making sure that attribute remapping is only done for the parent tree, and not for unrelated parts of the query plan. The current tree transformation infrastructure works very well if the transformation at hand requires little or a global contextual information. In this case we need to know both the attributes that were not to be moved, and we also needed to know which child attributes were modified. This cannot be done easily using the current infrastructure, and solutions typically involves transversing the query plan multiple times (which is super slow). I have moved around some code in `TreeNode`, `QueryPlan` and `LogicalPlan`to make this much more straightforward; this basically allows you to manually traverse the tree. ## How was this patch tested? I have added unit tests to `RemoveRedundantAliasAndProjectSuite` and I have added integration tests to the `SQLQueryTestSuite.union` and `SQLQueryTestSuite.cte` test cases. Author: Herman van Hovell <hvanhovell@databricks.com> Closes #16843 from hvanhovell/SPARK-18609-2.1.
Showing
- sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala 84 additions, 41 deletions...a/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala
- sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala 13 additions, 29 deletions...scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala
- sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/LogicalPlan.scala 1 addition, 1 deletion...apache/spark/sql/catalyst/plans/logical/LogicalPlan.scala
- sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/trees/TreeNode.scala 11 additions, 35 deletions.../scala/org/apache/spark/sql/catalyst/trees/TreeNode.scala
- sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/RemoveRedundantAliasAndProjectSuite.scala 47 additions, 5 deletions...alyst/optimizer/RemoveRedundantAliasAndProjectSuite.scala
- sql/core/src/test/resources/sql-tests/inputs/cte.sql 15 additions, 0 deletionssql/core/src/test/resources/sql-tests/inputs/cte.sql
- sql/core/src/test/resources/sql-tests/inputs/union.sql 16 additions, 0 deletionssql/core/src/test/resources/sql-tests/inputs/union.sql
- sql/core/src/test/resources/sql-tests/results/cte.sql.out 48 additions, 1 deletionsql/core/src/test/resources/sql-tests/results/cte.sql.out
- sql/core/src/test/resources/sql-tests/results/union.sql.out 67 additions, 3 deletionssql/core/src/test/resources/sql-tests/results/union.sql.out
Loading
Please register or sign in to comment