diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index 2f0108c3d4c0d135d6b9ba021da03154c4b870c3..6e8c5c05b5ac8ce244bfcb9b75533fc6ff78f7b8 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -137,7 +137,7 @@ 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. + * 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,7 +149,11 @@ 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 */ + /* + * 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,7 +1176,7 @@ 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.is_trigger = OidIsValid(tgreloid); proc_key.user_id = pltrusted ? GetUserId() : InvalidOid; proc_ptr = hash_search(pltcl_proc_htab, &proc_key, @@ -1228,14 +1232,16 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, bool pltrusted) int tcl_rc; /************************************************************ - * Build our internal proc name from the functions Oid + trigger Oid + * Build our internal proc name from the function's Oid. Append + * "_trigger" when appropriate to ensure the normal and trigger + * cases are kept separate. ************************************************************/ 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); + "__PLTcl_proc_%u_trigger", fn_oid); /************************************************************ * Allocate a new procedure description block