Merge pull request #1297 from citusdata/subquery_use_original_query

Subquery pushdown planner uses original query
pull/1298/head
Önder Kalacı 2017-04-11 14:25:11 +03:00 committed by GitHub
commit 723e9a1a7f
5 changed files with 22 additions and 12 deletions

View File

@ -104,28 +104,35 @@ static MultiNode * ApplyCartesianProduct(MultiNode *leftNode, MultiNode *rightNo
* Local functions forward declarations for subquery pushdown. Note that these
* functions will be removed with upcoming subqery changes.
*/
static MultiNode * SubqueryPushdownMultiPlanTree(Query *queryTree,
List *subqueryEntryList);
static MultiNode * SubqueryPushdownMultiPlanTree(Query *queryTree);
static void ErrorIfSubqueryJoin(Query *queryTree);
static MultiTable * MultiSubqueryPushdownTable(RangeTblEntry *subqueryRangeTableEntry);
/*
* MultiLogicalPlanCreate takes in a parsed query tree, uses helper functions to
* create logical plan and adds a root node to top of it.
* MultiLogicalPlanCreate takes in both the original query and its corresponding modified
* query tree yield by the standard planner. It uses helper functions to create logical
* plan and adds a root node to top of it. The original query is only used for subquery
* pushdown planning.
*/
MultiTreeRoot *
MultiLogicalPlanCreate(Query *queryTree)
MultiLogicalPlanCreate(Query *originalQuery, Query *queryTree)
{
MultiNode *multiQueryNode = NULL;
MultiTreeRoot *rootNode = NULL;
List *subqueryEntryList = NULL;
List *subqueryEntryList = SubqueryEntryList(queryTree);
/*
* We check the existence of subqueries in the modified query given that
* if postgres already flattened the subqueries, MultiPlanTree() can plan
* corresponding distributed plan.
*/
subqueryEntryList = SubqueryEntryList(queryTree);
if (subqueryEntryList != NIL)
{
if (SubqueryPushdown)
{
multiQueryNode = SubqueryPushdownMultiPlanTree(queryTree, subqueryEntryList);
multiQueryNode = SubqueryPushdownMultiPlanTree(originalQuery);
}
else
{
@ -1982,7 +1989,7 @@ ApplyCartesianProduct(MultiNode *leftNode, MultiNode *rightNode,
* from other parts of code although it causes some code duplication.
*/
static MultiNode *
SubqueryPushdownMultiPlanTree(Query *queryTree, List *subqueryEntryList)
SubqueryPushdownMultiPlanTree(Query *queryTree)
{
List *targetEntryList = queryTree->targetList;
List *qualifierList = NIL;
@ -1997,6 +2004,7 @@ SubqueryPushdownMultiPlanTree(Query *queryTree, List *subqueryEntryList)
MultiExtendedOp *extendedOpNode = NULL;
MultiNode *currentTopNode = NULL;
RangeTblEntry *subqueryRangeTableEntry = NULL;
List *subqueryEntryList = SubqueryEntryList(queryTree);
/* verify we can perform distributed planning on this query */
ErrorIfQueryNotSupported(queryTree);

View File

@ -295,7 +295,7 @@ CreateDistributedPlan(PlannedStmt *localPlan, Query *originalQuery, Query *query
if ((!distributedPlan || distributedPlan->planningError) && !hasUnresolvedParams)
{
/* Create and optimize logical plan */
MultiTreeRoot *logicalPlan = MultiLogicalPlanCreate(query);
MultiTreeRoot *logicalPlan = MultiLogicalPlanCreate(originalQuery, query);
MultiLogicalPlanOptimize(logicalPlan, plannerRestrictionContext);
/*

View File

@ -180,7 +180,7 @@ extern bool SubqueryPushdown;
/* Function declarations for building logical plans */
extern MultiTreeRoot * MultiLogicalPlanCreate(Query *queryTree);
extern MultiTreeRoot * MultiLogicalPlanCreate(Query *originalQuery, Query *queryTree);
extern bool NeedsDistributedPlanning(Query *queryTree);
extern MultiNode * ParentNode(MultiNode *multiNode);
extern MultiNode * ChildNode(MultiUnaryNode *multiNode);

View File

@ -178,7 +178,8 @@ SELECT count(*) FROM
(SELECT l_orderkey FROM lineitem_subquery) UNION ALL
(SELECT 1::bigint)
) b;
ERROR: could not run distributed query with complex table expressions
ERROR: cannot push down this subquery
DETAIL: Union All clauses are currently unsupported
---
-- TEMPORARLY DISABLE UNIONS WITHOUT JOINS
---

View File

@ -178,7 +178,8 @@ SELECT count(*) FROM
(SELECT l_orderkey FROM lineitem_subquery) UNION ALL
(SELECT 1::bigint)
) b;
ERROR: could not run distributed query with complex table expressions
ERROR: cannot push down this subquery
DETAIL: Union All clauses are currently unsupported
---
-- TEMPORARLY DISABLE UNIONS WITHOUT JOINS
---