200 int paramno,
int location);
280 nargs *
sizeof(
Oid));
292 errmsg(
"could not determine actual type of argument declared %s",
472 int paramno =
pref->number;
486 int paramno,
int location)
506 return (
Node *) param;
578 fcache->shutdown_reg =
false;
620 fcache->func->cfunc.use_count--;
635 fcache->lazyEvalOK = lazyEvalOK;
640 fcache->next_query_index = 0;
641 fcache->error_query_index = 0;
679 if (
fcache->next_query_index >=
fcache->func->num_queries)
681 fcache->error_query_index++;
685 fcache->error_query_index++;
688 fcache->next_query_index);
689 fcache->next_query_index++;
722 foreach(
lc,
fcache->cplan->stmt_list)
737 errmsg(
"cannot COPY to/from client in an SQL function")));
743 errmsg(
"%s is not allowed in an SQL function",
751 errmsg(
"%s is not allowed in a non-volatile function",
763 newes->setsResult =
false;
764 newes->lazyEval =
false;
778 if (
fcache->next_query_index <
fcache->func->num_queries)
805 "SQL function junkfilter",
828 if (
fcache->func->rettupdesc &&
fcache->func->returnsTuple)
847 if (
fcache->func->returnsTuple)
856 if (
fcache->func->returnsSet &&
857 !
fcache->func->returnsTuple &&
865 fcache->lazyEvalOK =
true;
1080 "SQL function parse trees",
1185 errmsg(
"return type mismatch in function declared to return %s",
1187 errdetail(
"Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING.")));
1270 errmsg(
"cached plan must not change result type")));
1300 "SQL function execution",
1302 fcache->ownSubcontext =
true;
1315 "SQL function execution",
1317 fcache->ownSubcontext =
true;
1322 fcache->ownSubcontext =
false;
1466 if (
fcache->ownSubcontext)
1476 int nargs = fcinfo->
nargs;
1481 Oid *argtypes =
fcache->func->pinfo->argtypes;
1491 fcache->paramLI = paramLI;
1496 paramLI =
fcache->paramLI;
1500 for (
int i = 0;
i < nargs;
i++)
1522 prm->ptype = argtypes[
i];
1548 if (
fcache->func->returnsTuple)
1589 if (fcinfo->flinfo->fn_retset)
1604 errmsg(
"set-valued function called in context that cannot accept a set")));
1612 randomAccess =
false;
1627 fcache->tscontext = tscontext;
1628 fcache->randomAccess = randomAccess;
1682 if (!
fcache->func->readonly_func)
1714 if (completed || !
fcache->func->returnsSet)
1758 if (
fcache->func->returnsSet)
1771 slot =
fcache->junkFilter->jf_resultSlot;
1785 if (!
fcache->shutdown_reg)
1790 fcache->shutdown_reg =
true;
1793 else if (
fcache->lazyEval)
1801 fcinfo->isnull =
true;
1805 if (
fcache->shutdown_reg)
1810 fcache->shutdown_reg =
false;
1832 fcinfo->isnull =
true;
1836 if (
fcache->shutdown_reg)
1841 fcache->shutdown_reg =
false;
1853 slot =
fcache->junkFilter->jf_resultSlot;
1858 fcinfo->isnull =
true;
1866 fcinfo->isnull =
true;
1949 if (
fcache->error_query_index > 0)
1950 errcontext(
"SQL function \"%s\" statement %d",
1979 if (!
fcache->func->readonly_func)
1984 if (!
fcache->func->readonly_func)
2002 fcache->shutdown_reg =
false;
2022 fcache->func->cfunc.use_count--;
2075 errmsg(
"calling procedures with output arguments is not supported in SQL functions")));
2141 rettype, rettupdesc,
2204 tlist =
parse->targetList;
2213 parse->returningList)
2215 tlist =
parse->returningList;
2224 errmsg(
"return type mismatch in function declared to return %s",
2226 errdetail(
"Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING.")));
2262 errmsg(
"return type mismatch in function declared to return %s",
2264 errdetail(
"Final statement must return exactly one column.")));
2276 errmsg(
"return type mismatch in function declared to return %s",
2338 if (rettupdesc ==
NULL)
2366 errmsg(
"return type mismatch in function declared to return %s",
2368 errdetail(
"Final statement returns too many columns.")));
2389 }
while (attr->attisdropped);
2393 attr->atttypid, attr->atttypmod,
2399 errmsg(
"return type mismatch in function declared to return %s",
2401 errdetail(
"Final statement returns %s instead of %s at column %d.",
2413 errmsg(
"return type mismatch in function declared to return %s",
2415 errdetail(
"Final statement returns too few columns.")));
2443 errmsg(
"return type %s is not supported for SQL functions",
2472 foreach(
lc,
parse->targetList)
2487 rte->lateral =
false;
2489 rte->inFromCl =
true;
2600 return parse->targetList;
2606 parse->returningList)
2607 return parse->returningList;
#define TextDatumGetCString(d)
#define Assert(condition)
#define OidIsValid(objectId)
Datum datumCopy(Datum value, bool typByVal, int typLen)
DestReceiver * CreateDestReceiver(CommandDest dest)
DestReceiver * None_Receiver
int internalerrquery(const char *query)
int internalerrposition(int cursorpos)
int errdetail(const char *fmt,...)
ErrorContextCallback * error_context_stack
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
int errposition(int cursorpos)
#define ereport(elevel,...)
JunkFilter * ExecInitJunkFilterConversion(List *targetList, TupleDesc cleanTupType, TupleTableSlot *slot)
TupleTableSlot * ExecFilterJunk(JunkFilter *junkfilter, TupleTableSlot *slot)
JunkFilter * ExecInitJunkFilter(List *targetList, TupleTableSlot *slot)
void ExecutorEnd(QueryDesc *queryDesc)
void ExecutorFinish(QueryDesc *queryDesc)
void ExecutorStart(QueryDesc *queryDesc, int eflags)
void ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count)
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
Datum ExecFetchSlotHeapTupleDatum(TupleTableSlot *slot)
const TupleTableSlotOps TTSOpsMinimalTuple
void UnregisterExprContextCallback(ExprContext *econtext, ExprContextCallbackFunction function, Datum arg)
void RegisterExprContextCallback(ExprContext *econtext, ExprContextCallbackFunction function, Datum arg)
int ExecCleanTargetListLength(List *targetlist)
@ SFRM_Materialize_Preferred
@ SFRM_Materialize_Random
#define EXEC_FLAG_SKIP_TRIGGERS
#define MakeExpandedObjectReadOnly(d, isnull, typlen)
#define repalloc_array(pointer, type, count)
#define palloc0_object(type)
Oid get_call_expr_argtype(Node *expr, int argnum)
#define PG_GET_COLLATION()
int get_func_input_arg_names(Datum proargnames, Datum proargmodes, char ***arg_names)
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
CachedFunction * cached_function_compile(FunctionCallInfo fcinfo, CachedFunction *function, CachedFunctionCompileCallback ccallback, CachedFunctionDeleteCallback dcallback, Size cacheEntrySize, bool includeResultType, bool forValidator)
static void check_sql_fn_statement(List *queryTreeList)
static void sql_delete_callback(CachedFunction *cfunc)
static Datum postquel_get_single_result(TupleTableSlot *slot, FunctionCallInfo fcinfo, SQLFunctionCachePtr fcache)
Datum fmgr_sql(PG_FUNCTION_ARGS)
bool check_sql_fn_retval(List *queryTreeLists, Oid rettype, TupleDesc rettupdesc, char prokind, bool insertDroppedCols)
void check_sql_fn_statements(List *queryTreeLists)
static void prepare_next_query(SQLFunctionHashEntry *func)
static List * get_sql_fn_result_tlist(List *queryTreeList)
static Node * sql_fn_resolve_param_name(SQLFunctionParseInfoPtr pinfo, const char *paramname, int location)
static void sqlfunction_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
static Node * sql_fn_param_ref(ParseState *pstate, ParamRef *pref)
static bool postquel_getnext(execution_state *es, SQLFunctionCachePtr fcache)
static bool check_sql_stmt_retval(List *queryTreeList, Oid rettype, TupleDesc rettupdesc, char prokind, bool insertDroppedCols)
static void sql_compile_callback(FunctionCallInfo fcinfo, HeapTuple procedureTuple, const CachedFunctionHashKey *hashkey, CachedFunction *cfunc, bool forValidator)
static void postquel_sub_params(SQLFunctionCachePtr fcache, FunctionCallInfo fcinfo)
static bool sqlfunction_receive(TupleTableSlot *slot, DestReceiver *self)
static void postquel_start(execution_state *es, SQLFunctionCachePtr fcache)
static bool init_execution_state(SQLFunctionCachePtr fcache)
static void sql_compile_error_callback(void *arg)
DestReceiver * CreateSQLFunctionDestReceiver(void)
static void sql_postrewrite_callback(List *querytree_list, void *arg)
static void postquel_end(execution_state *es, SQLFunctionCachePtr fcache)
static void RemoveSQLFunctionCache(void *arg)
void sql_fn_parser_setup(struct ParseState *pstate, SQLFunctionParseInfoPtr pinfo)
static Node * sql_fn_post_column_ref(ParseState *pstate, ColumnRef *cref, Node *var)
static void sqlfunction_destroy(DestReceiver *self)
static void sql_exec_error_callback(void *arg)
static void sqlfunction_shutdown(DestReceiver *self)
static Node * sql_fn_make_param(SQLFunctionParseInfoPtr pinfo, int paramno, int location)
SQLFunctionParseInfoPtr prepare_sql_fn_parse_info(HeapTuple procedureTuple, Node *call_expr, Oid inputCollation)
static void ShutdownSQLFunction(Datum arg)
static bool coerce_fn_result_column(TargetEntry *src_tle, Oid res_type, int32 res_typmod, bool tlist_is_modifiable, List **upper_tlist, bool *upper_tlist_nontrivial)
static SQLFunctionCache * init_sql_fcache(FunctionCallInfo fcinfo, bool lazyEvalOK)
SQLFunctionCache * SQLFunctionCachePtr
SQLFunctionParseInfo * SQLFunctionParseInfoPtr
static void * GETSTRUCT(const HeapTupleData *tuple)
List * lappend(List *list, void *datum)
bool type_is_rowtype(Oid typid)
void get_typlenbyval(Oid typid, int16 *typlen, bool *typbyval)
Oid get_typcollation(Oid typid)
int16 get_typlen(Oid typid)
char get_typtype(Oid typid)
Alias * makeAlias(const char *aliasname, List *colnames)
Var * makeVarFromTargetEntry(int varno, TargetEntry *tle)
FromExpr * makeFromExpr(List *fromlist, Node *quals)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
Const * makeConst(Oid consttype, int32 consttypmod, Oid constcollid, int constlen, Datum constvalue, bool constisnull, bool constbyval)
char * MemoryContextStrdup(MemoryContext context, const char *string)
void * MemoryContextAlloc(MemoryContext context, Size size)
void MemoryContextReset(MemoryContext context)
void * MemoryContextAllocZero(MemoryContext context, Size size)
char * pstrdup(const char *in)
void MemoryContextRegisterResetCallback(MemoryContext context, MemoryContextCallback *cb)
void MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
void pfree(void *pointer)
MemoryContext CurrentMemoryContext
MemoryContext CacheMemoryContext
void MemoryContextDelete(MemoryContext context)
void MemoryContextSetIdentifier(MemoryContext context, const char *id)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define ALLOCSET_SMALL_SIZES
Oid exprType(const Node *expr)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
ParamListInfo makeParamList(int numParams)
void(* ParserSetupHook)(ParseState *pstate, void *arg)
Node * coerce_to_target_type(ParseState *pstate, Node *expr, Oid exprtype, Oid targettype, int32 targettypmod, CoercionContext ccontext, CoercionForm cformat, int location)
void assign_expr_collations(ParseState *pstate, Node *expr)
Node * ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, Node *last_srf, FuncCall *fn, bool proc_call, int location)
#define CURSOR_OPT_PARALLEL_OK
#define CURSOR_OPT_NO_SCROLL
FormData_pg_attribute * Form_pg_attribute
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define linitial_node(type, l)
#define foreach_current_index(var_or_cell)
static void * list_nth(const List *list, int n)
#define list_nth_node(type, list, n)
#define llast_node(type, l)
FormData_pg_proc * Form_pg_proc
void DropCachedPlan(CachedPlanSource *plansource)
void SaveCachedPlan(CachedPlanSource *plansource)
void CompleteCachedPlan(CachedPlanSource *plansource, List *querytree_list, MemoryContext querytree_context, Oid *param_types, int num_params, ParserSetupHook parserSetup, void *parserSetupArg, int cursor_options, bool fixed_result)
CachedPlan * GetCachedPlan(CachedPlanSource *plansource, ParamListInfo boundParams, ResourceOwner owner, QueryEnvironment *queryEnv)
CachedPlanSource * CreateCachedPlanForQuery(Query *analyzed_parse_tree, const char *query_string, CommandTag commandTag)
void SetPostRewriteHook(CachedPlanSource *plansource, PostRewriteHook postRewrite, void *postRewriteArg)
CachedPlanSource * CreateCachedPlan(RawStmt *raw_parse_tree, const char *query_string, CommandTag commandTag)
void ReleaseCachedPlan(CachedPlan *plan, ResourceOwner owner)
List * pg_analyze_and_rewrite_withcb(RawStmt *parsetree, const char *query_string, ParserSetupHook parserSetup, void *parserSetupArg, QueryEnvironment *queryEnv)
List * pg_parse_query(const char *query_string)
List * pg_rewrite_query(Query *query)
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
void FreeQueryDesc(QueryDesc *qdesc)
QueryDesc * CreateQueryDesc(PlannedStmt *plannedstmt, const char *sourceText, Snapshot snapshot, Snapshot crosscheck_snapshot, DestReceiver *dest, ParamListInfo params, QueryEnvironment *queryEnv, int instrument_options)
void * stringToNode(const char *str)
ResourceOwner CurrentResourceOwner
void AcquireRewriteLocks(Query *parsetree, bool forExecute, bool forUpdatePushedDown)
Snapshot GetTransactionSnapshot(void)
void PushActiveSnapshot(Snapshot snapshot)
void UpdateActiveSnapshotCommandId(void)
bool ActiveSnapshotSet(void)
void PopActiveSnapshot(void)
Snapshot GetActiveSnapshot(void)
struct ErrorContextCallback * previous
MemoryContext ecxt_per_query_memory
NullableDatum args[FLEXIBLE_ARRAY_MEMBER]
ParamExternData params[FLEXIBLE_ARRAY_MEMBER]
ParseParamRefHook p_paramref_hook
PreParseColumnRefHook p_pre_columnref_hook
PostParseColumnRefHook p_post_columnref_hook
PlannedStmt * plannedstmt
QueryEnvironment * queryEnv
SetFunctionReturnMode returnMode
Tuplestorestate * setResult
SQLFunctionHashEntry * func
execution_state * esarray
MemoryContextCallback mcb
SQLFunctionParseInfoPtr pinfo
void(* rStartup)(DestReceiver *self, int operation, TupleDesc typeinfo)
void(* rShutdown)(DestReceiver *self)
bool(* receiveSlot)(TupleTableSlot *slot, DestReceiver *self)
void(* rDestroy)(DestReceiver *self)
struct execution_state * next
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup, AttrNumber attributeNumber)
TupleDesc CreateTupleDescCopy(TupleDesc tupdesc)
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
void tuplestore_puttupleslot(Tuplestorestate *state, TupleTableSlot *slot)
Tuplestorestate * tuplestore_begin_heap(bool randomAccess, bool interXact, int maxKBytes)
void tuplestore_end(Tuplestorestate *state)
static Datum slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
static void ExecMaterializeSlot(TupleTableSlot *slot)
void ProcessUtility(PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
bool CommandIsReadOnly(PlannedStmt *pstmt)
CommandTag CreateCommandTag(Node *parsetree)
static const char * CreateCommandName(Node *parsetree)
String * makeString(char *str)
void CommandCounterIncrement(void)