Properly handle empty arrays returned from plperl functions.
authorAndrew Dunstan <andrew@dunslane.net>
Wed, 17 Aug 2011 15:59:18 +0000 (11:59 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Wed, 17 Aug 2011 15:59:18 +0000 (11:59 -0400)
Bug reported by David Wheeler, fix by Alex Hunsaker.

src/pl/plperl/plperl.c

index 8fd4cfb550bb5fe9b4d762b68f81e23aac48d51b..8b5d4dc1915835af580a3e3c67fca080c312e263 100644 (file)
@@ -1078,14 +1078,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);
@@ -1149,6 +1150,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;