Free reference in correct Perl context. Backpatch to release 8.2. Patch from Tim...
authorAndrew Dunstan
Fri, 12 Feb 2010 04:31:14 +0000 (04:31 +0000)
committerAndrew Dunstan
Fri, 12 Feb 2010 04:31:14 +0000 (04:31 +0000)
src/pl/plperl/expected/plperl_plperlu.out
src/pl/plperl/plperl.c
src/pl/plperl/sql/plperl_plperlu.sql

index e940f711d52f0076054036b8321209ae6ee52ee0..acc9dd4de3328a9023b3f2a6c5a3fbbbfa3883e2 100644 (file)
@@ -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)
+
index 97471edc9bad090cc3c72de41e9bccbbb73319dd..f3e8d1bd830481da0e3a6e34ce4eece7bdb0e44c 100644 (file)
@@ -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;
index 15b5aa29687f93cd6f3f0ef270fd8bbc48cf44e6..cbc5080fa63d3074c2e8ad79390449dd8a83b537 100644 (file)
@@ -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');
+