]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Properly handle empty arrays returned from plperl functions.
authorAndrew Dunstan <andrew@dunslane.net>
Wed, 17 Aug 2011 16:03:26 +0000 (12:03 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Wed, 17 Aug 2011 16:03:26 +0000 (12:03 -0400)
Bug reported by David Wheeler, fix by Alex Hunsaker.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   src/pl/plperl/plperl.c
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# autom4te.cache/
# configure.in~
# doc/src/sgml/ref/grant.sgml~
# src/backend/port/win32_latch.c~
# src/bin/psql/command.c~
# src/include/pg_config.h.win32~
# src/pl/plpython/plpython.c~
# src/tools/msvc/pgbison.bat~
# src/tools/msvc/pgbison.pl.bak
# src/tools/msvc/pgflex.bat~
# src/tools/msvc/pgflex.pl.bak
# src/tools/pgindent/README~
# src/tools/pgindent/pgindent.pl
# src/tools/pgindent/pgindent.pl~
# xxxxx
# yyyyyy

src/pl/plperl/plperl.c

index 61252308cd871bd49823ec8621fcfdd1f15ef0ae..5d25695586d7f66b319ac8b6f7fcfed2f7153380 100644 (file)
@@ -1077,14 +1077,15 @@ _array_to_datum(AV *av, int *ndims, int *dims, int cur_depth,
        int                     i = 0;
        int                     len = av_len(av) + 1;
 
-       if (len == 0)
-               astate = accumArrayResult(astate, (Datum) 0, true, atypid, NULL);
-
        for (i = 0; i < len; i++)
        {
+               /* fetch the array element */
                SV                **svp = av_fetch(av, i, FALSE);
+
+               /* see if this element is an array, if so get that */
                SV                 *sav = svp ? get_perl_array_ref(*svp) : NULL;
 
+               /* multi-dimensional array? */
                if (sav)
                {
                        AV                 *nav = (AV *) SvRV(sav);
@@ -1148,6 +1149,9 @@ plperl_array_to_datum(SV *src, Oid typid)
        astate = _array_to_datum((AV *) SvRV(src), &ndims, dims, 1, astate, typid,
                                                         atypid);
 
+       if (!astate)
+               return PointerGetDatum(construct_empty_array(atypid));
+
        for (i = 0; i < ndims; i++)
                lbs[i] = 1;