From 68c903a66ce6f766a8c99d07034374109859624f Mon Sep 17 00:00:00 2001
From: Andrew Dunstan <andrew@dunslane.net>
Date: Wed, 17 Aug 2011 11:59:18 -0400
Subject: [PATCH] Properly handle empty arrays returned from plperl functions.

Bug reported by David Wheeler, fix by Alex Hunsaker.
---
 src/pl/plperl/plperl.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index 8fd4cfb550..8b5d4dc191 100644
--- a/src/pl/plperl/plperl.c
+++ b/src/pl/plperl/plperl.c
@@ -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;