From 76b12e0af765b2ca2eeddcabdd5e7c22eda164da Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 31 Oct 2010 11:42:51 -0400 Subject: [PATCH] Revert removal of trigger flag from plperl function hash key. 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. --- src/pl/plperl/expected/plperl_trigger.out | 6 ++++++ src/pl/plperl/plperl.c | 8 +++++++- src/pl/plperl/sql/plperl_trigger.sql | 7 ++++++- 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 8cd74cb4b9..bb1aed3093 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 44becda3f3..270e9f78e0 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 1e68759b0f..c47ddad3ca 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(); -- 2.40.0