diff options
author | Heikki Linnakangas | 2020-10-14 07:58:38 +0000 |
---|---|---|
committer | Heikki Linnakangas | 2020-10-14 07:58:38 +0000 |
commit | 178f2d560dde05b356ab2f586b8bc62514f454aa (patch) | |
tree | 4d327c3826c6a27366554147ca70ba698f212757 /doc/src | |
parent | 39b4a951003a6545268e141272e123929d0d710f (diff) |
Include result relation info in direct modify ForeignScan nodes.
FDWs that can perform an UPDATE/DELETE remotely using the "direct modify"
set of APIs need to access the ResultRelInfo of the target table. That's
currently available in EState.es_result_relation_info, but the next
commit will remove that field.
This commit adds a new resultRelation field in ForeignScan, to store the
target relation's RT index, and the corresponding ResultRelInfo in
ForeignScanState. The FDW's PlanDirectModify callback is expected to set
'resultRelation' along with 'operation'. The core code doesn't need them
for anything, they are for the convenience of FDW's Begin- and
IterateDirectModify callbacks.
Authors: Amit Langote, Etsuro Fujita
Discussion: https://www.postgresql.org/message-id/CA%2BHiwqGEmiib8FLiHMhKB%2BCH5dRgHSLc5N5wnvc4kym%2BZYpQEQ%40mail.gmail.com
Diffstat (limited to 'doc/src')
-rw-r--r-- | doc/src/sgml/fdwhandler.sgml | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/doc/src/sgml/fdwhandler.sgml b/doc/src/sgml/fdwhandler.sgml index 72fa1272120..9c9293414c5 100644 --- a/doc/src/sgml/fdwhandler.sgml +++ b/doc/src/sgml/fdwhandler.sgml @@ -861,11 +861,15 @@ PlanDirectModify(PlannerInfo *root, To execute the direct modification on the remote server, this function must rewrite the target subplan with a <structname>ForeignScan</structname> plan node that executes the direct modification on the remote server. The - <structfield>operation</structfield> field of the <structname>ForeignScan</structname> must - be set to the <literal>CmdType</literal> enumeration appropriately; that is, + <structfield>operation</structfield> and <structfield>resultRelation</structfield> fields + of the <structname>ForeignScan</structname> must be set appropriately. + <structfield>operation</structfield> must be set to the <literal>CmdType</literal> + enumeration corresponding to the statement kind (that is, <literal>CMD_UPDATE</literal> for <command>UPDATE</command>, <literal>CMD_INSERT</literal> for <command>INSERT</command>, and - <literal>CMD_DELETE</literal> for <command>DELETE</command>. + <literal>CMD_DELETE</literal> for <command>DELETE</command>), and the + <literal>resultRelation</literal> argument must be copied to the + <structfield>resultRelation</structfield> field. </para> <para> @@ -925,9 +929,8 @@ IterateDirectModify(ForeignScanState *node); needed for the <literal>RETURNING</literal> calculation, returning it in a tuple table slot (the node's <structfield>ScanTupleSlot</structfield> should be used for this purpose). The data that was actually inserted, updated - or deleted must be stored in the - <literal>es_result_relation_info->ri_projectReturning->pi_exprContext->ecxt_scantuple</literal> - of the node's <structname>EState</structname>. + or deleted must be stored in + <literal>node->resultRelInfo->ri_projectReturning->pi_exprContext->ecxt_scantuple</literal>. Return NULL if no more rows are available. Note that this is called in a short-lived memory context that will be reset between invocations. Create a memory context in |