62 state->funcReturnsSet =
false;
79 state->funcReturnsSet = func->funcretset;
112 bool returnsSet =
false;
118 bool first_time =
true;
147 rsinfo.
type = T_ReturnSetInfo;
179 NULL, (
Node *) &rsinfo);
196 goto no_function_result;
315 (
errcode(ERRCODE_DATATYPE_MISMATCH),
316 errmsg(
"rows returned by function are not all of the same row type")));
338 int natts = expectedDesc->
natts;
341 nullflags = (
bool *)
palloc(natts *
sizeof(
bool));
342 memset(nullflags,
true, natts *
sizeof(
bool));
365 (
errcode(ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED),
366 errmsg(
"table-function protocol for value-per-call mode was not followed")));
373 (
errcode(ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED),
374 errmsg(
"table-function protocol for materialize mode was not followed")));
380 (
errcode(ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED),
381 errmsg(
"unrecognized table-function returnMode: %d",
406 int natts = expectedDesc->
natts;
409 nullflags = (
bool *)
palloc(natts *
sizeof(
bool));
410 memset(nullflags,
true, natts *
sizeof(
bool));
450 state->funcReturnsSet =
true;
475 elog(
ERROR,
"unrecognized node type: %d",
592 rsinfo.
type = T_ReturnSetInfo;
667 (
errcode(ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED),
668 errmsg(
"table-function protocol for materialize mode was not followed")));
685 (
errcode(ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED),
686 errmsg(
"unrecognized table-function returnMode: %d",
718 (
errcode(ERRCODE_TOO_MANY_ARGUMENTS),
719 errmsg_plural(
"cannot pass more than %d argument to a function",
720 "cannot pass more than %d arguments to a function",
733 input_collation, NULL, NULL);
738 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
739 errmsg(
"set-valued function called in context that cannot accept a set"),
843 foreach(
arg, argList)
894 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
895 errmsg(
"function returning setof record called in "
896 "context that cannot accept type record")));
950 (
errcode(ERRCODE_DATATYPE_MISMATCH),
951 errmsg(
"function return row and query-specified return row do not match"),
952 errdetail_plural(
"Returned row contains %d attribute, but query expects %d.",
953 "Returned row contains %d attributes, but query expects %d.",
957 for (
i = 0;
i < dst_tupdesc->
natts;
i++)
964 if (!dattr->attisdropped)
966 (
errcode(ERRCODE_DATATYPE_MISMATCH),
967 errmsg(
"function return row and query-specified return row do not match"),
968 errdetail(
"Returned type %s at ordinal position %d, but query expects %s.",
973 if (dattr->attlen != sattr->attlen ||
974 dattr->attalign != sattr->attalign)
976 (
errcode(ERRCODE_DATATYPE_MISMATCH),
977 errmsg(
"function return row and query-specified return row do not match"),
978 errdetail(
"Physical storage mismatch on dropped attribute at ordinal position %d.",
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
elog(ERROR, "%s: %s", p2, msg)
int errmsg_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
int errdetail(const char *fmt,...)
int errdetail_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
List * ExecInitExprList(List *nodes, PlanState *parent)
ExprState * ExecInitExpr(Expr *node, PlanState *parent)
static void init_sexpr(Oid foid, Oid input_collation, Expr *node, SetExprState *sexpr, PlanState *parent, MemoryContext sexprCxt, bool allowSRF, bool needDescForSRF)
SetExprState * ExecInitTableFunctionResult(Expr *expr, ExprContext *econtext, PlanState *parent)
Tuplestorestate * ExecMakeTableFunctionResult(SetExprState *setexpr, ExprContext *econtext, MemoryContext argContext, TupleDesc expectedDesc, bool randomAccess)
Datum ExecMakeFunctionResultSet(SetExprState *fcache, ExprContext *econtext, MemoryContext argContext, bool *isNull, ExprDoneCond *isDone)
SetExprState * ExecInitFunctionResultSet(Expr *expr, ExprContext *econtext, PlanState *parent)
static void ExecEvalFuncArgs(FunctionCallInfo fcinfo, List *argList, ExprContext *econtext)
static void ShutdownSetExpr(Datum arg)
static void ExecPrepareTuplestoreResult(SetExprState *sexpr, ExprContext *econtext, Tuplestorestate *resultStore, TupleDesc resultDesc)
static void tupledesc_match(TupleDesc dst_tupdesc, TupleDesc src_tupdesc)
Datum ExecFetchSlotHeapTupleDatum(TupleTableSlot *slot)
const TupleTableSlotOps TTSOpsMinimalTuple
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
int executor_errposition(EState *estate, int location)
void RegisterExprContextCallback(ExprContext *econtext, ExprContextCallbackFunction function, Datum arg)
@ SFRM_Materialize_Preferred
@ SFRM_Materialize_Random
#define ResetExprContext(econtext)
static Datum ExecEvalExpr(ExprState *state, ExprContext *econtext, bool *isNull)
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
#define DatumGetHeapTupleHeader(X)
#define SizeForFunctionCallInfo(nargs)
#define InitFunctionCallInfoData(Fcinfo, Flinfo, Nargs, Collation, Context, Resultinfo)
struct FunctionCallInfoBaseData * FunctionCallInfo
#define FunctionCallInvoke(fcinfo)
#define fmgr_info_set_expr(expr, finfo)
TypeFuncClass get_expr_result_type(Node *expr, Oid *resultTypeId, TupleDesc *resultTupleDesc)
@ TYPEFUNC_COMPOSITE_DOMAIN
#define HeapTupleHeaderGetTypMod(tup)
#define HeapTupleHeaderGetTypeId(tup)
#define HeapTupleHeaderGetDatumLength(tup)
Assert(fmt[strlen(fmt) - 1] !='\n')
bool type_is_rowtype(Oid typid)
char * get_func_name(Oid funcid)
void MemoryContextReset(MemoryContext context)
MemoryContext CurrentMemoryContext
#define CHECK_FOR_INTERRUPTS()
Oid exprType(const Node *expr)
int exprLocation(const Node *expr)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
#define InvokeFunctionExecuteHook(objectId)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
bool IsBinaryCoercible(Oid srctype, Oid targettype)
FormData_pg_attribute * Form_pg_attribute
static int list_length(const List *l)
void pgstat_init_function_usage(FunctionCallInfo fcinfo, PgStat_FunctionCallUsage *fcu)
void pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize)
void check_stack_depth(void)
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
MemoryContext ecxt_per_tuple_memory
MemoryContext ecxt_per_query_memory
NullableDatum args[FLEXIBLE_ARRAY_MEMBER]
SetFunctionReturnMode returnMode
Tuplestorestate * setResult
TupleTableSlot * funcResultSlot
Tuplestorestate * funcResultStore
ExprState * elidedFuncState
void FreeTupleDesc(TupleDesc tupdesc)
TupleDesc CreateTemplateTupleDesc(int natts)
TupleDesc CreateTupleDescCopy(TupleDesc tupdesc)
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
#define TupleDescAttr(tupdesc, i)
bool tuplestore_gettupleslot(Tuplestorestate *state, bool forward, bool copy, TupleTableSlot *slot)
void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, Datum *values, bool *isnull)
Tuplestorestate * tuplestore_begin_heap(bool randomAccess, bool interXact, int maxKBytes)
void tuplestore_end(Tuplestorestate *state)
void tuplestore_puttuple(Tuplestorestate *state, HeapTuple tuple)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
static Datum slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull)
TupleDesc lookup_rowtype_tupdesc_copy(Oid type_id, int32 typmod)