]> granicus.if.org Git - postgresql/commitdiff
Use only one hash entry for all instances of a pltcl trigger function.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 3 Nov 2010 16:26:55 +0000 (12:26 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 3 Nov 2010 16:26:55 +0000 (12:26 -0400)
Like plperl and unlike plpgsql, there isn't any cached state that could
depend on exactly which relation the trigger is being fired for.  So we
can use just one hash entry for all relations, which might save a little
something.

Alex Hunsaker

src/pl/tcl/pltcl.c

index 2f0108c3d4c0d135d6b9ba021da03154c4b870c3..6e8c5c05b5ac8ce244bfcb9b75533fc6ff78f7b8 100644 (file)
@@ -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