diff options
Diffstat (limited to 'contrib/postgres_fdw')
-rw-r--r-- | contrib/postgres_fdw/deparse.c | 12 | ||||
-rw-r--r-- | contrib/postgres_fdw/postgres_fdw.c | 12 |
2 files changed, 17 insertions, 7 deletions
diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c index 473fa45bd43..8a847deb13b 100644 --- a/contrib/postgres_fdw/deparse.c +++ b/contrib/postgres_fdw/deparse.c @@ -4026,7 +4026,17 @@ get_relation_column_alias_ids(Var *node, RelOptInfo *foreignrel, i = 1; foreach(lc, foreignrel->reltarget->exprs) { - if (equal(lfirst(lc), (Node *) node)) + Var *tlvar = (Var *) lfirst(lc); + + /* + * Match reltarget entries only on varno/varattno. Ideally there + * would be some cross-check on varnullingrels, but it's unclear what + * to do exactly; we don't have enough context to know what that value + * should be. + */ + if (IsA(tlvar, Var) && + tlvar->varno == node->varno && + tlvar->varattno == node->varattno) { *colno = i; return; diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c index 50d23f922cc..29b2be602c2 100644 --- a/contrib/postgres_fdw/postgres_fdw.c +++ b/contrib/postgres_fdw/postgres_fdw.c @@ -1517,7 +1517,7 @@ postgresBeginForeignScan(ForeignScanState *node, int eflags) if (fsplan->scan.scanrelid > 0) rtindex = fsplan->scan.scanrelid; else - rtindex = bms_next_member(fsplan->fs_relids, -1); + rtindex = bms_next_member(fsplan->fs_base_relids, -1); rte = exec_rt_fetch(rtindex, estate); /* Get info about foreign table. */ @@ -2414,7 +2414,7 @@ find_modifytable_subplan(PlannerInfo *root, { ForeignScan *fscan = (ForeignScan *) subplan; - if (bms_is_member(rtindex, fscan->fs_relids)) + if (bms_is_member(rtindex, fscan->fs_base_relids)) return fscan; } @@ -2838,8 +2838,8 @@ postgresExplainForeignScan(ForeignScanState *node, ExplainState *es) * that setrefs.c won't update the string when flattening the * rangetable. To find out what rtoffset was applied, identify the * minimum RT index appearing in the string and compare it to the - * minimum member of plan->fs_relids. (We expect all the relids in - * the join will have been offset by the same amount; the Asserts + * minimum member of plan->fs_base_relids. (We expect all the relids + * in the join will have been offset by the same amount; the Asserts * below should catch it if that ever changes.) */ minrti = INT_MAX; @@ -2856,7 +2856,7 @@ postgresExplainForeignScan(ForeignScanState *node, ExplainState *es) else ptr++; } - rtoffset = bms_next_member(plan->fs_relids, -1) - minrti; + rtoffset = bms_next_member(plan->fs_base_relids, -1) - minrti; /* Now we can translate the string */ relations = makeStringInfo(); @@ -2871,7 +2871,7 @@ postgresExplainForeignScan(ForeignScanState *node, ExplainState *es) char *refname; rti += rtoffset; - Assert(bms_is_member(rti, plan->fs_relids)); + Assert(bms_is_member(rti, plan->fs_base_relids)); rte = rt_fetch(rti, es->rtable); Assert(rte->rtekind == RTE_RELATION); /* This logic should agree with explain.c's ExplainTargetRel */ |