<!--
-$PostgreSQL: pgsql/doc/src/sgml/plperl.sgml,v 2.40 2005/05/20 01:52:24 neilc Exp $
+$PostgreSQL: pgsql/doc/src/sgml/plperl.sgml,v 2.41 2005/06/05 03:16:29 momjian Exp $
-->
<chapter id="plperl">
SELECT * FROM perl_set();
</programlisting>
- Note that when you do this, Perl will have to build the entire array in
- memory; therefore the technique does not scale to very large result sets.
+ When you do this, Perl will have to build the entire array in memory;
+ therefore the technique does not scale to very large result sets. You
+ can instead call <function>return_next</function> for each element of
+ the result set, passing it either a scalar or a reference to a hash,
+ as appropriate to your function's return type.
</para>
<para>
return undef;
$$ LANGUAGE plperl;
SELECT perl_set_int(5);
- perl_set_int
---------------
-(0 rows)
-
+ERROR: set-valued function called in context that cannot accept a set
SELECT * FROM perl_set_int(5);
perl_set_int
--------------
return [0..$_[0]];
$$ LANGUAGE plperl;
SELECT perl_set_int(5);
- perl_set_int
---------------
- 0
- 1
- 2
- 3
- 4
- 5
-(6 rows)
-
+ERROR: set-valued function called in context that cannot accept a set
SELECT * FROM perl_set_int(5);
perl_set_int
--------------
return undef;
$$ LANGUAGE plperl;
SELECT perl_set();
- perl_set
-----------
-(0 rows)
-
+ERROR: set-valued function called in context that cannot accept a set
SELECT * FROM perl_set();
f1 | f2 | f3
----+----+----
];
$$ LANGUAGE plperl;
SELECT perl_set();
-ERROR: elements of Perl result array must be reference to hash
+ERROR: set-valued function called in context that cannot accept a set
SELECT * FROM perl_set();
-ERROR: elements of Perl result array must be reference to hash
+ERROR: setof-composite-returning Perl function must call return_next with reference to hash
CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
return [
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
];
$$ LANGUAGE plperl;
SELECT perl_set();
- perl_set
-----------------------
- (1,Hello,World)
- (2,Hello,PostgreSQL)
- (3,Hello,PL/Perl)
-(3 rows)
-
+ERROR: set-valued function called in context that cannot accept a set
SELECT * FROM perl_set();
f1 | f2 | f3
----+-------+------------
return undef;
$$ LANGUAGE plperl;
SELECT perl_record_set();
- perl_record_set
------------------
-(0 rows)
-
+ERROR: set-valued function called in context that cannot accept a set
SELECT * FROM perl_record_set();
ERROR: a column definition list is required for functions returning "record"
SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
];
$$ LANGUAGE plperl;
SELECT perl_record_set();
-ERROR: function returning record called in context that cannot accept type record
+ERROR: set-valued function called in context that cannot accept a set
SELECT * FROM perl_record_set();
ERROR: a column definition list is required for functions returning "record"
SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
-ERROR: elements of Perl result array must be reference to hash
+ERROR: setof-composite-returning Perl function must call return_next with reference to hash
CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
return [
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
];
$$ LANGUAGE plperl;
SELECT perl_record_set();
-ERROR: function returning record called in context that cannot accept type record
+ERROR: set-valued function called in context that cannot accept a set
SELECT * FROM perl_record_set();
ERROR: a column definition list is required for functions returning "record"
SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
];
$$ LANGUAGE plperl;
SELECT perl_out_params_set();
- perl_out_params_set
-----------------------
- (1,Hello,World)
- (2,Hello,PostgreSQL)
- (3,Hello,PL/Perl)
-(3 rows)
-
+ERROR: set-valued function called in context that cannot accept a set
SELECT * FROM perl_out_params_set();
f1 | f2 | f3
----+-------+------------
(3 rows)
SELECT (perl_out_params_set()).f3;
- f3
-------------
- World
- PostgreSQL
- PL/Perl
-(3 rows)
-
+ERROR: set-valued function called in context that cannot accept a set
--
-- Check behavior with erroneous return values
--
return 42;
$$ LANGUAGE plperl;
SELECT * FROM foo_set_bad();
-ERROR: set-returning Perl function must return reference to array
+ERROR: set-returning Perl function must return reference to array or use return_next
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
return {y => 3, z => 4};
$$ LANGUAGE plperl;
SELECT * FROM foo_set_bad();
-ERROR: set-returning Perl function must return reference to array
+ERROR: set-returning Perl function must return reference to array or use return_next
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
return [
[1, 2],
];
$$ LANGUAGE plperl;
SELECT * FROM foo_set_bad();
-ERROR: elements of Perl result array must be reference to hash
+ERROR: setof-composite-returning Perl function must call return_next with reference to hash
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
return [
{y => 3, z => 4}
(1 row)
+--
+-- Test return_next
+--
+CREATE OR REPLACE FUNCTION perl_srf_rn() RETURNS SETOF RECORD AS $$
+$i = 0;
+for ("World", "PostgreSQL", "PL/Perl") {
+ return_next({f1=>++$i, f2=>'Hello', f3=>$_});
+}
+return;
+$$ language plperl;
+SELECT * from perl_srf_rn() AS (f1 INTEGER, f2 TEXT, f3 TEXT);
+ f1 | f2 | f3
+----+-------+------------
+ 1 | Hello | World
+ 2 | Hello | PostgreSQL
+ 3 | Hello | PL/Perl
+(3 rows)
+