aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/plan/createplan.c61
1 files changed, 35 insertions, 26 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index bdac0b1860b..54ff7f623d4 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -2099,10 +2099,7 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path,
RelOptInfo *rel = best_path->path.parent;
Index scan_relid = rel->relid;
Oid rel_oid = InvalidOid;
- Bitmapset *attrs_used = NULL;
Plan *outer_plan = NULL;
- ListCell *lc;
- int i;
Assert(rel->fdwroutine != NULL);
@@ -2180,36 +2177,48 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path,
}
/*
- * Detect whether any system columns are requested from rel. This is a
- * bit of a kluge and might go away someday, so we intentionally leave it
- * out of the API presented to FDWs.
- *
- * First, examine all the attributes needed for joins or final output.
- * Note: we must look at reltargetlist, not the attr_needed data, because
- * attr_needed isn't computed for inheritance child rels.
+ * If rel is a base relation, detect whether any system columns are
+ * requested from the rel. (If rel is a join relation, rel->relid will be
+ * 0, but there can be no Var with relid 0 in the reltargetlist or the
+ * restriction clauses, so we skip this in that case. Note that any such
+ * columns in base relations that were joined are assumed to be contained
+ * in fdw_scan_tlist.) This is a bit of a kluge and might go away someday,
+ * so we intentionally leave it out of the API presented to FDWs.
*/
- pull_varattnos((Node *) rel->reltargetlist, rel->relid, &attrs_used);
-
- /* Add all the attributes used by restriction clauses. */
- foreach(lc, rel->baserestrictinfo)
+ scan_plan->fsSystemCol = false;
+ if (scan_relid > 0)
{
- RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
+ Bitmapset *attrs_used = NULL;
+ ListCell *lc;
+ int i;
- pull_varattnos((Node *) rinfo->clause, rel->relid, &attrs_used);
- }
+ /*
+ * First, examine all the attributes needed for joins or final output.
+ * Note: we must look at reltargetlist, not the attr_needed data,
+ * because attr_needed isn't computed for inheritance child rels.
+ */
+ pull_varattnos((Node *) rel->reltargetlist, scan_relid, &attrs_used);
- /* Now, are any system columns requested from rel? */
- scan_plan->fsSystemCol = false;
- for (i = FirstLowInvalidHeapAttributeNumber + 1; i < 0; i++)
- {
- if (bms_is_member(i - FirstLowInvalidHeapAttributeNumber, attrs_used))
+ /* Add all the attributes used by restriction clauses. */
+ foreach(lc, rel->baserestrictinfo)
{
- scan_plan->fsSystemCol = true;
- break;
+ RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
+
+ pull_varattnos((Node *) rinfo->clause, scan_relid, &attrs_used);
}
- }
- bms_free(attrs_used);
+ /* Now, are any system columns requested from rel? */
+ for (i = FirstLowInvalidHeapAttributeNumber + 1; i < 0; i++)
+ {
+ if (bms_is_member(i - FirstLowInvalidHeapAttributeNumber, attrs_used))
+ {
+ scan_plan->fsSystemCol = true;
+ break;
+ }
+ }
+
+ bms_free(attrs_used);
+ }
return scan_plan;
}