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,36 +2177,48 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path, ...@@ -2180,36 +2177,48 @@ 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
* First, examine all the attributes needed for joins or final output. * columns in base relations that were joined are assumed to be contained
* Note: we must look at reltargetlist, not the attr_needed data, because * in fdw_scan_tlist.) This is a bit of a kluge and might go away someday,
* attr_needed isn't computed for inheritance child rels. * so we intentionally leave it out of the API presented to FDWs.
*/ */
pull_varattnos((Node *) rel->reltargetlist, rel->relid, &attrs_used); scan_plan->fsSystemCol = false;
if (scan_relid > 0)
/* Add all the attributes used by restriction clauses. */
foreach(lc, rel->baserestrictinfo)
{ {
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? */ /* Add all the attributes used by restriction clauses. */
scan_plan->fsSystemCol = false; foreach(lc, rel->baserestrictinfo)
for (i = FirstLowInvalidHeapAttributeNumber + 1; i < 0; i++)
{
if (bms_is_member(i - FirstLowInvalidHeapAttributeNumber, attrs_used))
{ {
scan_plan->fsSystemCol = true; RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
break;
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; 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