GitHub user nsyca opened a pull request:
https://github.com/apache/spark/pull/17520
[WIP][SPARK-19712][SQL] Move PullupCorrelatedPredicates and
RewritePredicateSubquery after OptimizeSubqueries
## What changes were proposed in this pull request?
This commit moves two rules right next to the rule OptimizeSubqueries.
1. PullupCorrelatedPredicates: the rewrite of [Not] Exists and [Not] In
(ListQuery) to PredicateSubquery
2. RewritePredicateSubquery: the rewrite of PredicateSubquery to
LeftSemi/LeftAnti
With this change, [Not] Exists/In subquery is now rewritten to
LeftSemi/LeftAnti at the beginning of Optimizer.
By moving rule PullupCorrelatedPredicates after rule OptimizerSubqueries,
all the rules from the nested call to the entire Optimizer on the plans in
subqueries will need to deal with (1) the correlated columns wrapped with
OuterReference, and (2) the SubqueryExpression.
We will block any push down of both types of expressions for the following
reasons:
1. We do not want to push any correlated expressions further down the plan
tree. Deep correlation is not yet supported in Spark, and, even when supported,
deep correlation is more difficult to be unnested to a join.
2. We do not want to push any correlated subquery down because the
correlated columns' ExprIds in the subquery may need to remap to different
ExprIds from the plan below the current Filter that hosts the subquery.
One side effect is we used to push down Exists/In subquery as if it is a
predicate in rule PushDownPredicate and rule PushPredicateThroughJoin. Now
Exists/In subquery is rewritten to LeftSemi/LeftAnti, we need to handle the
push down of LeftSemi/LeftAnti instead. This will be done in a followup commit.
Another Todo is to merge the two-stage rewrite in rule
PullupCorrelatedPredicates and rule RewritePredicateSubquery into a single
stage rewrite rule.
## How was this patch tested?
Unit tests with test cases in SQLQueryTestSuite under the directory
./sql/core/src/test/resources/sql-tests/inputs/subquery.
You can merge this pull request into a Git repository by running:
$ git pull https://github.com/nsyca/spark 19712-1
Alternatively you can review and apply these changes as the patch at:
https://github.com/apache/spark/pull/17520.patch
To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:
This closes #17520
----
commit b98865127a39bde885f9b1680cfe608629d59d51
Author: Nattavut Sutyanyong <[email protected]>
Date: 2016-07-29T21:43:56Z
[SPARK-16804][SQL] Correlated subqueries containing LIMIT return incorrect
results
## What changes were proposed in this pull request?
This patch fixes the incorrect results in the rule ResolveSubquery in
Catalyst's Analysis phase.
## How was this patch tested?
./dev/run-tests
a new unit test on the problematic pattern.
commit 069ed8f8e5f14dca7a15701945d42fc27fe82f3c
Author: Nattavut Sutyanyong <[email protected]>
Date: 2016-07-29T21:50:02Z
[SPARK-16804][SQL] Correlated subqueries containing LIMIT return incorrect
results
## What changes were proposed in this pull request?
This patch fixes the incorrect results in the rule ResolveSubquery in
Catalyst's Analysis phase.
## How was this patch tested?
./dev/run-tests
a new unit test on the problematic pattern.
commit edca333c081e6d4e53a91b496fba4a3ef4ee89ac
Author: Nattavut Sutyanyong <[email protected]>
Date: 2016-07-30T00:28:15Z
New positive test cases
commit 64184fdb77c1a305bb2932e82582da28bb4c0e53
Author: Nattavut Sutyanyong <[email protected]>
Date: 2016-08-01T13:20:09Z
Fix unit test case failure
commit 29f82b05c9e40e7934397257c674b260a8e8a996
Author: Nattavut Sutyanyong <[email protected]>
Date: 2016-08-05T17:42:01Z
blocking TABLESAMPLE
commit ac43ab47907a1ccd6d22f920415fbb4de93d4720
Author: Nattavut Sutyanyong <[email protected]>
Date: 2016-08-05T21:10:19Z
Fixing code styling
commit 631d396031e8bf627eb1f4872a4d3a17c144536c
Author: Nattavut Sutyanyong <[email protected]>
Date: 2016-08-07T18:39:44Z
Correcting Scala test style
commit 7eb9b2dbba3633a1958e38e0019e3ce816300514
Author: Nattavut Sutyanyong <[email protected]>
Date: 2016-08-08T02:31:09Z
One (last) attempt to correct the Scala style tests
commit 1387cf51541408ac20048064fa5e559836af932c
Author: Nattavut Sutyanyong <[email protected]>
Date: 2016-08-12T20:11:50Z
Merge remote-tracking branch 'upstream/master'
commit 648afac8d35f557ca48d19b93956a9e0fbc6ea6e
Author: Nattavut Sutyanyong <[email protected]>
Date: 2017-03-14T14:12:59Z
Merge remote-tracking branch 'upstream/master'
commit dfd476da6a9a75a36c0c01d1b6188610f213133e
Author: Nattavut Sutyanyong <[email protected]>
Date: 2017-03-16T14:16:01Z
Merge remote-tracking branch 'upstream/master'
commit 9e1c18c9551bb5c74f7bb6c0e13a75dafe0fb859
Author: Nattavut Sutyanyong <[email protected]>
Date: 2017-03-20T14:49:38Z
Merge remote-tracking branch 'upstream/master'
commit bc4fe9326e3c33954d223746ec36fb990fb8d994
Author: Nattavut Sutyanyong <[email protected]>
Date: 2017-03-22T23:10:17Z
Move PullupCorrelatedPredicates and RewritePredicateSubquery after
OptimizeSubqueries
This commit moves two rules right next to the rule OptimizeSubqueries.
1. PullupCorrelatedPredicates:
the rewrite of [Not] Exists and [Not] In (ListQuery) to
PredicateSubquery
2. RewritePredicateSubquery:
the rewrite of PredicateSubquery to LeftSemi/LeftAnti
With this change, [Not] Exists/In subquery is now rewritten to
LeftSemi/LeftAnti
at the beginning of Optimizer.
By moving rule PullupCorrelatedPredicates after rule OptimizerSubqueries,
all
the rules from the nested call to the entire Optimizer on the plans in
subqueries
will need to deal with (1). the correlated columns wrapped with
OuterReference,
and (2) the SubqueryExpression.
We will block any push down of both types of expressions for the following
reasons:
1. We do not want to push any correlated expressions further down the plan
tree.
Deep correlation is not yet supported in Spark, and, even when supported,
deep correlation is more difficult to be unnested to a join.
2. We do not want to push any correlated subquery down because the
correlated
columns' ExprIds in the subquery may need to remap to different ExprIds
from
the plan below the current Filter that hosts the subquery.
Another side effect is we used to push down Exists/In subquery as if it is a
predicate in rule PushDownPredicate and rule PushPredicateThroughJoin. Now
Exists/In subquery is rewritten to LeftSemi/LeftAnti, we need to handle
the push down of LeftSemi/LeftAnti instead. This will be done in a followup
commit.
Another Todo is to merge the two-stage rewrite in rule
PullupCorrelatedPredicates
and rule RewritePredicateSubquery into a single stage rewrite.
commit dc3aa7e3dc51f01f1f322306eccb32d17a1de26e
Author: Nattavut Sutyanyong <[email protected]>
Date: 2017-04-03T15:50:45Z
Merge remote-tracking branch 'upstream/master'
commit 380d5d735401eb32d40fc8c3fd22d5d3f13a25de
Author: Nattavut Sutyanyong <[email protected]>
Date: 2017-04-03T15:51:35Z
Merge branch 'master' into phase2-1-clean
----
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]