11/**********************************************************************
22 * plpython.c - python as a procedural language for PostgreSQL
33 *
4- *$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.143 2010/05/01 17: 04:38 tgl Exp $
4+ *$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.144 2010/06/10 04:05:01 tgl Exp $
55 *
66 *********************************************************************
77 */
@@ -1838,6 +1838,7 @@ PLy_input_datum_func2(PLyDatumToOb *arg, Oid typeOid, HeapTuple typeTup)
18381838arg -> typioparam = getTypeIOParam (typeTup );
18391839arg -> typbyval = typeStruct -> typbyval ;
18401840arg -> typlen = typeStruct -> typlen ;
1841+ arg -> typalign = typeStruct -> typalign ;
18411842
18421843/* Determine which kind of Python object we will convert to */
18431844switch (getBaseType (element_type ?element_type :typeOid ))
@@ -1873,10 +1874,17 @@ PLy_input_datum_func2(PLyDatumToOb *arg, Oid typeOid, HeapTuple typeTup)
18731874
18741875if (element_type )
18751876{
1877+ char dummy_delim ;
1878+ Oid funcid ;
1879+
18761880arg -> elm = PLy_malloc0 (sizeof (* arg -> elm ));
18771881arg -> elm -> func = arg -> func ;
18781882arg -> func = PLyList_FromArray ;
1879- get_typlenbyvalalign (element_type ,& arg -> elm -> typlen ,& arg -> elm -> typbyval ,& arg -> elm -> typalign );
1883+ arg -> elm -> typoid = element_type ;
1884+ get_type_io_data (element_type ,IOFunc_output ,
1885+ & arg -> elm -> typlen ,& arg -> elm -> typbyval ,& arg -> elm -> typalign ,& dummy_delim ,
1886+ & arg -> elm -> typioparam ,& funcid );
1887+ perm_fmgr_info (funcid ,& arg -> elm -> typfunc );
18801888}
18811889}
18821890
@@ -1986,6 +1994,7 @@ static PyObject *
19861994PLyList_FromArray (PLyDatumToOb * arg ,Datum d )
19871995{
19881996ArrayType * array = DatumGetArrayTypeP (d );
1997+ PLyDatumToOb * elm = arg -> elm ;
19891998PyObject * list ;
19901999int length ;
19912000int lbound ;
@@ -2011,11 +2020,13 @@ PLyList_FromArray(PLyDatumToOb *arg, Datum d)
20112020int offset ;
20122021
20132022offset = lbound + i ;
2014- elem = array_ref (array ,1 ,& offset ,arg -> typlen ,arg -> elm -> typlen ,arg -> elm -> typbyval ,arg -> elm -> typalign ,& isnull );
2023+ elem = array_ref (array ,1 ,& offset ,arg -> typlen ,
2024+ elm -> typlen ,elm -> typbyval ,elm -> typalign ,
2025+ & isnull );
20152026if (isnull )
20162027PyList_SET_ITEM (list ,i ,Py_None );
20172028else
2018- PyList_SET_ITEM (list ,i ,arg -> elm -> func (arg ,elem ));
2029+ PyList_SET_ITEM (list ,i ,elm -> func (elm ,elem ));
20192030}
20202031
20212032return list ;