Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

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.
  • Loading branch information...
commit 76b12e0af765b2ca2eeddcabdd5e7c22eda164da 1 parent 186cbbd
Tom Lane authored
View
6 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"
View
8 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,
View
7 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();
Please sign in to comment.
Something went wrong with that request. Please try again.