69 bool read_only,
bool fire_triggers, uint64 tcount,
107 if (_SPI_stack == NULL)
234 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
235 errmsg(
"invalid transaction termination")));
248 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
249 errmsg(
"cannot commit while a subtransaction is active")));
303 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
304 errmsg(
"invalid transaction termination")));
309 (
errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
310 errmsg(
"cannot roll back while a subtransaction is active")));
379 errmsg(
"transaction left non-empty SPI stack"),
380 errhint(
"Check for missing \"SPI_finish\" calls.")));
438 if (found && isCommit)
441 errmsg(
"subtransaction left non-empty SPI stack"),
442 errhint(
"Check for missing \"SPI_finish\" calls.")));
448 if (_SPI_current && !isCommit)
468 if (tuptable->
subid >= mySubid)
477 if (tuptable == _SPI_current->
tuptable)
479 if (tuptable == SPI_tuptable)
493 if (_SPI_current == NULL)
508 if (src == NULL || tcount < 0)
524 read_only,
true, tcount, NULL);
540 bool read_only,
long tcount)
547 if (plan->
nargs > 0 && Values == NULL)
558 read_only,
true, tcount, NULL);
574 bool read_only,
long tcount)
587 read_only,
true, tcount, NULL);
602 bool read_only,
long tcount,
616 read_only,
true, tcount, dest);
639 bool read_only,
bool fire_triggers,
long tcount)
646 if (plan->
nargs > 0 && Values == NULL)
656 snapshot, crosscheck_snapshot,
657 read_only, fire_triggers, tcount, NULL);
671 int nargs,
Oid *argtypes,
673 bool read_only,
long tcount)
679 if (src == NULL || nargs < 0 || tcount < 0)
682 if (nargs > 0 && (argtypes == NULL || Values == NULL))
705 read_only,
true, tcount, NULL);
722 bool read_only,
long tcount,
728 if (src == NULL || tcount < 0)
749 read_only,
true, tcount, dest);
768 if (src == NULL || nargs < 0 || (nargs > 0 && argtypes == NULL))
804 if (src == NULL || options == NULL)
836 void *parserSetupArg,
954 if (_SPI_current == NULL)
975 if (tuple == NULL || tupdesc == NULL)
981 if (_SPI_current == NULL)
988 if (tupdesc->
tdtypeid == RECORDOID &&
1007 int numberOfAttributes;
1012 if (rel == NULL || tuple == NULL || natts < 0 || attnum == NULL || Values == NULL)
1018 if (_SPI_current == NULL)
1030 n = (
bool *)
palloc(numberOfAttributes *
sizeof(
bool));
1036 for (i = 0; i < natts; i++)
1038 if (attnum[i] <= 0 || attnum[i] > numberOfAttributes)
1040 v[attnum[
i] - 1] = Values[
i];
1041 n[attnum[
i] - 1] = (Nulls && Nulls[
i] ==
'n') ?
true :
false;
1076 for (res = 0; res < tupdesc->
natts; res++)
1080 if (
namestrcmp(&attr->attname, fname) == 0 &&
1081 !attr->attisdropped)
1087 return sysatt->attnum;
1100 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1126 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1152 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1157 return (
Datum) NULL;
1172 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1208 if (fnumber > tupdesc->
natts || fnumber == 0 ||
1236 if (_SPI_current == NULL)
1237 elog(
ERROR,
"SPI_palloc called while not connected to SPI");
1262 if (_SPI_current == NULL)
1263 elog(
ERROR,
"SPI_datumTransfer called while not connected to SPI");
1287 if (tuptable == NULL)
1293 if (_SPI_current != NULL)
1320 elog(
WARNING,
"attempt to delete invalid SPITupleTable %p", tuptable);
1325 if (tuptable == _SPI_current->
tuptable)
1327 if (tuptable == SPI_tuptable)
1328 SPI_tuptable = NULL;
1370 int nargs,
Oid *argtypes,
1372 bool read_only,
int cursorOptions)
1378 if (src == NULL || nargs < 0)
1379 elog(
ERROR,
"SPI_cursor_open_with_args called with invalid arguments");
1381 if (nargs > 0 && (argtypes == NULL || Values == NULL))
1382 elog(
ERROR,
"SPI_cursor_open_with_args called with missing parameters");
1386 elog(
ERROR,
"SPI_cursor_open_with_args called while not connected");
1437 bool read_only,
int cursorOptions)
1443 elog(
ERROR,
"SPI_cursor_parse_open_with_paramlist called with invalid arguments");
1447 elog(
ERROR,
"SPI_cursor_parse_open_with_paramlist called while not connected");
1500 (
errcode(ERRCODE_INVALID_CURSOR_DEFINITION),
1501 errmsg(
"cannot open multi-query plan as cursor")));
1504 (
errcode(ERRCODE_INVALID_CURSOR_DEFINITION),
1506 errmsg(
"cannot open %s query as cursor",
1515 elog(
ERROR,
"SPI_cursor_open called while not connected");
1519 SPI_tuptable = NULL;
1524 if (name == NULL || name[0] ==
'\0')
1546 spierrcontext.
arg = &spicallbackarg;
1612 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1613 errmsg(
"DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported"),
1614 errdetail(
"Scrollable cursors must be READ ONLY.")));
1631 foreach(lc, stmt_list)
1637 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1639 errmsg(
"%s is not allowed in a non-volatile function",
1760 elog(
ERROR,
"invalid portal in SPI cursor operation");
1773 argIndex < 0 || argIndex >= plan->
nargs)
1869 static char buf[64];
1874 return "SPI_ERROR_CONNECT";
1876 return "SPI_ERROR_COPY";
1878 return "SPI_ERROR_OPUNKNOWN";
1880 return "SPI_ERROR_UNCONNECTED";
1882 return "SPI_ERROR_ARGUMENT";
1884 return "SPI_ERROR_PARAM";
1886 return "SPI_ERROR_TRANSACTION";
1888 return "SPI_ERROR_NOATTRIBUTE";
1890 return "SPI_ERROR_NOOUTFUNC";
1892 return "SPI_ERROR_TYPUNKNOWN";
1894 return "SPI_ERROR_REL_DUPLICATE";
1896 return "SPI_ERROR_REL_NOT_FOUND";
1898 return "SPI_OK_CONNECT";
1900 return "SPI_OK_FINISH";
1902 return "SPI_OK_FETCH";
1904 return "SPI_OK_UTILITY";
1906 return "SPI_OK_SELECT";
1908 return "SPI_OK_SELINTO";
1910 return "SPI_OK_INSERT";
1912 return "SPI_OK_DELETE";
1914 return "SPI_OK_UPDATE";
1916 return "SPI_OK_CURSOR";
1918 return "SPI_OK_INSERT_RETURNING";
1920 return "SPI_OK_DELETE_RETURNING";
1922 return "SPI_OK_UPDATE_RETURNING";
1924 return "SPI_OK_REWRITTEN";
1926 return "SPI_OK_REL_REGISTER";
1928 return "SPI_OK_REL_UNREGISTER";
1931 sprintf(buf,
"Unrecognized SPI code %d", code);
1982 spierrcontext.
arg = &spicallbackarg;
2012 if (_SPI_current == NULL)
2013 elog(
ERROR,
"spi_dest_startup called while not connected to SPI");
2015 if (_SPI_current->
tuptable != NULL)
2016 elog(
ERROR,
"improper call to spi_dest_startup");
2059 if (_SPI_current == NULL)
2060 elog(
ERROR,
"spi_printtup called while not connected to SPI");
2063 if (tuptable == NULL)
2064 elog(
ERROR,
"improper call to spi_printtup");
2071 uint64 newalloced = tuptable->
alloced * 2;
2075 tuptable->
alloced = newalloced;
2106 List *raw_parsetree_list;
2107 List *plancache_list;
2115 spicallbackarg.
query = src;
2118 spierrcontext.
arg = &spicallbackarg;
2131 plancache_list =
NIL;
2133 foreach(list_item, raw_parsetree_list)
2180 plancache_list =
lappend(plancache_list, plansource);
2214 List *raw_parsetree_list;
2215 List *plancache_list;
2223 spicallbackarg.
query = src;
2226 spierrcontext.
arg = &spicallbackarg;
2238 plancache_list =
NIL;
2240 foreach(list_item, raw_parsetree_list)
2249 plancache_list =
lappend(plancache_list, plansource);
2276 bool read_only,
bool fire_triggers, uint64 tcount,
2280 uint64 my_processed = 0;
2283 bool pushed_active_snap =
false;
2292 spicallbackarg.
query = NULL;
2295 spierrcontext.
arg = &spicallbackarg;
2326 pushed_active_snap =
true;
2332 pushed_active_snap =
true;
2357 if (parsetree == NULL)
2402 if (pushed_active_snap)
2405 pushed_active_snap =
true;
2408 foreach(lc2, stmt_list)
2444 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2446 errmsg(
"%s is not allowed in a non-volatile function",
2465 else if (caller_dest)
2470 if (stmt->utilityStmt == NULL)
2482 snap, crosscheck_snapshot,
2487 canSetTag ? tcount : 0);
2566 my_tuptable = _SPI_current->
tuptable;
2604 if (pushed_active_snap)
2618 SPI_tuptable = my_tuptable;
2647 for (
int i = 0;
i < nargs;
i++)
2652 prm->
isnull = (Nulls && Nulls[
i] ==
'n');
2654 prm->
ptype = argtypes[
i];
2702 #ifdef SPI_EXECUTOR_STATS 2703 if (ShowExecutorStats)
2723 elog(
ERROR,
"consistency check on SPI tuple count failed");
2730 #ifdef SPI_EXECUTOR_STATS 2731 if (ShowExecutorStats)
2748 int syntaxerrposition;
2758 if (syntaxerrposition > 0)
2775 errcontext(
"PL/pgSQL assignment \"%s\"", query);
2797 elog(
ERROR,
"invalid portal in SPI cursor operation");
2801 elog(
ERROR,
"SPI cursor operation called while not connected");
2805 SPI_tuptable = NULL;
2826 elog(
ERROR,
"consistency check on SPI tuple count failed");
2830 SPI_tuptable = _SPI_current->
tuptable;
2862 if (_SPI_current == NULL)
2902 uint64 processed = _SPI_current->
processed;
2904 bool failed =
false;
2906 if (tuptable == NULL)
2908 else if (processed != tuptable->
numvals)
2954 if (plan->
nargs > 0)
3019 if (plan->
nargs > 0)
3046 newplan->
saved =
true;
3069 if (_SPI_current->
queryEnv == NULL)
3085 if (enr == NULL || enr->
md.
name == NULL)
3097 if (_SPI_current->
queryEnv == NULL)
int SPI_fnumber(TupleDesc tupdesc, const char *fname)
HeapTuple heap_copytuple(HeapTuple tuple)
static void _SPI_prepare_plan(const char *src, SPIPlanPtr plan)
ParamExternData params[FLEXIBLE_ARRAY_MEMBER]
ParamListInfo copyParamList(ParamListInfo from)
EphemeralNamedRelationMetadataData md
bool CommandIsReadOnly(PlannedStmt *pstmt)
void AbortCurrentTransaction(void)
Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber)
Portal CreatePortal(const char *name, bool allowDup, bool dupSilent)
TupleDesc CreateTupleDescCopy(TupleDesc tupdesc)
void UpdateActiveSnapshotCommandId(void)
#define IsA(nodeptr, _type_)
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
#define SPI_ERROR_REL_NOT_FOUND
int errhint(const char *fmt,...)
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
CachedPlan * GetCachedPlan(CachedPlanSource *plansource, ParamListInfo boundParams, bool useResOwner, QueryEnvironment *queryEnv)
#define SPI_ERROR_REL_DUPLICATE
Portal CreateNewPortal(void)
CachedPlanSource * CreateCachedPlan(RawStmt *raw_parse_tree, const char *query_string, CommandTag commandTag)
MemoryContext TopTransactionContext
HeapTupleHeader SPI_returntuple(HeapTuple tuple, TupleDesc tupdesc)
void PortalStart(Portal portal, ParamListInfo params, int eflags, Snapshot snapshot)
void SPI_freetuple(HeapTuple tuple)
#define SPI_ERROR_UNCONNECTED
static void _SPI_commit(bool chain)
CachedPlanSource * CreateOneShotCachedPlan(RawStmt *raw_parse_tree, const char *query_string, CommandTag commandTag)
SPIPlanPtr SPI_prepare_extended(const char *src, const SPIPrepareOptions *options)
int SPI_connect_ext(int options)
bool SPI_is_cursor_plan(SPIPlanPtr plan)
#define SPI_OK_DELETE_RETURNING
void FreeQueryDesc(QueryDesc *qdesc)
static int _SPI_stack_depth
void SPI_scroll_cursor_fetch(Portal portal, FetchDirection direction, long count)
void ShowUsage(const char *title)
void MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
Portal GetPortalByName(const char *name)
#define TupleDescAttr(tupdesc, i)
static const char * CreateCommandName(Node *parsetree)
char * pstrdup(const char *in)
void CommitTransactionCommand(void)
SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes)
Portal SPI_cursor_open_with_paramlist(const char *name, SPIPlanPtr plan, ParamListInfo params, bool read_only)
static EphemeralNamedRelation _SPI_find_ENR_by_name(const char *name)
#define ALLOCSET_SMALL_SIZES
uint64 PortalRunFetch(Portal portal, FetchDirection fdirection, long count, DestReceiver *dest)
void SPI_scroll_cursor_move(Portal portal, FetchDirection direction, long count)
SPIPlanPtr SPI_saveplan(SPIPlanPtr plan)
void ExecutorStart(QueryDesc *queryDesc, int eflags)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Snapshot GetActiveSnapshot(void)
static void slist_push_head(slist_head *head, slist_node *node)
void AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid)
static void _SPI_rollback(bool chain)
SPITupleTable * SPI_tuptable
#define SPI_ERROR_OPUNKNOWN
int errcode(int sqlerrcode)
static void _SPI_prepare_oneshot_plan(const char *src, SPIPlanPtr plan)
int namestrcmp(Name name, const char *str)
static int _SPI_connected
#define FirstLowInvalidHeapAttributeNumber
SubTransactionId execSubid
static _SPI_connection * _SPI_current
HeapTuple SPI_copytuple(HeapTuple tuple)
void PopActiveSnapshot(void)
Portal SPI_cursor_open(const char *name, SPIPlanPtr plan, Datum *Values, const char *Nulls, bool read_only)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
ParserSetupHook parserSetup
void PortalDefineQuery(Portal portal, const char *prepStmtName, const char *sourceText, CommandTag commandTag, List *stmts, CachedPlan *cplan)
void heap_freetuple(HeapTuple htup)
List * pg_analyze_and_rewrite(RawStmt *parsetree, const char *query_string, Oid *paramTypes, int numParams, QueryEnvironment *queryEnv)
#define linitial_node(type, l)
DestReceiver * None_Receiver
#define SPI_OK_REL_REGISTER
ParamListInfo makeParamList(int numParams)
void(* callback)(void *arg)
struct ErrorContextCallback * previous
Snapshot GetTransactionSnapshot(void)
#define DatumGetHeapTupleHeader(X)
#define SPI_ERROR_CONNECT
MemoryContext portalContext
#define CURSOR_OPT_NO_SCROLL
struct CachedPlan * gplan
SPITupleTable * outer_tuptable
char * SPI_gettype(TupleDesc tupdesc, int fnumber)
static int _SPI_begin_call(bool use_exec)
static bool _SPI_checktuples(void)
void assign_record_type_typmod(TupleDesc tupDesc)
MemoryContext PortalContext
#define slist_foreach_modify(iter, lhead)
char * SPI_fname(TupleDesc tupdesc, int fnumber)
Portal SPI_cursor_find(const char *name)
ErrorContextCallback * error_context_stack
char * SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber)
const FormData_pg_attribute * SystemAttributeDefinition(AttrNumber attno)
CachedPlan * SPI_plan_get_cached_plan(SPIPlanPtr plan)
void ExecutorEnd(QueryDesc *queryDesc)
#define SPI_ERROR_NOOUTFUNC
SubTransactionId connectSubid
#define SPI_ERROR_ARGUMENT
static void _SPI_error_callback(void *arg)
void pfree(void *pointer)
static void slist_init(slist_head *head)
#define SPI_OK_TD_REGISTER
#define ObjectIdGetDatum(X)
QueryEnvironment * queryEnv
int SPI_execute_plan_with_paramlist(SPIPlanPtr plan, ParamListInfo params, bool read_only, long tcount)
int SPI_execute_with_args(const char *src, int nargs, Oid *argtypes, Datum *Values, const char *Nulls, bool read_only, long tcount)
int SPI_exec(const char *src, long tcount)
Datum SPI_datumTransfer(Datum value, bool typByVal, int typLen)
void ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once)
#define SPI_OPT_NONATOMIC
void InitializeQueryCompletion(QueryCompletion *qc)
#define SPI_OK_INSERT_RETURNING
static SPIPlanPtr _SPI_save_plan(SPIPlanPtr plan)
void PushCopiedSnapshot(Snapshot snapshot)
QueryDesc * CreateQueryDesc(PlannedStmt *plannedstmt, const char *sourceText, Snapshot snapshot, Snapshot crosscheck_snapshot, DestReceiver *dest, ParamListInfo params, QueryEnvironment *queryEnv, int instrument_options)
int SPI_execute_plan(SPIPlanPtr plan, Datum *Values, const char *Nulls, bool read_only, long tcount)
Datum SPI_getbinval(HeapTuple tuple, TupleDesc tupdesc, int fnumber, bool *isnull)
CachedPlanSource * CopyCachedPlan(CachedPlanSource *plansource)
struct SPICallbackArg SPICallbackArg
const char * SPI_result_code_string(int code)
#define ALLOCSET_DEFAULT_SIZES
#define lfirst_node(type, lc)
void unregister_ENR(QueryEnvironment *queryEnv, const char *name)
const FormData_pg_attribute * SystemAttributeByName(const char *attname)
static int _SPI_pquery(QueryDesc *queryDesc, bool fire_triggers, uint64 tcount)
void SaveTransactionCharacteristics(void)
void(* ParserSetupHook)(struct ParseState *pstate, void *arg)
int SPI_unregister_relation(const char *name)
char * get_namespace_name(Oid nspid)
int SPI_keepplan(SPIPlanPtr plan)
void PushActiveSnapshot(Snapshot snap)
#define SPI_ERROR_NOATTRIBUTE
DestReceiver * CreateDestReceiver(CommandDest dest)
static MemoryContext _SPI_execmem(void)
int errdetail(const char *fmt,...)
int SPI_execute_plan_with_receiver(SPIPlanPtr plan, ParamListInfo params, bool read_only, long tcount, DestReceiver *dest)
#define SPI_OK_UPDATE_RETURNING
void spi_dest_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
void ReleaseCachedPlan(CachedPlan *plan, bool useResOwner)
QueryEnvironment * create_queryEnv(void)
static _SPI_connection * _SPI_stack
#define RelationGetRelationName(relation)
FormData_pg_attribute * Form_pg_attribute
bool ActiveSnapshotSet(void)
MemoryContext CurrentMemoryContext
static SPIPlanPtr _SPI_make_plan_non_temp(SPIPlanPtr plan)
int SPI_getargcount(SPIPlanPtr plan)
ParserSetupHook parserSetup
void CachedPlanSetParentContext(CachedPlanSource *plansource, MemoryContext newcontext)
HeapTuple SPI_modifytuple(Relation rel, HeapTuple tuple, int natts, int *attnum, Datum *Values, const char *Nulls)
int SPI_register_trigger_data(TriggerData *tdata)
MemoryContext TopMemoryContext
Datum heap_copy_tuple_as_datum(HeapTuple tuple, TupleDesc tupleDesc)
void ExecutorFinish(QueryDesc *queryDesc)
#define SPI_ERROR_TRANSACTION
int SPI_execute_snapshot(SPIPlanPtr plan, Datum *Values, const char *Nulls, Snapshot snapshot, Snapshot crosscheck_snapshot, bool read_only, bool fire_triggers, long tcount)
List * lappend(List *list, void *datum)
void * SPI_palloc(Size size)
static int _SPI_end_call(bool use_exec)
void register_ENR(QueryEnvironment *queryEnv, EphemeralNamedRelation enr)
#define heap_getattr(tup, attnum, tupleDesc, isnull)
void SPI_freetuptable(SPITupleTable *tuptable)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
#define MemoryContextResetAndDeleteChildren(ctx)
#define slist_container(type, membername, ptr)
static int _SPI_execute_plan(SPIPlanPtr plan, ParamListInfo paramLI, Snapshot snapshot, Snapshot crosscheck_snapshot, bool read_only, bool fire_triggers, uint64 tcount, DestReceiver *caller_dest)
void * palloc0(Size size)
void CommandCounterIncrement(void)
void ReleaseSysCache(HeapTuple tuple)
bool ExecSupportsBackwardScan(Plan *node)
int SPI_execute_with_receiver(const char *src, ParamListInfo params, bool read_only, long tcount, DestReceiver *dest)
static void _SPI_cursor_operation(Portal portal, FetchDirection direction, long count, DestReceiver *dest)
char * SPI_getrelname(Relation rel)
bool SPI_inside_nonatomic_context(void)
#define ereport(elevel,...)
static HeapTuple ExecCopySlotHeapTuple(TupleTableSlot *slot)
void SaveCachedPlan(CachedPlanSource *plansource)
int internalerrquery(const char *query)
Datum datumTransfer(Datum value, bool typByVal, int typLen)
int64 tuplestore_tuple_count(Tuplestorestate *state)
#define HeapTupleIsValid(tuple)
#define Assert(condition)
ParserSetupHook parserSetup
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)
CommandTag CreateCommandTag(Node *parsetree)
SubTransactionId GetCurrentSubTransactionId(void)
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)
void StartTransactionCommand(void)
SPIPlanPtr SPI_prepare_cursor(const char *src, int nargs, Oid *argtypes, int cursorOptions)
char * SPI_getnspname(Relation rel)
const char * query_string
void AtEOXact_SPI(bool isCommit)
void RestoreTransactionCharacteristics(void)
FormData_pg_type * Form_pg_type
static int list_length(const List *l)
void SPI_commit_and_chain(void)
#define SPI_ERROR_TYPUNKNOWN
void SPI_cursor_move(Portal portal, bool forward, long count)
#define InvalidSubTransactionId
List * pg_analyze_and_rewrite_params(RawStmt *parsetree, const char *query_string, ParserSetupHook parserSetup, void *parserSetupArg, QueryEnvironment *queryEnv)
void * repalloc(void *pointer, Size size)
struct RawStmt * raw_parse_tree
#define EXEC_FLAG_SKIP_TRIGGERS
QueryEnvironment * queryEnv
Tuplestorestate * tg_oldtable
void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *values, bool *isnull)
bool IsSubTransaction(void)
int SPI_freeplan(SPIPlanPtr plan)
void SPI_cursor_close(Portal portal)
const char * GetCommandTagName(CommandTag commandTag)
static Portal SPI_cursor_open_internal(const char *name, SPIPlanPtr plan, ParamListInfo paramLI, bool read_only)
#define CURSOR_OPT_PARALLEL_OK
bool SPI_plan_is_valid(SPIPlanPtr plan)
int SPI_register_relation(EphemeralNamedRelation enr)
char * OidOutputFunctionCall(Oid functionId, Datum val)
void * repalloc_huge(void *pointer, Size size)
int errmsg(const char *fmt,...)
void PortalDrop(Portal portal, bool isTopCommit)
Portal SPI_cursor_parse_open_with_paramlist(const char *name, const char *src, ParamListInfo params, bool read_only, int cursorOptions)
char * MemoryContextStrdup(MemoryContext context, const char *string)
void * MemoryContextAlloc(MemoryContext context, Size size)
#define CURSOR_OPT_SCROLL
int SPI_execp(SPIPlanPtr plan, Datum *Values, const char *Nulls, long tcount)
Oid SPI_getargtypeid(SPIPlanPtr plan, int argIndex)
Tuplestorestate * tg_newtable
List * SPI_plan_get_plan_sources(SPIPlanPtr plan)
void HoldPinnedPortals(void)
void SPI_cursor_fetch(Portal portal, bool forward, long count)
void DropCachedPlan(CachedPlanSource *plansource)
bool CachedPlanIsValid(CachedPlanSource *plansource)
void SPI_start_transaction(void)
struct _SPI_plan * SPIPlanPtr
static void slist_delete_current(slist_mutable_iter *iter)
void * SPI_repalloc(void *pointer, Size size)
PlannedStmt * plannedstmt
List * raw_parser(const char *str, RawParseMode mode)
static MemoryContext _SPI_procmem(void)
static ParamListInfo _SPI_convert_params(int nargs, Oid *argtypes, Datum *Values, const char *Nulls)
void ProcessUtility(PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
void SPI_rollback_and_chain(void)
void SPI_pfree(void *pointer)
int errposition(int cursorpos)
bool spi_printtup(TupleTableSlot *slot, DestReceiver *self)
SPIPlanPtr SPI_prepare_params(const char *src, ParserSetupHook parserSetup, void *parserSetupArg, int cursorOptions)
int SPI_execute(const char *src, bool read_only, long tcount)
#define SPI_OK_REL_UNREGISTER
MemoryContext CacheMemoryContext
static bool Nulls[MAXATTR]
EphemeralNamedRelation get_ENR(QueryEnvironment *queryEnv, const char *name)
int internalerrposition(int cursorpos)
#define RelationGetNamespace(relation)