PostgreSQL Source Code git master
Loading...
Searching...
No Matches
ginblock.h File Reference
#include "access/transam.h"
#include "storage/block.h"
#include "storage/bufpage.h"
#include "storage/itemptr.h"
#include "storage/off.h"
Include dependency graph for ginblock.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  GinPageOpaqueData
 
struct  GinMetaPageData
 
struct  PostingItem
 
struct  GinPostingList
 

Macros

#define GIN_DATA   (1 << 0)
 
#define GIN_LEAF   (1 << 1)
 
#define GIN_DELETED   (1 << 2)
 
#define GIN_META   (1 << 3)
 
#define GIN_LIST   (1 << 4)
 
#define GIN_LIST_FULLROW   (1 << 5) /* makes sense only on GIN_LIST page */
 
#define GIN_INCOMPLETE_SPLIT
 
#define GIN_COMPRESSED   (1 << 7)
 
#define GIN_METAPAGE_BLKNO   (0)
 
#define GIN_ROOT_BLKNO   (1)
 
#define GIN_CURRENT_VERSION   2
 
#define GinPageGetMeta(p)    ((GinMetaPageData *) PageGetContents(p))
 
#define GinPageGetOpaque(page)   ( (GinPageOpaque) PageGetSpecialPointer(page) )
 
#define GinPageIsLeaf(page)   ( (GinPageGetOpaque(page)->flags & GIN_LEAF) != 0 )
 
#define GinPageSetLeaf(page)   ( GinPageGetOpaque(page)->flags |= GIN_LEAF )
 
#define GinPageSetNonLeaf(page)   ( GinPageGetOpaque(page)->flags &= ~GIN_LEAF )
 
#define GinPageIsData(page)   ( (GinPageGetOpaque(page)->flags & GIN_DATA) != 0 )
 
#define GinPageSetData(page)   ( GinPageGetOpaque(page)->flags |= GIN_DATA )
 
#define GinPageIsList(page)   ( (GinPageGetOpaque(page)->flags & GIN_LIST) != 0 )
 
#define GinPageSetList(page)   ( GinPageGetOpaque(page)->flags |= GIN_LIST )
 
#define GinPageHasFullRow(page)   ( (GinPageGetOpaque(page)->flags & GIN_LIST_FULLROW) != 0 )
 
#define GinPageSetFullRow(page)   ( GinPageGetOpaque(page)->flags |= GIN_LIST_FULLROW )
 
#define GinPageIsCompressed(page)   ( (GinPageGetOpaque(page)->flags & GIN_COMPRESSED) != 0 )
 
#define GinPageSetCompressed(page)   ( GinPageGetOpaque(page)->flags |= GIN_COMPRESSED )
 
#define GinPageIsDeleted(page)   ( (GinPageGetOpaque(page)->flags & GIN_DELETED) != 0 )
 
#define GinPageSetDeleted(page)   ( GinPageGetOpaque(page)->flags |= GIN_DELETED)
 
#define GinPageSetNonDeleted(page)   ( GinPageGetOpaque(page)->flags &= ~GIN_DELETED)
 
#define GinPageIsIncompleteSplit(page)   ( (GinPageGetOpaque(page)->flags & GIN_INCOMPLETE_SPLIT) != 0 )
 
#define GinPageRightMost(page)   ( GinPageGetOpaque(page)->rightlink == InvalidBlockNumber)
 
#define GinPageGetDeleteXid(page)   ( ((PageHeader) (page))->pd_prune_xid )
 
#define GinPageSetDeleteXid(page, xid)   ( ((PageHeader) (page))->pd_prune_xid = xid)
 
#define GinItemPointerGetBlockNumber(pointer)    (ItemPointerGetBlockNumberNoCheck(pointer))
 
#define GinItemPointerGetOffsetNumber(pointer)    (ItemPointerGetOffsetNumberNoCheck(pointer))
 
#define GinItemPointerSetBlockNumber(pointer, blkno)    (ItemPointerSetBlockNumber((pointer), (blkno)))
 
#define GinItemPointerSetOffsetNumber(pointer, offnum)    (ItemPointerSetOffsetNumber((pointer), (offnum)))
 
#define ItemPointerSetMin(p)    ItemPointerSet((p), (BlockNumber)0, (OffsetNumber)0)
 
#define ItemPointerIsMin(p)
 
#define ItemPointerSetMax(p)    ItemPointerSet((p), InvalidBlockNumber, (OffsetNumber)0xffff)
 
#define ItemPointerSetLossyPage(p, b)    ItemPointerSet((p), (b), (OffsetNumber)0xffff)
 
#define ItemPointerIsLossyPage(p)
 
#define PostingItemGetBlockNumber(pointer)    BlockIdGetBlockNumber(&(pointer)->child_blkno)
 
#define PostingItemSetBlockNumber(pointer, blockNumber)    BlockIdSet(&((pointer)->child_blkno), (blockNumber))
 
#define GIN_CAT_NORM_KEY   0 /* normal, non-null key value */
 
#define GIN_CAT_NULL_KEY   1 /* null key value */
 
#define GIN_CAT_EMPTY_ITEM   2 /* placeholder for zero-key item */
 
#define GIN_CAT_NULL_ITEM   3 /* placeholder for null item */
 
#define GIN_CAT_EMPTY_QUERY   (-1) /* placeholder for full-scan query */
 
#define GinCategoryOffset(itup, ginstate)
 
#define GinGetNullCategory(itup, ginstate)    (*((GinNullCategory *) ((char*)(itup) + GinCategoryOffset(itup,ginstate))))
 
#define GinSetNullCategory(itup, ginstate, c)    (*((GinNullCategory *) ((char*)(itup) + GinCategoryOffset(itup,ginstate))) = (c))
 
#define GinGetNPosting(itup)   GinItemPointerGetOffsetNumber(&(itup)->t_tid)
 
#define GinSetNPosting(itup, n)   ItemPointerSetOffsetNumber(&(itup)->t_tid,n)
 
#define GIN_TREE_POSTING   ((OffsetNumber)0xffff)
 
#define GinIsPostingTree(itup)   (GinGetNPosting(itup) == GIN_TREE_POSTING)
 
#define GinSetPostingTree(itup, blkno)   ( GinSetNPosting((itup),GIN_TREE_POSTING), ItemPointerSetBlockNumber(&(itup)->t_tid, blkno) )
 
#define GinGetPostingTree(itup)   GinItemPointerGetBlockNumber(&(itup)->t_tid)
 
#define GIN_ITUP_COMPRESSED   (1U << 31)
 
#define GinGetPostingOffset(itup)   (GinItemPointerGetBlockNumber(&(itup)->t_tid) & (~GIN_ITUP_COMPRESSED))
 
#define GinSetPostingOffset(itup, n)   ItemPointerSetBlockNumber(&(itup)->t_tid,(n)|GIN_ITUP_COMPRESSED)
 
#define GinGetPosting(itup)   ((Pointer) ((char*)(itup) + GinGetPostingOffset(itup)))
 
#define GinItupIsCompressed(itup)   ((GinItemPointerGetBlockNumber(&(itup)->t_tid) & GIN_ITUP_COMPRESSED) != 0)
 
#define GinMaxItemSize
 
#define GinGetDownlink(itup)   GinItemPointerGetBlockNumber(&(itup)->t_tid)
 
#define GinSetDownlink(itup, blkno)   ItemPointerSet(&(itup)->t_tid, blkno, InvalidOffsetNumber)
 
#define GinDataLeafPageGetPostingList(page)    (GinPostingList *) ((PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData))))
 
#define GinDataLeafPageGetPostingListSize(page)    (((PageHeader) page)->pd_lower - MAXALIGN(SizeOfPageHeaderData) - MAXALIGN(sizeof(ItemPointerData)))
 
#define GinDataLeafPageIsEmpty(page)    (GinPageIsCompressed(page) ? (GinDataLeafPageGetPostingListSize(page) == 0) : (GinPageGetOpaque(page)->maxoff < FirstOffsetNumber))
 
#define GinDataLeafPageGetFreeSpace(page)   PageGetExactFreeSpace(page)
 
#define GinDataPageGetRightBound(page)   ((ItemPointer) PageGetContents(page))
 
#define GinDataPageGetData(page)    (PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData)))
 
#define GinDataPageGetPostingItem(page, i)    ((PostingItem *) (GinDataPageGetData(page) + ((i)-1) * sizeof(PostingItem)))
 
#define GinDataPageSetDataSize(page, size)
 
#define GinNonLeafDataPageGetFreeSpace(page)
 
#define GinDataPageMaxDataSize
 
#define GinListPageSize    ( BLCKSZ - SizeOfPageHeaderData - MAXALIGN(sizeof(GinPageOpaqueData)) )
 
#define SizeOfGinPostingList(plist)   (offsetof(GinPostingList, bytes) + SHORTALIGN((plist)->nbytes) )
 
#define GinNextPostingListSegment(cur)   ((GinPostingList *) (((char *) (cur)) + SizeOfGinPostingList((cur))))
 

Typedefs

typedef struct GinPageOpaqueData GinPageOpaqueData
 
typedef GinPageOpaqueDataGinPageOpaque
 
typedef struct GinMetaPageData GinMetaPageData
 
typedef signed char GinNullCategory
 

Functions

bool GinPageIsRecyclable (Page page)
 

Macro Definition Documentation

◆ GIN_CAT_EMPTY_ITEM

#define GIN_CAT_EMPTY_ITEM   2 /* placeholder for zero-key item */

Definition at line 210 of file ginblock.h.

◆ GIN_CAT_EMPTY_QUERY

#define GIN_CAT_EMPTY_QUERY   (-1) /* placeholder for full-scan query */

Definition at line 212 of file ginblock.h.

◆ GIN_CAT_NORM_KEY

#define GIN_CAT_NORM_KEY   0 /* normal, non-null key value */

Definition at line 208 of file ginblock.h.

◆ GIN_CAT_NULL_ITEM

#define GIN_CAT_NULL_ITEM   3 /* placeholder for null item */

Definition at line 211 of file ginblock.h.

◆ GIN_CAT_NULL_KEY

#define GIN_CAT_NULL_KEY   1 /* null key value */

Definition at line 209 of file ginblock.h.

◆ GIN_COMPRESSED

#define GIN_COMPRESSED   (1 << 7)

Definition at line 48 of file ginblock.h.

◆ GIN_CURRENT_VERSION

#define GIN_CURRENT_VERSION   2

Definition at line 102 of file ginblock.h.

◆ GIN_DATA

#define GIN_DATA   (1 << 0)

Definition at line 41 of file ginblock.h.

◆ GIN_DELETED

#define GIN_DELETED   (1 << 2)

Definition at line 43 of file ginblock.h.

◆ GIN_INCOMPLETE_SPLIT

#define GIN_INCOMPLETE_SPLIT
Value:
(1 << 6) /* page was split, but parent not
* updated */

Definition at line 47 of file ginblock.h.

56{
57 /*
58 * Pointers to head and tail of pending list, which consists of GIN_LIST
59 * pages. These store fast-inserted entries that haven't yet been moved
60 * into the regular GIN structure.
61 */
62 BlockNumber head;
63 BlockNumber tail;
64
65 /*
66 * Free space in bytes in the pending list's tail page.
67 */
68 uint32 tailFreeSize;
69
70 /*
71 * We store both number of pages and number of heap tuples that are in the
72 * pending list.
73 */
74 BlockNumber nPendingPages;
75 int64 nPendingHeapTuples;
76
77 /*
78 * Statistics for planner use (accurate as of last VACUUM)
79 */
80 BlockNumber nTotalPages;
81 BlockNumber nEntryPages;
82 BlockNumber nDataPages;
83 int64 nEntries;
84
85 /*
86 * GIN version number (ideally this should have been at the front, but too
87 * late now. Don't move it!)
88 *
89 * Currently 2 (for indexes initialized in 9.4 or later)
90 *
91 * Version 1 (indexes initialized in version 9.1, 9.2 or 9.3), is
92 * compatible, but may contain uncompressed posting tree (leaf) pages and
93 * posting lists. They will be converted to compressed format when
94 * modified.
95 *
96 * Version 0 (indexes initialized in 9.0 or before) is compatible but may
97 * be missing null entries, including both null keys and placeholders.
98 * Reject full-index-scan attempts on such indexes.
99 */
100 int32 ginVersion;
102
103#define GIN_CURRENT_VERSION 2
104
105#define GinPageGetMeta(p) \
106 ((GinMetaPageData *) PageGetContents(p))
107
108/*
109 * Macros for accessing a GIN index page's opaque data
110 */
111#define GinPageGetOpaque(page) ( (GinPageOpaque) PageGetSpecialPointer(page) )
112
113#define GinPageIsLeaf(page) ( (GinPageGetOpaque(page)->flags & GIN_LEAF) != 0 )
114#define GinPageSetLeaf(page) ( GinPageGetOpaque(page)->flags |= GIN_LEAF )
115#define GinPageSetNonLeaf(page) ( GinPageGetOpaque(page)->flags &= ~GIN_LEAF )
116#define GinPageIsData(page) ( (GinPageGetOpaque(page)->flags & GIN_DATA) != 0 )
117#define GinPageSetData(page) ( GinPageGetOpaque(page)->flags |= GIN_DATA )
118#define GinPageIsList(page) ( (GinPageGetOpaque(page)->flags & GIN_LIST) != 0 )
119#define GinPageSetList(page) ( GinPageGetOpaque(page)->flags |= GIN_LIST )
120#define GinPageHasFullRow(page) ( (GinPageGetOpaque(page)->flags & GIN_LIST_FULLROW) != 0 )
121#define GinPageSetFullRow(page) ( GinPageGetOpaque(page)->flags |= GIN_LIST_FULLROW )
122#define GinPageIsCompressed(page) ( (GinPageGetOpaque(page)->flags & GIN_COMPRESSED) != 0 )
123#define GinPageSetCompressed(page) ( GinPageGetOpaque(page)->flags |= GIN_COMPRESSED )
124
125#define GinPageIsDeleted(page) ( (GinPageGetOpaque(page)->flags & GIN_DELETED) != 0 )
126#define GinPageSetDeleted(page) ( GinPageGetOpaque(page)->flags |= GIN_DELETED)
127#define GinPageSetNonDeleted(page) ( GinPageGetOpaque(page)->flags &= ~GIN_DELETED)
128#define GinPageIsIncompleteSplit(page) ( (GinPageGetOpaque(page)->flags & GIN_INCOMPLETE_SPLIT) != 0 )
129
130#define GinPageRightMost(page) ( GinPageGetOpaque(page)->rightlink == InvalidBlockNumber)
131
132/*
133 * We should reclaim deleted page only once every transaction started before
134 * its deletion is over.
135 */
136#define GinPageGetDeleteXid(page) ( ((PageHeader) (page))->pd_prune_xid )
137#define GinPageSetDeleteXid(page, xid) ( ((PageHeader) (page))->pd_prune_xid = xid)
138extern bool GinPageIsRecyclable(Page page);
139
140/*
141 * We use our own ItemPointerGet(BlockNumber|OffsetNumber)
142 * to avoid Asserts, since sometimes the ip_posid isn't "valid"
143 */
144#define GinItemPointerGetBlockNumber(pointer) \
145 (ItemPointerGetBlockNumberNoCheck(pointer))
146
147#define GinItemPointerGetOffsetNumber(pointer) \
148 (ItemPointerGetOffsetNumberNoCheck(pointer))
149
150#define GinItemPointerSetBlockNumber(pointer, blkno) \
151 (ItemPointerSetBlockNumber((pointer), (blkno)))
152
153#define GinItemPointerSetOffsetNumber(pointer, offnum) \
154 (ItemPointerSetOffsetNumber((pointer), (offnum)))
155
156
157/*
158 * Special-case item pointer values needed by the GIN search logic.
159 * MIN: sorts less than any valid item pointer
160 * MAX: sorts greater than any valid item pointer
161 * LOSSY PAGE: indicates a whole heap page, sorts after normal item
162 * pointers for that page
163 * Note that these are all distinguishable from an "invalid" item pointer
164 * (which is InvalidBlockNumber/0) as well as from all normal item
165 * pointers (which have item numbers in the range 1..MaxHeapTuplesPerPage).
166 */
167#define ItemPointerSetMin(p) \
168 ItemPointerSet((p), (BlockNumber)0, (OffsetNumber)0)
169#define ItemPointerIsMin(p) \
170 (GinItemPointerGetOffsetNumber(p) == (OffsetNumber)0 && \
171 GinItemPointerGetBlockNumber(p) == (BlockNumber)0)
172#define ItemPointerSetMax(p) \
173 ItemPointerSet((p), InvalidBlockNumber, (OffsetNumber)0xffff)
174#define ItemPointerSetLossyPage(p, b) \
175 ItemPointerSet((p), (b), (OffsetNumber)0xffff)
176#define ItemPointerIsLossyPage(p) \
177 (GinItemPointerGetOffsetNumber(p) == (OffsetNumber)0xffff && \
178 GinItemPointerGetBlockNumber(p) != InvalidBlockNumber)
179
180/*
181 * Posting item in a non-leaf posting-tree page
182 */
183typedef struct
184{
185 /* We use BlockIdData not BlockNumber to avoid padding space wastage */
186 BlockIdData child_blkno;
189
190#define PostingItemGetBlockNumber(pointer) \
191 BlockIdGetBlockNumber(&(pointer)->child_blkno)
192
193#define PostingItemSetBlockNumber(pointer, blockNumber) \
194 BlockIdSet(&((pointer)->child_blkno), (blockNumber))
195
196/*
197 * Category codes to distinguish placeholder nulls from ordinary NULL keys.
198 *
199 * The first two code values were chosen to be compatible with the usual usage
200 * of bool isNull flags. However, casting between bool and GinNullCategory is
201 * risky because of the possibility of different bit patterns and type sizes,
202 * so it is no longer done.
203 *
204 * GIN_CAT_EMPTY_QUERY is never stored in the index; and notice that it is
205 * chosen to sort before not after regular key values.
206 */
207typedef signed char GinNullCategory;
208
209#define GIN_CAT_NORM_KEY 0 /* normal, non-null key value */
210#define GIN_CAT_NULL_KEY 1 /* null key value */
211#define GIN_CAT_EMPTY_ITEM 2 /* placeholder for zero-key item */
212#define GIN_CAT_NULL_ITEM 3 /* placeholder for null item */
213#define GIN_CAT_EMPTY_QUERY (-1) /* placeholder for full-scan query */
214
215/*
216 * Access macros for null category byte in entry tuples
217 */
218#define GinCategoryOffset(itup,ginstate) \
219 (IndexInfoFindDataOffset((itup)->t_info) + \
220 ((ginstate)->oneCol ? 0 : sizeof(int16)))
221#define GinGetNullCategory(itup,ginstate) \
222 (*((GinNullCategory *) ((char*)(itup) + GinCategoryOffset(itup,ginstate))))
223#define GinSetNullCategory(itup,ginstate,c) \
224 (*((GinNullCategory *) ((char*)(itup) + GinCategoryOffset(itup,ginstate))) = (c))
225
226/*
227 * Access macros for leaf-page entry tuples (see discussion in README)
228 */
229#define GinGetNPosting(itup) GinItemPointerGetOffsetNumber(&(itup)->t_tid)
230#define GinSetNPosting(itup,n) ItemPointerSetOffsetNumber(&(itup)->t_tid,n)
231#define GIN_TREE_POSTING ((OffsetNumber)0xffff)
232#define GinIsPostingTree(itup) (GinGetNPosting(itup) == GIN_TREE_POSTING)
233#define GinSetPostingTree(itup, blkno) ( GinSetNPosting((itup),GIN_TREE_POSTING), ItemPointerSetBlockNumber(&(itup)->t_tid, blkno) )
234#define GinGetPostingTree(itup) GinItemPointerGetBlockNumber(&(itup)->t_tid)
235
236#define GIN_ITUP_COMPRESSED (1U << 31)
237#define GinGetPostingOffset(itup) (GinItemPointerGetBlockNumber(&(itup)->t_tid) & (~GIN_ITUP_COMPRESSED))
238#define GinSetPostingOffset(itup,n) ItemPointerSetBlockNumber(&(itup)->t_tid,(n)|GIN_ITUP_COMPRESSED)
239#define GinGetPosting(itup) ((Pointer) ((char*)(itup) + GinGetPostingOffset(itup)))
240#define GinItupIsCompressed(itup) ((GinItemPointerGetBlockNumber(&(itup)->t_tid) & GIN_ITUP_COMPRESSED) != 0)
241
242/*
243 * Maximum size of an item on entry tree page. Make sure that we fit at least
244 * three items on each page. (On regular B-tree indexes, we must fit at least
245 * three items: two data items and the "high key". In GIN entry tree, we don't
246 * currently store the high key explicitly, we just use the rightmost item on
247 * the page, so it would actually be enough to fit two items.)
248 */
249#define GinMaxItemSize \
250 Min(INDEX_SIZE_MASK, \
251 MAXALIGN_DOWN(((BLCKSZ - \
252 MAXALIGN(SizeOfPageHeaderData + 3 * sizeof(ItemIdData)) - \
253 MAXALIGN(sizeof(GinPageOpaqueData))) / 3)))
254
255/*
256 * Access macros for non-leaf entry tuples
257 */
258#define GinGetDownlink(itup) GinItemPointerGetBlockNumber(&(itup)->t_tid)
259#define GinSetDownlink(itup,blkno) ItemPointerSet(&(itup)->t_tid, blkno, InvalidOffsetNumber)
260
261
262/*
263 * Data (posting tree) pages
264 *
265 * Posting tree pages don't store regular tuples. Non-leaf pages contain
266 * PostingItems, which are pairs of ItemPointers and child block numbers.
267 * Leaf pages contain GinPostingLists and an uncompressed array of item
268 * pointers.
269 *
270 * In a leaf page, the compressed posting lists are stored after the regular
271 * page header, one after each other. Although we don't store regular tuples,
272 * pd_lower is used to indicate the end of the posting lists. After that, free
273 * space follows. This layout is compatible with the "standard" heap and
274 * index page layout described in bufpage.h, so that we can e.g set buffer_std
275 * when writing WAL records.
276 *
277 * In the special space is the GinPageOpaque struct.
278 */
279#define GinDataLeafPageGetPostingList(page) \
280 (GinPostingList *) ((PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData))))
281#define GinDataLeafPageGetPostingListSize(page) \
282 (((PageHeader) page)->pd_lower - MAXALIGN(SizeOfPageHeaderData) - MAXALIGN(sizeof(ItemPointerData)))
283
284#define GinDataLeafPageIsEmpty(page) \
285 (GinPageIsCompressed(page) ? (GinDataLeafPageGetPostingListSize(page) == 0) : (GinPageGetOpaque(page)->maxoff < FirstOffsetNumber))
286
287#define GinDataLeafPageGetFreeSpace(page) PageGetExactFreeSpace(page)
288
289#define GinDataPageGetRightBound(page) ((ItemPointer) PageGetContents(page))
290/*
291 * Pointer to the data portion of a posting tree page. For internal pages,
292 * that's the beginning of the array of PostingItems. For compressed leaf
293 * pages, the first compressed posting list. For uncompressed (pre-9.4) leaf
294 * pages, it's the beginning of the ItemPointer array.
295 */
296#define GinDataPageGetData(page) \
297 (PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData)))
298/* non-leaf pages contain PostingItems */
299#define GinDataPageGetPostingItem(page, i) \
300 ((PostingItem *) (GinDataPageGetData(page) + ((i)-1) * sizeof(PostingItem)))
301
302/*
303 * Note: there is no GinDataPageGetDataSize macro, because before version
304 * 9.4, we didn't set pd_lower on data pages. There can be pages in the index
305 * that were binary-upgraded from earlier versions and still have an invalid
306 * pd_lower, so we cannot trust it in general. Compressed posting tree leaf
307 * pages are new in 9.4, however, so we can trust them; see
308 * GinDataLeafPageGetPostingListSize.
309 */
310#define GinDataPageSetDataSize(page, size) \
311 { \
312 Assert(size <= GinDataPageMaxDataSize); \
313 ((PageHeader) page)->pd_lower = (size) + MAXALIGN(SizeOfPageHeaderData) + MAXALIGN(sizeof(ItemPointerData)); \
314 }
315
316#define GinNonLeafDataPageGetFreeSpace(page) \
317 (GinDataPageMaxDataSize - \
318 GinPageGetOpaque(page)->maxoff * sizeof(PostingItem))
319
320#define GinDataPageMaxDataSize \
321 (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) \
322 - MAXALIGN(sizeof(ItemPointerData)) \
323 - MAXALIGN(sizeof(GinPageOpaqueData)))
324
325/*
326 * List pages
327 */
328#define GinListPageSize \
329 ( BLCKSZ - SizeOfPageHeaderData - MAXALIGN(sizeof(GinPageOpaqueData)) )
330
331/*
332 * A compressed posting list.
333 *
334 * Note: This requires 2-byte alignment.
335 */
336typedef struct
337{
338 ItemPointerData first; /* first item in this posting list (unpacked) */
339 uint16 nbytes; /* number of bytes that follow */
340 unsigned char bytes[FLEXIBLE_ARRAY_MEMBER]; /* varbyte encoded items */
342
343#define SizeOfGinPostingList(plist) (offsetof(GinPostingList, bytes) + SHORTALIGN((plist)->nbytes) )
344#define GinNextPostingListSegment(cur) ((GinPostingList *) (((char *) (cur)) + SizeOfGinPostingList((cur))))
345
346#endif /* GINBLOCK_H */
uint32 BlockNumber
Definition block.h:31
PageData * Page
Definition bufpage.h:81
int64_t int64
Definition c.h:543
#define FLEXIBLE_ARRAY_MEMBER
Definition c.h:480
int32_t int32
Definition c.h:542
uint16_t uint16
Definition c.h:545
uint32_t uint32
Definition c.h:546
bool GinPageIsRecyclable(Page page)
Definition ginvacuum.c:801
signed char GinNullCategory
Definition ginblock.h:206

◆ GIN_ITUP_COMPRESSED

#define GIN_ITUP_COMPRESSED   (1U << 31)

Definition at line 235 of file ginblock.h.

◆ GIN_LEAF

#define GIN_LEAF   (1 << 1)

Definition at line 42 of file ginblock.h.

◆ GIN_LIST

#define GIN_LIST   (1 << 4)

Definition at line 45 of file ginblock.h.

◆ GIN_LIST_FULLROW

#define GIN_LIST_FULLROW   (1 << 5) /* makes sense only on GIN_LIST page */

Definition at line 46 of file ginblock.h.

◆ GIN_META

#define GIN_META   (1 << 3)

Definition at line 44 of file ginblock.h.

◆ GIN_METAPAGE_BLKNO

#define GIN_METAPAGE_BLKNO   (0)

Definition at line 51 of file ginblock.h.

◆ GIN_ROOT_BLKNO

#define GIN_ROOT_BLKNO   (1)

Definition at line 52 of file ginblock.h.

◆ GIN_TREE_POSTING

#define GIN_TREE_POSTING   ((OffsetNumber)0xffff)

Definition at line 230 of file ginblock.h.

◆ GinCategoryOffset

#define GinCategoryOffset (   itup,
  ginstate 
)
Value:
(IndexInfoFindDataOffset((itup)->t_info) + \
((ginstate)->oneCol ? 0 : sizeof(int16)))
int16_t int16
Definition c.h:541
static Size IndexInfoFindDataOffset(unsigned short t_info)
Definition itup.h:112
static int fb(int x)

Definition at line 217 of file ginblock.h.

◆ GinDataLeafPageGetFreeSpace

#define GinDataLeafPageGetFreeSpace (   page)    PageGetExactFreeSpace(page)

Definition at line 286 of file ginblock.h.

◆ GinDataLeafPageGetPostingList

#define GinDataLeafPageGetPostingList (   page)     (GinPostingList *) ((PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData))))

Definition at line 278 of file ginblock.h.

◆ GinDataLeafPageGetPostingListSize

#define GinDataLeafPageGetPostingListSize (   page)     (((PageHeader) page)->pd_lower - MAXALIGN(SizeOfPageHeaderData) - MAXALIGN(sizeof(ItemPointerData)))

Definition at line 280 of file ginblock.h.

◆ GinDataLeafPageIsEmpty

#define GinDataLeafPageIsEmpty (   page)     (GinPageIsCompressed(page) ? (GinDataLeafPageGetPostingListSize(page) == 0) : (GinPageGetOpaque(page)->maxoff < FirstOffsetNumber))

Definition at line 283 of file ginblock.h.

◆ GinDataPageGetData

#define GinDataPageGetData (   page)     (PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData)))

Definition at line 295 of file ginblock.h.

◆ GinDataPageGetPostingItem

#define GinDataPageGetPostingItem (   page,
  i 
)     ((PostingItem *) (GinDataPageGetData(page) + ((i)-1) * sizeof(PostingItem)))

Definition at line 298 of file ginblock.h.

◆ GinDataPageGetRightBound

#define GinDataPageGetRightBound (   page)    ((ItemPointer) PageGetContents(page))

Definition at line 288 of file ginblock.h.

◆ GinDataPageMaxDataSize

#define GinDataPageMaxDataSize
Value:
#define SizeOfPageHeaderData
Definition bufpage.h:216
#define MAXALIGN(LEN)
Definition c.h:826

Definition at line 319 of file ginblock.h.

◆ GinDataPageSetDataSize

#define GinDataPageSetDataSize (   page,
  size 
)
Value:
{ \
((PageHeader) page)->pd_lower = (size) + MAXALIGN(SizeOfPageHeaderData) + MAXALIGN(sizeof(ItemPointerData)); \
}
PageHeaderData * PageHeader
Definition bufpage.h:173
#define GinDataPageMaxDataSize
Definition ginblock.h:319

Definition at line 309 of file ginblock.h.

311 { \
313 ((PageHeader) page)->pd_lower = (size) + MAXALIGN(SizeOfPageHeaderData) + MAXALIGN(sizeof(ItemPointerData)); \

◆ GinGetDownlink

#define GinGetDownlink (   itup)    GinItemPointerGetBlockNumber(&(itup)->t_tid)

Definition at line 257 of file ginblock.h.

◆ GinGetNPosting

#define GinGetNPosting (   itup)    GinItemPointerGetOffsetNumber(&(itup)->t_tid)

Definition at line 228 of file ginblock.h.

◆ GinGetNullCategory

#define GinGetNullCategory (   itup,
  ginstate 
)     (*((GinNullCategory *) ((char*)(itup) + GinCategoryOffset(itup,ginstate))))

Definition at line 220 of file ginblock.h.

220 : sizeof(int16)))
221#define GinGetNullCategory(itup,ginstate) \
#define GinGetNullCategory(itup, ginstate)
Definition ginblock.h:220

◆ GinGetPosting

#define GinGetPosting (   itup)    ((Pointer) ((char*)(itup) + GinGetPostingOffset(itup)))

Definition at line 238 of file ginblock.h.

◆ GinGetPostingOffset

#define GinGetPostingOffset (   itup)    (GinItemPointerGetBlockNumber(&(itup)->t_tid) & (~GIN_ITUP_COMPRESSED))

Definition at line 236 of file ginblock.h.

◆ GinGetPostingTree

#define GinGetPostingTree (   itup)    GinItemPointerGetBlockNumber(&(itup)->t_tid)

Definition at line 233 of file ginblock.h.

◆ GinIsPostingTree

#define GinIsPostingTree (   itup)    (GinGetNPosting(itup) == GIN_TREE_POSTING)

Definition at line 231 of file ginblock.h.

◆ GinItemPointerGetBlockNumber

#define GinItemPointerGetBlockNumber (   pointer)     (ItemPointerGetBlockNumberNoCheck(pointer))

Definition at line 143 of file ginblock.h.

◆ GinItemPointerGetOffsetNumber

#define GinItemPointerGetOffsetNumber (   pointer)     (ItemPointerGetOffsetNumberNoCheck(pointer))

Definition at line 146 of file ginblock.h.

◆ GinItemPointerSetBlockNumber

#define GinItemPointerSetBlockNumber (   pointer,
  blkno 
)     (ItemPointerSetBlockNumber((pointer), (blkno)))

Definition at line 149 of file ginblock.h.

◆ GinItemPointerSetOffsetNumber

#define GinItemPointerSetOffsetNumber (   pointer,
  offnum 
)     (ItemPointerSetOffsetNumber((pointer), (offnum)))

Definition at line 152 of file ginblock.h.

◆ GinItupIsCompressed

#define GinItupIsCompressed (   itup)    ((GinItemPointerGetBlockNumber(&(itup)->t_tid) & GIN_ITUP_COMPRESSED) != 0)

Definition at line 239 of file ginblock.h.

◆ GinListPageSize

Definition at line 327 of file ginblock.h.

◆ GinMaxItemSize

#define GinMaxItemSize
Value:
MAXALIGN(sizeof(GinPageOpaqueData))) / 3)))
#define MAXALIGN_DOWN(LEN)
Definition c.h:838
#define Min(x, y)
Definition c.h:997
#define INDEX_SIZE_MASK
Definition itup.h:65

Definition at line 248 of file ginblock.h.

◆ GinNextPostingListSegment

#define GinNextPostingListSegment (   cur)    ((GinPostingList *) (((char *) (cur)) + SizeOfGinPostingList((cur))))

Definition at line 343 of file ginblock.h.

◆ GinNonLeafDataPageGetFreeSpace

#define GinNonLeafDataPageGetFreeSpace (   page)
Value:

Definition at line 315 of file ginblock.h.

◆ GinPageGetDeleteXid

#define GinPageGetDeleteXid (   page)    ( ((PageHeader) (page))->pd_prune_xid )

Definition at line 135 of file ginblock.h.

◆ GinPageGetMeta

#define GinPageGetMeta (   p)     ((GinMetaPageData *) PageGetContents(p))

Definition at line 104 of file ginblock.h.

◆ GinPageGetOpaque

#define GinPageGetOpaque (   page)    ( (GinPageOpaque) PageGetSpecialPointer(page) )

Definition at line 110 of file ginblock.h.

◆ GinPageHasFullRow

#define GinPageHasFullRow (   page)    ( (GinPageGetOpaque(page)->flags & GIN_LIST_FULLROW) != 0 )

Definition at line 119 of file ginblock.h.

◆ GinPageIsCompressed

#define GinPageIsCompressed (   page)    ( (GinPageGetOpaque(page)->flags & GIN_COMPRESSED) != 0 )

Definition at line 121 of file ginblock.h.

◆ GinPageIsData

#define GinPageIsData (   page)    ( (GinPageGetOpaque(page)->flags & GIN_DATA) != 0 )

Definition at line 115 of file ginblock.h.

◆ GinPageIsDeleted

#define GinPageIsDeleted (   page)    ( (GinPageGetOpaque(page)->flags & GIN_DELETED) != 0 )

Definition at line 124 of file ginblock.h.

◆ GinPageIsIncompleteSplit

#define GinPageIsIncompleteSplit (   page)    ( (GinPageGetOpaque(page)->flags & GIN_INCOMPLETE_SPLIT) != 0 )

Definition at line 127 of file ginblock.h.

◆ GinPageIsLeaf

#define GinPageIsLeaf (   page)    ( (GinPageGetOpaque(page)->flags & GIN_LEAF) != 0 )

Definition at line 112 of file ginblock.h.

◆ GinPageIsList

#define GinPageIsList (   page)    ( (GinPageGetOpaque(page)->flags & GIN_LIST) != 0 )

Definition at line 117 of file ginblock.h.

◆ GinPageRightMost

#define GinPageRightMost (   page)    ( GinPageGetOpaque(page)->rightlink == InvalidBlockNumber)

Definition at line 129 of file ginblock.h.

◆ GinPageSetCompressed

#define GinPageSetCompressed (   page)    ( GinPageGetOpaque(page)->flags |= GIN_COMPRESSED )

Definition at line 122 of file ginblock.h.

◆ GinPageSetData

#define GinPageSetData (   page)    ( GinPageGetOpaque(page)->flags |= GIN_DATA )

Definition at line 116 of file ginblock.h.

◆ GinPageSetDeleted

#define GinPageSetDeleted (   page)    ( GinPageGetOpaque(page)->flags |= GIN_DELETED)

Definition at line 125 of file ginblock.h.

◆ GinPageSetDeleteXid

#define GinPageSetDeleteXid (   page,
  xid 
)    ( ((PageHeader) (page))->pd_prune_xid = xid)

Definition at line 136 of file ginblock.h.

◆ GinPageSetFullRow

#define GinPageSetFullRow (   page)    ( GinPageGetOpaque(page)->flags |= GIN_LIST_FULLROW )

Definition at line 120 of file ginblock.h.

◆ GinPageSetLeaf

#define GinPageSetLeaf (   page)    ( GinPageGetOpaque(page)->flags |= GIN_LEAF )

Definition at line 113 of file ginblock.h.

◆ GinPageSetList

#define GinPageSetList (   page)    ( GinPageGetOpaque(page)->flags |= GIN_LIST )

Definition at line 118 of file ginblock.h.

◆ GinPageSetNonDeleted

#define GinPageSetNonDeleted (   page)    ( GinPageGetOpaque(page)->flags &= ~GIN_DELETED)

Definition at line 126 of file ginblock.h.

◆ GinPageSetNonLeaf

#define GinPageSetNonLeaf (   page)    ( GinPageGetOpaque(page)->flags &= ~GIN_LEAF )

Definition at line 114 of file ginblock.h.

◆ GinSetDownlink

#define GinSetDownlink (   itup,
  blkno 
)    ItemPointerSet(&(itup)->t_tid, blkno, InvalidOffsetNumber)

Definition at line 258 of file ginblock.h.

◆ GinSetNPosting

#define GinSetNPosting (   itup,
 
)    ItemPointerSetOffsetNumber(&(itup)->t_tid,n)

Definition at line 229 of file ginblock.h.

◆ GinSetNullCategory

#define GinSetNullCategory (   itup,
  ginstate,
  c 
)     (*((GinNullCategory *) ((char*)(itup) + GinCategoryOffset(itup,ginstate))) = (c))

Definition at line 222 of file ginblock.h.

◆ GinSetPostingOffset

#define GinSetPostingOffset (   itup,
 
)    ItemPointerSetBlockNumber(&(itup)->t_tid,(n)|GIN_ITUP_COMPRESSED)

Definition at line 237 of file ginblock.h.

◆ GinSetPostingTree

#define GinSetPostingTree (   itup,
  blkno 
)    ( GinSetNPosting((itup),GIN_TREE_POSTING), ItemPointerSetBlockNumber(&(itup)->t_tid, blkno) )

Definition at line 232 of file ginblock.h.

◆ ItemPointerIsLossyPage

#define ItemPointerIsLossyPage (   p)
Value:
#define InvalidBlockNumber
Definition block.h:33
#define GinItemPointerGetOffsetNumber(pointer)
Definition ginblock.h:146
#define GinItemPointerGetBlockNumber(pointer)
Definition ginblock.h:143
uint16 OffsetNumber
Definition off.h:24

Definition at line 175 of file ginblock.h.

◆ ItemPointerIsMin

#define ItemPointerIsMin (   p)
Value:

Definition at line 168 of file ginblock.h.

◆ ItemPointerSetLossyPage

#define ItemPointerSetLossyPage (   p,
  b 
)     ItemPointerSet((p), (b), (OffsetNumber)0xffff)

Definition at line 173 of file ginblock.h.

◆ ItemPointerSetMax

#define ItemPointerSetMax (   p)     ItemPointerSet((p), InvalidBlockNumber, (OffsetNumber)0xffff)

Definition at line 171 of file ginblock.h.

◆ ItemPointerSetMin

#define ItemPointerSetMin (   p)     ItemPointerSet((p), (BlockNumber)0, (OffsetNumber)0)

Definition at line 166 of file ginblock.h.

◆ PostingItemGetBlockNumber

#define PostingItemGetBlockNumber (   pointer)     BlockIdGetBlockNumber(&(pointer)->child_blkno)

Definition at line 189 of file ginblock.h.

◆ PostingItemSetBlockNumber

#define PostingItemSetBlockNumber (   pointer,
  blockNumber 
)     BlockIdSet(&((pointer)->child_blkno), (blockNumber))

Definition at line 192 of file ginblock.h.

◆ SizeOfGinPostingList

#define SizeOfGinPostingList (   plist)    (offsetof(GinPostingList, bytes) + SHORTALIGN((plist)->nbytes) )

Definition at line 342 of file ginblock.h.

Typedef Documentation

◆ GinMetaPageData

◆ GinNullCategory

Definition at line 206 of file ginblock.h.

◆ GinPageOpaque

Definition at line 39 of file ginblock.h.

◆ GinPageOpaqueData

Function Documentation

◆ GinPageIsRecyclable()

bool GinPageIsRecyclable ( Page  page)
extern

Definition at line 801 of file ginvacuum.c.

802{
804
805 if (PageIsNew(page))
806 return true;
807
808 if (!GinPageIsDeleted(page))
809 return false;
810
812
814 return true;
815
816 /*
817 * If no backend still could view delete_xid as in running, all scans
818 * concurrent with ginDeletePage() must have finished.
819 */
821}
static bool PageIsNew(const PageData *page)
Definition bufpage.h:233
uint32 TransactionId
Definition c.h:666
#define GinPageGetDeleteXid(page)
Definition ginblock.h:135
#define GinPageIsDeleted(page)
Definition ginblock.h:124
bool GlobalVisCheckRemovableXid(Relation rel, TransactionId xid)
Definition procarray.c:4279
#define TransactionIdIsValid(xid)
Definition transam.h:41

References fb(), GinPageGetDeleteXid, GinPageIsDeleted, GlobalVisCheckRemovableXid(), PageIsNew(), and TransactionIdIsValid.

Referenced by GinNewBuffer(), and ginvacuumcleanup().