diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index bd84778..49586a3 100644
*** a/src/backend/executor/nodeModifyTable.c
--- b/src/backend/executor/nodeModifyTable.c
*************** ExecEndModifyTable(ModifyTableState *nod
*** 2318,2325 ****
  {
  	int			i;
  
! 	/* Free transition tables */
! 	if (node->mt_transition_capture != NULL)
  		DestroyTransitionCaptureState(node->mt_transition_capture);
  
  	/*
--- 2318,2331 ----
  {
  	int			i;
  
! 	/*
! 	 * Free transition tables, unless this query is being run in
! 	 * EXEC_FLAG_SKIP_TRIGGERS mode, which means that it may have queued AFTER
! 	 * triggers that won't be run till later.  In that case we'll just leak
! 	 * the transition tables till end of (sub)transaction.
! 	 */
! 	if (node->mt_transition_capture != NULL &&
! 		!(node->ps.state->es_top_eflags & EXEC_FLAG_SKIP_TRIGGERS))
  		DestroyTransitionCaptureState(node->mt_transition_capture);
  
  	/*
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index da0850b..bbfbc06 100644
*** a/src/backend/commands/trigger.c
--- b/src/backend/commands/trigger.c
*************** AfterTriggerSaveEvent(EState *estate, Re
*** 5474,5480 ****
  		new_shared.ats_tgoid = trigger->tgoid;
  		new_shared.ats_relid = RelationGetRelid(rel);
  		new_shared.ats_firing_id = 0;
! 		new_shared.ats_transition_capture = transition_capture;
  
  		afterTriggerAddEvent(&afterTriggers.query_stack[afterTriggers.query_depth],
  							 &new_event, &new_shared);
--- 5474,5482 ----
  		new_shared.ats_tgoid = trigger->tgoid;
  		new_shared.ats_relid = RelationGetRelid(rel);
  		new_shared.ats_firing_id = 0;
! 		/* deferrable triggers cannot access transition data */
! 		new_shared.ats_transition_capture =
! 			trigger->tgdeferrable ? NULL : transition_capture;
  
  		afterTriggerAddEvent(&afterTriggers.query_stack[afterTriggers.query_depth],
  							 &new_event, &new_shared);
