Skip to content

Commit 3cb5867

Browse files
committed
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
1 parent 2ad83ff commit 3cb5867

File tree

1 file changed

+35
-26
lines changed

1 file changed

+35
-26
lines changed

src/backend/optimizer/plan/createplan.c

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2099,10 +2099,7 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path,
20992099
RelOptInfo *rel = best_path->path.parent;
21002100
Index scan_relid = rel->relid;
21012101
Oid rel_oid = InvalidOid;
2102-
Bitmapset *attrs_used = NULL;
21032102
Plan *outer_plan = NULL;
2104-
ListCell *lc;
2105-
int i;
21062103

21072104
Assert(rel->fdwroutine != NULL);
21082105

@@ -2180,36 +2177,48 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path,
21802177
}
21812178

21822179
/*
2183-
* Detect whether any system columns are requested from rel. This is a
2184-
* bit of a kluge and might go away someday, so we intentionally leave it
2185-
* out of the API presented to FDWs.
2186-
*
2187-
* First, examine all the attributes needed for joins or final output.
2188-
* Note: we must look at reltargetlist, not the attr_needed data, because
2189-
* attr_needed isn't computed for inheritance child rels.
2180+
* If rel is a base relation, detect whether any system columns are
2181+
* requested from the rel. (If rel is a join relation, rel->relid will be
2182+
* 0, but there can be no Var with relid 0 in the reltargetlist or the
2183+
* restriction clauses, so we skip this in that case. Note that any such
2184+
* columns in base relations that were joined are assumed to be contained
2185+
* in fdw_scan_tlist.) This is a bit of a kluge and might go away someday,
2186+
* so we intentionally leave it out of the API presented to FDWs.
21902187
*/
2191-
pull_varattnos((Node *) rel->reltargetlist, rel->relid, &attrs_used);
2192-
2193-
/* Add all the attributes used by restriction clauses. */
2194-
foreach(lc, rel->baserestrictinfo)
2188+
scan_plan->fsSystemCol = false;
2189+
if (scan_relid > 0)
21952190
{
2196-
RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
2191+
Bitmapset *attrs_used = NULL;
2192+
ListCell *lc;
2193+
int i;
21972194

2198-
pull_varattnos((Node *) rinfo->clause, rel->relid, &attrs_used);
2199-
}
2195+
/*
2196+
* First, examine all the attributes needed for joins or final output.
2197+
* Note: we must look at reltargetlist, not the attr_needed data,
2198+
* because attr_needed isn't computed for inheritance child rels.
2199+
*/
2200+
pull_varattnos((Node *) rel->reltargetlist, scan_relid, &attrs_used);
22002201

2201-
/* Now, are any system columns requested from rel? */
2202-
scan_plan->fsSystemCol = false;
2203-
for (i = FirstLowInvalidHeapAttributeNumber + 1; i < 0; i++)
2204-
{
2205-
if (bms_is_member(i - FirstLowInvalidHeapAttributeNumber, attrs_used))
2202+
/* Add all the attributes used by restriction clauses. */
2203+
foreach(lc, rel->baserestrictinfo)
22062204
{
2207-
scan_plan->fsSystemCol = true;
2208-
break;
2205+
RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
2206+
2207+
pull_varattnos((Node *) rinfo->clause, scan_relid, &attrs_used);
22092208
}
2210-
}
22112209

2212-
bms_free(attrs_used);
2210+
/* Now, are any system columns requested from rel? */
2211+
for (i = FirstLowInvalidHeapAttributeNumber + 1; i < 0; i++)
2212+
{
2213+
if (bms_is_member(i - FirstLowInvalidHeapAttributeNumber, attrs_used))
2214+
{
2215+
scan_plan->fsSystemCol = true;
2216+
break;
2217+
}
2218+
}
2219+
2220+
bms_free(attrs_used);
2221+
}
22132222

22142223
return scan_plan;
22152224
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy