--- src/backend/commands/trigger.c.orig 2007-05-21 15:45:53.000000000 +0700 +++ src/backend/commands/trigger.c 2007-05-21 15:51:42.000000000 +0700 @@ -1989,6 +1989,24 @@ } +static bool +afterTriggerCascadeOrSetXXX(Oid tgfoid) +{ + switch (tgfoid) + { + case F_RI_FKEY_CASCADE_DEL: + case F_RI_FKEY_CASCADE_UPD: + case F_RI_FKEY_SETNULL_DEL: + case F_RI_FKEY_SETNULL_UPD: + case F_RI_FKEY_SETDEFAULT_DEL: + case F_RI_FKEY_SETDEFAULT_UPD: + return true; + + default: + return false; + } +} + /* ---------- * afterTriggerAddEvent() * @@ -1996,7 +2014,7 @@ * ---------- */ static void -afterTriggerAddEvent(AfterTriggerEvent event) +afterTriggerAddEvent(AfterTriggerEvent event, Oid tgfoid) { AfterTriggerEventList *events; @@ -2012,6 +2030,11 @@ events->head = event; events->tail = event; } + else if (afterTriggerCascadeOrSetXXX(tgfoid)) + { + event->ate_next = events->head; + events->head = event; + } else { events->tail->ate_next = event; @@ -3178,6 +3201,6 @@ /* * Add the new event to the queue. */ - afterTriggerAddEvent(new_event); + afterTriggerAddEvent(new_event, trigger->tgfoid); } }