On Thu, Nov 23, 2023 at 08:36:34AM +0100, Laurenz Albe wrote:
> On Wed, 2023-11-22 at 14:49 -0800, Peter Geoghegan wrote:
> > I don't think that your proposed wording for this is an improvement.
>
> Well, the existing wording is impenetrable even for someone with some
> PostgreSQL knowledge, like me.
I moved the parition pagagraph to a more logical location and tried to
clarify the new paragraph to be more targeted on the goal, patch
attached.
--
Bruce Momjian <[email protected]> https://momjian.us
EDB https://enterprisedb.com
Only you can decide what is important to you.
diff --git a/doc/src/sgml/trigger.sgml b/doc/src/sgml/trigger.sgml
index 6e1f370b21..a5390ff644 100644
--- a/doc/src/sgml/trigger.sgml
+++ b/doc/src/sgml/trigger.sgml
@@ -132,29 +132,19 @@
</para>
<para>
- A statement that targets a parent table in an inheritance or partitioning
- hierarchy does not cause the statement-level triggers of affected child
- tables to be fired; only the parent table's statement-level triggers are
- fired. However, row-level triggers of any affected child tables will be
- fired.
+ If an <command>INSERT</command> contains an <literal>ON CONFLICT
+ DO UPDATE</literal> clause, it is possible for row-level
+ <literal>BEFORE</literal> <command>INSERT</command> and then
+ <literal>BEFORE</literal> <command>UPDATE</command> triggers
+ to be executed on triggered rows. Such interactions can be
+ complex if the triggers are not idempotent because change made by
+ <literal>BEFORE</literal> <command>INSERT</command> triggers will be
+ seen by <literal>BEFORE</literal> <command>UPDATE</command> triggers,
+ including changes to <varname>EXCLUDED</varname> columns.
</para>
<para>
- If an <command>INSERT</command> contains an <literal>ON CONFLICT
- DO UPDATE</literal> clause, it is possible that the effects of
- row-level <literal>BEFORE</literal> <command>INSERT</command> triggers and
- row-level <literal>BEFORE</literal> <command>UPDATE</command> triggers can
- both be applied in a way that is apparent from the final state of
- the updated row, if an <varname>EXCLUDED</varname> column is referenced.
- There need not be an <varname>EXCLUDED</varname> column reference for
- both sets of row-level <literal>BEFORE</literal> triggers to execute,
- though. The
- possibility of surprising outcomes should be considered when there
- are both <literal>BEFORE</literal> <command>INSERT</command> and
- <literal>BEFORE</literal> <command>UPDATE</command> row-level triggers
- that change a row being inserted/updated (this can be
- problematic even if the modifications are more or less equivalent, if
- they're not also idempotent). Note that statement-level
+ Note that statement-level
<command>UPDATE</command> triggers are executed when <literal>ON
CONFLICT DO UPDATE</literal> is specified, regardless of whether or not
any rows were affected by the <command>UPDATE</command> (and
@@ -169,6 +159,14 @@
triggers.
</para>
+ <para>
+ A statement that targets a parent table in an inheritance or partitioning
+ hierarchy does not cause the statement-level triggers of affected child
+ tables to be fired; only the parent table's statement-level triggers are
+ fired. However, row-level triggers of any affected child tables will be
+ fired.
+ </para>
+
<para>
If an <command>UPDATE</command> on a partitioned table causes a row to move
to another partition, it will be performed as a <command>DELETE</command>