1 /*------------------------------------------------------------------------- 2 * 3 * spi.h 4 * Server Programming Interface public declarations 5 * 6 * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group 7 * Portions Copyright (c) 1994, Regents of the University of California 8 * 9 * src/include/executor/spi.h 10 * 11 *------------------------------------------------------------------------- 12 */ 13 #ifndef SPI_H 14 #define SPI_H 15 16 #include "commands/trigger.h" 17 #include "lib/ilist.h" 18 #include "nodes/parsenodes.h" 19 #include "utils/portal.h" 20 21 22 typedef struct SPITupleTable 23 { 24 /* Public members */ 25 TupleDesc tupdesc; /* tuple descriptor */ 26 HeapTuple *vals; /* array of tuples */ 27 uint64 numvals; /* number of valid tuples */ 28 29 /* Private members, not intended for external callers */ 30 uint64 alloced; /* allocated length of vals array */ 31 MemoryContext tuptabcxt; /* memory context of result table */ 32 slist_node next; /* link for internal bookkeeping */ 33 SubTransactionId subid; /* subxact in which tuptable was created */ 34 } SPITupleTable; 35 36 /* Plans are opaque structs for standard users of SPI */ 37 typedef struct _SPI_plan *SPIPlanPtr; 38 39 #define SPI_ERROR_CONNECT (-1) 40 #define SPI_ERROR_COPY (-2) 41 #define SPI_ERROR_OPUNKNOWN (-3) 42 #define SPI_ERROR_UNCONNECTED (-4) 43 #define SPI_ERROR_CURSOR (-5) /* not used anymore */ 44 #define SPI_ERROR_ARGUMENT (-6) 45 #define SPI_ERROR_PARAM (-7) 46 #define SPI_ERROR_TRANSACTION (-8) 47 #define SPI_ERROR_NOATTRIBUTE (-9) 48 #define SPI_ERROR_NOOUTFUNC (-10) 49 #define SPI_ERROR_TYPUNKNOWN (-11) 50 #define SPI_ERROR_REL_DUPLICATE (-12) 51 #define SPI_ERROR_REL_NOT_FOUND (-13) 52 53 #define SPI_OK_CONNECT 1 54 #define SPI_OK_FINISH 2 55 #define SPI_OK_FETCH 3 56 #define SPI_OK_UTILITY 4 57 #define SPI_OK_SELECT 5 58 #define SPI_OK_SELINTO 6 59 #define SPI_OK_INSERT 7 60 #define SPI_OK_DELETE 8 61 #define SPI_OK_UPDATE 9 62 #define SPI_OK_CURSOR 10 63 #define SPI_OK_INSERT_RETURNING 11 64 #define SPI_OK_DELETE_RETURNING 12 65 #define SPI_OK_UPDATE_RETURNING 13 66 #define SPI_OK_REWRITTEN 14 67 #define SPI_OK_REL_REGISTER 15 68 #define SPI_OK_REL_UNREGISTER 16 69 #define SPI_OK_TD_REGISTER 17 70 71 #define SPI_OPT_NONATOMIC (1 << 0) 72 73 /* These used to be functions, now just no-ops for backwards compatibility */ 74 #define SPI_push() ((void) 0) 75 #define SPI_pop() ((void) 0) 76 #define SPI_push_conditional() false 77 #define SPI_pop_conditional(pushed) ((void) 0) 78 #define SPI_restore_connection() ((void) 0) 79 80 extern PGDLLIMPORT uint64 SPI_processed; 81 extern PGDLLIMPORT SPITupleTable *SPI_tuptable; 82 extern PGDLLIMPORT int SPI_result; 83 84 extern int SPI_connect(void); 85 extern int SPI_connect_ext(int options); 86 extern int SPI_finish(void); 87 extern int SPI_execute(const char *src, bool read_only, long tcount); 88 extern int SPI_execute_plan(SPIPlanPtr plan, Datum *Values, const char *Nulls, 89 bool read_only, long tcount); 90 extern int SPI_execute_plan_with_paramlist(SPIPlanPtr plan, 91 ParamListInfo params, 92 bool read_only, long tcount); 93 extern int SPI_exec(const char *src, long tcount); 94 extern int SPI_execp(SPIPlanPtr plan, Datum *Values, const char *Nulls, 95 long tcount); 96 extern int SPI_execute_snapshot(SPIPlanPtr plan, 97 Datum *Values, const char *Nulls, 98 Snapshot snapshot, 99 Snapshot crosscheck_snapshot, 100 bool read_only, bool fire_triggers, long tcount); 101 extern int SPI_execute_with_args(const char *src, 102 int nargs, Oid *argtypes, 103 Datum *Values, const char *Nulls, 104 bool read_only, long tcount); 105 extern SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes); 106 extern SPIPlanPtr SPI_prepare_cursor(const char *src, int nargs, Oid *argtypes, 107 int cursorOptions); 108 extern SPIPlanPtr SPI_prepare_params(const char *src, 109 ParserSetupHook parserSetup, 110 void *parserSetupArg, 111 int cursorOptions); 112 extern int SPI_keepplan(SPIPlanPtr plan); 113 extern SPIPlanPtr SPI_saveplan(SPIPlanPtr plan); 114 extern int SPI_freeplan(SPIPlanPtr plan); 115 116 extern Oid SPI_getargtypeid(SPIPlanPtr plan, int argIndex); 117 extern int SPI_getargcount(SPIPlanPtr plan); 118 extern bool SPI_is_cursor_plan(SPIPlanPtr plan); 119 extern bool SPI_plan_is_valid(SPIPlanPtr plan); 120 extern const char *SPI_result_code_string(int code); 121 122 extern List *SPI_plan_get_plan_sources(SPIPlanPtr plan); 123 extern CachedPlan *SPI_plan_get_cached_plan(SPIPlanPtr plan); 124 125 extern HeapTuple SPI_copytuple(HeapTuple tuple); 126 extern HeapTupleHeader SPI_returntuple(HeapTuple tuple, TupleDesc tupdesc); 127 extern HeapTuple SPI_modifytuple(Relation rel, HeapTuple tuple, int natts, 128 int *attnum, Datum *Values, const char *Nulls); 129 extern int SPI_fnumber(TupleDesc tupdesc, const char *fname); 130 extern char *SPI_fname(TupleDesc tupdesc, int fnumber); 131 extern char *SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber); 132 extern Datum SPI_getbinval(HeapTuple tuple, TupleDesc tupdesc, int fnumber, bool *isnull); 133 extern char *SPI_gettype(TupleDesc tupdesc, int fnumber); 134 extern Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber); 135 extern char *SPI_getrelname(Relation rel); 136 extern char *SPI_getnspname(Relation rel); 137 extern void *SPI_palloc(Size size); 138 extern void *SPI_repalloc(void *pointer, Size size); 139 extern void SPI_pfree(void *pointer); 140 extern Datum SPI_datumTransfer(Datum value, bool typByVal, int typLen); 141 extern void SPI_freetuple(HeapTuple pointer); 142 extern void SPI_freetuptable(SPITupleTable *tuptable); 143 144 extern Portal SPI_cursor_open(const char *name, SPIPlanPtr plan, 145 Datum *Values, const char *Nulls, bool read_only); 146 extern Portal SPI_cursor_open_with_args(const char *name, 147 const char *src, 148 int nargs, Oid *argtypes, 149 Datum *Values, const char *Nulls, 150 bool read_only, int cursorOptions); 151 extern Portal SPI_cursor_open_with_paramlist(const char *name, SPIPlanPtr plan, 152 ParamListInfo params, bool read_only); 153 extern Portal SPI_cursor_find(const char *name); 154 extern void SPI_cursor_fetch(Portal portal, bool forward, long count); 155 extern void SPI_cursor_move(Portal portal, bool forward, long count); 156 extern void SPI_scroll_cursor_fetch(Portal, FetchDirection direction, long count); 157 extern void SPI_scroll_cursor_move(Portal, FetchDirection direction, long count); 158 extern void SPI_cursor_close(Portal portal); 159 160 extern int SPI_register_relation(EphemeralNamedRelation enr); 161 extern int SPI_unregister_relation(const char *name); 162 extern int SPI_register_trigger_data(TriggerData *tdata); 163 164 extern void SPI_start_transaction(void); 165 extern void SPI_commit(void); 166 extern void SPI_commit_and_chain(void); 167 extern void SPI_rollback(void); 168 extern void SPI_rollback_and_chain(void); 169 170 extern void SPICleanup(void); 171 extern void AtEOXact_SPI(bool isCommit); 172 extern void AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid); 173 extern bool SPI_inside_nonatomic_context(void); 174 175 #endif /* SPI_H */ 176