triggers-context-fix.patch
text/x-patch
Filename: triggers-context-fix.patch
Type: text/x-patch
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/trigger.c | 31 | 1 |
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 4b295f8da5..0073f576f0 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -3976,6 +3976,36 @@ afterTriggerCheckState(AfterTriggerShared evtshared)
return ((evtshared->ats_event & AFTER_TRIGGER_INITDEFERRED) != 0);
}
+/* ----------
+ * afterTriggerCopyBitmap()
+ *
+ * Copy bitmap into AfterTriggerEvents memory context.
+ * ----------
+ */
+static Bitmapset *
+afterTriggerCopyBitmap(Bitmapset *src)
+{
+ Bitmapset *dst;
+ MemoryContext oldcxt;
+
+ if (src == NULL)
+ return NULL;
+
+ /* Create event context if we didn't already */
+ if (afterTriggers.event_cxt == NULL)
+ afterTriggers.event_cxt =
+ AllocSetContextCreate(TopTransactionContext,
+ "AfterTriggerEvents",
+ ALLOCSET_DEFAULT_SIZES);
+
+ oldcxt = MemoryContextSwitchTo(afterTriggers.event_cxt);
+
+ dst = bms_copy(src);
+
+ MemoryContextSwitchTo(oldcxt);
+
+ return dst;
+}
/* ----------
* afterTriggerAddEvent()
@@ -6387,7 +6417,7 @@ AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo,
new_shared.ats_table = transition_capture->tcs_private;
else
new_shared.ats_table = NULL;
- new_shared.ats_modifiedcols = modifiedCols;
+ new_shared.ats_modifiedcols = afterTriggerCopyBitmap(modifiedCols);
afterTriggerAddEvent(&afterTriggers.query_stack[afterTriggers.query_depth].events,
&new_event, &new_shared);