diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c index 78facb8..e2b4b56 100644 --- a/contrib/postgres_fdw/postgres_fdw.c +++ b/contrib/postgres_fdw/postgres_fdw.c @@ -2357,7 +2357,7 @@ postgresBeginDirectModify(ForeignScanState *node, int eflags) * Identify which user to do the remote access as. This should match what * ExecCheckRTEPerms() does. */ - rtindex = node->resultRelInfo->ri_RangeTableIndex; + rtindex = fsplan->resultRelation; rte = exec_rt_fetch(rtindex, estate); userid = rte->checkAsUser ? rte->checkAsUser : GetUserId(); diff --git a/src/backend/executor/nodeForeignscan.c b/src/backend/executor/nodeForeignscan.c index 0b20f94..ce1ff17 100644 --- a/src/backend/executor/nodeForeignscan.c +++ b/src/backend/executor/nodeForeignscan.c @@ -49,7 +49,18 @@ ForeignNext(ForeignScanState *node) /* Call the Iterate function in short-lived context */ oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); if (plan->operation != CMD_SELECT) + { + EState *estate = node->ss.ps.state; + + /* + * For the FDW's convenience, look up the modification target + * relation's ResultRelInfo. + */ + Assert(plan->resultRelation > 0); + if (node->resultRelInfo == NULL) + node->resultRelInfo = estate->es_result_relations[plan->resultRelation - 1]; slot = node->fdwroutine->IterateDirectModify(node); + } else slot = node->fdwroutine->IterateForeignScan(node); MemoryContextSwitchTo(oldcontext); @@ -215,13 +226,6 @@ ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags) scanstate->fdwroutine = fdwroutine; scanstate->fdw_state = NULL; - /* - * For the FDW's convenience, look up the modification target relation's. - * ResultRelInfo. - */ - if (node->resultRelation > 0) - scanstate->resultRelInfo = estate->es_result_relations[node->resultRelation - 1]; - /* Initialize any outer plan. */ if (outerPlan(node)) outerPlanState(scanstate) =