240 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
241 errmsg(
"invalid transaction termination")));
255 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
256 errmsg(
"cannot commit while a subtransaction is active")));
340 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
341 errmsg(
"invalid transaction termination")));
346 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
347 errmsg(
"cannot roll back while a subtransaction is active")));
468 if (found && isCommit)
471 errmsg(
"transaction left non-empty SPI stack"),
472 errhint(
"Check for missing \"SPI_finish\" calls.")));
528 if (found && isCommit)
531 errmsg(
"subtransaction left non-empty SPI stack"),
532 errhint(
"Check for missing \"SPI_finish\" calls.")));
558 if (tuptable->
subid >= mySubid)
599 if (src == NULL || tcount < 0)
640 if (src == NULL ||
options == NULL)
654 plan.parserSetupArg =
options->params->parserSetupArg;
670 bool read_only,
long tcount)
678 if (
plan->nargs > 0 && Values == NULL)
731 bool read_only,
long tcount)
773 bool read_only,
bool fire_triggers,
long tcount)
781 if (
plan->nargs > 0 && Values == NULL)
795 snapshot, crosscheck_snapshot,
810 int nargs,
Oid *argtypes,
812 bool read_only,
long tcount)
819 if (src == NULL || nargs < 0 || tcount < 0)
822 if (nargs > 0 && (argtypes == NULL || Values == NULL))
834 plan.argtypes = argtypes;
835 plan.parserSetup = NULL;
836 plan.parserSetupArg = NULL;
869 if (src == NULL || nargs < 0 || (nargs > 0 && argtypes == NULL))
882 plan.cursor_options = cursorOptions;
884 plan.argtypes = argtypes;
885 plan.parserSetup = NULL;
886 plan.parserSetupArg = NULL;
905 if (src == NULL ||
options == NULL)
920 plan.argtypes = NULL;
937 void *parserSetupArg,
956 plan.cursor_options = cursorOptions;
958 plan.argtypes = NULL;
959 plan.parserSetup = parserSetup;
960 plan.parserSetupArg = parserSetupArg;
989 foreach(lc,
plan->plancache_list)
1030 foreach(lc,
plan->plancache_list)
1076 if (tuple == NULL || tupdesc == NULL)
1089 if (tupdesc->
tdtypeid == RECORDOID &&
1108 int numberOfAttributes;
1113 if (rel == NULL || tuple == NULL || natts < 0 ||
attnum == NULL || Values == NULL)
1131 n = (
bool *)
palloc(numberOfAttributes *
sizeof(
bool));
1137 for (
i = 0;
i < natts;
i++)
1181 if (
namestrcmp(&attr->attname, fname) == 0 &&
1182 !attr->attisdropped)
1188 return sysatt->attnum;
1201 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1227 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1253 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1258 return (
Datum) NULL;
1273 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1309 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1338 elog(
ERROR,
"SPI_palloc called while not connected to SPI");
1364 elog(
ERROR,
"SPI_datumTransfer called while not connected to SPI");
1388 if (tuptable == NULL)
1421 elog(
WARNING,
"attempt to delete invalid SPITupleTable %p", tuptable);
1471 int nargs,
Oid *argtypes,
1473 bool read_only,
int cursorOptions)
1479 if (src == NULL || nargs < 0)
1480 elog(
ERROR,
"SPI_cursor_open_with_args called with invalid arguments");
1482 if (nargs > 0 && (argtypes == NULL || Values == NULL))
1483 elog(
ERROR,
"SPI_cursor_open_with_args called with missing parameters");
1487 elog(
ERROR,
"SPI_cursor_open_with_args called while not connected");
1492 plan.cursor_options = cursorOptions;
1494 plan.argtypes = argtypes;
1495 plan.parserSetup = NULL;
1496 plan.parserSetupArg = NULL;
1537 if (src == NULL ||
options == NULL)
1538 elog(
ERROR,
"SPI_cursor_parse_open called with invalid arguments");
1542 elog(
ERROR,
"SPI_cursor_parse_open called while not connected");
1551 plan.parserSetupArg =
options->params->parserSetupArg;
1598 (
errcode(ERRCODE_INVALID_CURSOR_DEFINITION),
1599 errmsg(
"cannot open multi-query plan as cursor")));
1603 cmdtag =
"SELECT INTO";
1607 (
errcode(ERRCODE_INVALID_CURSOR_DEFINITION),
1609 errmsg(
"cannot open %s query as cursor", cmdtag)));
1617 elog(
ERROR,
"SPI_cursor_open called while not connected");
1626 if (
name == NULL ||
name[0] ==
'\0')
1646 spicallbackarg.
mode =
plan->parse_mode;
1648 spierrcontext.
arg = &spicallbackarg;
1714 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1715 errmsg(
"DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported"),
1716 errdetail(
"Scrollable cursors must be READ ONLY.")));
1733 foreach(lc, stmt_list)
1739 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1741 errmsg(
"%s is not allowed in a non-volatile function",
1862 elog(
ERROR,
"invalid portal in SPI cursor operation");
1875 argIndex < 0 || argIndex >=
plan->nargs)
1880 return plan->argtypes[argIndex];
1951 foreach(lc,
plan->plancache_list)
1971 static char buf[64];
1976 return "SPI_ERROR_CONNECT";
1978 return "SPI_ERROR_COPY";
1980 return "SPI_ERROR_OPUNKNOWN";
1982 return "SPI_ERROR_UNCONNECTED";
1984 return "SPI_ERROR_ARGUMENT";
1986 return "SPI_ERROR_PARAM";
1988 return "SPI_ERROR_TRANSACTION";
1990 return "SPI_ERROR_NOATTRIBUTE";
1992 return "SPI_ERROR_NOOUTFUNC";
1994 return "SPI_ERROR_TYPUNKNOWN";
1996 return "SPI_ERROR_REL_DUPLICATE";
1998 return "SPI_ERROR_REL_NOT_FOUND";
2000 return "SPI_OK_CONNECT";
2002 return "SPI_OK_FINISH";
2004 return "SPI_OK_FETCH";
2006 return "SPI_OK_UTILITY";
2008 return "SPI_OK_SELECT";
2010 return "SPI_OK_SELINTO";
2012 return "SPI_OK_INSERT";
2014 return "SPI_OK_DELETE";
2016 return "SPI_OK_UPDATE";
2018 return "SPI_OK_CURSOR";
2020 return "SPI_OK_INSERT_RETURNING";
2022 return "SPI_OK_DELETE_RETURNING";
2024 return "SPI_OK_UPDATE_RETURNING";
2026 return "SPI_OK_REWRITTEN";
2028 return "SPI_OK_REL_REGISTER";
2030 return "SPI_OK_REL_UNREGISTER";
2032 return "SPI_OK_TD_REGISTER";
2034 return "SPI_OK_MERGE";
2036 return "SPI_OK_MERGE_RETURNING";
2039 sprintf(
buf,
"Unrecognized SPI code %d", code);
2055 return plan->plancache_list;
2091 spicallbackarg.
mode =
plan->parse_mode;
2093 spierrcontext.
arg = &spicallbackarg;
2125 elog(
ERROR,
"spi_dest_startup called while not connected to SPI");
2128 elog(
ERROR,
"improper call to spi_dest_startup");
2172 elog(
ERROR,
"spi_printtup called while not connected to SPI");
2175 if (tuptable == NULL)
2176 elog(
ERROR,
"improper call to spi_printtup");
2183 uint64 newalloced = tuptable->
alloced * 2;
2187 tuptable->
alloced = newalloced;
2218 List *raw_parsetree_list;
2219 List *plancache_list;
2227 spicallbackarg.
query = src;
2228 spicallbackarg.
mode =
plan->parse_mode;
2230 spierrcontext.
arg = &spicallbackarg;
2243 plancache_list =
NIL;
2245 foreach(list_item, raw_parsetree_list)
2263 if (
plan->parserSetup != NULL)
2269 plan->parserSetupArg,
2288 plan->parserSetupArg,
2289 plan->cursor_options,
2292 plancache_list =
lappend(plancache_list, plansource);
2295 plan->plancache_list = plancache_list;
2296 plan->oneshot =
false;
2326 List *raw_parsetree_list;
2327 List *plancache_list;
2335 spicallbackarg.
query = src;
2336 spicallbackarg.
mode =
plan->parse_mode;
2338 spierrcontext.
arg = &spicallbackarg;
2350 plancache_list =
NIL;
2352 foreach(list_item, raw_parsetree_list)
2361 plancache_list =
lappend(plancache_list, plansource);
2364 plan->plancache_list = plancache_list;
2365 plan->oneshot =
true;
2399 uint64 my_processed = 0;
2402 bool pushed_active_snap =
false;
2412 spicallbackarg.
query = NULL;
2413 spicallbackarg.
mode =
plan->parse_mode;
2415 spierrcontext.
arg = &spicallbackarg;
2447 pushed_active_snap =
true;
2453 pushed_active_snap =
true;
2463 else if (plan_owner == NULL)
2474 (
errcode(ERRCODE_SYNTAX_ERROR),
2475 errmsg(
"empty query does not return tuples")));
2477 foreach(lc1,
plan->plancache_list)
2492 List *querytree_list;
2498 if (parsetree == NULL)
2499 querytree_list =
NIL;
2500 else if (
plan->parserSetup != NULL)
2506 plan->parserSetupArg,
2525 plan->parserSetupArg,
2526 plan->cursor_options,
2543 cmdtag =
"SELECT INTO";
2547 (
errcode(ERRCODE_SYNTAX_ERROR),
2549 errmsg(
"%s query does not return tuples", cmdtag)));
2590 if (pushed_active_snap)
2593 pushed_active_snap =
true;
2597 foreach(lc2, stmt_list)
2600 bool canSetTag =
stmt->canSetTag;
2613 if (
stmt->utilityStmt)
2634 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2636 errmsg(
"%s is not allowed in a non-volatile function",
2644 if (!
options->read_only && pushed_active_snap)
2661 if (
stmt->utilityStmt == NULL)
2673 snap, crosscheck_snapshot,
2679 canSetTag ?
options->tcount : 0);
2795 if (pushed_active_snap)
2838 for (
int i = 0;
i < nargs;
i++)
2845 prm->
ptype = argtypes[
i];
2899 #ifdef SPI_EXECUTOR_STATS
2900 if (ShowExecutorStats)
2920 elog(
ERROR,
"consistency check on SPI tuple count failed");
2927 #ifdef SPI_EXECUTOR_STATS
2928 if (ShowExecutorStats)
2944 const char *query = carg->
query;
2945 int syntaxerrposition;
2955 if (syntaxerrposition > 0)
2972 errcontext(
"PL/pgSQL assignment \"%s\"", query);
2994 elog(
ERROR,
"invalid portal in SPI cursor operation");
2998 elog(
ERROR,
"SPI cursor operation called while not connected");
3023 elog(
ERROR,
"consistency check on SPI tuple count failed");
3101 bool failed =
false;
3103 if (tuptable == NULL)
3105 else if (processed != tuptable->
numvals)
3151 if (
plan->nargs > 0)
3167 foreach(lc,
plan->plancache_list)
3216 if (
plan->nargs > 0)
3227 foreach(lc,
plan->plancache_list)
3243 newplan->
saved =
true;
3282 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
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_copytuple(HeapTuple tuple)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
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)
void MemoryContextReset(MemoryContext context)
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
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
static pg_noinline void Size size
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_OK_MERGE_RETURNING
#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)