Michael Fuhr wrote:

On Thu, Nov 17, 2005 at 08:41:51PM -0500, Tom Lane wrote:
I think plperl should be fixed to translate undef to NULL when returning
an array, but currently it translates to an empty string:

I'll take a look at this if nobody else steps up.  It might just
be a minor change to this part of plperl.c:

210     "    else " \
211     "    { " \
212     "      my $str = qq($elem); " \
213     "      $str =~ s/([\"\\\\])/\\\\$1/g; " \
214     "      $res .= qq(\"$str\"); " \
215     "    } " \


Yeah.

I have the fix below which I will apply shortly. Demo:

perltest=# CREATE OR REPLACE function returns_array() returns text[] as $$
perltest$# return ['a,b','c"d',undef,'e-f']; $$ LANGUAGE plperl;
CREATE FUNCTION
perltest=# select returns_array();
returns_array ------------------------
{"a,b","c\"d",NULL,e-f}


There might be some problems going in the other direction, too;
I haven't tried.  Anybody feeling eager to fix this?

Does the current implementation provide automatic conversion to a
Perl array for inbound values?  Unless I'm missing something that
entire problem might still need to be solved.


Correct, we get the string representation, which is ugly. We certainly want to change that for 8.2 so we get an arrayref. And this makes it more urgent. demo:

perltest=# create or replace function dump_array(text[]) returns text language plperlu as $$ use Data::Dumper; return Dumper([EMAIL PROTECTED]); $$;
CREATE FUNCTION
perltest=# select dump_array(ARRAY(select datname from pg_database));
dump_array ---------------------------------------------------------------------------
$VAR1 = [
         '{postgres,perltest,template1,template0}'
       ];


cheers

andrew

Index: plperl.c
===================================================================
RCS file: /cvsroot/pgsql/src/pl/plperl/plperl.c,v
retrieving revision 1.94
diff -c -r1.94 plperl.c
*** plperl.c    18 Oct 2005 17:13:14 -0000      1.94
--- plperl.c    18 Nov 2005 13:13:31 -0000
***************
*** 207,218 ****
       "    { " \
       "      $res .= _plperl_to_pg_array($elem); " \
       "    } " \
!       "    else " \
       "    { " \
       "      my $str = qq($elem); " \
       "      $str =~ s/([\"\\\\])/\\\\$1/g; " \
       "      $res .= qq(\"$str\"); " \
       "    } " \
       "  } " \
       "  return qq({$res}); " \
       "} "
--- 207,222 ----
       "    { " \
       "      $res .= _plperl_to_pg_array($elem); " \
       "    } " \
!       "    elsif (defined($elem)) " \
       "    { " \
       "      my $str = qq($elem); " \
       "      $str =~ s/([\"\\\\])/\\\\$1/g; " \
       "      $res .= qq(\"$str\"); " \
       "    } " \
+       "    else " \
+       "    { "\
+       "      $res .= 'NULL' ; " \
+       "    } "\
       "  } " \
       "  return qq({$res}); " \
       "} "



---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
      choose an index scan if your joining column's datatypes do not
      match

Reply via email to