From 4ddf151c49b5ed3524ececc42226bf456cd8beaf Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 10 Jun 2010 04:05:01 +0000
Subject: [PATCH] Fix quite-bogus handling of arrays in plpython
 datum-to-PyObject conversion.  Per bug #5497 from David Gardner.

---
 src/pl/plpython/plpython.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index 7ddc223dfd4..c530b80597e 100644
--- a/src/pl/plpython/plpython.c
+++ b/src/pl/plpython/plpython.c
@@ -1,7 +1,7 @@
 /**********************************************************************
  * plpython.c - python as a procedural language for PostgreSQL
  *
- *	$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.143 2010/05/01 17:04:38 tgl Exp $
+ *	$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.144 2010/06/10 04:05:01 tgl Exp $
  *
  *********************************************************************
  */
@@ -1838,6 +1838,7 @@ PLy_input_datum_func2(PLyDatumToOb *arg, Oid typeOid, HeapTuple typeTup)
 	arg->typioparam = getTypeIOParam(typeTup);
 	arg->typbyval = typeStruct->typbyval;
 	arg->typlen = typeStruct->typlen;
+	arg->typalign = typeStruct->typalign;
 
 	/* Determine which kind of Python object we will convert to */
 	switch (getBaseType(element_type ? element_type : typeOid))
@@ -1873,10 +1874,17 @@ PLy_input_datum_func2(PLyDatumToOb *arg, Oid typeOid, HeapTuple typeTup)
 
 	if (element_type)
 	{
+		char		dummy_delim;
+		Oid			funcid;
+
 		arg->elm = PLy_malloc0(sizeof(*arg->elm));
 		arg->elm->func = arg->func;
 		arg->func = PLyList_FromArray;
-		get_typlenbyvalalign(element_type, &arg->elm->typlen, &arg->elm->typbyval, &arg->elm->typalign);
+		arg->elm->typoid = element_type;
+		get_type_io_data(element_type, IOFunc_output,
+						 &arg->elm->typlen, &arg->elm->typbyval, &arg->elm->typalign, &dummy_delim,
+						 &arg->elm->typioparam, &funcid);
+		perm_fmgr_info(funcid, &arg->elm->typfunc);
 	}
 }
 
@@ -1986,6 +1994,7 @@ static PyObject *
 PLyList_FromArray(PLyDatumToOb *arg, Datum d)
 {
 	ArrayType  *array = DatumGetArrayTypeP(d);
+	PLyDatumToOb *elm = arg->elm;
 	PyObject   *list;
 	int			length;
 	int			lbound;
@@ -2011,11 +2020,13 @@ PLyList_FromArray(PLyDatumToOb *arg, Datum d)
 		int			offset;
 
 		offset = lbound + i;
-		elem = array_ref(array, 1, &offset, arg->typlen, arg->elm->typlen, arg->elm->typbyval, arg->elm->typalign, &isnull);
+		elem = array_ref(array, 1, &offset, arg->typlen,
+						 elm->typlen, elm->typbyval, elm->typalign,
+						 &isnull);
 		if (isnull)
 			PyList_SET_ITEM(list, i, Py_None);
 		else
-			PyList_SET_ITEM(list, i, arg->elm->func(arg, elem));
+			PyList_SET_ITEM(list, i, elm->func(elm, elem));
 	}
 
 	return list;
-- 
GitLab