reverse-AfterTriggerSharedData-search-order.patch
text/x-diff
Filename: reverse-AfterTriggerSharedData-search-order.patch
Type: text/x-diff
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/trigger.c | 7 | 5 |
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 1fa63ab7d0..711c09a103 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -4104,11 +4104,12 @@ afterTriggerAddEvent(AfterTriggerEventList *events,
/*
* Try to locate a matching shared-data record already in the chunk. If
- * none, make a new one.
+ * none, make a new one. The search begins with the most recently added
+ * record, since newer ones are most likely to match.
*/
- for (newshared = ((AfterTriggerShared) chunk->endptr) - 1;
- (char *) newshared >= chunk->endfree;
- newshared--)
+ for (newshared = (AfterTriggerShared) chunk->endfree;
+ (char *) newshared < chunk->endptr;
+ newshared++)
{
/* compare fields roughly by probability of them being different */
if (newshared->ats_tgoid == evtshared->ats_tgoid &&
@@ -4120,8 +4121,9 @@ afterTriggerAddEvent(AfterTriggerEventList *events,
evtshared->ats_modifiedcols))
break;
}
- if ((char *) newshared < chunk->endfree)
+ if ((char *) newshared >= chunk->endptr)
{
+ newshared = ((AfterTriggerShared) chunk->endfree) - 1;
*newshared = *evtshared;
/* now we must make a suitably-long-lived copy of the bitmap */
newshared->ats_modifiedcols = afterTriggerCopyBitmap(evtshared->ats_modifiedcols);