Repository: spark
Updated Branches:
refs/heads/master 1fdfe6935 -> 9c5935d00
[SPARK-22141][SQL] Propagate empty relation before checking Cartesian products
## What changes were proposed in this pull request?
When inferring constraints from children, Join's condition can be simplified as
None.
For example,
```
val testRelation = LocalRelation('a.int)
val x = testRelation.as("x")
val y = testRelation.where($"a" === 2 && !($"a" === 2)).as("y")
x.join.where($"x.a" === $"y.a")
```
The plan will become
```
Join Inner
:- LocalRelation <empty>, [a#23]
+- LocalRelation <empty>, [a#224]
```
And the Cartesian products check will throw exception for above plan.
Propagate empty relation before checking Cartesian products, and the issue is
resolved.
## How was this patch tested?
Unit test
Author: Wang Gengliang <[email protected]>
Closes #19362 from gengliangwang/MoveCheckCartesianProducts.
Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/9c5935d0
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/9c5935d0
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/9c5935d0
Branch: refs/heads/master
Commit: 9c5935d00b54ed2f029a214ffc64f69cfa854e69
Parents: 1fdfe69
Author: Wang Gengliang <[email protected]>
Authored: Wed Sep 27 12:44:10 2017 +0200
Committer: Herman van Hovell <[email protected]>
Committed: Wed Sep 27 12:44:10 2017 +0200
----------------------------------------------------------------------
.../org/apache/spark/sql/catalyst/optimizer/Optimizer.scala | 4 ++--
sql/core/src/test/scala/org/apache/spark/sql/JoinSuite.scala | 8 ++++++++
2 files changed, 10 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/spark/blob/9c5935d0/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala
----------------------------------------------------------------------
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 a602894..a391c51 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
@@ -124,8 +124,6 @@ abstract class Optimizer(sessionCatalog: SessionCatalog)
SimplifyCreateMapOps,
CombineConcats) ++
extendedOperatorOptimizationRules: _*) ::
- Batch("Check Cartesian Products", Once,
- CheckCartesianProducts) ::
Batch("Join Reorder", Once,
CostBasedJoinReorder) ::
Batch("Decimal Optimizations", fixedPoint,
@@ -136,6 +134,8 @@ abstract class Optimizer(sessionCatalog: SessionCatalog)
Batch("LocalRelation", fixedPoint,
ConvertToLocalRelation,
PropagateEmptyRelation) ::
+ Batch("Check Cartesian Products", Once,
+ CheckCartesianProducts) ::
Batch("OptimizeCodegen", Once,
OptimizeCodegen) ::
Batch("RewriteSubquery", Once,
http://git-wip-us.apache.org/repos/asf/spark/blob/9c5935d0/sql/core/src/test/scala/org/apache/spark/sql/JoinSuite.scala
----------------------------------------------------------------------
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/JoinSuite.scala
b/sql/core/src/test/scala/org/apache/spark/sql/JoinSuite.scala
index 9d50e8b..226cc30 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/JoinSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/JoinSuite.scala
@@ -200,6 +200,14 @@ class JoinSuite extends QueryTest with SharedSQLContext {
Nil)
}
+ test("SPARK-22141: Propagate empty relation before checking Cartesian
products") {
+ Seq("inner", "left", "right", "left_outer", "right_outer",
"full_outer").foreach { joinType =>
+ val x = testData2.where($"a" === 2 && !($"a" === 2)).as("x")
+ val y = testData2.where($"a" === 1 && !($"a" === 1)).as("y")
+ checkAnswer(x.join(y, Seq.empty, joinType), Nil)
+ }
+ }
+
test("big inner join, 4 matches per row") {
val bigData = testData.union(testData).union(testData).union(testData)
val bigDataX = bigData.as("x")
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]