From f4f979bcc3ad588455b74970c193d6fd6f21e7ea Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Tue, 15 Dec 2020 10:39:02 +0300 Subject: [PATCH] wip --- src/backend/distributed/planner/query_pushdown_planning.c | 3 ++- src/backend/distributed/planner/recursive_planning.c | 3 +-- src/include/distributed/recursive_planning.h | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/planner/query_pushdown_planning.c b/src/backend/distributed/planner/query_pushdown_planning.c index 07bb8a9b2..62d0843fd 100644 --- a/src/backend/distributed/planner/query_pushdown_planning.c +++ b/src/backend/distributed/planner/query_pushdown_planning.c @@ -934,7 +934,8 @@ DeferErrorIfCannotPushdownSubquery(Query *subqueryTree, bool outerMostQueryHasLi * push down SQL features within such a function, as long as co-located join * checks are applied. */ - if (!contain_vars_of_level((Node *) subqueryTree, 1)) +#include "distributed/recursive_planning.h" + if (!ContainsReferencesToOuterQuery(subqueryTree)) { if (subqueryTree->limitOffset) { diff --git a/src/backend/distributed/planner/recursive_planning.c b/src/backend/distributed/planner/recursive_planning.c index c6dce836e..de852b06d 100644 --- a/src/backend/distributed/planner/recursive_planning.c +++ b/src/backend/distributed/planner/recursive_planning.c @@ -171,7 +171,6 @@ static void RecursivelyPlanSubquery(Query *subquery, static DistributedSubPlan * CreateDistributedSubPlan(uint32 subPlanId, Query *subPlanQuery); static bool CteReferenceListWalker(Node *node, CteReferenceWalkerContext *context); -static bool ContainsReferencesToOuterQuery(Query *query); static bool ContainsReferencesToOuterQueryWalker(Node *node, VarLevelsUpWalkerContext *context); static bool NodeContainsSubqueryReferencingOuterQuery(Node *node); @@ -1238,7 +1237,7 @@ CteReferenceListWalker(Node *node, CteReferenceWalkerContext *context) * anything that points outside of the query itself. Such queries cannot be * planned recursively. */ -static bool +bool ContainsReferencesToOuterQuery(Query *query) { VarLevelsUpWalkerContext context = { 0 }; diff --git a/src/include/distributed/recursive_planning.h b/src/include/distributed/recursive_planning.h index e1017bd70..54007da79 100644 --- a/src/include/distributed/recursive_planning.h +++ b/src/include/distributed/recursive_planning.h @@ -22,6 +22,8 @@ #include "nodes/relation.h" #endif +extern bool ContainsReferencesToOuterQuery(Query *query); + extern List * GenerateSubplansForSubqueriesAndCTEs(uint64 planId, Query *originalQuery, PlannerRestrictionContext * plannerRestrictionContext);