diff options
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/access/gist.h | 9 | ||||
| -rw-r--r-- | src/include/access/gist_private.h | 11 |
2 files changed, 18 insertions, 2 deletions
diff --git a/src/include/access/gist.h b/src/include/access/gist.h index 81e559bc2d..ea3a3b01f4 100644 --- a/src/include/access/gist.h +++ b/src/include/access/gist.h @@ -41,8 +41,11 @@ */ #define F_LEAF (1 << 0) /* leaf page */ #define F_DELETED (1 << 1) /* the page has been deleted */ -#define F_TUPLES_DELETED (1 << 2) /* some tuples on the page are dead */ +#define F_TUPLES_DELETED (1 << 2) /* some tuples on the page were + * deleted */ #define F_FOLLOW_RIGHT (1 << 3) /* page to the right has no downlink */ +#define F_HAS_GARBAGE (1 << 4) /* some tuples on the page are dead, + * but not deleted yet */ typedef XLogRecPtr GistNSN; @@ -137,6 +140,10 @@ typedef struct GISTENTRY #define GistMarkTuplesDeleted(page) ( GistPageGetOpaque(page)->flags |= F_TUPLES_DELETED) #define GistClearTuplesDeleted(page) ( GistPageGetOpaque(page)->flags &= ~F_TUPLES_DELETED) +#define GistPageHasGarbage(page) ( GistPageGetOpaque(page)->flags & F_HAS_GARBAGE) +#define GistMarkPageHasGarbage(page) ( GistPageGetOpaque(page)->flags |= F_HAS_GARBAGE) +#define GistClearPageHasGarbage(page) ( GistPageGetOpaque(page)->flags &= ~F_HAS_GARBAGE) + #define GistFollowRight(page) ( GistPageGetOpaque(page)->flags & F_FOLLOW_RIGHT) #define GistMarkFollowRight(page) ( GistPageGetOpaque(page)->flags |= F_FOLLOW_RIGHT) #define GistClearFollowRight(page) ( GistPageGetOpaque(page)->flags &= ~F_FOLLOW_RIGHT) diff --git a/src/include/access/gist_private.h b/src/include/access/gist_private.h index 4f1a5c33ea..1a77982391 100644 --- a/src/include/access/gist_private.h +++ b/src/include/access/gist_private.h @@ -22,6 +22,7 @@ #include "storage/bufmgr.h" #include "storage/buffile.h" #include "utils/hsearch.h" +#include "access/genam.h" /* * Maximum number of "halves" a page can be split into in one operation. @@ -121,9 +122,11 @@ typedef struct GISTSearchHeapItem { ItemPointerData heapPtr; bool recheck; /* T if quals must be rechecked */ - bool recheckDistances; /* T if distances must be rechecked */ + bool recheckDistances; /* T if distances must be rechecked */ IndexTuple ftup; /* data fetched back from the index, used in * index-only scans */ + OffsetNumber offnum; /* track offset in page to mark tuple as + * LP_DEAD */ } GISTSearchHeapItem; /* Unvisited item, either index page or heap tuple */ @@ -161,6 +164,12 @@ typedef struct GISTScanOpaqueData /* pre-allocated workspace arrays */ double *distances; /* output area for gistindex_keytest */ + /* info about killed items if any (killedItems is NULL if never used) */ + OffsetNumber *killedItems; /* offset numbers of killed items */ + int numKilled; /* number of currently stored items */ + BlockNumber curBlkno; /* current number of block */ + GistNSN curPageLSN; /* pos in the WAL stream when page was read */ + /* In a non-ordered search, returnable heap items are stored here: */ GISTSearchHeapItem pageData[BLCKSZ / sizeof(IndexTupleData)]; OffsetNumber nPageData; /* number of valid items in array */ |
