mirror of
https://github.com/postgres/postgres.git
synced 2026-02-03 20:40:14 -05:00
Now that commit fec0778c8 drew a clear line between public and private
fields in SPITupleTable, it seems pretty silly that the count of valid
tuples isn't on the public side of that line. The reason why not was
that there wasn't such a count. For reasons lost in the mists of time,
spi.c preferred to keep a count of remaining free entries in the array.
But that seems pretty pointless: it's unlike the way we handle similar
code everywhere else, and it involves extra subtractions that surely
outweigh having to do a comparison rather than test-for-zero to check
for array-full.
Hence, rearrange so that this code does the expansible array logic
the same as everywhere else, with a count of valid entries alongside
the allocated array length. And document the count as public.
I looked for core-code callers where it would make sense to start
relying on tuptable->numvals rather than the separate SPI_processed
variable. Right now there don't seem to be places where it'd be
a win to do so without more code restructuring than I care to
undertake today. In principle, though, having SPITupleTables be
fully self-contained should be helpful down the line.
Discussion: https://postgr.es/m/16852.1563395722@sss.pgh.pa.us
175 lines
6.7 KiB
C
175 lines
6.7 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* spi.h
|
|
* Server Programming Interface public declarations
|
|
*
|
|
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/executor/spi.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef SPI_H
|
|
#define SPI_H
|
|
|
|
#include "commands/trigger.h"
|
|
#include "lib/ilist.h"
|
|
#include "nodes/parsenodes.h"
|
|
#include "utils/portal.h"
|
|
|
|
|
|
typedef struct SPITupleTable
|
|
{
|
|
/* Public members */
|
|
TupleDesc tupdesc; /* tuple descriptor */
|
|
HeapTuple *vals; /* array of tuples */
|
|
uint64 numvals; /* number of valid tuples */
|
|
|
|
/* Private members, not intended for external callers */
|
|
uint64 alloced; /* allocated length of vals array */
|
|
MemoryContext tuptabcxt; /* memory context of result table */
|
|
slist_node next; /* link for internal bookkeeping */
|
|
SubTransactionId subid; /* subxact in which tuptable was created */
|
|
} SPITupleTable;
|
|
|
|
/* Plans are opaque structs for standard users of SPI */
|
|
typedef struct _SPI_plan *SPIPlanPtr;
|
|
|
|
#define SPI_ERROR_CONNECT (-1)
|
|
#define SPI_ERROR_COPY (-2)
|
|
#define SPI_ERROR_OPUNKNOWN (-3)
|
|
#define SPI_ERROR_UNCONNECTED (-4)
|
|
#define SPI_ERROR_CURSOR (-5) /* not used anymore */
|
|
#define SPI_ERROR_ARGUMENT (-6)
|
|
#define SPI_ERROR_PARAM (-7)
|
|
#define SPI_ERROR_TRANSACTION (-8)
|
|
#define SPI_ERROR_NOATTRIBUTE (-9)
|
|
#define SPI_ERROR_NOOUTFUNC (-10)
|
|
#define SPI_ERROR_TYPUNKNOWN (-11)
|
|
#define SPI_ERROR_REL_DUPLICATE (-12)
|
|
#define SPI_ERROR_REL_NOT_FOUND (-13)
|
|
|
|
#define SPI_OK_CONNECT 1
|
|
#define SPI_OK_FINISH 2
|
|
#define SPI_OK_FETCH 3
|
|
#define SPI_OK_UTILITY 4
|
|
#define SPI_OK_SELECT 5
|
|
#define SPI_OK_SELINTO 6
|
|
#define SPI_OK_INSERT 7
|
|
#define SPI_OK_DELETE 8
|
|
#define SPI_OK_UPDATE 9
|
|
#define SPI_OK_CURSOR 10
|
|
#define SPI_OK_INSERT_RETURNING 11
|
|
#define SPI_OK_DELETE_RETURNING 12
|
|
#define SPI_OK_UPDATE_RETURNING 13
|
|
#define SPI_OK_REWRITTEN 14
|
|
#define SPI_OK_REL_REGISTER 15
|
|
#define SPI_OK_REL_UNREGISTER 16
|
|
#define SPI_OK_TD_REGISTER 17
|
|
|
|
#define SPI_OPT_NONATOMIC (1 << 0)
|
|
|
|
/* These used to be functions, now just no-ops for backwards compatibility */
|
|
#define SPI_push() ((void) 0)
|
|
#define SPI_pop() ((void) 0)
|
|
#define SPI_push_conditional() false
|
|
#define SPI_pop_conditional(pushed) ((void) 0)
|
|
#define SPI_restore_connection() ((void) 0)
|
|
|
|
extern PGDLLIMPORT uint64 SPI_processed;
|
|
extern PGDLLIMPORT SPITupleTable *SPI_tuptable;
|
|
extern PGDLLIMPORT int SPI_result;
|
|
|
|
extern int SPI_connect(void);
|
|
extern int SPI_connect_ext(int options);
|
|
extern int SPI_finish(void);
|
|
extern int SPI_execute(const char *src, bool read_only, long tcount);
|
|
extern int SPI_execute_plan(SPIPlanPtr plan, Datum *Values, const char *Nulls,
|
|
bool read_only, long tcount);
|
|
extern int SPI_execute_plan_with_paramlist(SPIPlanPtr plan,
|
|
ParamListInfo params,
|
|
bool read_only, long tcount);
|
|
extern int SPI_exec(const char *src, long tcount);
|
|
extern int SPI_execp(SPIPlanPtr plan, Datum *Values, const char *Nulls,
|
|
long tcount);
|
|
extern int SPI_execute_snapshot(SPIPlanPtr plan,
|
|
Datum *Values, const char *Nulls,
|
|
Snapshot snapshot,
|
|
Snapshot crosscheck_snapshot,
|
|
bool read_only, bool fire_triggers, long tcount);
|
|
extern int SPI_execute_with_args(const char *src,
|
|
int nargs, Oid *argtypes,
|
|
Datum *Values, const char *Nulls,
|
|
bool read_only, long tcount);
|
|
extern SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes);
|
|
extern SPIPlanPtr SPI_prepare_cursor(const char *src, int nargs, Oid *argtypes,
|
|
int cursorOptions);
|
|
extern SPIPlanPtr SPI_prepare_params(const char *src,
|
|
ParserSetupHook parserSetup,
|
|
void *parserSetupArg,
|
|
int cursorOptions);
|
|
extern int SPI_keepplan(SPIPlanPtr plan);
|
|
extern SPIPlanPtr SPI_saveplan(SPIPlanPtr plan);
|
|
extern int SPI_freeplan(SPIPlanPtr plan);
|
|
|
|
extern Oid SPI_getargtypeid(SPIPlanPtr plan, int argIndex);
|
|
extern int SPI_getargcount(SPIPlanPtr plan);
|
|
extern bool SPI_is_cursor_plan(SPIPlanPtr plan);
|
|
extern bool SPI_plan_is_valid(SPIPlanPtr plan);
|
|
extern const char *SPI_result_code_string(int code);
|
|
|
|
extern List *SPI_plan_get_plan_sources(SPIPlanPtr plan);
|
|
extern CachedPlan *SPI_plan_get_cached_plan(SPIPlanPtr plan);
|
|
|
|
extern HeapTuple SPI_copytuple(HeapTuple tuple);
|
|
extern HeapTupleHeader SPI_returntuple(HeapTuple tuple, TupleDesc tupdesc);
|
|
extern HeapTuple SPI_modifytuple(Relation rel, HeapTuple tuple, int natts,
|
|
int *attnum, Datum *Values, const char *Nulls);
|
|
extern int SPI_fnumber(TupleDesc tupdesc, const char *fname);
|
|
extern char *SPI_fname(TupleDesc tupdesc, int fnumber);
|
|
extern char *SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber);
|
|
extern Datum SPI_getbinval(HeapTuple tuple, TupleDesc tupdesc, int fnumber, bool *isnull);
|
|
extern char *SPI_gettype(TupleDesc tupdesc, int fnumber);
|
|
extern Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber);
|
|
extern char *SPI_getrelname(Relation rel);
|
|
extern char *SPI_getnspname(Relation rel);
|
|
extern void *SPI_palloc(Size size);
|
|
extern void *SPI_repalloc(void *pointer, Size size);
|
|
extern void SPI_pfree(void *pointer);
|
|
extern Datum SPI_datumTransfer(Datum value, bool typByVal, int typLen);
|
|
extern void SPI_freetuple(HeapTuple pointer);
|
|
extern void SPI_freetuptable(SPITupleTable *tuptable);
|
|
|
|
extern Portal SPI_cursor_open(const char *name, SPIPlanPtr plan,
|
|
Datum *Values, const char *Nulls, bool read_only);
|
|
extern 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);
|
|
extern Portal SPI_cursor_open_with_paramlist(const char *name, SPIPlanPtr plan,
|
|
ParamListInfo params, bool read_only);
|
|
extern Portal SPI_cursor_find(const char *name);
|
|
extern void SPI_cursor_fetch(Portal portal, bool forward, long count);
|
|
extern void SPI_cursor_move(Portal portal, bool forward, long count);
|
|
extern void SPI_scroll_cursor_fetch(Portal, FetchDirection direction, long count);
|
|
extern void SPI_scroll_cursor_move(Portal, FetchDirection direction, long count);
|
|
extern void SPI_cursor_close(Portal portal);
|
|
|
|
extern int SPI_register_relation(EphemeralNamedRelation enr);
|
|
extern int SPI_unregister_relation(const char *name);
|
|
extern int SPI_register_trigger_data(TriggerData *tdata);
|
|
|
|
extern void SPI_start_transaction(void);
|
|
extern void SPI_commit(void);
|
|
extern void SPI_commit_and_chain(void);
|
|
extern void SPI_rollback(void);
|
|
extern void SPI_rollback_and_chain(void);
|
|
|
|
extern void SPICleanup(void);
|
|
extern void AtEOXact_SPI(bool isCommit);
|
|
extern void AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid);
|
|
extern bool SPI_inside_nonatomic_context(void);
|
|
|
|
#endif /* SPI_H */
|