20#include "utils/fmgroids.h"
123 return arg->func(
arg,
val, isnull,
false);
174 arg->tuple.recdesc = desc;
177 if (
arg->tuple.natts != desc->
natts)
193 if (attr->attisdropped)
196 if (
att->typoid == attr->atttypid &&
att->typmod == attr->atttypmod)
200 attr->atttypid, attr->atttypmod,
224 arg->tuple.recdesc = desc;
227 if (
arg->tuple.natts != desc->
natts)
243 if (attr->attisdropped)
246 if (
att->typoid == attr->atttypid &&
att->typmod == attr->atttypmod)
250 attr->atttypid, attr->atttypmod,
280 if (
arg->tuple.recdesc &&
281 arg->tuple.recdesc->tdtypmod !=
arg->typmod)
308 arg->typoid = typeOid;
309 arg->typmod = typmod;
346 arg->domain.domain_info =
NULL;
383 arg->tuple.typentry = typentry;
386 arg->tuple.natts = 0;
431 arg->typoid = typeOid;
432 arg->typmod = typmod;
498 arg->tuple.typentry = typentry;
501 arg->tuple.natts = 0;
588 PLy_elog(
ERROR,
"could not import a module for Decimal constructor");
598 PLy_elog(
ERROR,
"conversion from numeric to Decimal failed");
703 &dataptr, &bitmap, &bitmask);
720 for (
i = 0;
i < dims[dim];
i++)
739 for (
i = 0;
i < dims[dim];
i++)
742 if (bitmap && (*bitmap & bitmask) == 0)
761 if (bitmask == 0x100 )
830 for (
i = 0;
i <
arg->tuple.natts;
i++)
839 if (attr->attisdropped)
842 if (attr->attgenerated)
915 PLy_elog(
ERROR,
"could not create bytes representation of Python object");
974 Assert(desc ==
arg->tuple.typentry->tupDesc);
976 if (
arg->tuple.tupdescid !=
arg->tuple.typentry->tupDesc_identifier)
980 arg->tuple.tupdescid =
arg->tuple.typentry->tupDesc_identifier;
985 desc =
arg->tuple.recdesc;
989 arg->tuple.recdesc = desc;
1052 PLy_elog(
ERROR,
"could not create string representation of Python object");
1063 errmsg(
"could not convert Python object into cstring: Python string representation appears to contain null bytes")));
1064 else if (
slen > plen)
1065 elog(
ERROR,
"could not convert Python object into cstring: Python string longer than reported length");
1093 arg->scalar.typioparam,
1110 &
arg->domain.domain_info,
arg->mcxt);
1160 errmsg(
"return value of function with array return type is not a Python sequence")));
1163 memset(dims, 0,
sizeof(dims));
1173 arg->array.elmbasetype);
1179 for (
int i = 0;
i < ndims;
i++)
1205 PLy_elog(
ERROR,
"could not determine sequence length for function return value");
1207 for (
i = 0;
i <
len;
i++)
1225 errmsg(
"multidimensional arrays must have array expressions with matching dimensions")));
1230 errmsg(
"number of array dimensions exceeds the maximum allowed (%d)",
1240 errmsg(
"multidimensional arrays must have array expressions with matching dimensions")));
1256 errmsg(
"multidimensional arrays must have array expressions with matching dimensions")));
1327 while (*ptr &&
isspace((
unsigned char) *ptr))
1332 errmsg(
"malformed record literal: \"%s\"",
str),
1334 errhint(
"To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\".")));
1365 if (attr->attisdropped)
1381 errmsg(
"key \"%s\" not found in mapping", key),
1382 errhint(
"To return null in a column, "
1383 "add the value None to the mapping with the key named after the column.")));
1435 errmsg(
"length of returned sequence did not match number of columns in row")));
1505 if (attr->attisdropped)
1533 errmsg(
"attribute \"%s\" does not exist in Python object", key),
1535 errhint(
"To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\".") :
1536 errhint(
"To return null in a column, let the returned object have an attribute named after column with value None.")));
Datum idx(PG_FUNCTION_ARGS)
#define ARR_NULLBITMAP(a)
#define DatumGetArrayTypeP(X)
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
ArrayType * construct_empty_array(Oid elmtype)
Datum makeMdArrayResult(ArrayBuildState *astate, int ndims, int *dims, int *lbs, MemoryContext rcontext, bool release)
ArrayBuildState * initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
Datum numeric_out(PG_FUNCTION_ARGS)
static Datum values[MAXATTR]
#define Assert(condition)
#define OidIsValid(objectId)
void domain_check(Datum value, bool isnull, Oid domainType, void **extra, MemoryContext mcxt)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
#define palloc_array(type, count)
Datum InputFunctionCall(FmgrInfo *flinfo, char *str, Oid typioparam, int32 typmod)
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
char * OutputFunctionCall(FmgrInfo *flinfo, Datum val)
#define DatumGetHeapTupleHeader(X)
#define DatumGetByteaPP(X)
#define DirectFunctionCall1(func, arg1)
#define FunctionCall1(flinfo, arg1)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
Datum heap_copy_tuple_as_datum(HeapTuple tuple, TupleDesc tupleDesc)
void heap_freetuple(HeapTuple htup)
#define PLyObject_AsString
static Datum heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
static int32 HeapTupleHeaderGetTypMod(const HeapTupleHeaderData *tup)
static uint32 HeapTupleHeaderGetDatumLength(const HeapTupleHeaderData *tup)
static Oid HeapTupleHeaderGetTypeId(const HeapTupleHeaderData *tup)
static PyObject * decimal_constructor
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
void getTypeInputInfo(Oid type, Oid *typInput, Oid *typIOParam)
Oid get_transform_tosql(Oid typid, Oid langid, List *trftypes)
Oid get_transform_fromsql(Oid typid, Oid langid, List *trftypes)
Oid getBaseType(Oid typid)
bool pg_verifymbstr(const char *mbstr, int len, bool noError)
void MemoryContextReset(MemoryContext context)
void * MemoryContextAllocZero(MemoryContext context, Size size)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext CurrentMemoryContext
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
FormData_pg_attribute * Form_pg_attribute
PLyExecutionContext * PLy_current_execution_context(void)
MemoryContext PLy_get_scratch_context(PLyExecutionContext *context)
static PyObject * PLyLong_FromInt16(PLyDatumToOb *arg, Datum d)
void PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt, Oid typeOid, int32 typmod, PLyProcedure *proc)
void PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt, Oid typeOid, int32 typmod, PLyProcedure *proc)
static PyObject * PLyLong_FromInt64(PLyDatumToOb *arg, Datum d)
PyObject * PLy_input_from_tuple(PLyDatumToOb *arg, HeapTuple tuple, TupleDesc desc, bool include_generated)
static PyObject * PLyDict_FromTuple(PLyDatumToOb *arg, HeapTuple tuple, TupleDesc desc, bool include_generated)
static Datum PLyMapping_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *mapping)
static Datum PLyObject_ToBool(PLyObToDatum *arg, PyObject *plrv, bool *isnull, bool inarray)
void PLy_input_setup_tuple(PLyDatumToOb *arg, TupleDesc desc, PLyProcedure *proc)
PyObject * PLy_input_convert(PLyDatumToOb *arg, Datum val)
static Datum PLyObject_ToBytea(PLyObToDatum *arg, PyObject *plrv, bool *isnull, bool inarray)
static PyObject * PLyDict_FromComposite(PLyDatumToOb *arg, Datum d)
static Datum PLyObject_ToScalar(PLyObToDatum *arg, PyObject *plrv, bool *isnull, bool inarray)
static Datum PLyObject_ToTransform(PLyObToDatum *arg, PyObject *plrv, bool *isnull, bool inarray)
static PyObject * PLyLong_FromInt32(PLyDatumToOb *arg, Datum d)
static PyObject * PLyBool_FromBool(PLyDatumToOb *arg, Datum d)
void PLy_output_setup_record(PLyObToDatum *arg, TupleDesc desc, PLyProcedure *proc)
static PyObject * PLyUnicode_FromScalar(PLyDatumToOb *arg, Datum d)
static PyObject * PLyObject_FromTransform(PLyDatumToOb *arg, Datum d)
static PyObject * PLyFloat_FromFloat8(PLyDatumToOb *arg, Datum d)
static PyObject * PLyList_FromArray_recurse(PLyDatumToOb *elm, int *dims, int ndim, int dim, char **dataptr_p, bits8 **bitmap_p, int *bitmask_p)
static void PLySequence_ToArray_recurse(PyObject *obj, ArrayBuildState **astatep, int *ndims, int *dims, int cur_depth, PLyObToDatum *elm, Oid elmbasetype)
static Datum PLyObject_ToComposite(PLyObToDatum *arg, PyObject *plrv, bool *isnull, bool inarray)
static PyObject * PLyFloat_FromFloat4(PLyDatumToOb *arg, Datum d)
static PyObject * PLyLong_FromOid(PLyDatumToOb *arg, Datum d)
static Datum PLySequence_ToArray(PLyObToDatum *arg, PyObject *plrv, bool *isnull, bool inarray)
static PyObject * PLyList_FromArray(PLyDatumToOb *arg, Datum d)
static Datum PLySequence_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *sequence)
static PyObject * PLyBytes_FromBytea(PLyDatumToOb *arg, Datum d)
static Datum PLyUnicode_ToComposite(PLyObToDatum *arg, PyObject *string, bool inarray)
void PLy_output_setup_tuple(PLyObToDatum *arg, TupleDesc desc, PLyProcedure *proc)
Datum PLy_output_convert(PLyObToDatum *arg, PyObject *val, bool *isnull)
static Datum PLyObject_ToDomain(PLyObToDatum *arg, PyObject *plrv, bool *isnull, bool inarray)
static PyObject * PLyDecimal_FromNumeric(PLyDatumToOb *arg, Datum d)
static Datum PLyGenericObject_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *object, bool inarray)
PyObject * PLyUnicode_Bytes(PyObject *unicode)
PyObject * PLyUnicode_FromString(const char *s)
static bool DatumGetBool(Datum X)
static int64 DatumGetInt64(Datum X)
static Datum PointerGetDatum(const void *X)
static float4 DatumGetFloat4(Datum X)
static Oid DatumGetObjectId(Datum X)
static Datum BoolGetDatum(bool X)
static float8 DatumGetFloat8(Datum X)
static char * DatumGetCString(Datum X)
static Pointer DatumGetPointer(Datum X)
static int16 DatumGetInt16(Datum X)
static int32 DatumGetInt32(Datum X)
void check_stack_depth(void)
#define ReleaseTupleDesc(tupdesc)
#define PinTupleDesc(tupdesc)
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
#define att_align_nominal(cur_offset, attalign)
#define att_addlength_pointer(cur_offset, attlen, attptr)
static Datum fetch_att(const void *T, bool attbyval, int attlen)
TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)
#define INVALID_TUPLEDESC_IDENTIFIER
#define TYPECACHE_DOMAIN_BASE_INFO
static Size VARSIZE_ANY_EXHDR(const void *PTR)
static char * VARDATA(const void *PTR)
static char * VARDATA_ANY(const void *PTR)
static void SET_VARSIZE(void *PTR, Size len)