@@ -153,10 +153,8 @@ typedef union PLyTypeInput
153
153
*/
154
154
155
155
struct PLyObToDatum ;
156
- struct PLyTypeInfo ;
157
- typedef Datum (* PLyObToDatumFunc ) (struct PLyTypeInfo * ,
158
- struct PLyObToDatum * ,
159
- PyObject * );
156
+ typedef Datum (* PLyObToDatumFunc ) (struct PLyObToDatum * ,int32 typmod ,
157
+ PyObject * );
160
158
161
159
typedef struct PLyObToDatum
162
160
{
@@ -346,14 +344,10 @@ static PyObject *PLyList_FromArray(PLyDatumToOb *arg, Datum d);
346
344
347
345
static PyObject * PLyDict_FromTuple (PLyTypeInfo * ,HeapTuple ,TupleDesc );
348
346
349
- static Datum PLyObject_ToBool (PLyTypeInfo * ,PLyObToDatum * ,
350
- PyObject * );
351
- static Datum PLyObject_ToBytea (PLyTypeInfo * ,PLyObToDatum * ,
352
- PyObject * );
353
- static Datum PLyObject_ToDatum (PLyTypeInfo * ,PLyObToDatum * ,
354
- PyObject * );
355
- static Datum PLySequence_ToArray (PLyTypeInfo * ,PLyObToDatum * ,
356
- PyObject * );
347
+ static Datum PLyObject_ToBool (PLyObToDatum * ,int32 ,PyObject * );
348
+ static Datum PLyObject_ToBytea (PLyObToDatum * ,int32 ,PyObject * );
349
+ static Datum PLyObject_ToDatum (PLyObToDatum * ,int32 ,PyObject * );
350
+ static Datum PLySequence_ToArray (PLyObToDatum * ,int32 ,PyObject * );
357
351
358
352
static HeapTuple PLyMapping_ToTuple (PLyTypeInfo * ,PyObject * );
359
353
static HeapTuple PLySequence_ToTuple (PLyTypeInfo * ,PyObject * );
@@ -421,7 +415,8 @@ static void
421
415
plpython_error_callback (void * arg )
422
416
{
423
417
if (PLy_curr_procedure )
424
- errcontext ("PL/Python function \"%s\"" ,PLy_procedure_name (PLy_curr_procedure ));
418
+ errcontext ("PL/Python function \"%s\"" ,
419
+ PLy_procedure_name (PLy_curr_procedure ));
425
420
}
426
421
427
422
static void
@@ -743,7 +738,9 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
743
738
{
744
739
PLyObToDatum * att = & proc -> result .out .r .atts [atti ];
745
740
746
- modvalues [i ]= (att -> func ) (& proc -> result ,att ,plval );
741
+ modvalues [i ]= (att -> func ) (att ,
742
+ tupdesc -> attrs [atti ]-> atttypmod ,
743
+ plval );
747
744
modnulls [i ]= ' ' ;
748
745
}
749
746
else
@@ -1131,9 +1128,7 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
1131
1128
else
1132
1129
{
1133
1130
fcinfo -> isnull = false;
1134
- rv = (proc -> result .out .d .func ) (& proc -> result ,
1135
- & proc -> result .out .d ,
1136
- plrv );
1131
+ rv = (proc -> result .out .d .func ) (& proc -> result .out .d ,-1 ,plrv );
1137
1132
}
1138
1133
}
1139
1134
PG_CATCH ();
@@ -2098,9 +2093,7 @@ PLyDict_FromTuple(PLyTypeInfo *info, HeapTuple tuple, TupleDesc desc)
2098
2093
* type can parse.
2099
2094
*/
2100
2095
static Datum
2101
- PLyObject_ToBool (PLyTypeInfo * info ,
2102
- PLyObToDatum * arg ,
2103
- PyObject * plrv )
2096
+ PLyObject_ToBool (PLyObToDatum * arg ,int32 typmod ,PyObject * plrv )
2104
2097
{
2105
2098
Datum rv ;
2106
2099
@@ -2119,9 +2112,7 @@ PLyObject_ToBool(PLyTypeInfo *info,
2119
2112
* with embedded nulls. And it's faster this way.
2120
2113
*/
2121
2114
static Datum
2122
- PLyObject_ToBytea (PLyTypeInfo * info ,
2123
- PLyObToDatum * arg ,
2124
- PyObject * plrv )
2115
+ PLyObject_ToBytea (PLyObToDatum * arg ,int32 typmod ,PyObject * plrv )
2125
2116
{
2126
2117
PyObject * volatile plrv_so = NULL ;
2127
2118
Datum rv ;
@@ -2163,9 +2154,7 @@ PLyObject_ToBytea(PLyTypeInfo *info,
2163
2154
* cstring into PostgreSQL type.
2164
2155
*/
2165
2156
static Datum
2166
- PLyObject_ToDatum (PLyTypeInfo * info ,
2167
- PLyObToDatum * arg ,
2168
- PyObject * plrv )
2157
+ PLyObject_ToDatum (PLyObToDatum * arg ,int32 typmod ,PyObject * plrv )
2169
2158
{
2170
2159
PyObject * volatile plrv_bo = NULL ;
2171
2160
Datum rv ;
@@ -2201,7 +2190,10 @@ PLyObject_ToDatum(PLyTypeInfo *info,
2201
2190
else if (slen > plen )
2202
2191
elog (ERROR ,"could not convert Python object into cstring: Python string longer than reported length" );
2203
2192
pg_verifymbstr (plrv_sc ,slen , false);
2204
- rv = InputFunctionCall (& arg -> typfunc ,plrv_sc ,arg -> typioparam ,-1 );
2193
+ rv = InputFunctionCall (& arg -> typfunc ,
2194
+ plrv_sc ,
2195
+ arg -> typioparam ,
2196
+ typmod );
2205
2197
}
2206
2198
PG_CATCH ();
2207
2199
{
@@ -2216,9 +2208,7 @@ PLyObject_ToDatum(PLyTypeInfo *info,
2216
2208
}
2217
2209
2218
2210
static Datum
2219
- PLySequence_ToArray (PLyTypeInfo * info ,
2220
- PLyObToDatum * arg ,
2221
- PyObject * plrv )
2211
+ PLySequence_ToArray (PLyObToDatum * arg ,int32 typmod ,PyObject * plrv )
2222
2212
{
2223
2213
ArrayType * array ;
2224
2214
int i ;
@@ -2250,7 +2240,7 @@ PLySequence_ToArray(PLyTypeInfo *info,
2250
2240
* We don't support arrays of row types yet, so the first argument
2251
2241
* can be NULL.
2252
2242
*/
2253
- elems [i ]= arg -> elm -> func (NULL , arg -> elm ,obj );
2243
+ elems [i ]= arg -> elm -> func (arg -> elm , -1 ,obj );
2254
2244
}
2255
2245
Py_XDECREF (obj );
2256
2246
}
@@ -2299,7 +2289,7 @@ PLyMapping_ToTuple(PLyTypeInfo *info, PyObject *mapping)
2299
2289
}
2300
2290
else if (value )
2301
2291
{
2302
- values [i ]= (att -> func ) (info , att ,value );
2292
+ values [i ]= (att -> func ) (att , -1 ,value );
2303
2293
nulls [i ]= false;
2304
2294
}
2305
2295
else
@@ -2376,7 +2366,7 @@ PLySequence_ToTuple(PLyTypeInfo *info, PyObject *sequence)
2376
2366
}
2377
2367
else if (value )
2378
2368
{
2379
- values [i ]= (att -> func ) (info , att ,value );
2369
+ values [i ]= (att -> func ) (att , -1 ,value );
2380
2370
nulls [i ]= false;
2381
2371
}
2382
2372
@@ -2436,7 +2426,7 @@ PLyObject_ToTuple(PLyTypeInfo *info, PyObject *object)
2436
2426
}
2437
2427
else if (value )
2438
2428
{
2439
- values [i ]= (att -> func ) (info , att ,value );
2429
+ values [i ]= (att -> func ) (att , -1 ,value );
2440
2430
nulls [i ]= false;
2441
2431
}
2442
2432
else
@@ -3018,7 +3008,9 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
3018
3008
PG_TRY ();
3019
3009
{
3020
3010
plan -> values [j ]=
3021
- plan -> args [j ].out .d .func (NULL ,& (plan -> args [j ].out .d ),elem );
3011
+ plan -> args [j ].out .d .func (& (plan -> args [j ].out .d ),
3012
+ -1 ,
3013
+ elem );
3022
3014
}
3023
3015
PG_CATCH ();
3024
3016
{