From 5ca611841bcd37c7ee8448c46c8398ef8d8edcc4 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 26 Jun 2015 09:40:47 -0400 Subject: Improve handling of CustomPath/CustomPlan(State) children. Allow CustomPath to have a list of paths, CustomPlan a list of plans, and CustomPlanState a list of planstates known to the core system, so that custom path/plan providers can more reasonably use this infrastructure for nodes with multiple children. KaiGai Kohei, per a design suggestion from Tom Lane, with some further kibitzing by me. --- src/backend/optimizer/plan/subselect.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'src/backend/optimizer/plan/subselect.c') diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index f80abb494c..4708b87f33 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -2373,10 +2373,27 @@ finalize_plan(PlannerInfo *root, Plan *plan, Bitmapset *valid_params, break; case T_CustomScan: - finalize_primnode((Node *) ((CustomScan *) plan)->custom_exprs, - &context); - /* We assume custom_scan_tlist cannot contain Params */ - context.paramids = bms_add_members(context.paramids, scan_params); + { + CustomScan *cscan = (CustomScan *) plan; + ListCell *lc; + + finalize_primnode((Node *) cscan->custom_exprs, + &context); + /* We assume custom_scan_tlist cannot contain Params */ + context.paramids = + bms_add_members(context.paramids, scan_params); + + /* child nodes if any */ + foreach (lc, cscan->custom_plans) + { + context.paramids = + bms_add_members(context.paramids, + finalize_plan(root, + (Plan *) lfirst(lc), + valid_params, + scan_params)); + } + } break; case T_ModifyTable: -- cgit v1.2.1