summaryrefslogtreecommitdiff
path: root/src/backend/commands/trigger.c
diff options
context:
space:
mode:
authorNoah Misch2014-03-23 06:15:52 +0000
committerNoah Misch2014-03-23 06:15:52 +0000
commit6115480c543c0141011a99db78987ad13540be59 (patch)
treea403743b574ec9043d5a4b39407f56ec8d445c49 /src/backend/commands/trigger.c
parentc31305de5f5a4880b0ba2f5983025ef0210a3b2a (diff)
Improve comments about AfterTriggerBeginQuery() query level usage.
Diffstat (limited to 'src/backend/commands/trigger.c')
-rw-r--r--src/backend/commands/trigger.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index fa74bd2cf10..3e92a7c29e5 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -3805,10 +3805,14 @@ AfterTriggerEndQuery(EState *estate)
* IMMEDIATE: all events we have decided to defer will be available for it
* to fire.
*
- * We loop in case a trigger queues more events at the same query level
- * (is that even possible?). Be careful here: firing a trigger could
- * result in query_stack being repalloc'd, so we can't save its address
- * across afterTriggerInvokeEvents calls.
+ * We loop in case a trigger queues more events at the same query level.
+ * Ordinary trigger functions, including all PL/pgSQL trigger functions,
+ * will instead fire any triggers in a dedicated query level. Foreign key
+ * enforcement triggers do add to the current query level, thanks to their
+ * passing fire_triggers = false to SPI_execute_snapshot(). Other
+ * C-language triggers might do likewise. Be careful here: firing a
+ * trigger could result in query_stack being repalloc'd, so we can't save
+ * its address across afterTriggerInvokeEvents calls.
*
* If we find no firable events, we don't have to increment
* firing_counter.
@@ -4046,7 +4050,9 @@ AfterTriggerEndSubXact(bool isCommit)
/*
* Release any event lists from queries being aborted, and restore
- * query_depth to its pre-subxact value.
+ * query_depth to its pre-subxact value. This assumes that a
+ * subtransaction will not add events to query levels started in a
+ * earlier transaction state.
*/
while (afterTriggers->query_depth > afterTriggers->depth_stack[my_level])
{