-- SRF tests
--> Type by Value
CREATE OR REPLACE FUNCTION srftbvseq () RETURNS SETOF int
LANGUAGE plpy AS 'return (123,321,234,432,345,543)';
SELECT srftbvseq();
 srftbvseq 
-----------
       123
       321
       234
       432
       345
       543
(6 rows)

SELECT * FROM srftbvseq();
 srftbvseq 
-----------
       123
       321
       234
       432
       345
       543
(6 rows)

CREATE OR REPLACE FUNCTION srftbviter () RETURNS SETOF int
LANGUAGE plpy AS 'return iter((123,321,234,432,345,543))';
SELECT srftbviter();
 srftbviter 
------------
        123
        321
        234
        432
        345
        543
(6 rows)

SELECT * FROM srftbviter();
 srftbviter 
------------
        123
        321
        234
        432
        345
        543
(6 rows)

CREATE OR REPLACE FUNCTION srftbvgen () RETURNS SETOF int
LANGUAGE plpy AS 'yield -123; yield 123; yield 475; yield 8593';
SELECT srftbvgen();
 srftbvgen 
-----------
      -123
       123
       475
      8593
(4 rows)

SELECT * FROM srftbvgen();
 srftbvgen 
-----------
      -123
       123
       475
      8593
(4 rows)

--> Type by Reference
CREATE OR REPLACE FUNCTION srftbrseq () RETURNS SETOF text
LANGUAGE plpy AS 'return ("foo", "bar", "feh")';
SELECT srftbrseq();
 srftbrseq 
-----------
 foo
 bar
 feh
(3 rows)

SELECT * FROM srftbrseq();
 srftbrseq 
-----------
 foo
 bar
 feh
(3 rows)

CREATE OR REPLACE FUNCTION srftbriter () RETURNS SETOF text
LANGUAGE plpy AS 'return iter(("fleh", "flaw", "bleh"))';
SELECT srftbriter();
 srftbriter 
------------
 fleh
 flaw
 bleh
(3 rows)

SELECT * FROM srftbriter();
 srftbriter 
------------
 fleh
 flaw
 bleh
(3 rows)

CREATE OR REPLACE FUNCTION srftbrgen () RETURNS SETOF text
LANGUAGE plpy AS 'yield "ack"; yield "oak"; yield "troke"; yield "nope"';
SELECT srftbrgen();
 srftbrgen 
-----------
 ack
 oak
 troke
 nope
(4 rows)

SELECT * FROM srftbrgen();
 srftbrgen 
-----------
 ack
 oak
 troke
 nope
(4 rows)

--> Arbitrary Composite type
CREATE TYPE composite AS ( foo text, bar int2 );
CREATE OR REPLACE FUNCTION srfctseq () RETURNS SETOF composite
LANGUAGE plpy AS 'return (("foo", 321), ("bar", 213), ("feh", 123))';
SELECT srfctseq();
ERROR:  cannot accept a value of type record
SELECT * FROM srfctseq();
 foo | bar 
-----+-----
 foo | 321
 bar | 213
 feh | 123
(3 rows)

CREATE OR REPLACE FUNCTION srfctiter () RETURNS SETOF composite
LANGUAGE plpy AS 'return iter((("foo", 321), ("bar", 213), ("feh", 123)))';
SELECT srfctiter();
ERROR:  cannot accept a value of type record
SELECT * FROM srfctiter();
 foo | bar 
-----+-----
 foo | 321
 bar | 213
 feh | 123
(3 rows)

CREATE OR REPLACE FUNCTION srfctgen () RETURNS SETOF composite
LANGUAGE plpy AS 'yield ("foo", 321); yield ("bar", 213); yield ("feh", 123)';
SELECT srfctgen();
ERROR:  cannot accept a value of type record
SELECT * FROM srfctgen();
 foo | bar 
-----+-----
 foo | 321
 bar | 213
 feh | 123
(3 rows)

DROP TYPE composite CASCADE;
NOTICE:  drop cascades to function srfctgen()
NOTICE:  drop cascades to function srfctiter()
NOTICE:  drop cascades to function srfctseq()
/* vim: set filetype=sql: */
