aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2010-10-31 11:42:51 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2010-10-31 11:42:51 -0400
commit76b12e0af765b2ca2eeddcabdd5e7c22eda164da (patch)
tree7c33ae67ed542302f5055c41ef9baf58fd0e7da0
parent186cbbda8f8dc5e42f68fc7892f206a76d56a20f (diff)
downloadpostgresql-76b12e0af765b2ca2eeddcabdd5e7c22eda164da.tar.gz
postgresql-76b12e0af765b2ca2eeddcabdd5e7c22eda164da.zip
Revert removal of trigger flag from plperl function hash key.REL9_1_ALPHA2
As noted by Jan Urbanski, this flag is in fact needed to ensure that the function's input/result conversion functions are set up as expected. Add a regression test to discourage anyone from making same mistake in future.
-rw-r--r--src/pl/plperl/expected/plperl_trigger.out6
-rw-r--r--src/pl/plperl/plperl.c8
-rw-r--r--src/pl/plperl/sql/plperl_trigger.sql7
3 files changed, 19 insertions, 2 deletions
diff --git a/src/pl/plperl/expected/plperl_trigger.out b/src/pl/plperl/expected/plperl_trigger.out
index 8cd74cb4b99..bb1aed30936 100644
--- a/src/pl/plperl/expected/plperl_trigger.out
+++ b/src/pl/plperl/expected/plperl_trigger.out
@@ -266,3 +266,9 @@ SELECT * FROM trigger_test;
4 | immortal
(1 row)
+CREATE FUNCTION direct_trigger() RETURNS trigger AS $$
+ return;
+$$ LANGUAGE plperl;
+SELECT direct_trigger();
+ERROR: trigger functions can only be called as triggers
+CONTEXT: compilation of PL/Perl function "direct_trigger"
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index 44becda3f32..270e9f78e05 100644
--- a/src/pl/plperl/plperl.c
+++ b/src/pl/plperl/plperl.c
@@ -113,7 +113,7 @@ typedef struct plperl_proc_desc
/**********************************************************************
* For speedy lookup, we maintain a hash table mapping from
- * function OID + user OID to plperl_proc_desc pointers.
+ * function OID + trigger flag + user OID to plperl_proc_desc pointers.
* The reason the plperl_proc_desc struct isn't directly part of the hash
* entry is to simplify recovery from errors during compile_plperl_function.
*
@@ -127,6 +127,11 @@ typedef struct plperl_proc_desc
typedef struct plperl_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 */
} plperl_proc_key;
@@ -1955,6 +1960,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
/* Try to find function in plperl_proc_hash */
proc_key.proc_id = fn_oid;
+ proc_key.is_trigger = is_trigger;
proc_key.user_id = GetUserId();
proc_ptr = hash_search(plperl_proc_hash, &proc_key,
diff --git a/src/pl/plperl/sql/plperl_trigger.sql b/src/pl/plperl/sql/plperl_trigger.sql
index 1e68759b0f8..c47ddad3ca8 100644
--- a/src/pl/plperl/sql/plperl_trigger.sql
+++ b/src/pl/plperl/sql/plperl_trigger.sql
@@ -128,5 +128,10 @@ FOR EACH ROW EXECUTE PROCEDURE immortal('immortal');
DELETE FROM trigger_test;
-
SELECT * FROM trigger_test;
+
+CREATE FUNCTION direct_trigger() RETURNS trigger AS $$
+ return;
+$$ LANGUAGE plperl;
+
+SELECT direct_trigger();