aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/trigger.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/trigger.c')
-rw-r--r--src/backend/commands/trigger.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 1fa63ab7d0f..711c09a1030 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);