mirror of https://github.com/postgres/postgres
external projects, we should be careful about what parts of the GiST API are considered implementation details, and which are part of the public API. Therefore, I've moved internal-only declarations into gist_private.h -- future backward-incompatible changes to gist.h should be made with care, to avoid needlessly breaking external GiST extensions. Also did some related header cleanup: remove some unnecessary #includes from gist.h, and remove some unused definitions: isAttByVal(), _gistdump(), and GISTNStrategies.REL8_1_STABLE
parent
eda6dd32d1
commit
c891e05f26
@ -0,0 +1,110 @@ |
|||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
* |
||||||
|
* gist_private.h |
||||||
|
* private declarations for GiST -- declarations related to the |
||||||
|
* internal implementation of GiST, not the public API |
||||||
|
* |
||||||
|
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group |
||||||
|
* Portions Copyright (c) 1994, Regents of the University of California |
||||||
|
* |
||||||
|
* $PostgreSQL: pgsql/src/include/access/gist_private.h,v 1.1 2005/05/17 03:34:18 neilc Exp $ |
||||||
|
* |
||||||
|
*------------------------------------------------------------------------- |
||||||
|
*/ |
||||||
|
#ifndef GIST_PRIVATE_H |
||||||
|
#define GIST_PRIVATE_H |
||||||
|
|
||||||
|
#include "access/gist.h" |
||||||
|
#include "access/xlog.h" |
||||||
|
#include "fmgr.h" |
||||||
|
|
||||||
|
/*
|
||||||
|
* When we descend a tree, we keep a stack of parent pointers. This |
||||||
|
* allows us to follow a chain of internal node points until we reach |
||||||
|
* a leaf node, and then back up the stack to re-examine the internal |
||||||
|
* nodes. |
||||||
|
* |
||||||
|
* 'parent' is the previous stack entry -- i.e. the node we arrived |
||||||
|
* from. 'block' is the node's block number. 'offset' is the offset in |
||||||
|
* the node's page that we stopped at (i.e. we followed the child |
||||||
|
* pointer located at the specified offset). |
||||||
|
*/ |
||||||
|
typedef struct GISTSTACK |
||||||
|
{ |
||||||
|
struct GISTSTACK *parent; |
||||||
|
OffsetNumber offset; |
||||||
|
BlockNumber block; |
||||||
|
} GISTSTACK; |
||||||
|
|
||||||
|
typedef struct GISTSTATE |
||||||
|
{ |
||||||
|
FmgrInfo consistentFn[INDEX_MAX_KEYS]; |
||||||
|
FmgrInfo unionFn[INDEX_MAX_KEYS]; |
||||||
|
FmgrInfo compressFn[INDEX_MAX_KEYS]; |
||||||
|
FmgrInfo decompressFn[INDEX_MAX_KEYS]; |
||||||
|
FmgrInfo penaltyFn[INDEX_MAX_KEYS]; |
||||||
|
FmgrInfo picksplitFn[INDEX_MAX_KEYS]; |
||||||
|
FmgrInfo equalFn[INDEX_MAX_KEYS]; |
||||||
|
|
||||||
|
TupleDesc tupdesc; |
||||||
|
} 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 |
||||||
|
{ |
||||||
|
GISTSTACK *stack; |
||||||
|
GISTSTACK *markstk; |
||||||
|
uint16 flags; |
||||||
|
GISTSTATE *giststate; |
||||||
|
MemoryContext tempCxt; |
||||||
|
Buffer curbuf; |
||||||
|
Buffer markbuf; |
||||||
|
} 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 index */ |
||||||
|
#define GIST_ROOT_BLKNO 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 |
||||||
|
|
||||||
|
/* gist.c */ |
||||||
|
extern Datum gistbuild(PG_FUNCTION_ARGS); |
||||||
|
extern Datum gistinsert(PG_FUNCTION_ARGS); |
||||||
|
extern Datum gistbulkdelete(PG_FUNCTION_ARGS); |
||||||
|
extern MemoryContext createTempGistContext(void); |
||||||
|
extern void initGISTstate(GISTSTATE *giststate, Relation index); |
||||||
|
extern void freeGISTstate(GISTSTATE *giststate); |
||||||
|
extern void gistdentryinit(GISTSTATE *giststate, int nkey, GISTENTRY *e, |
||||||
|
Datum k, Relation r, Page pg, OffsetNumber o, |
||||||
|
int b, bool l, bool isNull); |
||||||
|
extern void gist_redo(XLogRecPtr lsn, XLogRecord *record); |
||||||
|
extern void gist_undo(XLogRecPtr lsn, XLogRecord *record); |
||||||
|
extern void gist_desc(char *buf, uint8 xl_info, char *rec); |
||||||
|
|
||||||
|
/* gistget.c */ |
||||||
|
extern Datum gistgettuple(PG_FUNCTION_ARGS); |
||||||
|
extern Datum gistgetmulti(PG_FUNCTION_ARGS); |
||||||
|
|
||||||
|
#endif /* GIST_PRIVATE_H */ |
Loading…
Reference in new issue