Index: src/backend/commands/trigger.c
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/backend/commands/trigger.c,v
retrieving revision 1.142
diff -c -r1.142 trigger.c
*** src/backend/commands/trigger.c	15 Dec 2002 21:01:34 -0000	1.142
--- src/backend/commands/trigger.c	19 Dec 2002 19:40:14 -0000
***************
*** 1456,1462 ****
  			palloc0(trigdesc->numtriggers * sizeof(FmgrInfo));
  
  	LocTriggerData.type = T_TriggerData;
! 	LocTriggerData.tg_event = TRIGGER_EVENT_UPDATE | TRIGGER_EVENT_ROW | TRIGGER_EVENT_BEFORE;
  	LocTriggerData.tg_relation = relinfo->ri_RelationDesc;
  	for (i = 0; i < ntrigs; i++)
  	{
--- 1456,1464 ----
  			palloc0(trigdesc->numtriggers * sizeof(FmgrInfo));
  
  	LocTriggerData.type = T_TriggerData;
! 	LocTriggerData.tg_event = TRIGGER_EVENT_UPDATE |
! 							  TRIGGER_EVENT_ROW |
! 							  TRIGGER_EVENT_BEFORE;
  	LocTriggerData.tg_relation = relinfo->ri_RelationDesc;
  	for (i = 0; i < ntrigs; i++)
  	{
***************
*** 2323,2328 ****
--- 2325,2331 ----
  	int			new_size;
  	int			i;
  	int			ntriggers;
+ 	int			n_enabled_triggers = 0;
  	int		   *tgindx;
  	ItemPointerData oldctid;
  	ItemPointerData newctid;
***************
*** 2343,2353 ****
  	else
  		ItemPointerSetInvalid(&(newctid));
  
- 	/*
- 	 * Create a new event
- 	 */
- 	oldcxt = MemoryContextSwitchTo(deftrig_cxt);
- 
  	if (row_trigger)
  	{
  		ntriggers = trigdesc->n_after_row[event];
--- 2346,2351 ----
***************
*** 2359,2366 ****
  		tgindx = trigdesc->tg_after_statement[event];
  	}
  
  	new_size = offsetof(DeferredTriggerEventData, dte_item[0]) +
! 		ntriggers * sizeof(DeferredTriggerEventItem);
  
  	new_event = (DeferredTriggerEvent) palloc(new_size);
  	new_event->dte_next = NULL;
--- 2357,2389 ----
  		tgindx = trigdesc->tg_after_statement[event];
  	}
  
+ 	/*
+ 	 * Count the number of triggers that are actually enabled. Since we
+ 	 * only add enabled triggers to the queue, we only need allocate
+ 	 * enough space to hold them (and not any disabled triggers that may
+ 	 * be associated with the relation).
+ 	 */
+ 	for (i = 0; i < ntriggers; i++)
+ 	{
+ 		Trigger *trigger = &trigdesc->triggers[tgindx[i]];
+ 
+ 		if (trigger->tgenabled)
+ 			n_enabled_triggers++;
+ 	}
+ 
+ 	/*
+ 	 * If all the triggers on this relation are disabled, we're done.
+ 	 */
+ 	if (n_enabled_triggers == 0)
+ 		return;
+ 
+ 	/*
+ 	 * Create a new event
+ 	 */
+ 	oldcxt = MemoryContextSwitchTo(deftrig_cxt);
+ 
  	new_size = offsetof(DeferredTriggerEventData, dte_item[0]) +
! 		n_enabled_triggers * sizeof(DeferredTriggerEventItem);
  
  	new_event = (DeferredTriggerEvent) palloc(new_size);
  	new_event->dte_next = NULL;
***************
*** 2373,2381 ****
  	new_event->dte_n_items = ntriggers;
  	for (i = 0; i < ntriggers; i++)
  	{
  		Trigger    *trigger = &trigdesc->triggers[tgindx[i]];
- 		DeferredTriggerEventItem *ev_item = &(new_event->dte_item[i]);
  
  		ev_item->dti_tgoid = trigger->tgoid;
  		ev_item->dti_state = 
  			((trigger->tgdeferrable) ?
--- 2396,2408 ----
  	new_event->dte_n_items = ntriggers;
  	for (i = 0; i < ntriggers; i++)
  	{
+ 		DeferredTriggerEventItem *ev_item;
  		Trigger    *trigger = &trigdesc->triggers[tgindx[i]];
  
+ 		if (!trigger->tgenabled)
+ 			continue;
+ 
+ 		ev_item = &(new_event->dte_item[i]);
  		ev_item->dti_tgoid = trigger->tgoid;
  		ev_item->dti_state = 
  			((trigger->tgdeferrable) ?
