Skip to content

Commit 7e30c00

Browse files
committed
Free reference in correct Perl context. Backpatch to release 8.2. Patch from Tim Bunce.
1 parent 14d5a47 commit 7e30c00

File tree

3 files changed

+70
-2
lines changed

3 files changed

+70
-2
lines changed

src/pl/plperl/expected/plperl_plperlu.out

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,49 @@ CONTEXT: PL/Perl function "bar"
1717
SELECT * FROM foo(); -- used to cause backend crash (after switching to plperlu)
1818
ERROR: syntax error at or near "invalid" at line 4. at line 2.
1919
CONTEXT: PL/Perl function "foo"
20+
-- test redefinition of specific SP switching languages
21+
-- http://archives.postgresql.org/pgsql-bugs/2010-01/msg00116.php
22+
-- plperl first
23+
create or replace function foo(text) returns text language plperl as 'shift';
24+
select foo('hey');
25+
foo
26+
-----
27+
hey
28+
(1 row)
29+
30+
create or replace function foo(text) returns text language plperlu as 'shift';
31+
select foo('hey');
32+
foo
33+
-----
34+
hey
35+
(1 row)
36+
37+
create or replace function foo(text) returns text language plperl as 'shift';
38+
select foo('hey');
39+
foo
40+
-----
41+
hey
42+
(1 row)
43+
44+
-- plperlu first
45+
create or replace function bar(text) returns text language plperlu as 'shift';
46+
select bar('hey');
47+
bar
48+
-----
49+
hey
50+
(1 row)
51+
52+
create or replace function bar(text) returns text language plperl as 'shift';
53+
select bar('hey');
54+
bar
55+
-----
56+
hey
57+
(1 row)
58+
59+
create or replace function bar(text) returns text language plperlu as 'shift';
60+
select bar('hey');
61+
bar
62+
-----
63+
hey
64+
(1 row)
65+

src/pl/plperl/plperl.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**********************************************************************
22
* plperl.c - perl as a procedural language for PostgreSQL
33
*
4-
* $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.163 2010/01/30 01:46:57 adunstan Exp $
4+
* $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.164 2010/02/12 04:31:14 adunstan Exp $
55
*
66
**********************************************************************/
77

@@ -1762,8 +1762,11 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
17621762
{
17631763
hash_search(plperl_proc_hash, internal_proname,
17641764
HASH_REMOVE, NULL);
1765-
if (prodesc->reference)
1765+
if (prodesc->reference) {
1766+
select_perl_context(prodesc->lanpltrusted);
17661767
SvREFCNT_dec(prodesc->reference);
1768+
restore_context(oldcontext);
1769+
}
17671770
free(prodesc->proname);
17681771
free(prodesc);
17691772
prodesc = NULL;

src/pl/plperl/sql/plperl_plperlu.sql

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,22 @@ $$ LANGUAGE plperlu; -- compile plperlu code
1616
SELECT * FROM bar(); -- throws exception normally (running plperl)
1717
SELECT * FROM foo(); -- used to cause backend crash (after switching to plperlu)
1818

19+
-- test redefinition of specific SP switching languages
20+
-- http://archives.postgresql.org/pgsql-bugs/2010-01/msg00116.php
21+
22+
-- plperl first
23+
create or replace function foo(text) returns text language plperl as 'shift';
24+
select foo('hey');
25+
create or replace function foo(text) returns text language plperlu as 'shift';
26+
select foo('hey');
27+
create or replace function foo(text) returns text language plperl as 'shift';
28+
select foo('hey');
29+
30+
-- plperlu first
31+
create or replace function bar(text) returns text language plperlu as 'shift';
32+
select bar('hey');
33+
create or replace function bar(text) returns text language plperl as 'shift';
34+
select bar('hey');
35+
create or replace function bar(text) returns text language plperlu as 'shift';
36+
select bar('hey');
37+

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy