mirror of
https://github.com/postgres/postgres.git
synced 2025-10-27 00:12:01 +03:00
Rearrange planner to save the whole PlannerInfo (subroot) for a subquery.
Formerly, set_subquery_pathlist and other creators of plans for subqueries saved only the rangetable and rowMarks lists from the lower-level PlannerInfo. But there's no reason not to remember the whole PlannerInfo, and indeed this turns out to simplify matters in a number of places. The immediate reason for doing this was so that the subroot will still be accessible when we're trying to extract column statistics out of an already-planned subquery. But now that I've done it, it seems like a good code-beautification effort in its own right. I also chose to get rid of the transient subrtable and subrowmark fields in SubqueryScan nodes, in favor of having setrefs.c look up the subquery's RelOptInfo. That required changing all the APIs in setrefs.c to pass PlannerInfo not PlannerGlobal, which was a large but quite mechanical transformation. One side-effect not foreseen at the beginning is that this finally broke inheritance_planner's assumption that replanning the same subquery RTE N times would necessarily give interchangeable results each time. That assumption was always pretty risky, but now we really have to make a separate RTE for each instance so that there's a place to carry the separate subroots.
This commit is contained in:
@@ -121,8 +121,7 @@ extern void set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel,
|
||||
RelOptInfo *inner_rel,
|
||||
SpecialJoinInfo *sjinfo,
|
||||
List *restrictlist);
|
||||
extern void set_subquery_size_estimates(PlannerInfo *root, RelOptInfo *rel,
|
||||
PlannerInfo *subroot);
|
||||
extern void set_subquery_size_estimates(PlannerInfo *root, RelOptInfo *rel);
|
||||
extern void set_function_size_estimates(PlannerInfo *root, RelOptInfo *rel);
|
||||
extern void set_values_size_estimates(PlannerInfo *root, RelOptInfo *rel);
|
||||
extern void set_cte_size_estimates(PlannerInfo *root, RelOptInfo *rel,
|
||||
|
||||
@@ -96,6 +96,7 @@ extern HashPath *create_hashjoin_path(PlannerInfo *root,
|
||||
/*
|
||||
* prototypes for relnode.c
|
||||
*/
|
||||
extern void setup_simple_rel_arrays(PlannerInfo *root);
|
||||
extern RelOptInfo *build_simple_rel(PlannerInfo *root, int relid,
|
||||
RelOptKind reloptkind);
|
||||
extern RelOptInfo *find_base_rel(PlannerInfo *root, int relid);
|
||||
|
||||
@@ -41,8 +41,7 @@ extern Plan *optimize_minmax_aggregates(PlannerInfo *root, List *tlist,
|
||||
*/
|
||||
extern Plan *create_plan(PlannerInfo *root, Path *best_path);
|
||||
extern SubqueryScan *make_subqueryscan(List *qptlist, List *qpqual,
|
||||
Index scanrelid, Plan *subplan,
|
||||
List *subrtable, List *subrowmark);
|
||||
Index scanrelid, Plan *subplan);
|
||||
extern Append *make_append(List *appendplans, List *tlist);
|
||||
extern RecursiveUnion *make_recursive_union(List *tlist,
|
||||
Plan *lefttree, Plan *righttree, int wtParam,
|
||||
@@ -118,18 +117,15 @@ extern List *remove_useless_joins(PlannerInfo *root, List *joinlist);
|
||||
/*
|
||||
* prototypes for plan/setrefs.c
|
||||
*/
|
||||
extern Plan *set_plan_references(PlannerGlobal *glob,
|
||||
Plan *plan,
|
||||
List *rtable,
|
||||
List *rowmarks);
|
||||
extern List *set_returning_clause_references(PlannerGlobal *glob,
|
||||
extern Plan *set_plan_references(PlannerInfo *root, Plan *plan);
|
||||
extern List *set_returning_clause_references(PlannerInfo *root,
|
||||
List *rlist,
|
||||
Plan *topplan,
|
||||
Index resultRelation);
|
||||
extern void fix_opfuncids(Node *node);
|
||||
extern void set_opfuncid(OpExpr *opexpr);
|
||||
extern void set_sa_opfuncid(ScalarArrayOpExpr *opexpr);
|
||||
extern void record_plan_function_dependency(PlannerGlobal *glob, Oid funcid);
|
||||
extern void record_plan_function_dependency(PlannerInfo *root, Oid funcid);
|
||||
extern void extract_query_dependencies(Node *query,
|
||||
List **relationOids,
|
||||
List **invalItems);
|
||||
|
||||
Reference in New Issue
Block a user