diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index d52ebd0ea1998be2725df9984710039931fdf3f7..b52eebe2aac590dee553784a15114a61cf839853 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -41,7 +41,6 @@ #include "parser/parse_oper.h" #include "parser/parsetree.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" #include "utils/syscache.h" @@ -742,52 +741,19 @@ inheritance_planner(PlannerInfo *root) List *rowMarks; List *tlist; PlannerInfo subroot; - MemoryContext childcxt; ListCell *l; - /* - * Memory management here is a bit messy, because the planning process can - * scribble on both the query parsetree and the rangetable. We need to - * ensure that each call of grouping_planner gets an un-scribbled-on copy - * to start with, so we start by copying the given query tree each time - * (as a byproduct of adjust_appendrel_attrs). However, we also want to - * make sure that the modified rangetable ultimately gets propagated back - * to the master copy, to pick up any changes of the Query structures - * inside subquery RTEs. We do that by copying back the rangetable from - * the first successful child planning step. (We are effectively assuming - * that sub-Queries will get planned identically each time, or at least - * that the impacts on their rangetables will be the same each time.) - * - * Another consideration is that when there are a lot of child tables, we - * can eat a lot of memory this way. To fix that, we create a child - * memory context that can be reset between steps to recover memory, at - * the cost of having to copy the completed plan trees out to the parent - * context. - */ - childcxt = AllocSetContextCreate(CurrentMemoryContext, - "Inheritance child planning context", - ALLOCSET_DEFAULT_MINSIZE, - ALLOCSET_DEFAULT_INITSIZE, - ALLOCSET_DEFAULT_MAXSIZE); - foreach(l, root->append_rel_list) { AppendRelInfo *appinfo = (AppendRelInfo *) lfirst(l); Plan *subplan; - MemoryContext oldcxt; /* append_rel_list contains all append rels; ignore others */ if (appinfo->parent_relid != parentRTindex) continue; /* - * Discard any cruft generated in previous loop iterations. - */ - MemoryContextReset(childcxt); - oldcxt = MemoryContextSwitchTo(childcxt); - - /* - * Generate modified query (in childcxt) with this rel as target. + * Generate modified query with this rel as target. */ memcpy(&subroot, root, sizeof(PlannerInfo)); subroot.parse = (Query *) @@ -801,11 +767,9 @@ inheritance_planner(PlannerInfo *root) /* and we haven't created PlaceHolderInfos, either */ Assert(subroot.placeholder_list == NIL); - /* Generate plan (also in childcxt) */ + /* Generate plan */ subplan = grouping_planner(&subroot, 0.0 /* retrieve all tuples */ ); - MemoryContextSwitchTo(oldcxt); - /* * If this child rel was excluded by constraint exclusion, exclude it * from the plan. @@ -813,20 +777,14 @@ inheritance_planner(PlannerInfo *root) if (is_dummy_plan(subplan)) continue; - /* - * Be sure to copy what we need out of the child context. - */ - subplan = copyObject(subplan); - - /* Save rtable from first child to install in parent after the loop */ + /* Save rtable from first rel for use below */ if (subplans == NIL) - rtable = copyObject(subroot.parse->rtable); + rtable = subroot.parse->rtable; subplans = lappend(subplans, subplan); /* Make sure any initplans from this rel get into the outer list */ - root->init_plans = list_concat(root->init_plans, - copyObject(subroot.init_plans)); + root->init_plans = list_concat(root->init_plans, subroot.init_plans); /* Build target-relations list for the executor */ resultRelations = lappend_int(resultRelations, appinfo->child_relid); @@ -836,18 +794,14 @@ inheritance_planner(PlannerInfo *root) { List *rlist; - rlist = copyObject(subroot.parse->returningList); rlist = set_returning_clause_references(root->glob, - rlist, + subroot.parse->returningList, subplan, appinfo->child_relid); returningLists = lappend(returningLists, rlist); } } - /* Done with child context */ - MemoryContextDelete(childcxt); - root->resultRelations = resultRelations; /* Mark result as unordered (probably unnecessary) */ @@ -870,7 +824,15 @@ inheritance_planner(PlannerInfo *root) } /* - * Install modified rangetable from first child into parent parsetree. + * Planning might have modified the rangetable, due to changes of the + * Query structures inside subquery RTEs. We have to ensure that this + * gets propagated back to the master copy. But can't do this until we + * are done planning, because all the calls to grouping_planner need + * virgin sub-Queries to work from. (We are effectively assuming that + * sub-Queries will get planned identically each time, or at least that + * the impacts on their rangetables will be the same each time.) + * + * XXX should clean this up someday */ parse->rtable = rtable;