Commit 3cb5867b authored by Alvaro Herrera's avatar Alvaro Herrera

Don't test for system columns on join relations

create_foreignscan_plan needs to know whether any system columns are
requested from a relation (this flag is needed by ForeignNext during
execution).  However, for join relations this is a pointless test,
because it's not possible to request system columns from them, so
remove the check.

Author: Etsuro Fujita
Discussion: http://www.postgresql.org/message-id/56AA0FC5.9000207@lab.ntt.co.jp
Reviewed-by: David Rowley, Robert Haas
parent 2ad83fff
...@@ -2099,10 +2099,7 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path, ...@@ -2099,10 +2099,7 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path,
RelOptInfo *rel = best_path->path.parent; RelOptInfo *rel = best_path->path.parent;
Index scan_relid = rel->relid; Index scan_relid = rel->relid;
Oid rel_oid = InvalidOid; Oid rel_oid = InvalidOid;
Bitmapset *attrs_used = NULL;
Plan *outer_plan = NULL; Plan *outer_plan = NULL;
ListCell *lc;
int i;
Assert(rel->fdwroutine != NULL); Assert(rel->fdwroutine != NULL);
...@@ -2180,26 +2177,37 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path, ...@@ -2180,26 +2177,37 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path,
} }
/* /*
* Detect whether any system columns are requested from rel. This is a * If rel is a base relation, detect whether any system columns are
* bit of a kluge and might go away someday, so we intentionally leave it * requested from the rel. (If rel is a join relation, rel->relid will be
* out of the API presented to FDWs. * 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.
*/
scan_plan->fsSystemCol = false;
if (scan_relid > 0)
{
Bitmapset *attrs_used = NULL;
ListCell *lc;
int i;
/*
* First, examine all the attributes needed for joins or final output. * First, examine all the attributes needed for joins or final output.
* Note: we must look at reltargetlist, not the attr_needed data, because * Note: we must look at reltargetlist, not the attr_needed data,
* attr_needed isn't computed for inheritance child rels. * because attr_needed isn't computed for inheritance child rels.
*/ */
pull_varattnos((Node *) rel->reltargetlist, rel->relid, &attrs_used); pull_varattnos((Node *) rel->reltargetlist, scan_relid, &attrs_used);
/* Add all the attributes used by restriction clauses. */ /* Add all the attributes used by restriction clauses. */
foreach(lc, rel->baserestrictinfo) foreach(lc, rel->baserestrictinfo)
{ {
RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc); RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
pull_varattnos((Node *) rinfo->clause, rel->relid, &attrs_used); pull_varattnos((Node *) rinfo->clause, scan_relid, &attrs_used);
} }
/* Now, are any system columns requested from rel? */ /* Now, are any system columns requested from rel? */
scan_plan->fsSystemCol = false;
for (i = FirstLowInvalidHeapAttributeNumber + 1; i < 0; i++) for (i = FirstLowInvalidHeapAttributeNumber + 1; i < 0; i++)
{ {
if (bms_is_member(i - FirstLowInvalidHeapAttributeNumber, attrs_used)) if (bms_is_member(i - FirstLowInvalidHeapAttributeNumber, attrs_used))
...@@ -2210,6 +2218,7 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path, ...@@ -2210,6 +2218,7 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path,
} }
bms_free(attrs_used); bms_free(attrs_used);
}
return scan_plan; return scan_plan;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment