diff --git a/src/pl/plperl/expected/plperl_plperlu.out b/src/pl/plperl/expected/plperl_plperlu.out index e940f711d5..acc9dd4de3 100644 --- a/src/pl/plperl/expected/plperl_plperlu.out +++ b/src/pl/plperl/expected/plperl_plperlu.out @@ -17,3 +17,49 @@ CONTEXT: PL/Perl function "bar" SELECT * FROM foo(); -- used to cause backend crash (after switching to plperlu) ERROR: syntax error at or near "invalid" at line 4. at line 2. CONTEXT: PL/Perl function "foo" +-- test redefinition of specific SP switching languages +-- http://archives.postgresql.org/pgsql-bugs/2010-01/msg00116.php +-- plperl first +create or replace function foo(text) returns text language plperl as 'shift'; +select foo('hey'); + foo +----- + hey +(1 row) + +create or replace function foo(text) returns text language plperlu as 'shift'; +select foo('hey'); + foo +----- + hey +(1 row) + +create or replace function foo(text) returns text language plperl as 'shift'; +select foo('hey'); + foo +----- + hey +(1 row) + +-- plperlu first +create or replace function bar(text) returns text language plperlu as 'shift'; +select bar('hey'); + bar +----- + hey +(1 row) + +create or replace function bar(text) returns text language plperl as 'shift'; +select bar('hey'); + bar +----- + hey +(1 row) + +create or replace function bar(text) returns text language plperlu as 'shift'; +select bar('hey'); + bar +----- + hey +(1 row) + diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 97471edc9b..f3e8d1bd83 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -1,7 +1,7 @@ /********************************************************************** * plperl.c - perl as a procedural language for PostgreSQL * - * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.163 2010/01/30 01:46:57 adunstan Exp $ + * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.164 2010/02/12 04:31:14 adunstan Exp $ * **********************************************************************/ @@ -1762,8 +1762,11 @@ compile_plperl_function(Oid fn_oid, bool is_trigger) { hash_search(plperl_proc_hash, internal_proname, HASH_REMOVE, NULL); - if (prodesc->reference) + if (prodesc->reference) { + select_perl_context(prodesc->lanpltrusted); SvREFCNT_dec(prodesc->reference); + restore_context(oldcontext); + } free(prodesc->proname); free(prodesc); prodesc = NULL; diff --git a/src/pl/plperl/sql/plperl_plperlu.sql b/src/pl/plperl/sql/plperl_plperlu.sql index 15b5aa2968..cbc5080fa6 100644 --- a/src/pl/plperl/sql/plperl_plperlu.sql +++ b/src/pl/plperl/sql/plperl_plperlu.sql @@ -16,3 +16,22 @@ $$ LANGUAGE plperlu; -- compile plperlu code SELECT * FROM bar(); -- throws exception normally (running plperl) SELECT * FROM foo(); -- used to cause backend crash (after switching to plperlu) +-- test redefinition of specific SP switching languages +-- http://archives.postgresql.org/pgsql-bugs/2010-01/msg00116.php + +-- plperl first +create or replace function foo(text) returns text language plperl as 'shift'; +select foo('hey'); +create or replace function foo(text) returns text language plperlu as 'shift'; +select foo('hey'); +create or replace function foo(text) returns text language plperl as 'shift'; +select foo('hey'); + +-- plperlu first +create or replace function bar(text) returns text language plperlu as 'shift'; +select bar('hey'); +create or replace function bar(text) returns text language plperl as 'shift'; +select bar('hey'); +create or replace function bar(text) returns text language plperlu as 'shift'; +select bar('hey'); +