<literal>NULL</literal>, no additional plan-time actions are taken, and the
<literal>fdw_private</literal> list delivered to
<function>BeginForeignModify</function> will be NIL.
</para>
<para>
<programlisting>
void
BeginForeignModify(ModifyTableState *mtstate,
ResultRelInfo *rinfo,
List *fdw_private,
int subplan_index,
int eflags);
</programlisting>
Begin executing a foreign table modification operation. This routine is
called during executor startup. It should perform any initialization
needed prior to the actual table modifications. Subsequently,
<function>ExecForeignInsert/ExecForeignBatchInsert</function>,
<function>ExecForeignUpdate</function> or
<function>ExecForeignDelete</function> will be called for tuple(s) to be
inserted, updated, or deleted.
</para>
<para>
<literal>mtstate</literal> is the overall state of the
<structname>ModifyTable</structname> plan node being executed; global data about
the plan and execution state is available via this structure.
<literal>rinfo</literal> is the <structname>ResultRelInfo</structname> struct describing
the target foreign table. (The <structfield>ri_FdwState</structfield> field of
<structname>ResultRelInfo</structname> is available for the FDW to store any
private state it needs for this operation.)
<literal>fdw_private</literal> contains the private data generated by
<function>PlanForeignModify</function>, if any.
<literal>subplan_index</literal> identifies which target of
the <structname>ModifyTable</structname> plan node this is.
<literal>eflags</literal> contains flag bits describing the executor's
operating mode for this plan node.
</para>
<para>
Note that when <literal>(eflags & EXEC_FLAG_EXPLAIN_ONLY)</literal> is
true, this function should not perform any externally-visible actions;
it should only do the minimum required to make the node state valid
for <function>ExplainForeignModify</function> and <function>EndForeignModify</function>.
</para>
<para>
If the <function>BeginForeignModify</function> pointer is set to
<literal>NULL</literal>, no action is taken during executor startup.
</para>
<para>
<programlisting>
TupleTableSlot *
ExecForeignInsert(EState *estate,
ResultRelInfo *rinfo,
TupleTableSlot *slot,
TupleTableSlot *planSlot);
</programlisting>
Insert one tuple into the foreign table.
<literal>estate</literal> is global execution state for the query.
<literal>rinfo</literal> is the <structname>ResultRelInfo</structname> struct describing
the target foreign table.
<literal>slot</literal> contains the tuple to be inserted; it will match the
row-type definition of the foreign table.
<literal>planSlot</literal> contains the tuple that was generated by the
<structname>ModifyTable</structname> plan node's subplan; it differs from
<literal>slot</literal> in possibly containing additional <quote>junk</quote>
columns. (The <literal>planSlot</literal> is typically of little interest
for <command>INSERT</command> cases, but is provided for completeness.)
</para>
<para>
The return value is either a slot containing the data that was actually
inserted (this might differ from the data supplied, for example as a
result of trigger actions), or NULL if no row was actually inserted
(again, typically as a result of triggers). The passed-in
<literal>slot</literal> can be re-used for this purpose.
</para>
<para>
The data in the returned slot is used only if the <command>INSERT</command>
statement has a <literal>RETURNING</literal> clause or involves a view
<literal>WITH CHECK OPTION</literal>; or if the foreign table has
an <literal>AFTER ROW</literal>