diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 9281874..840890e 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -723,29 +723,37 @@ ExplainPreScanNode(PlanState *planstate, Bitmapset **rels_used) case T_SeqScan: case T_IndexScan: case T_IndexOnlyScan: case T_BitmapHeapScan: case T_TidScan: case T_SubqueryScan: case T_FunctionScan: case T_ValuesScan: case T_CteScan: case T_WorkTableScan: - case T_ForeignScan: case T_CustomScan: *rels_used = bms_add_member(*rels_used, ((Scan *) plan)->scanrelid); break; case T_ModifyTable: *rels_used = bms_add_member(*rels_used, ((ModifyTable *) plan)->nominalRelation); break; + case T_ForeignScan: + { + ForeignScan *foreign_scan = (ForeignScan *)plan; + if (foreign_scan->scan.scanrelid != 0) + *rels_used = bms_add_member(*rels_used, foreign_scan->scan.scanrelid); + else + *rels_used = bms_add_members(*rels_used, foreign_scan->relids); + } + break; default: break; } /* initPlan-s */ if (planstate->initPlan) ExplainPreScanSubPlans(planstate->initPlan, rels_used); /* lefttree */ if (outerPlanState(planstate)) diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index b4b2dc5..0a9bf37 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -2008,20 +2008,23 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path, foreach (lc, scan_plan->fdw_ps_tlist) { TargetEntry *tle = lfirst(lc); if (tle->resjunk) found_resjunk = true; else if (found_resjunk) elog(ERROR, "junk TLE should not apper prior to valid one"); } + + /* Set the relids that are represented by this foreign scan for Explain */ + scan_plan->relids = best_path->path.parent->relids; } /* Copy cost data from Path to Plan; no need to make FDW do this */ copy_path_costsize(&scan_plan->scan.plan, &best_path->path); /* Track FDW server-id; no need to make FDW do this */ scan_plan->fdw_handler = rel->fdw_handler; /* * Replace any outer-relation variables with nestloop params in the qual diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h index 213034b..ba278de 100644 --- a/src/include/nodes/plannodes.h +++ b/src/include/nodes/plannodes.h @@ -484,20 +484,23 @@ typedef struct WorkTableScan * ---------------- */ typedef struct ForeignScan { Scan scan; Oid fdw_handler; /* OID of FDW handler */ List *fdw_exprs; /* expressions that FDW may evaluate */ List *fdw_ps_tlist; /* optional pseudo-scan tlist for FDW */ List *fdw_private; /* private data for FDW */ bool fsSystemCol; /* true if any "system column" is needed */ + Bitmapset *relids; /* When scan.scanrelid is 0, the list of + * relations represented by this node + */ } ForeignScan; /* ---------------- * CustomScan node * * The comments for ForeignScan's fdw_exprs, fdw_varmap and fdw_private fields * apply equally to custom_exprs, custom_ps_tlist and custom_private. * Note that since Plan trees can be copied, custom scan providers *must* * fit all plan data they need into those fields; embedding CustomScan in * a larger struct will not work.