1
1
/**********************************************************************
2
2
* plpython.c - python as a procedural language for PostgreSQL
3
3
*
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 $
5
5
*
6
6
*********************************************************************
7
7
*/
@@ -1838,6 +1838,7 @@ PLy_input_datum_func2(PLyDatumToOb *arg, Oid typeOid, HeapTuple typeTup)
1838
1838
arg -> typioparam = getTypeIOParam (typeTup );
1839
1839
arg -> typbyval = typeStruct -> typbyval ;
1840
1840
arg -> typlen = typeStruct -> typlen ;
1841
+ arg -> typalign = typeStruct -> typalign ;
1841
1842
1842
1843
/* Determine which kind of Python object we will convert to */
1843
1844
switch (getBaseType (element_type ?element_type :typeOid ))
@@ -1873,10 +1874,17 @@ PLy_input_datum_func2(PLyDatumToOb *arg, Oid typeOid, HeapTuple typeTup)
1873
1874
1874
1875
if (element_type )
1875
1876
{
1877
+ char dummy_delim ;
1878
+ Oid funcid ;
1879
+
1876
1880
arg -> elm = PLy_malloc0 (sizeof (* arg -> elm ));
1877
1881
arg -> elm -> func = arg -> func ;
1878
1882
arg -> 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 );
1880
1888
}
1881
1889
}
1882
1890
@@ -1986,6 +1994,7 @@ static PyObject *
1986
1994
PLyList_FromArray (PLyDatumToOb * arg ,Datum d )
1987
1995
{
1988
1996
ArrayType * array = DatumGetArrayTypeP (d );
1997
+ PLyDatumToOb * elm = arg -> elm ;
1989
1998
PyObject * list ;
1990
1999
int length ;
1991
2000
int lbound ;
@@ -2011,11 +2020,13 @@ PLyList_FromArray(PLyDatumToOb *arg, Datum d)
2011
2020
int offset ;
2012
2021
2013
2022
offset = 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 );
2015
2026
if (isnull )
2016
2027
PyList_SET_ITEM (list ,i ,Py_None );
2017
2028
else
2018
- PyList_SET_ITEM (list ,i ,arg -> elm -> func (arg ,elem ));
2029
+ PyList_SET_ITEM (list ,i ,elm -> func (elm ,elem ));
2019
2030
}
2020
2031
2021
2032
return list ;