plperl returning setof foo[]
От | Andrew Dunstan |
---|---|
Тема | plperl returning setof foo[] |
Дата | |
Msg-id | 4AABD7BE.60603@dunslane.net обсуждение исходный текст |
Ответы |
Re: plperl returning setof foo[]
Re: plperl returning setof foo[] |
Список | pgsql-hackers |
I have just noticed, somewhat to my chagrin, that while in a plperl function that returns an array type you can return a perl arrayref, like this: return [qw(a b c)]; if the function returns a setof an array type you cannot do this: return_next [qw(a b c)]; Now the plperl docs say: Perl can return PostgreSQL arrays as references to Perl arrays. Here is an example: CREATE OR REPLACE function returns_array() RETURNS text[][] AS $$ return [['a"b','c,d'],['e\\f','g']]; $$ LANGUAGE plperl; select returns_array(); and while it doesn't specifically mention SRFs it doesn't exclude them, either. The fix is fairly small (see attached) although I need to check with some perlguts guru to see if I need to decrement a refcounter here or there. Nobody has complained about it over the years, so I wonder if it should be backpatched. It wouldn't change any working behaviour, just remove the non-working property of some documented behaviour. cheers andrew Index: plperl.c =================================================================== RCS file: /cvsroot/pgsql/src/pl/plperl/plperl.c,v retrieving revision 1.150 diff -c -r1.150 plperl.c *** plperl.c 11 Jun 2009 14:49:14 -0000 1.150 --- plperl.c 12 Sep 2009 16:46:40 -0000 *************** *** 1992,2001 **** { Datum ret; bool isNull; if (SvOK(sv)) { ! char *val = SvPV(sv, PL_na); ret = InputFunctionCall(&prodesc->result_in_func, val, prodesc->result_typioparam, -1); --- 1992,2011 ---- { Datum ret; bool isNull; + SV *array_ret = NULL; if (SvOK(sv)) { ! char *val; ! ! if (prodesc->fn_retisarray && SvROK(sv) && ! SvTYPE(SvRV(sv)) == SVt_PVAV) ! { ! array_ret = plperl_convert_to_pg_array(sv); ! sv = array_ret; ! } ! ! val = SvPV(sv, PL_na); ret = InputFunctionCall(&prodesc->result_in_func, val, prodesc->result_typioparam, -1);
В списке pgsql-hackers по дате отправления: