241 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
242 errmsg(
"invalid transaction termination")));
256 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
257 errmsg(
"cannot commit while a subtransaction is active")));
341 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
342 errmsg(
"invalid transaction termination")));
347 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
348 errmsg(
"cannot roll back while a subtransaction is active")));
469 if (found && isCommit)
472 errmsg(
"transaction left non-empty SPI stack"),
473 errhint(
"Check for missing \"SPI_finish\" calls.")));
529 if (found && isCommit)
532 errmsg(
"subtransaction left non-empty SPI stack"),
533 errhint(
"Check for missing \"SPI_finish\" calls.")));
559 if (tuptable->
subid >= mySubid)
600 if (src == NULL || tcount < 0)
641 if (src == NULL ||
options == NULL)
655 plan.parserSetupArg =
options->params->parserSetupArg;
671 bool read_only,
long tcount)
679 if (
plan->nargs > 0 && Values == NULL)
732 bool read_only,
long tcount)
774 bool read_only,
bool fire_triggers,
long tcount)
782 if (
plan->nargs > 0 && Values == NULL)
796 snapshot, crosscheck_snapshot,
811 int nargs,
Oid *argtypes,
813 bool read_only,
long tcount)
820 if (src == NULL || nargs < 0 || tcount < 0)
823 if (nargs > 0 && (argtypes == NULL || Values == NULL))
835 plan.argtypes = argtypes;
836 plan.parserSetup = NULL;
837 plan.parserSetupArg = NULL;
870 if (src == NULL || nargs < 0 || (nargs > 0 && argtypes == NULL))
883 plan.cursor_options = cursorOptions;
885 plan.argtypes = argtypes;
886 plan.parserSetup = NULL;
887 plan.parserSetupArg = NULL;
906 if (src == NULL ||
options == NULL)
921 plan.argtypes = NULL;
938 void *parserSetupArg,
957 plan.cursor_options = cursorOptions;
959 plan.argtypes = NULL;
960 plan.parserSetup = parserSetup;
961 plan.parserSetupArg = parserSetupArg;
990 foreach(lc,
plan->plancache_list)
1031 foreach(lc,
plan->plancache_list)
1077 if (tuple == NULL || tupdesc == NULL)
1090 if (tupdesc->
tdtypeid == RECORDOID &&
1109 int numberOfAttributes;
1114 if (rel == NULL || tuple == NULL || natts < 0 ||
attnum == NULL || Values == NULL)
1132 n = (
bool *)
palloc(numberOfAttributes *
sizeof(
bool));
1138 for (
i = 0;
i < natts;
i++)
1182 if (
namestrcmp(&attr->attname, fname) == 0 &&
1183 !attr->attisdropped)
1189 return sysatt->attnum;
1202 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1228 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1254 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1259 return (
Datum) NULL;
1274 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1310 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1339 elog(
ERROR,
"SPI_palloc called while not connected to SPI");
1365 elog(
ERROR,
"SPI_datumTransfer called while not connected to SPI");
1389 if (tuptable == NULL)
1422 elog(
WARNING,
"attempt to delete invalid SPITupleTable %p", tuptable);
1472 int nargs,
Oid *argtypes,
1474 bool read_only,
int cursorOptions)
1480 if (src == NULL || nargs < 0)
1481 elog(
ERROR,
"SPI_cursor_open_with_args called with invalid arguments");
1483 if (nargs > 0 && (argtypes == NULL || Values == NULL))
1484 elog(
ERROR,
"SPI_cursor_open_with_args called with missing parameters");
1488 elog(
ERROR,
"SPI_cursor_open_with_args called while not connected");
1493 plan.cursor_options = cursorOptions;
1495 plan.argtypes = argtypes;
1496 plan.parserSetup = NULL;
1497 plan.parserSetupArg = NULL;
1538 if (src == NULL ||
options == NULL)
1539 elog(
ERROR,
"SPI_cursor_parse_open called with invalid arguments");
1543 elog(
ERROR,
"SPI_cursor_parse_open called while not connected");
1552 plan.parserSetupArg =
options->params->parserSetupArg;
1599 (
errcode(ERRCODE_INVALID_CURSOR_DEFINITION),
1600 errmsg(
"cannot open multi-query plan as cursor")));
1604 cmdtag =
"SELECT INTO";
1608 (
errcode(ERRCODE_INVALID_CURSOR_DEFINITION),
1610 errmsg(
"cannot open %s query as cursor", cmdtag)));
1618 elog(
ERROR,
"SPI_cursor_open called while not connected");
1627 if (
name == NULL ||
name[0] ==
'\0')
1647 spicallbackarg.
mode =
plan->parse_mode;
1649 spierrcontext.
arg = &spicallbackarg;
1715 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1716 errmsg(
"DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported"),
1717 errdetail(
"Scrollable cursors must be READ ONLY.")));
1734 foreach(lc, stmt_list)
1740 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1742 errmsg(
"%s is not allowed in a non-volatile function",
1863 elog(
ERROR,
"invalid portal in SPI cursor operation");
1876 argIndex < 0 || argIndex >=
plan->nargs)
1881 return plan->argtypes[argIndex];
1952 foreach(lc,
plan->plancache_list)
1972 static char buf[64];
1977 return "SPI_ERROR_CONNECT";
1979 return "SPI_ERROR_COPY";
1981 return "SPI_ERROR_OPUNKNOWN";
1983 return "SPI_ERROR_UNCONNECTED";
1985 return "SPI_ERROR_ARGUMENT";
1987 return "SPI_ERROR_PARAM";
1989 return "SPI_ERROR_TRANSACTION";
1991 return "SPI_ERROR_NOATTRIBUTE";
1993 return "SPI_ERROR_NOOUTFUNC";
1995 return "SPI_ERROR_TYPUNKNOWN";
1997 return "SPI_ERROR_REL_DUPLICATE";
1999 return "SPI_ERROR_REL_NOT_FOUND";
2001 return "SPI_OK_CONNECT";
2003 return "SPI_OK_FINISH";
2005 return "SPI_OK_FETCH";
2007 return "SPI_OK_UTILITY";
2009 return "SPI_OK_SELECT";
2011 return "SPI_OK_SELINTO";
2013 return "SPI_OK_INSERT";
2015 return "SPI_OK_DELETE";
2017 return "SPI_OK_UPDATE";
2019 return "SPI_OK_CURSOR";
2021 return "SPI_OK_INSERT_RETURNING";
2023 return "SPI_OK_DELETE_RETURNING";
2025 return "SPI_OK_UPDATE_RETURNING";
2027 return "SPI_OK_REWRITTEN";
2029 return "SPI_OK_REL_REGISTER";
2031 return "SPI_OK_REL_UNREGISTER";
2033 return "SPI_OK_TD_REGISTER";
2035 return "SPI_OK_MERGE";
2038 sprintf(
buf,
"Unrecognized SPI code %d", code);
2054 return plan->plancache_list;
2090 spicallbackarg.
mode =
plan->parse_mode;
2092 spierrcontext.
arg = &spicallbackarg;
2124 elog(
ERROR,
"spi_dest_startup called while not connected to SPI");
2127 elog(
ERROR,
"improper call to spi_dest_startup");
2171 elog(
ERROR,
"spi_printtup called while not connected to SPI");
2174 if (tuptable == NULL)
2175 elog(
ERROR,
"improper call to spi_printtup");
2182 uint64 newalloced = tuptable->
alloced * 2;
2186 tuptable->
alloced = newalloced;
2217 List *raw_parsetree_list;
2218 List *plancache_list;
2226 spicallbackarg.
query = src;
2227 spicallbackarg.
mode =
plan->parse_mode;
2229 spierrcontext.
arg = &spicallbackarg;
2242 plancache_list =
NIL;
2244 foreach(list_item, raw_parsetree_list)
2262 if (
plan->parserSetup != NULL)
2268 plan->parserSetupArg,
2287 plan->parserSetupArg,
2288 plan->cursor_options,
2291 plancache_list =
lappend(plancache_list, plansource);
2294 plan->plancache_list = plancache_list;
2295 plan->oneshot =
false;
2325 List *raw_parsetree_list;
2326 List *plancache_list;
2334 spicallbackarg.
query = src;
2335 spicallbackarg.
mode =
plan->parse_mode;
2337 spierrcontext.
arg = &spicallbackarg;
2349 plancache_list =
NIL;
2351 foreach(list_item, raw_parsetree_list)
2360 plancache_list =
lappend(plancache_list, plansource);
2363 plan->plancache_list = plancache_list;
2364 plan->oneshot =
true;
2398 uint64 my_processed = 0;
2401 bool pushed_active_snap =
false;
2411 spicallbackarg.
query = NULL;
2412 spicallbackarg.
mode =
plan->parse_mode;
2414 spierrcontext.
arg = &spicallbackarg;
2446 pushed_active_snap =
true;
2452 pushed_active_snap =
true;
2462 else if (plan_owner == NULL)
2473 (
errcode(ERRCODE_SYNTAX_ERROR),
2474 errmsg(
"empty query does not return tuples")));
2476 foreach(lc1,
plan->plancache_list)
2491 List *querytree_list;
2497 if (parsetree == NULL)
2498 querytree_list =
NIL;
2499 else if (
plan->parserSetup != NULL)
2505 plan->parserSetupArg,
2524 plan->parserSetupArg,
2525 plan->cursor_options,
2542 cmdtag =
"SELECT INTO";
2546 (
errcode(ERRCODE_SYNTAX_ERROR),
2548 errmsg(
"%s query does not return tuples", cmdtag)));
2589 if (pushed_active_snap)
2592 pushed_active_snap =
true;
2596 foreach(lc2, stmt_list)
2599 bool canSetTag =
stmt->canSetTag;
2612 if (
stmt->utilityStmt)
2633 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2635 errmsg(
"%s is not allowed in a non-volatile function",
2643 if (!
options->read_only && pushed_active_snap)
2660 if (
stmt->utilityStmt == NULL)
2672 snap, crosscheck_snapshot,
2678 canSetTag ?
options->tcount : 0);
2794 if (pushed_active_snap)
2837 for (
int i = 0;
i < nargs;
i++)
2844 prm->
ptype = argtypes[
i];
2895 #ifdef SPI_EXECUTOR_STATS
2896 if (ShowExecutorStats)
2916 elog(
ERROR,
"consistency check on SPI tuple count failed");
2923 #ifdef SPI_EXECUTOR_STATS
2924 if (ShowExecutorStats)
2940 const char *query = carg->
query;
2941 int syntaxerrposition;
2951 if (syntaxerrposition > 0)
2968 errcontext(
"PL/pgSQL assignment \"%s\"", query);
2990 elog(
ERROR,
"invalid portal in SPI cursor operation");
2994 elog(
ERROR,
"SPI cursor operation called while not connected");
3019 elog(
ERROR,
"consistency check on SPI tuple count failed");
3097 bool failed =
false;
3099 if (tuptable == NULL)
3101 else if (processed != tuptable->
numvals)
3147 if (
plan->nargs > 0)
3163 foreach(lc,
plan->plancache_list)
3212 if (
plan->nargs > 0)
3223 foreach(lc,
plan->plancache_list)
3239 newplan->
saved =
true;
3278 if (enr == NULL || enr->
md.
name == NULL)
List * raw_parser(const char *str, RawParseMode mode)
static bool Nulls[MAXATTR]
#define InvalidSubTransactionId
void InitializeQueryCompletion(QueryCompletion *qc)
const char * GetCommandTagName(CommandTag commandTag)
Datum datumTransfer(Datum value, bool typByVal, int typLen)
static void PGresult * res
elog(ERROR, "%s: %s", p2, msg)
DestReceiver * None_Receiver
DestReceiver * CreateDestReceiver(CommandDest dest)
int internalerrquery(const char *query)
int internalerrposition(int cursorpos)
int errdetail(const char *fmt,...)
ErrorContextCallback * error_context_stack
void ReThrowError(ErrorData *edata)
void FlushErrorState(void)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
int errposition(int cursorpos)
ErrorData * CopyErrorData(void)
#define ereport(elevel,...)
bool ExecSupportsBackwardScan(Plan *node)
void ExecutorEnd(QueryDesc *queryDesc)
void ExecutorFinish(QueryDesc *queryDesc)
void ExecutorStart(QueryDesc *queryDesc, int eflags)
void ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once)
#define EXEC_FLAG_SKIP_TRIGGERS
char * OidOutputFunctionCall(Oid functionId, Datum val)
#define DatumGetHeapTupleHeader(X)
const FormData_pg_attribute * SystemAttributeDefinition(AttrNumber attno)
const FormData_pg_attribute * SystemAttributeByName(const char *attname)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
HeapTuple heap_copytuple(HeapTuple tuple)
void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *values, bool *isnull)
Datum heap_copy_tuple_as_datum(HeapTuple tuple, TupleDesc tupleDesc)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static Datum heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
static void slist_delete_current(slist_mutable_iter *iter)
#define slist_foreach_modify(iter, lhead)
static void slist_init(slist_head *head)
static void slist_push_head(slist_head *head, slist_node *node)
#define slist_container(type, membername, ptr)
if(TABLE==NULL||TABLE_index==NULL)
Assert(fmt[strlen(fmt) - 1] !='\n')
List * lappend(List *list, void *datum)
char * get_namespace_name(Oid nspid)
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
MemoryContext TopTransactionContext
void MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext TopMemoryContext
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
void * repalloc(void *pointer, Size size)
void * MemoryContextAlloc(MemoryContext context, Size size)
char * MemoryContextStrdup(MemoryContext context, const char *string)
MemoryContext CacheMemoryContext
void MemoryContextDelete(MemoryContext context)
MemoryContext PortalContext
void * repalloc_huge(void *pointer, Size size)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define ALLOCSET_SMALL_SIZES
#define MemoryContextResetAndDeleteChildren(ctx)
int namestrcmp(Name name, const char *str)
#define IsA(nodeptr, _type_)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
ParamListInfo makeParamList(int numParams)
ParamListInfo copyParamList(ParamListInfo from)
void(* ParserSetupHook)(struct ParseState *pstate, void *arg)
#define CURSOR_OPT_SCROLL
#define CURSOR_OPT_PARALLEL_OK
#define CURSOR_OPT_NO_SCROLL
@ RAW_PARSE_PLPGSQL_ASSIGN2
@ RAW_PARSE_PLPGSQL_ASSIGN1
@ RAW_PARSE_PLPGSQL_ASSIGN3
FormData_pg_attribute * Form_pg_attribute
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define linitial_node(type, l)
FormData_pg_type * Form_pg_type
void CachedPlanSetParentContext(CachedPlanSource *plansource, MemoryContext newcontext)
bool CachedPlanIsValid(CachedPlanSource *plansource)
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)
CachedPlanSource * CreateCachedPlan(RawStmt *raw_parse_tree, const char *query_string, CommandTag commandTag)
CachedPlan * GetCachedPlan(CachedPlanSource *plansource, ParamListInfo boundParams, ResourceOwner owner, QueryEnvironment *queryEnv)
void ReleaseCachedPlan(CachedPlan *plan, ResourceOwner owner)
CachedPlanSource * CreateOneShotCachedPlan(RawStmt *raw_parse_tree, const char *query_string, CommandTag commandTag)
CachedPlanSource * CopyCachedPlan(CachedPlanSource *plansource)
Portal CreateNewPortal(void)
void HoldPinnedPortals(void)
void PortalDrop(Portal portal, bool isTopCommit)
Portal GetPortalByName(const char *name)
void PortalDefineQuery(Portal portal, const char *prepStmtName, const char *sourceText, CommandTag commandTag, List *stmts, CachedPlan *cplan)
Portal CreatePortal(const char *name, bool allowDup, bool dupSilent)
void ForgetPortalSnapshots(void)
List * pg_analyze_and_rewrite_withcb(RawStmt *parsetree, const char *query_string, ParserSetupHook parserSetup, void *parserSetupArg, QueryEnvironment *queryEnv)
void ShowUsage(const char *title)
List * pg_analyze_and_rewrite_fixedparams(RawStmt *parsetree, const char *query_string, const Oid *paramTypes, int numParams, QueryEnvironment *queryEnv)
static Datum ObjectIdGetDatum(Oid X)
void FreeQueryDesc(QueryDesc *qdesc)
bool PlannedStmtRequiresSnapshot(PlannedStmt *pstmt)
void EnsurePortalSnapshotExists(void)
void PortalStart(Portal portal, ParamListInfo params, int eflags, Snapshot snapshot)
QueryDesc * CreateQueryDesc(PlannedStmt *plannedstmt, const char *sourceText, Snapshot snapshot, Snapshot crosscheck_snapshot, DestReceiver *dest, ParamListInfo params, QueryEnvironment *queryEnv, int instrument_options)
uint64 PortalRunFetch(Portal portal, FetchDirection fdirection, long count, DestReceiver *dest)
EphemeralNamedRelation get_ENR(QueryEnvironment *queryEnv, const char *name)
void unregister_ENR(QueryEnvironment *queryEnv, const char *name)
QueryEnvironment * create_queryEnv(void)
void register_ENR(QueryEnvironment *queryEnv, EphemeralNamedRelation enr)
#define RelationGetRelationName(relation)
#define RelationGetNamespace(relation)
ResourceOwner CurrentResourceOwner
Snapshot GetTransactionSnapshot(void)
void PushActiveSnapshot(Snapshot snapshot)
void UpdateActiveSnapshotCommandId(void)
bool ActiveSnapshotSet(void)
void PopActiveSnapshot(void)
void PushCopiedSnapshot(Snapshot snapshot)
Snapshot GetActiveSnapshot(void)
void AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid)
SPIPlanPtr SPI_prepare_cursor(const char *src, int nargs, Oid *argtypes, int cursorOptions)
static int _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options, Snapshot snapshot, Snapshot crosscheck_snapshot, bool fire_triggers)
int SPI_execute_plan_with_paramlist(SPIPlanPtr plan, ParamListInfo params, bool read_only, long tcount)
bool spi_printtup(TupleTableSlot *slot, DestReceiver *self)
static void _SPI_error_callback(void *arg)
char * SPI_getrelname(Relation rel)
CachedPlan * SPI_plan_get_cached_plan(SPIPlanPtr plan)
static int _SPI_connected
void SPI_scroll_cursor_move(Portal portal, FetchDirection direction, long count)
static SPIPlanPtr _SPI_save_plan(SPIPlanPtr plan)
void SPI_cursor_move(Portal portal, bool forward, long count)
void SPI_freetuple(HeapTuple tuple)
int SPI_fnumber(TupleDesc tupdesc, const char *fname)
void spi_dest_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
static int _SPI_end_call(bool use_exec)
bool SPI_plan_is_valid(SPIPlanPtr plan)
void SPI_commit_and_chain(void)
bool SPI_is_cursor_plan(SPIPlanPtr plan)
SPIPlanPtr SPI_prepare_extended(const char *src, const SPIPrepareOptions *options)
Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber)
static _SPI_connection * _SPI_stack
HeapTupleHeader SPI_returntuple(HeapTuple tuple, TupleDesc tupdesc)
int SPI_freeplan(SPIPlanPtr plan)
void SPI_rollback_and_chain(void)
SPITupleTable * SPI_tuptable
static int _SPI_pquery(QueryDesc *queryDesc, bool fire_triggers, uint64 tcount)
Portal SPI_cursor_find(const char *name)
int SPI_unregister_relation(const char *name)
bool SPI_inside_nonatomic_context(void)
static void _SPI_cursor_operation(Portal portal, FetchDirection direction, long count, DestReceiver *dest)
int SPI_execute_snapshot(SPIPlanPtr plan, Datum *Values, const char *Nulls, Snapshot snapshot, Snapshot crosscheck_snapshot, bool read_only, bool fire_triggers, long tcount)
int SPI_execute_plan_extended(SPIPlanPtr plan, const SPIExecuteOptions *options)
SPIPlanPtr SPI_prepare_params(const char *src, ParserSetupHook parserSetup, void *parserSetupArg, int cursorOptions)
SPIPlanPtr SPI_saveplan(SPIPlanPtr plan)
const char * SPI_result_code_string(int code)
void SPI_cursor_fetch(Portal portal, bool forward, long count)
Portal SPI_cursor_parse_open(const char *name, const char *src, const SPIParseOpenOptions *options)
int SPI_execute_plan(SPIPlanPtr plan, Datum *Values, const char *Nulls, bool read_only, long tcount)
static _SPI_connection * _SPI_current
Datum SPI_datumTransfer(Datum value, bool typByVal, int typLen)
int SPI_register_trigger_data(TriggerData *tdata)
static int _SPI_stack_depth
static void _SPI_prepare_plan(const char *src, SPIPlanPtr plan)
Portal SPI_cursor_open_with_paramlist(const char *name, SPIPlanPtr plan, ParamListInfo params, bool read_only)
Portal SPI_cursor_open_with_args(const char *name, const char *src, int nargs, Oid *argtypes, Datum *Values, const char *Nulls, bool read_only, int cursorOptions)
void SPI_freetuptable(SPITupleTable *tuptable)
Portal SPI_cursor_open(const char *name, SPIPlanPtr plan, Datum *Values, const char *Nulls, bool read_only)
void * SPI_repalloc(void *pointer, Size size)
int SPI_exec(const char *src, long tcount)
static int _SPI_begin_call(bool use_exec)
static ParamListInfo _SPI_convert_params(int nargs, Oid *argtypes, Datum *Values, const char *Nulls)
int SPI_register_relation(EphemeralNamedRelation enr)
HeapTuple SPI_modifytuple(Relation rel, HeapTuple tuple, int natts, int *attnum, Datum *Values, const char *Nulls)
SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes)
int SPI_keepplan(SPIPlanPtr plan)
void SPI_cursor_close(Portal portal)
void SPI_pfree(void *pointer)
char * SPI_getnspname(Relation rel)
int SPI_connect_ext(int options)
int SPI_execp(SPIPlanPtr plan, Datum *Values, const char *Nulls, long tcount)
static void _SPI_prepare_oneshot_plan(const char *src, SPIPlanPtr plan)
void SPI_scroll_cursor_fetch(Portal portal, FetchDirection direction, long count)
char * SPI_gettype(TupleDesc tupdesc, int fnumber)
static void _SPI_commit(bool chain)
int SPI_execute_extended(const char *src, const SPIExecuteOptions *options)
static Portal SPI_cursor_open_internal(const char *name, SPIPlanPtr plan, ParamListInfo paramLI, bool read_only)
List * SPI_plan_get_plan_sources(SPIPlanPtr plan)
void * SPI_palloc(Size size)
static bool _SPI_checktuples(void)
char * SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber)
static EphemeralNamedRelation _SPI_find_ENR_by_name(const char *name)
static MemoryContext _SPI_execmem(void)
static MemoryContext _SPI_procmem(void)
int SPI_execute_with_args(const char *src, int nargs, Oid *argtypes, Datum *Values, const char *Nulls, bool read_only, long tcount)
char * SPI_fname(TupleDesc tupdesc, int fnumber)
void SPI_start_transaction(void)
HeapTuple SPI_copytuple(HeapTuple tuple)
int SPI_getargcount(SPIPlanPtr plan)
struct SPICallbackArg SPICallbackArg
void AtEOXact_SPI(bool isCommit)
int SPI_execute(const char *src, bool read_only, long tcount)
Datum SPI_getbinval(HeapTuple tuple, TupleDesc tupdesc, int fnumber, bool *isnull)
static void _SPI_rollback(bool chain)
Oid SPI_getargtypeid(SPIPlanPtr plan, int argIndex)
static SPIPlanPtr _SPI_make_plan_non_temp(SPIPlanPtr plan)
#define SPI_ERROR_TRANSACTION
#define SPI_ERROR_REL_NOT_FOUND
#define SPI_ERROR_REL_DUPLICATE
#define SPI_OPT_NONATOMIC
#define SPI_OK_TD_REGISTER
#define SPI_OK_REL_REGISTER
#define SPI_ERROR_OPUNKNOWN
#define SPI_OK_UPDATE_RETURNING
#define SPI_ERROR_UNCONNECTED
#define SPI_OK_REL_UNREGISTER
#define SPI_ERROR_ARGUMENT
#define SPI_ERROR_NOATTRIBUTE
#define SPI_OK_INSERT_RETURNING
#define SPI_ERROR_NOOUTFUNC
#define SPI_OK_DELETE_RETURNING
struct _SPI_plan * SPIPlanPtr
#define SPI_ERROR_TYPUNKNOWN
#define SPI_ERROR_CONNECT
struct CachedPlan * gplan
const char * query_string
struct RawStmt * raw_parse_tree
EphemeralNamedRelationMetadataData md
struct ErrorContextCallback * previous
void(* callback)(void *arg)
ParamExternData params[FLEXIBLE_ARRAY_MEMBER]
QueryEnvironment * queryEnv
MemoryContext portalContext
PlannedStmt * plannedstmt
Tuplestorestate * tg_oldtable
Tuplestorestate * tg_newtable
SubTransactionId connectSubid
SPITupleTable * outer_tuptable
QueryEnvironment * queryEnv
SubTransactionId execSubid
ParserSetupHook parserSetup
#define FirstLowInvalidHeapAttributeNumber
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
TupleDesc CreateTupleDescCopy(TupleDesc tupdesc)
#define TupleDescAttr(tupdesc, i)
int64 tuplestore_tuple_count(Tuplestorestate *state)
static HeapTuple ExecCopySlotHeapTuple(TupleTableSlot *slot)
void assign_record_type_typmod(TupleDesc tupDesc)
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)
@ PROCESS_UTILITY_QUERY_NONATOMIC
void SaveTransactionCharacteristics(SavedTransactionCharacteristics *s)
void RestoreTransactionCharacteristics(const SavedTransactionCharacteristics *s)
SubTransactionId GetCurrentSubTransactionId(void)
void CommandCounterIncrement(void)
void StartTransactionCommand(void)
bool IsSubTransaction(void)
void CommitTransactionCommand(void)
void AbortCurrentTransaction(void)