Skip to content

Commit f5b78fa

Browse files
committed
Fix AfterTriggerExecute() to pass tg_trigtuple and tg_newtuple as NULLs
rather than pointers to garbage, when calling AFTER STATEMENT triggers. Michael Fuhr
1 parent bc8ac3c commit f5b78fa

File tree

1 file changed

+19
-26
lines changed

1 file changed

+19
-26
lines changed

src/backend/commands/trigger.c

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
99
* IDENTIFICATION
10-
* $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.205 2006/07/31 20:09:00 tgl Exp $
10+
* $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.206 2006/08/03 16:04:41 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -2090,52 +2090,45 @@ AfterTriggerExecute(AfterTriggerEvent event,
20902090
/*
20912091
* Fetch the required OLD and NEW tuples.
20922092
*/
2093+
LocTriggerData.tg_trigtuple = NULL;
2094+
LocTriggerData.tg_newtuple = NULL;
2095+
LocTriggerData.tg_trigtuplebuf = InvalidBuffer;
2096+
LocTriggerData.tg_newtuplebuf = InvalidBuffer;
2097+
20932098
if (ItemPointerIsValid(&(event->ate_oldctid)))
20942099
{
20952100
ItemPointerCopy(&(event->ate_oldctid), &(oldtuple.t_self));
20962101
if (!heap_fetch(rel, SnapshotAny, &oldtuple, &oldbuffer, false, NULL))
20972102
elog(ERROR, "failed to fetch old tuple for AFTER trigger");
2103+
LocTriggerData.tg_trigtuple = &oldtuple;
2104+
LocTriggerData.tg_trigtuplebuf = oldbuffer;
20982105
}
20992106

21002107
if (ItemPointerIsValid(&(event->ate_newctid)))
21012108
{
21022109
ItemPointerCopy(&(event->ate_newctid), &(newtuple.t_self));
21032110
if (!heap_fetch(rel, SnapshotAny, &newtuple, &newbuffer, false, NULL))
21042111
elog(ERROR, "failed to fetch new tuple for AFTER trigger");
2112+
if (LocTriggerData.tg_trigtuple != NULL)
2113+
{
2114+
LocTriggerData.tg_newtuple = &newtuple;
2115+
LocTriggerData.tg_newtuplebuf = newbuffer;
2116+
}
2117+
else
2118+
{
2119+
LocTriggerData.tg_trigtuple = &newtuple;
2120+
LocTriggerData.tg_trigtuplebuf = newbuffer;
2121+
}
21052122
}
21062123

21072124
/*
2108-
* Setup the trigger information
2125+
* Setup the remaining trigger information
21092126
*/
21102127
LocTriggerData.type = T_TriggerData;
21112128
LocTriggerData.tg_event =
21122129
event->ate_event & (TRIGGER_EVENT_OPMASK | TRIGGER_EVENT_ROW);
21132130
LocTriggerData.tg_relation = rel;
21142131

2115-
switch (event->ate_event & TRIGGER_EVENT_OPMASK)
2116-
{
2117-
case TRIGGER_EVENT_INSERT:
2118-
LocTriggerData.tg_trigtuple = &newtuple;
2119-
LocTriggerData.tg_newtuple = NULL;
2120-
LocTriggerData.tg_trigtuplebuf = newbuffer;
2121-
LocTriggerData.tg_newtuplebuf = InvalidBuffer;
2122-
break;
2123-
2124-
case TRIGGER_EVENT_UPDATE:
2125-
LocTriggerData.tg_trigtuple = &oldtuple;
2126-
LocTriggerData.tg_newtuple = &newtuple;
2127-
LocTriggerData.tg_trigtuplebuf = oldbuffer;
2128-
LocTriggerData.tg_newtuplebuf = newbuffer;
2129-
break;
2130-
2131-
case TRIGGER_EVENT_DELETE:
2132-
LocTriggerData.tg_trigtuple = &oldtuple;
2133-
LocTriggerData.tg_newtuple = NULL;
2134-
LocTriggerData.tg_trigtuplebuf = oldbuffer;
2135-
LocTriggerData.tg_newtuplebuf = InvalidBuffer;
2136-
break;
2137-
}
2138-
21392132
MemoryContextReset(per_tuple_context);
21402133

21412134
/*

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy