@@ -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
@@ -1132,9 +1129,7 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
1132
1129
else
1133
1130
{
1134
1131
fcinfo -> isnull = false;
1135
- rv = (proc -> result .out .d .func ) (& proc -> result ,
1136
- & proc -> result .out .d ,
1137
- plrv );
1132
+ rv = (proc -> result .out .d .func ) (& proc -> result .out .d , -1 , plrv );
1138
1133
}
1139
1134
}
1140
1135
PG_CATCH ();
@@ -2099,9 +2094,7 @@ PLyDict_FromTuple(PLyTypeInfo *info, HeapTuple tuple, TupleDesc desc)
2099
2094
* type can parse.
2100
2095
*/
2101
2096
static Datum
2102
- PLyObject_ToBool (PLyTypeInfo * info ,
2103
- PLyObToDatum * arg ,
2104
- PyObject * plrv )
2097
+ PLyObject_ToBool (PLyObToDatum * arg , int32 typmod , PyObject * plrv )
2105
2098
{
2106
2099
Datum rv ;
2107
2100
@@ -2120,9 +2113,7 @@ PLyObject_ToBool(PLyTypeInfo *info,
2120
2113
* with embedded nulls. And it's faster this way.
2121
2114
*/
2122
2115
static Datum
2123
- PLyObject_ToBytea (PLyTypeInfo * info ,
2124
- PLyObToDatum * arg ,
2125
- PyObject * plrv )
2116
+ PLyObject_ToBytea (PLyObToDatum * arg , int32 typmod , PyObject * plrv )
2126
2117
{
2127
2118
PyObject * volatile plrv_so = NULL ;
2128
2119
Datum rv ;
@@ -2164,9 +2155,7 @@ PLyObject_ToBytea(PLyTypeInfo *info,
2164
2155
* cstring into PostgreSQL type.
2165
2156
*/
2166
2157
static Datum
2167
- PLyObject_ToDatum (PLyTypeInfo * info ,
2168
- PLyObToDatum * arg ,
2169
- PyObject * plrv )
2158
+ PLyObject_ToDatum (PLyObToDatum * arg , int32 typmod , PyObject * plrv )
2170
2159
{
2171
2160
PyObject * volatile plrv_bo = NULL ;
2172
2161
Datum rv ;
@@ -2202,7 +2191,10 @@ PLyObject_ToDatum(PLyTypeInfo *info,
2202
2191
else if (slen > plen )
2203
2192
elog (ERROR , "could not convert Python object into cstring: Python string longer than reported length" );
2204
2193
pg_verifymbstr (plrv_sc , slen , false);
2205
- rv = InputFunctionCall (& arg -> typfunc , plrv_sc , arg -> typioparam , -1 );
2194
+ rv = InputFunctionCall (& arg -> typfunc ,
2195
+ plrv_sc ,
2196
+ arg -> typioparam ,
2197
+ typmod );
2206
2198
}
2207
2199
PG_CATCH ();
2208
2200
{
@@ -2217,9 +2209,7 @@ PLyObject_ToDatum(PLyTypeInfo *info,
2217
2209
}
2218
2210
2219
2211
static Datum
2220
- PLySequence_ToArray (PLyTypeInfo * info ,
2221
- PLyObToDatum * arg ,
2222
- PyObject * plrv )
2212
+ PLySequence_ToArray (PLyObToDatum * arg , int32 typmod , PyObject * plrv )
2223
2213
{
2224
2214
ArrayType * array ;
2225
2215
int i ;
@@ -2251,7 +2241,7 @@ PLySequence_ToArray(PLyTypeInfo *info,
2251
2241
* We don't support arrays of row types yet, so the first argument
2252
2242
* can be NULL.
2253
2243
*/
2254
- elems [i ] = arg -> elm -> func (NULL , arg -> elm , obj );
2244
+ elems [i ] = arg -> elm -> func (arg -> elm , -1 , obj );
2255
2245
}
2256
2246
Py_XDECREF (obj );
2257
2247
}
@@ -2300,7 +2290,7 @@ PLyMapping_ToTuple(PLyTypeInfo *info, PyObject *mapping)
2300
2290
}
2301
2291
else if (value )
2302
2292
{
2303
- values [i ] = (att -> func ) (info , att , value );
2293
+ values [i ] = (att -> func ) (att , -1 , value );
2304
2294
nulls [i ] = false;
2305
2295
}
2306
2296
else
@@ -2377,7 +2367,7 @@ PLySequence_ToTuple(PLyTypeInfo *info, PyObject *sequence)
2377
2367
}
2378
2368
else if (value )
2379
2369
{
2380
- values [i ] = (att -> func ) (info , att , value );
2370
+ values [i ] = (att -> func ) (att , -1 , value );
2381
2371
nulls [i ] = false;
2382
2372
}
2383
2373
@@ -2437,7 +2427,7 @@ PLyObject_ToTuple(PLyTypeInfo *info, PyObject *object)
2437
2427
}
2438
2428
else if (value )
2439
2429
{
2440
- values [i ] = (att -> func ) (info , att , value );
2430
+ values [i ] = (att -> func ) (att , -1 , value );
2441
2431
nulls [i ] = false;
2442
2432
}
2443
2433
else
@@ -3019,7 +3009,9 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
3019
3009
PG_TRY ();
3020
3010
{
3021
3011
plan -> values [j ] =
3022
- plan -> args [j ].out .d .func (NULL , & (plan -> args [j ].out .d ), elem );
3012
+ plan -> args [j ].out .d .func (& (plan -> args [j ].out .d ),
3013
+ -1 ,
3014
+ elem );
3023
3015
}
3024
3016
PG_CATCH ();
3025
3017
{
0 commit comments