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.
This commit is contained in:
Tom Lane 2010-10-31 11:42:51 -04:00
parent 186cbbda8f
commit 76b12e0af7
3 changed files with 19 additions and 2 deletions

View File

@ -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"

View File

@ -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,

View File

@ -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();