On Sep 6, 2022, 10:22 +0800, Richard Guo <guofenglinux@gmail.com>, wrote:
On Tue, Sep 6, 2022 at 1:18 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
Zhang Mingli <zmlpostgres@gmail.com> writes:
> Macro exec_subplan_get_plan is not used anymore.
> Attach a patch to remove it.
Hm, I wonder why it's not used anymore. Maybe we no longer need
that list at all? If we do, should use of the macro be
re-introduced in the accessors?
The PlannedStmt->subplans list is still used at several places.
Seems nowadays no one fetches the Plan from PlannedStmt->subplans with a
certain plan_id any more. Previously back in eab6b8b2 where this macro
was introduced, it was used in explain_outNode and ExecInitSubPlan.
I find a similar macro, planner_subplan_get_plan, who fetches the Plan
from glob->subplans. We can use it in the codes where needed. For
example, in the new function SS_make_multiexprs_unique.
/* Found one, get the associated subplan */
- plan = (Plan *) list_nth(root->glob->subplans, splan->plan_id - 1);
+ plan = planner_subplan_get_plan(root, splan);
Thanks
Richard
Yeah, searched on history and found:
exec_subplan_get_plan was once used in ExecInitSubPlan() to create planstate.
```
Plan *plan = exec_subplan_get_plan(estate->es_plannedstmt, subplan);
...
node->planstate = ExecInitNode(plan, sp_estate, eflags);
```
And now in ExecInitSubPlan(), planstate comes from es_subplanstates.
```
/* Link the SubPlanState to already-initialized subplan */
sstate->planstate = (PlanState *) list_nth(estate->es_subplanstates, subplan->plan_id - 1);
```
And estate->es_subplanstates is evaluated through a for-range of subplans list at some functions.
```
foreach(l, plannedstmt->subplans)
{
...
estate->es_subplanstates = lappend(estate->es_subplanstates, subplanstate);
}
```