diff options
author | Robert Haas <rhaas@postgresql.org> | 2016-03-18 13:48:58 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2016-03-18 13:55:52 -0400 |
commit | 0bf3ae88af330496517722e391e7c975e6bad219 (patch) | |
tree | 46220c3ebfc9616af8d683c74395b18045c59a8a /src/backend/executor/nodeForeignscan.c | |
parent | 3422fecccadb021b7b4cdbc73b2c29f66f031761 (diff) |
Directly modify foreign tables.
postgres_fdw can now sent an UPDATE or DELETE statement directly to
the foreign server in simple cases, rather than sending a SELECT FOR
UPDATE statement and then updating or deleting rows one-by-one.
Etsuro Fujita, reviewed by Rushabh Lathia, Shigeru Hanada, Kyotaro
Horiguchi, Albe Laurenz, Thom Brown, and me.
Diffstat (limited to 'src/backend/executor/nodeForeignscan.c')
-rw-r--r-- | src/backend/executor/nodeForeignscan.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/backend/executor/nodeForeignscan.c b/src/backend/executor/nodeForeignscan.c index 388c9227498..300f947d431 100644 --- a/src/backend/executor/nodeForeignscan.c +++ b/src/backend/executor/nodeForeignscan.c @@ -48,7 +48,10 @@ ForeignNext(ForeignScanState *node) /* Call the Iterate function in short-lived context */ oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); - slot = node->fdwroutine->IterateForeignScan(node); + if (plan->operation != CMD_SELECT) + slot = node->fdwroutine->IterateDirectModify(node); + else + slot = node->fdwroutine->IterateForeignScan(node); MemoryContextSwitchTo(oldcontext); /* @@ -226,7 +229,10 @@ ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags) /* * Tell the FDW to initialize the scan. */ - fdwroutine->BeginForeignScan(scanstate, eflags); + if (node->operation != CMD_SELECT) + fdwroutine->BeginDirectModify(scanstate, eflags); + else + fdwroutine->BeginForeignScan(scanstate, eflags); return scanstate; } @@ -240,8 +246,13 @@ ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags) void ExecEndForeignScan(ForeignScanState *node) { + ForeignScan *plan = (ForeignScan *) node->ss.ps.plan; + /* Let the FDW shut down */ - node->fdwroutine->EndForeignScan(node); + if (plan->operation != CMD_SELECT) + node->fdwroutine->EndDirectModify(node); + else + node->fdwroutine->EndForeignScan(node); /* Shut down any outer plan. */ if (outerPlanState(node)) |