mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
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
This commit is contained in:
parent
2ad83fff22
commit
3cb5867b7d
@ -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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
|
{
|
||||||
|
Bitmapset *attrs_used = NULL;
|
||||||
|
ListCell *lc;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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);
|
||||||
|
|
||||||
/* 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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bms_free(attrs_used);
|
bms_free(attrs_used);
|
||||||
|
}
|
||||||
|
|
||||||
return scan_plan;
|
return scan_plan;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user