Commit 76b12e0a authored by Tom Lane's avatar Tom Lane

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.
parent 186cbbda
...@@ -266,3 +266,9 @@ SELECT * FROM trigger_test; ...@@ -266,3 +266,9 @@ SELECT * FROM trigger_test;
4 | immortal 4 | immortal
(1 row) (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"
...@@ -113,7 +113,7 @@ typedef struct plperl_proc_desc ...@@ -113,7 +113,7 @@ typedef struct plperl_proc_desc
/********************************************************************** /**********************************************************************
* For speedy lookup, we maintain a hash table mapping from * 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 * 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. * entry is to simplify recovery from errors during compile_plperl_function.
* *
...@@ -127,6 +127,11 @@ typedef struct plperl_proc_desc ...@@ -127,6 +127,11 @@ typedef struct plperl_proc_desc
typedef struct plperl_proc_key typedef struct plperl_proc_key
{ {
Oid proc_id; /* Function OID */ 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 */ Oid user_id; /* User calling the function, or 0 */
} plperl_proc_key; } plperl_proc_key;
...@@ -1955,6 +1960,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger) ...@@ -1955,6 +1960,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
/* Try to find function in plperl_proc_hash */ /* Try to find function in plperl_proc_hash */
proc_key.proc_id = fn_oid; proc_key.proc_id = fn_oid;
proc_key.is_trigger = is_trigger;
proc_key.user_id = GetUserId(); proc_key.user_id = GetUserId();
proc_ptr = hash_search(plperl_proc_hash, &proc_key, proc_ptr = hash_search(plperl_proc_hash, &proc_key,
......
...@@ -128,5 +128,10 @@ FOR EACH ROW EXECUTE PROCEDURE immortal('immortal'); ...@@ -128,5 +128,10 @@ FOR EACH ROW EXECUTE PROCEDURE immortal('immortal');
DELETE FROM trigger_test; DELETE FROM trigger_test;
SELECT * FROM trigger_test; SELECT * FROM trigger_test;
CREATE FUNCTION direct_trigger() RETURNS trigger AS $$
return;
$$ LANGUAGE plperl;
SELECT direct_trigger();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment