*** a/src/pl/tcl/pltcl.c
--- b/src/pl/tcl/pltcl.c
***************
*** 137,143 **** typedef struct pltcl_query_desc
  
  /**********************************************************************
   * For speedy lookup, we maintain a hash table mapping from
!  * function OID + trigger OID + user OID to pltcl_proc_desc pointers.
   * The reason the pltcl_proc_desc struct isn't directly part of the hash
   * entry is to simplify recovery from errors during compile_pltcl_function.
   *
--- 137,143 ----
  
  /**********************************************************************
   * For speedy lookup, we maintain a hash table mapping from
!  * function OID + trigger flag + user OID to pltcl_proc_desc pointers.
   * The reason the pltcl_proc_desc struct isn't directly part of the hash
   * entry is to simplify recovery from errors during compile_pltcl_function.
   *
***************
*** 149,155 **** typedef struct pltcl_query_desc
  typedef struct pltcl_proc_key
  {
  	Oid			proc_id;				/* Function OID */
! 	Oid			trig_id;				/* Trigger OID, or 0 if not trigger */
  	Oid			user_id;				/* User calling the function, or 0 */
  } pltcl_proc_key;
  
--- 149,159 ----
  typedef struct pltcl_proc_key
  {
  	Oid			proc_id;				/* Function OID */
! 	/*
! 	 * is_trigger is really a bool, but declare as Oid to ensure this struct
! 	 * contains no padding
! 	 */
! 	Oid			is_trigger;				/* is it a trigger function? */
  	Oid			user_id;				/* User calling the function, or 0 */
  } pltcl_proc_key;
  
***************
*** 1172,1178 **** compile_pltcl_function(Oid fn_oid, Oid tgreloid, bool pltrusted)
  
  	/* Try to find function in pltcl_proc_htab */
  	proc_key.proc_id = fn_oid;
! 	proc_key.trig_id = tgreloid;
  	proc_key.user_id = pltrusted ? GetUserId() : InvalidOid;
  
  	proc_ptr = hash_search(pltcl_proc_htab, &proc_key,
--- 1176,1182 ----
  
  	/* Try to find function in pltcl_proc_htab */
  	proc_key.proc_id = fn_oid;
! 	proc_key.is_trigger = OidIsValid(tgreloid);
  	proc_key.user_id = pltrusted ? GetUserId() : InvalidOid;
  
  	proc_ptr = hash_search(pltcl_proc_htab, &proc_key,
***************
*** 1228,1241 **** compile_pltcl_function(Oid fn_oid, Oid tgreloid, bool pltrusted)
  		int			tcl_rc;
  
  		/************************************************************
! 		 * Build our internal proc name from the functions Oid + trigger Oid
  		 ************************************************************/
! 		if (!is_trigger)
! 			snprintf(internal_proname, sizeof(internal_proname),
! 					 "__PLTcl_proc_%u", fn_oid);
! 		else
! 			snprintf(internal_proname, sizeof(internal_proname),
! 					 "__PLTcl_proc_%u_trigger_%u", fn_oid, tgreloid);
  
  		/************************************************************
  		 * Allocate a new procedure description block
--- 1232,1241 ----
  		int			tcl_rc;
  
  		/************************************************************
! 		 * Build our internal proc name
  		 ************************************************************/
! 		snprintf(internal_proname, sizeof(internal_proname),
! 						 "__PLTcl_proc_%u", fn_oid);
  
  		/************************************************************
  		 * Allocate a new procedure description block
