14 #ifndef SPGIST_PRIVATE_H 15 #define SPGIST_PRIVATE_H 19 #include "catalog/pg_am_d.h" 32 #define SpGistGetFillFactor(relation) \ 33 (AssertMacro(relation->rd_rel->relkind == RELKIND_INDEX && \ 34 relation->rd_rel->relam == SPGIST_AM_OID), \ 35 (relation)->rd_options ? \ 36 ((SpGistOptions *) (relation)->rd_options)->fillfactor : \ 37 SPGIST_DEFAULT_FILLFACTOR) 38 #define SpGistGetTargetPageFreeSpace(relation) \ 39 (BLCKSZ * (100 - SpGistGetFillFactor(relation)) / 100) 43 #define SPGIST_METAPAGE_BLKNO (0) 44 #define SPGIST_ROOT_BLKNO (1) 45 #define SPGIST_NULL_BLKNO (2) 46 #define SPGIST_LAST_FIXED_BLKNO SPGIST_NULL_BLKNO 48 #define SpGistBlockIsRoot(blkno) \ 49 ((blkno) == SPGIST_ROOT_BLKNO || (blkno) == SPGIST_NULL_BLKNO) 50 #define SpGistBlockIsFixed(blkno) \ 51 ((BlockNumber) (blkno) <= (BlockNumber) SPGIST_LAST_FIXED_BLKNO) 68 #define SPGIST_META (1<<0) 69 #define SPGIST_DELETED (1<<1) 71 #define SPGIST_LEAF (1<<2) 72 #define SPGIST_NULLS (1<<3) 74 #define SpGistPageGetOpaque(page) ((SpGistPageOpaque) PageGetSpecialPointer(page)) 75 #define SpGistPageIsMeta(page) (SpGistPageGetOpaque(page)->flags & SPGIST_META) 76 #define SpGistPageIsDeleted(page) (SpGistPageGetOpaque(page)->flags & SPGIST_DELETED) 77 #define SpGistPageIsLeaf(page) (SpGistPageGetOpaque(page)->flags & SPGIST_LEAF) 78 #define SpGistPageStoresNulls(page) (SpGistPageGetOpaque(page)->flags & SPGIST_NULLS) 88 #define SPGIST_PAGE_ID 0xFF82 102 #define SPGIST_CACHED_PAGES 8 118 #define SPGIST_MAGIC_NUMBER (0xBA0BABEE) 120 #define SpGistPageGetMeta(p) \ 121 ((SpGistMetaPageData *) PageGetContents(p)) 168 #define SizeOfSpGistSearchItem(n_distances) \ 169 (offsetof(SpGistSearchItem, distances) + sizeof(double) * (n_distances)) 257 #define SPGIST_LIVE 0 258 #define SPGIST_REDIRECT 1 259 #define SPGIST_DEAD 2 260 #define SPGIST_PLACEHOLDER 3 284 #define SGITMAXNNODES 0x1FFF 285 #define SGITMAXPREFIXSIZE 0xFFFF 286 #define SGITMAXSIZE 0xFFFF 288 #define SGITHDRSZ MAXALIGN(sizeof(SpGistInnerTupleData)) 289 #define _SGITDATA(x) (((char *) (x)) + SGITHDRSZ) 290 #define SGITDATAPTR(x) ((x)->prefixSize ? _SGITDATA(x) : NULL) 291 #define SGITDATUM(x, s) ((x)->prefixSize ? \ 292 ((s)->attPrefixType.attbyval ? \ 293 *(Datum *) _SGITDATA(x) : \ 294 PointerGetDatum(_SGITDATA(x))) \ 296 #define SGITNODEPTR(x) ((SpGistNodeTuple) (_SGITDATA(x) + (x)->prefixSize)) 299 #define SGITITERATE(x, i, nt) \ 300 for ((i) = 0, (nt) = SGITNODEPTR(x); \ 302 (i)++, (nt) = (SpGistNodeTuple) (((char *) (nt)) + IndexTupleSize(nt))) 318 #define SGNTHDRSZ MAXALIGN(sizeof(SpGistNodeTupleData)) 319 #define SGNTDATAPTR(x) (((char *) (x)) + SGNTHDRSZ) 320 #define SGNTDATUM(x, s) ((s)->attLabelType.attbyval ? \ 321 *(Datum *) SGNTDATAPTR(x) : \ 322 PointerGetDatum(SGNTDATAPTR(x))) 361 #define SGLTHDRSZ MAXALIGN(sizeof(SpGistLeafTupleData)) 362 #define SGLTDATAPTR(x) (((char *) (x)) + SGLTHDRSZ) 363 #define SGLTDATUM(x, s) ((s)->attLeafType.attbyval ? \ 364 *(Datum *) SGLTDATAPTR(x) : \ 365 PointerGetDatum(SGLTDATAPTR(x))) 389 #define SGDTSIZE MAXALIGN(sizeof(SpGistDeadTupleData)) 399 #define SPGIST_PAGE_CAPACITY \ 400 MAXALIGN_DOWN(BLCKSZ - \ 401 SizeOfPageHeaderData - \ 402 MAXALIGN(sizeof(SpGistPageOpaqueData))) 408 #define SpGistPageGetFreeSpace(p, n) \ 409 (PageGetExactFreeSpace(p) + \ 410 Min(SpGistPageGetOpaque(p)->nPlaceholder, n) * \ 411 (SGDTSIZE + sizeof(ItemIdData))) 417 #define STORE_STATE(s, d) \ 419 (d).myXid = (s)->myXid; \ 420 (d).isBuild = (s)->isBuild; \ 434 #define GBUF_LEAF 0x03 435 #define GBUF_INNER_PARITY(x) ((x) % 3) 436 #define GBUF_NULLS 0x04 438 #define GBUF_PARITY_MASK 0x03 439 #define GBUF_REQ_LEAF(flags) (((flags) & GBUF_PARITY_MASK) == GBUF_LEAF) 440 #define GBUF_REQ_NULLS(flags) ((flags) & GBUF_NULLS) 445 #define SPGIST_MIN_FILLFACTOR 10 446 #define SPGIST_DEFAULT_FILLFACTOR 80 453 int needSpace,
bool *isNew);
461 Datum datum,
bool isnull);
465 bool hasPrefix,
Datum prefix,
477 bool *res,
bool *isnull);
484 int firststate,
int reststate,
491 ScanKey orderbys,
int norderbys);
SpGistLeafTuple spgFormLeafTuple(SpGistState *state, ItemPointer heapPtr, Datum datum, bool isnull)
SpGistTypeDesc attLeafType
SpGistCache * spgGetCache(Relation index)
SpGistPageOpaqueData * SpGistPageOpaque
SpGistTypeDesc attPrefixType
SpGistInnerTupleData * SpGistInnerTuple
void initSpGistState(SpGistState *state, Relation index)
double * spg_key_orderbys_distances(Datum key, bool isLeaf, ScanKey orderbys, int norderbys)
SpGistNodeTuple spgFormNodeTuple(SpGistState *state, Datum label, bool isnull)
void SpGistInitPage(Page page, uint16 f)
SpGistTypeDesc attLeafType
struct SpGistPageOpaqueData SpGistPageOpaqueData
struct SpGistSearchItem SpGistSearchItem
Datum * spgExtractNodeLabels(SpGistState *state, SpGistInnerTuple innerTuple)
#define FLEXIBLE_ARRAY_MEMBER
SpGistTypeDesc attLabelType
IndexTupleData SpGistNodeTupleData
struct SpGistDeadTupleData SpGistDeadTupleData
bool spgdoinsert(Relation index, SpGistState *state, ItemPointer heapPtr, Datum datum, bool isnull)
BOX * box_copy(BOX *orig)
struct SpGistLeafTupleData SpGistLeafTupleData
SpGistLUPCache lastUsedPages
struct SpGistOptions SpGistOptions
struct SpGistLastUsedPage SpGistLastUsedPage
struct SpGistTypeDesc SpGistTypeDesc
void spgUpdateNodeLink(SpGistInnerTuple tup, int nodeN, BlockNumber blkno, OffsetNumber offset)
struct SpGistMetaPageData SpGistMetaPageData
Buffer SpGistNewBuffer(Relation index)
unsigned int SpGistGetTypeSize(SpGistTypeDesc *att, Datum datum)
SpGistDeadTupleData * SpGistDeadTuple
struct SpGistLUPCache SpGistLUPCache
Buffer SpGistGetBuffer(Relation index, int flags, int needSpace, bool *isNew)
bool spgproperty(Oid index_oid, int attno, IndexAMProperty prop, const char *propname, bool *res, bool *isnull)
void spgPageIndexMultiDelete(SpGistState *state, Page page, OffsetNumber *itemnos, int nitems, int firststate, int reststate, BlockNumber blkno, OffsetNumber offnum)
SpGistDeadTuple spgFormDeadTuple(SpGistState *state, int tupstate, BlockNumber blkno, OffsetNumber offnum)
SpGistInnerTuple spgFormInnerTuple(SpGistState *state, bool hasPrefix, Datum prefix, int nNodes, SpGistNodeTuple *nodes)
void SpGistSetLastUsedPage(Relation index, Buffer buffer)
int * nonNullOrderByOffsets
SpGistLUPCache lastUsedPages
OffsetNumber SpGistPageAddNewItem(SpGistState *state, Page page, Item item, Size size, OffsetNumber *startOffset, bool errorOK)
void SpGistUpdateMetaPage(Relation index)
SpGistScanOpaqueData * SpGistScanOpaque
void SpGistInitBuffer(Buffer b, uint16 f)
FmgrInfo leafConsistentFn
FmgrInfo innerConsistentFn
#define SPGIST_CACHED_PAGES
SpGistTypeDesc attLabelType
MemoryContext traversalCxt
struct SpGistCache SpGistCache
#define MaxIndexTuplesPerPage
void SpGistInitMetapage(Page page)
SpGistTypeDesc attPrefixType
struct SpGistInnerTupleData SpGistInnerTupleData
SpGistLeafTupleData * SpGistLeafTuple
struct SpGistScanOpaqueData SpGistScanOpaqueData
struct SpGistState SpGistState
int numberOfNonNullOrderBys
SpGistNodeTupleData * SpGistNodeTuple