mirror of
https://github.com/postgres/postgres.git
synced 2025-06-08 22:02:03 +03:00
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:
parent
186cbbda8f
commit
76b12e0af7
@ -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
|
|||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* 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
|
|||||||
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)
|
|||||||
|
|
||||||
/* 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');
|
|||||||
|
|
||||||
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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user