aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2008-10-09 16:35:19 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2008-10-09 16:35:19 +0000
commit68909e70f757d34cfa53bb5fa315529b1c8c7b58 (patch)
treeb030c9ce6ee834e5c13d58c05bb46b58cce330a1 /src
parent433ba2dd560141dd3415ab7e2ddedb23b48c2024 (diff)
downloadpostgresql-68909e70f757d34cfa53bb5fa315529b1c8c7b58.tar.gz
postgresql-68909e70f757d34cfa53bb5fa315529b1c8c7b58.zip
Fix overly tense optimization of PLpgSQL_func_hashkey: we must represent
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.
Diffstat (limited to 'src')
-rw-r--r--src/pl/plpgsql/src/pl_comp.c7
-rw-r--r--src/pl/plpgsql/src/plpgsql.h6
2 files changed, 10 insertions, 3 deletions
diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c
index 2352c1c1365..840aac0544b 100644
--- a/src/pl/plpgsql/src/pl_comp.c
+++ b/src/pl/plpgsql/src/pl_comp.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.108.2.2 2007/02/08 18:37:38 tgl Exp $
+ * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.108.2.3 2008/10/09 16:35:19 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1965,12 +1965,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;
diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h
index b8bad2b1dee..c301d5c22db 100644
--- a/src/pl/plpgsql/src/plpgsql.h
+++ b/src/pl/plpgsql/src/plpgsql.h
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.81.2.2 2007/01/30 22:05:20 tgl Exp $
+ * $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.81.2.3 2008/10/09 16:35:19 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -526,6 +526,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