mirror of https://github.com/citusdata/citus.git
Subquery pushdown planner uses original query
With this commit, we change the input to the logical planner for subquery pushdown. Before this commit, the planner was relying on the query tree that is transformed by the postgresql planner. After this commit, the planner uses the original query. The main motivation behind this change is the simplify deparsing of subqueries.pull/1347/head
parent
6f381443a9
commit
a3cadbb1e1
|
@ -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);
|
||||
|
|
|
@ -311,7 +311,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);
|
||||
|
||||
/*
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -177,7 +177,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
|
||||
---
|
||||
|
|
|
@ -177,7 +177,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
|
||||
---
|
||||
|
|
Loading…
Reference in New Issue