aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pl/plperl/expected/plperl.out9
-rw-r--r--src/pl/plperl/plperl.c12
-rw-r--r--src/pl/plperl/sql/plperl.sql2
3 files changed, 14 insertions, 9 deletions
diff --git a/src/pl/plperl/expected/plperl.out b/src/pl/plperl/expected/plperl.out
index ebfba3eb8d0..d8a1ff5dd8d 100644
--- a/src/pl/plperl/expected/plperl.out
+++ b/src/pl/plperl/expected/plperl.out
@@ -763,14 +763,17 @@ $$ LANGUAGE plperl;
SELECT text_obj();
ERROR: cannot convert Perl hash to non-composite type text
CONTEXT: PL/Perl function "text_obj"
------ make sure we can't return a scalar ref
+-- test looking through a scalar ref
CREATE OR REPLACE FUNCTION text_scalarref() RETURNS text AS $$
my $str = 'str';
return \$str;
$$ LANGUAGE plperl;
SELECT text_scalarref();
-ERROR: PL/Perl function must return reference to hash or array
-CONTEXT: PL/Perl function "text_scalarref"
+ text_scalarref
+----------------
+ str
+(1 row)
+
-- check safe behavior when a function body is replaced during execution
CREATE OR REPLACE FUNCTION self_modify(INTEGER) RETURNS INTEGER AS $$
spi_exec_query('CREATE OR REPLACE FUNCTION self_modify(INTEGER) RETURNS INTEGER AS \'return $_[0] * 3;\' LANGUAGE plperl;');
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index 4342c02b272..4cfc5062531 100644
--- a/src/pl/plperl/plperl.c
+++ b/src/pl/plperl/plperl.c
@@ -1402,11 +1402,13 @@ plperl_sv_to_datum(SV *sv, Oid typid, int32 typmod,
return ret;
}
- /* Reference, but not reference to hash or array ... */
- ereport(ERROR,
- (errcode(ERRCODE_DATATYPE_MISMATCH),
- errmsg("PL/Perl function must return reference to hash or array")));
- return (Datum) 0; /* shut up compiler */
+ /*
+ * If it's a reference to something else, such as a scalar, just
+ * recursively look through the reference.
+ */
+ return plperl_sv_to_datum(SvRV(sv), typid, typmod,
+ fcinfo, finfo, typioparam,
+ isnull);
}
else
{
diff --git a/src/pl/plperl/sql/plperl.sql b/src/pl/plperl/sql/plperl.sql
index c36da0ff043..b0d950b2304 100644
--- a/src/pl/plperl/sql/plperl.sql
+++ b/src/pl/plperl/sql/plperl.sql
@@ -504,7 +504,7 @@ $$ LANGUAGE plperl;
SELECT text_obj();
------ make sure we can't return a scalar ref
+-- test looking through a scalar ref
CREATE OR REPLACE FUNCTION text_scalarref() RETURNS text AS $$
my $str = 'str';
return \$str;