⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gist.h

📁 关系型数据库 Postgresql 6.5.2
💻 H
字号:
/*------------------------------------------------------------------------- * * gist.h *	  common declarations for the GiST access method code. * * * * * *------------------------------------------------------------------------- */#ifndef GIST_H#define GIST_H#include "access/funcindex.h"#include "access/itup.h"#include "access/relscan.h"#include "access/sdir.h"/*** You can have as many strategies as you please in GiSTs, as** long as your consistent method can handle them**** But strat.h->StrategyEvaluationData->StrategyExpression	expression[12]** - so 12 is real max # of strategies, or StrategyEvaluationIsValid** crashes backend...			- vadim 05/21/97#define GISTNStrategies					100*/#define GISTNStrategies					12/*** Helper routines*/#define GISTNProcs						8#define GIST_CONSISTENT_PROC			1#define GIST_UNION_PROC					2#define GIST_COMPRESS_PROC				3#define GIST_DECOMPRESS_PROC			4#define GIST_PENALTY_PROC				5#define GIST_PICKSPLIT_PROC				6#define GIST_EQUAL_PROC					7#define GIST_INFO_PROC					8#define F_LEAF			(1 << 0)typedef struct GISTPageOpaqueData{	uint32		flags;} GISTPageOpaqueData;typedef GISTPageOpaqueData *GISTPageOpaque;#define GIST_LEAF(entry) (((GISTPageOpaque) PageGetSpecialPointer((entry)->page))->flags & F_LEAF)/* *	When we descend a tree, we keep a stack of parent pointers. */typedef struct GISTSTACK{	struct GISTSTACK *gs_parent;	OffsetNumber gs_child;	BlockNumber gs_blk;} GISTSTACK;typedef struct GISTSTATE{	FmgrInfo	consistentFn;	FmgrInfo	unionFn;	FmgrInfo	compressFn;	FmgrInfo	decompressFn;	FmgrInfo	penaltyFn;	FmgrInfo	picksplitFn;	FmgrInfo	equalFn;	bool		haskeytype;	bool		keytypbyval;} GISTSTATE;/***	When we're doing a scan, we need to keep track of the parent stack**	for the marked and current items.*/typedef struct GISTScanOpaqueData{	struct GISTSTACK *s_stack;	struct GISTSTACK *s_markstk;	uint16		s_flags;	struct GISTSTATE *giststate;} GISTScanOpaqueData;typedef GISTScanOpaqueData *GISTScanOpaque;/***	When we're doing a scan and updating a tree at the same time, the**	updates may affect the scan.  We use the flags entry of the scan's**	opaque space to record our actual position in response to updates**	that we can't handle simply by adjusting pointers.*/#define GS_CURBEFORE	((uint16) (1 << 0))#define GS_MRKBEFORE	((uint16) (1 << 1))/* root page of a gist */#define GISTP_ROOT				0/***	When we update a relation on which we're doing a scan, we need to**	check the scan and fix it if the update affected any of the pages it**	touches.  Otherwise, we can miss records that we should see.  The only**	times we need to do this are for deletions and splits.	See the code in**	gistscan.c for how the scan is fixed. These two constants tell us what sort**	of operation changed the index.*/#define GISTOP_DEL		0#define GISTOP_SPLIT	1/*** This is the Split Vector to be returned by the PickSplit method.*/typedef struct GIST_SPLITVEC{	OffsetNumber *spl_left;		/* array of entries that go left */	int			spl_nleft;		/* size of this array */	char	   *spl_ldatum;		/* Union of keys in spl_left */	OffsetNumber *spl_right;	/* array of entries that go right */	int			spl_nright;		/* size of the array */	char	   *spl_rdatum;		/* Union of keys in spl_right */} GIST_SPLITVEC;/*** An entry on a GiST node.  Contains the key (pred), as well as** its own location (rel,page,offset) which can supply the matching** pointer.  The size of the pred is in bytes, and leafkey is a flag to** tell us if the entry is in a leaf node.*/typedef struct GISTENTRY{	char	   *pred;	Relation	rel;	Page		page;	OffsetNumber offset;	int			bytes;	bool		leafkey;} GISTENTRY;/*** macro to initialize a GISTENTRY*/#define gistentryinit(e, pr, r, pg, o, b, l)\   {(e).pred = pr; (e).rel = r; (e).page = pg; (e).offset = o; (e).bytes = b; (e).leafkey = l;}/* defined in gist.c */#define TRLOWER(tr) (((tr)->bytes))#define TRUPPER(tr) (&((tr)->bytes[MAXALIGN(VARSIZE(TRLOWER(tr)))]))typedef struct txtrange{	/*	 * flag: NINF means that lower is negative infinity; PINF means that *	 * upper is positive infinity.	0 means that both are numbers.	 */	int32		vl_len;	int32		flag;	char		bytes[2];} TXTRANGE;typedef struct intrange{	int			lower;	int			upper;	/*	 * flag: NINF means that lower is negative infinity; PINF means that *	 * upper is positive infinity.	0 means that both are numbers.	 */	int			flag;} INTRANGE;extern void gistbuild(Relation heap,		  Relation index, int natts,		  AttrNumber *attnum, IndexStrategy istrat,		  uint16 pint, Datum *params,		  FuncIndexInfo *finfo,		  PredInfo *predInfo);extern InsertIndexResult gistinsert(Relation r, Datum *datum,		   char *nulls, ItemPointer ht_ctid, Relation heapRel);extern void _gistdump(Relation r);extern void gistfreestack(GISTSTACK *s);extern void initGISTstate(GISTSTATE *giststate, Relation index);extern void gistdentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr,			   Relation r, Page pg, OffsetNumber o, int b, bool l);extern StrategyNumber RelationGetGISTStrategy(Relation, AttrNumber, RegProcedure);/* gistget.c */extern RetrieveIndexResult gistgettuple(IndexScanDesc s, ScanDirection dir);#endif	 /* GIST_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -