mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Postpone extParam/allParam calculations until the very end of planning.
Until now we computed these Param ID sets at the end of subquery_planner, but that approach depends on subquery_planner returning a concrete Plan tree. We would like to switch over to returning one or more Paths for a subquery, and in that representation the necessary details aren't fully fleshed out (not to mention that we don't really want to do this work for Paths that end up getting discarded). Hence, refactor so that we can compute the param ID sets at the end of planning, just before set_plan_references is run. The main change necessary to make this work is that we need to capture the set of outer-level Param IDs available to the current query level before exiting subquery_planner, since the outer levels' plan_params lists are transient. (That's not going to pose a problem for returning Paths, since all the work involved in producing that data is part of expression preprocessing, which will continue to happen before Paths are produced.) On the plus side, this change gets rid of several existing kluges. Eventually I'd like to get rid of SS_finalize_plan altogether in favor of doing this work during set_plan_references, but that will require some complex rejiggering because SS_finalize_plan needs to visit subplans and initplans before the main plan. So leave that idea for another day.
This commit is contained in:
@@ -4473,11 +4473,7 @@ make_material(Plan *lefttree)
|
||||
* materialize_finished_plan: stick a Material node atop a completed plan
|
||||
*
|
||||
* There are a couple of places where we want to attach a Material node
|
||||
* after completion of subquery_planner(). This currently requires hackery.
|
||||
* Since subquery_planner has already run SS_finalize_plan on the subplan
|
||||
* tree, we have to kluge up parameter lists for the Material node.
|
||||
* Possibly this could be fixed by postponing SS_finalize_plan processing
|
||||
* until setrefs.c is run?
|
||||
* after completion of subquery_planner(), without any MaterialPath path.
|
||||
*/
|
||||
Plan *
|
||||
materialize_finished_plan(Plan *subplan)
|
||||
@@ -4498,10 +4494,6 @@ materialize_finished_plan(Plan *subplan)
|
||||
matplan->plan_rows = subplan->plan_rows;
|
||||
matplan->plan_width = subplan->plan_width;
|
||||
|
||||
/* parameter kluge --- see comments above */
|
||||
matplan->extParam = bms_copy(subplan->extParam);
|
||||
matplan->allParam = bms_copy(subplan->allParam);
|
||||
|
||||
return matplan;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user