*/
struct PLyObToDatum;
-struct PLyTypeInfo;
-typedef Datum (*PLyObToDatumFunc) (struct PLyTypeInfo *,
- struct PLyObToDatum *,
- PyObject *);
+typedef Datum (*PLyObToDatumFunc) (struct PLyObToDatum *, int32 typmod,
+ PyObject *);
typedef struct PLyObToDatum
{
static PyObject *PLyDict_FromTuple(PLyTypeInfo *, HeapTuple, TupleDesc);
-static Datum PLyObject_ToBool(PLyTypeInfo *, PLyObToDatum *,
- PyObject *);
-static Datum PLyObject_ToBytea(PLyTypeInfo *, PLyObToDatum *,
- PyObject *);
-static Datum PLyObject_ToDatum(PLyTypeInfo *, PLyObToDatum *,
- PyObject *);
-static Datum PLySequence_ToArray(PLyTypeInfo *, PLyObToDatum *,
- PyObject *);
+static Datum PLyObject_ToBool(PLyObToDatum *, int32, PyObject *);
+static Datum PLyObject_ToBytea(PLyObToDatum *, int32, PyObject *);
+static Datum PLyObject_ToDatum(PLyObToDatum *, int32, PyObject *);
+static Datum PLySequence_ToArray(PLyObToDatum *, int32, PyObject *);
static HeapTuple PLyMapping_ToTuple(PLyTypeInfo *, PyObject *);
static HeapTuple PLySequence_ToTuple(PLyTypeInfo *, PyObject *);
plpython_error_callback(void *arg)
{
if (PLy_curr_procedure)
- errcontext("PL/Python function \"%s\"", PLy_procedure_name(PLy_curr_procedure));
+ errcontext("PL/Python function \"%s\"",
+ PLy_procedure_name(PLy_curr_procedure));
}
static void
{
PLyObToDatum *att = &proc->result.out.r.atts[atti];
- modvalues[i] = (att->func) (&proc->result, att, plval);
+ modvalues[i] = (att->func) (att,
+ tupdesc->attrs[atti]->atttypmod,
+ plval);
modnulls[i] = ' ';
}
else
else
{
fcinfo->isnull = false;
- rv = (proc->result.out.d.func) (&proc->result,
- &proc->result.out.d,
- plrv);
+ rv = (proc->result.out.d.func) (&proc->result.out.d, -1, plrv);
}
}
PG_CATCH();
* type can parse.
*/
static Datum
-PLyObject_ToBool(PLyTypeInfo *info,
- PLyObToDatum *arg,
- PyObject *plrv)
+PLyObject_ToBool(PLyObToDatum *arg, int32 typmod, PyObject *plrv)
{
Datum rv;
* with embedded nulls. And it's faster this way.
*/
static Datum
-PLyObject_ToBytea(PLyTypeInfo *info,
- PLyObToDatum *arg,
- PyObject *plrv)
+PLyObject_ToBytea(PLyObToDatum *arg, int32 typmod, PyObject *plrv)
{
PyObject *volatile plrv_so = NULL;
Datum rv;
* cstring into PostgreSQL type.
*/
static Datum
-PLyObject_ToDatum(PLyTypeInfo *info,
- PLyObToDatum *arg,
- PyObject *plrv)
+PLyObject_ToDatum(PLyObToDatum *arg, int32 typmod, PyObject *plrv)
{
PyObject *volatile plrv_bo = NULL;
Datum rv;
else if (slen > plen)
elog(ERROR, "could not convert Python object into cstring: Python string longer than reported length");
pg_verifymbstr(plrv_sc, slen, false);
- rv = InputFunctionCall(&arg->typfunc, plrv_sc, arg->typioparam, -1);
+ rv = InputFunctionCall(&arg->typfunc,
+ plrv_sc,
+ arg->typioparam,
+ typmod);
}
PG_CATCH();
{
}
static Datum
-PLySequence_ToArray(PLyTypeInfo *info,
- PLyObToDatum *arg,
- PyObject *plrv)
+PLySequence_ToArray(PLyObToDatum *arg, int32 typmod, PyObject *plrv)
{
ArrayType *array;
int i;
* We don't support arrays of row types yet, so the first argument
* can be NULL.
*/
- elems[i] = arg->elm->func(NULL, arg->elm, obj);
+ elems[i] = arg->elm->func(arg->elm, -1, obj);
}
Py_XDECREF(obj);
}
}
else if (value)
{
- values[i] = (att->func) (info, att, value);
+ values[i] = (att->func) (att, -1, value);
nulls[i] = false;
}
else
}
else if (value)
{
- values[i] = (att->func) (info, att, value);
+ values[i] = (att->func) (att, -1, value);
nulls[i] = false;
}
}
else if (value)
{
- values[i] = (att->func) (info, att, value);
+ values[i] = (att->func) (att, -1, value);
nulls[i] = false;
}
else
PG_TRY();
{
plan->values[j] =
- plan->args[j].out.d.func(NULL, &(plan->args[j].out.d), elem);
+ plan->args[j].out.d.func(&(plan->args[j].out.d),
+ -1,
+ elem);
}
PG_CATCH();
{