]> granicus.if.org Git - postgresql/commitdiff
Fix overly tense optimization of PLpgSQL_func_hashkey: we must represent
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 9 Oct 2008 16:35:25 +0000 (16:35 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 9 Oct 2008 16:35:25 +0000 (16:35 +0000)
the isTrigger state explicitly, not rely on nonzero-ness of trigrelOid
to indicate trigger-hood, because trigrelOid will be left zero when compiling
for validation.  The (useless) function hash entry built by the validator
was able to match an ordinary non-trigger call later in the same session,
thereby bypassing the check that is supposed to prevent such a call.
Per report from Alvaro.

It might be worth suppressing the useless hash entry altogether, but
that's a bigger change than I want to consider back-patching.

Back-patch to 8.0.  7.4 doesn't have the problem because it doesn't
have validation mode.

src/pl/plpgsql/src/pl_comp.c
src/pl/plpgsql/src/plpgsql.h

index 186520377ce301d3f2ca9db7797deae50a34b76a..210c692f21a50123c33b9d2bc2e05d7cfc962fbb 100644 (file)
@@ -3,7 +3,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.94.2.4 2007/02/08 18:37:52 tgl Exp $
+ *       $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.94.2.5 2008/10/09 16:35:25 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -2075,12 +2075,15 @@ compute_function_hashkey(FunctionCallInfo fcinfo,
        /* get function OID */
        hashkey->funcOid = fcinfo->flinfo->fn_oid;
 
+       /* get call context */
+       hashkey->isTrigger = CALLED_AS_TRIGGER(fcinfo);
+
        /*
         * if trigger, get relation OID.  In validation mode we do not know what
         * relation is intended to be used, so we leave trigrelOid zero; the hash
         * entry built in this case will never really be used.
         */
-       if (CALLED_AS_TRIGGER(fcinfo) && !forValidator)
+       if (hashkey->isTrigger && !forValidator)
        {
                TriggerData *trigdata = (TriggerData *) fcinfo->context;
 
index d27ea9eab5395358f4dda437f18310899fdf6c99..fef84a77dcbaabad09de27e1258e4b20b764da29 100644 (file)
@@ -3,7 +3,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.65.2.3 2007/01/30 22:05:25 tgl Exp $
+ *       $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.65.2.4 2008/10/09 16:35:25 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -546,6 +546,10 @@ typedef struct PLpgSQL_func_hashkey
 {                                                              /* Hash lookup key for functions */
        Oid                     funcOid;
 
+       bool            isTrigger;              /* true if called as a trigger */
+
+       /* be careful that pad bytes in this struct get zeroed! */
+
        /*
         * For a trigger function, the OID of the relation triggered on is part of
         * the hashkey --- we want to compile the trigger separately for each