PostgreSQL Source Code git master
Loading...
Searching...
No Matches
gin_private.h
Go to the documentation of this file.
1/*--------------------------------------------------------------------------
2 * gin_private.h
3 * header file for postgres inverted index access method implementation.
4 *
5 * Copyright (c) 2006-2026, PostgreSQL Global Development Group
6 *
7 * src/include/access/gin_private.h
8 *--------------------------------------------------------------------------
9 */
10#ifndef GIN_PRIVATE_H
11#define GIN_PRIVATE_H
12
13#include "access/amapi.h"
14#include "access/gin.h"
15#include "access/ginblock.h"
16#include "access/htup_details.h"
17#include "access/itup.h"
18#include "common/int.h"
19#include "catalog/pg_am_d.h"
20#include "fmgr.h"
21#include "lib/rbtree.h"
22#include "nodes/tidbitmap.h"
23#include "storage/bufmgr.h"
24
25/*
26 * Storage type for GIN's reloptions
27 */
28typedef struct GinOptions
29{
30 int32 vl_len_; /* varlena header (do not touch directly!) */
31 bool useFastUpdate; /* use fast updates? */
32 int pendingListCleanupSize; /* maximum size of pending list */
34
35#define GIN_DEFAULT_USE_FASTUPDATE true
36#define GinGetUseFastUpdate(relation) \
37 (AssertMacro(relation->rd_rel->relkind == RELKIND_INDEX && \
38 relation->rd_rel->relam == GIN_AM_OID), \
39 (relation)->rd_options ? \
40 ((GinOptions *) (relation)->rd_options)->useFastUpdate : GIN_DEFAULT_USE_FASTUPDATE)
41#define GinGetPendingListCleanupSize(relation) \
42 (AssertMacro(relation->rd_rel->relkind == RELKIND_INDEX && \
43 relation->rd_rel->relam == GIN_AM_OID), \
44 (relation)->rd_options && \
45 ((GinOptions *) (relation)->rd_options)->pendingListCleanupSize != -1 ? \
46 ((GinOptions *) (relation)->rd_options)->pendingListCleanupSize : \
47 gin_pending_list_limit)
48
49
50/* Macros for buffer lock/unlock operations */
51#define GIN_UNLOCK BUFFER_LOCK_UNLOCK
52#define GIN_SHARE BUFFER_LOCK_SHARE
53#define GIN_EXCLUSIVE BUFFER_LOCK_EXCLUSIVE
54
55
56/*
57 * GinState: working data structure describing the index being worked on
58 */
59typedef struct GinState
60{
62 bool oneCol; /* true if single-column index */
63
64 /*
65 * origTupdesc is the nominal tuple descriptor of the index, ie, the i'th
66 * attribute shows the key type (not the input data type!) of the i'th
67 * index column. In a single-column index this describes the actual leaf
68 * index tuples. In a multi-column index, the actual leaf tuples contain
69 * a smallint column number followed by a key datum of the appropriate
70 * type for that column. We set up tupdesc[i] to describe the actual
71 * rowtype of the index tuples for the i'th column, ie, (int2, keytype).
72 * Note that in any case, leaf tuples contain more data than is known to
73 * the TupleDesc; see access/gin/README for details.
74 */
77
78 /*
79 * Per-index-column opclass support functions
80 */
87 /* canPartialMatch[i] is true if comparePartialFn[i] is valid */
89 /* Collations to pass to the support functions */
92
93
94/* ginutil.c */
95extern bytea *ginoptions(Datum reloptions, bool validate);
98extern void GinInitBuffer(Buffer b, uint32 f);
99extern void GinInitPage(Page page, uint32 f, Size pageSize);
100extern void GinInitMetabuffer(Buffer b);
102 Datum value, bool isNull,
103 int32 *nentries, GinNullCategory **categories);
104
106extern Datum gintuple_get_key(GinState *ginstate, IndexTuple tuple,
107 GinNullCategory *category);
108extern char *ginbuildphasename(int64 phasenum);
109
110/* gininsert.c */
112 struct IndexInfo *indexInfo);
113extern void ginbuildempty(Relation index);
114extern bool gininsert(Relation index, Datum *values, bool *isnull,
117 bool indexUnchanged,
118 struct IndexInfo *indexInfo);
119extern void ginEntryInsert(GinState *ginstate,
122 GinStatsData *buildStats);
123
124/* ginbtree.c */
125
126typedef struct GinBtreeStack
127{
132 /* predictNumber contains predicted number of pages on current level */
136
137typedef struct GinBtreeData *GinBtree;
138
139/* Return codes for GinBtreeData.beginPlaceToPage method */
146
178
179/* This represents a tuple to be inserted to entry tree. */
180typedef struct
181{
182 IndexTuple entry; /* tuple to insert */
183 bool isDelete; /* delete old tuple at same offset? */
185
186/*
187 * This represents an itempointer, or many itempointers, to be inserted to
188 * a data (posting tree) leaf page
189 */
196
197/*
198 * For internal data (posting tree) pages, the insertion payload is a
199 * PostingItem
200 */
201
202extern GinBtreeStack *ginFindLeafPage(GinBtree btree, bool searchMode,
203 bool rootConflictCheck);
204extern Buffer ginStepRight(Buffer buffer, Relation index, int lockmode);
205extern void freeGinBtreeStack(GinBtreeStack *stack);
206extern void ginInsertValue(GinBtree btree, GinBtreeStack *stack,
207 void *insertdata, GinStatsData *buildStats);
208
209/* ginentrypage.c */
210extern IndexTuple GinFormTuple(GinState *ginstate,
214 Datum key, GinNullCategory category,
215 GinState *ginstate);
218 IndexTuple itup, int *nitems);
219
220/* gindatapage.c */
222extern int GinDataLeafPageGetItemsToTbm(Page page, TIDBitmap *tbm);
225 GinStatsData *buildStats, Buffer entrybuffer);
227extern void GinPageDeletePostingItem(Page page, OffsetNumber offset);
228extern void ginInsertItemPointers(Relation index, BlockNumber rootBlkno,
230 GinStatsData *buildStats);
233
234/*
235 * This is declared in ginvacuum.c, but is passed between ginVacuumItemPointers
236 * and ginVacuumPostingTreeLeaf and as an opaque struct, so we need a forward
237 * declaration for it.
238 */
240
241extern void ginVacuumPostingTreeLeaf(Relation indexrel, Buffer buffer,
243
244/* ginscan.c */
245
246/*
247 * GinScanKeyData describes a single GIN index qualifier expression.
248 *
249 * From each qual expression, we extract one or more specific index search
250 * conditions, which are represented by GinScanEntryData. It's quite
251 * possible for identical search conditions to be requested by more than
252 * one qual expression, in which case we merge such conditions to have just
253 * one unique GinScanEntry --- this is particularly important for efficiency
254 * when dealing with full-index-scan entries. So there can be multiple
255 * GinScanKeyData.scanEntry pointers to the same GinScanEntryData.
256 *
257 * In each GinScanKeyData, nentries is the true number of entries, while
258 * nuserentries is the number that extractQueryFn returned (which is what
259 * we report to consistentFn). The "user" entries must come first.
260 */
262
264
265typedef struct GinScanKeyData
266{
267 /* Real number of entries in scanEntry[] (always > 0) */
269 /* Number of entries that extractQueryFn and consistentFn know about */
271
272 /* array of GinScanEntry pointers, one per extracted search condition */
274
275 /*
276 * At least one of the entries in requiredEntries must be present for a
277 * tuple to match the overall qual.
278 *
279 * additionalEntries contains entries that are needed by the consistent
280 * function to decide if an item matches, but are not sufficient to
281 * satisfy the qual without entries from requiredEntries.
282 */
287
288 /* array of check flags, reported to consistentFn */
295
296 /* other data needed for calling consistentFn */
298 /* NB: these three arrays have only nuserentries elements! */
305
306 /*
307 * An excludeOnly scan key is not able to enumerate all matching tuples.
308 * That is, to be semantically correct on its own, it would need to have a
309 * GIN_CAT_EMPTY_QUERY scanEntry, but it doesn't. Such a key can still be
310 * used to filter tuples returned by other scan keys, so we will get the
311 * right answers as long as there's at least one non-excludeOnly scan key
312 * for each index attribute considered by the search. For efficiency
313 * reasons we don't want to have unnecessary GIN_CAT_EMPTY_QUERY entries,
314 * so we will convert an excludeOnly scan key to non-excludeOnly (by
315 * adding a GIN_CAT_EMPTY_QUERY scanEntry) only if there are no other
316 * non-excludeOnly scan keys.
317 */
319
320 /*
321 * Match status data. curItem is the TID most recently tested (could be a
322 * lossy-page pointer). curItemMatches is true if it passes the
323 * consistentFn test; if so, recheckCurItem is the recheck flag.
324 * isFinished means that all the input entry streams are finished, so this
325 * key cannot succeed for any later TIDs.
326 */
332
333typedef struct GinScanEntryData
334{
335 /* query key and other information from extractQueryFn */
343
344 /* Current page in posting tree */
346
347 /* current ItemPointer to heap */
349
350 /* for a partial-match or full-scan query, we accumulate all TIDs here */
353
354 /*
355 * If blockno is InvalidBlockNumber, all of the other fields in the
356 * matchResult are meaningless.
357 */
361
362 /* used for Posting list and one page in Posting tree */
364 int nlist;
366
372
373typedef struct GinScanOpaqueData
374{
377
378 GinScanKey keys; /* one per scan qualifier expr */
380
381 GinScanEntry *entries; /* one per index search condition */
383 uint32 allocentries; /* allocated length of entries[] */
384
385 MemoryContext keyCtx; /* used to hold key and entry data */
386
387 bool isVoidRes; /* true if query is unsatisfiable */
389
391
392extern IndexScanDesc ginbeginscan(Relation rel, int nkeys, int norderbys);
393extern void ginendscan(IndexScanDesc scan);
394extern void ginrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys,
395 ScanKey orderbys, int norderbys);
396extern void ginNewScanKey(IndexScanDesc scan);
397extern void ginFreeScanKeys(GinScanOpaque so);
398
399/* ginget.c */
400extern int64 gingetbitmap(IndexScanDesc scan, TIDBitmap *tbm);
401
402/* ginlogic.c */
403extern void ginInitConsistentFunction(GinState *ginstate, GinScanKey key);
404
405/* ginvacuum.c */
409 void *callback_state);
411 IndexBulkDeleteResult *stats);
413 ItemPointerData *items, int nitem, int *nremaining);
414
415/* ginvalidate.c */
416extern bool ginvalidate(Oid opclassoid);
418 Oid opclassoid,
419 List *operators,
420 List *functions);
421
422/* ginbulk.c */
434
444
445extern void ginInitBA(BuildAccumulator *accum);
446extern void ginInsertBAEntries(BuildAccumulator *accum,
448 Datum *entries, GinNullCategory *categories,
449 int32 nentries);
450extern void ginBeginBAScan(BuildAccumulator *accum);
452 OffsetNumber *attnum, Datum *key, GinNullCategory *category,
453 uint32 *n);
454
455/* ginfast.c */
456
464
465extern void ginHeapTupleFastInsert(GinState *ginstate,
467extern void ginHeapTupleFastCollect(GinState *ginstate,
469 OffsetNumber attnum, Datum value, bool isNull,
471extern void ginInsertCleanup(GinState *ginstate, bool full_clean,
472 bool fill_fsm, bool forceCleanup, IndexBulkDeleteResult *stats);
473
474/* ginpostinglist.c */
475
477 int maxsize, int *nwritten);
479
481 int *ndecoded_out);
485 int *nmerged);
486
487/*
488 * Merging the results of several gin scans compares item pointers a lot,
489 * so we want this to be inlined.
490 */
491static inline int
499
500/*
501 * Compare two keys of the same index column
502 */
503static inline int
507{
508 /* if not of same null category, sort by that first */
509 if (categorya != categoryb)
510 return (categorya < categoryb) ? -1 : 1;
511
512 /* all null items in same category are equal */
514 return 0;
515
516 /* both not null, so safe to call the compareFn */
517 return DatumGetInt32(FunctionCall2Coll(&ginstate->compareFn[attnum - 1],
518 ginstate->supportCollation[attnum - 1],
519 a, b));
520}
521
522/*
523 * Compare two keys of possibly different index columns
524 */
525static inline int
529{
530 /* attribute number is the first sort key */
531 if (attnuma != attnumb)
532 return (attnuma < attnumb) ? -1 : 1;
533
534 return ginCompareEntries(ginstate, attnuma, a, categorya, b, categoryb);
535
536}
537
538extern int ginTraverseLock(Buffer buffer, bool searchMode);
539
540#endif /* GIN_PRIVATE_H */
static bool validate(Port *port, const char *auth)
Definition auth-oauth.c:638
uint32 BlockNumber
Definition block.h:31
static Datum values[MAXATTR]
Definition bootstrap.c:188
int Buffer
Definition buf.h:23
PageData * Page
Definition bufpage.h:81
int64_t int64
Definition c.h:615
int32_t int32
Definition c.h:614
uint64_t uint64
Definition c.h:619
uint32_t uint32
Definition c.h:618
void * Pointer
Definition c.h:609
size_t Size
Definition c.h:691
Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
Definition fmgr.c:1151
bool(* IndexBulkDeleteCallback)(ItemPointer itemptr, void *state)
Definition genam.h:95
IndexUniqueCheck
Definition genam.h:124
char GinTernaryValue
Definition gin.h:71
int ginTraverseLock(Buffer buffer, bool searchMode)
Definition ginbtree.c:39
IndexScanDesc ginbeginscan(Relation rel, int nkeys, int norderbys)
Definition ginscan.c:26
void freeGinBtreeStack(GinBtreeStack *stack)
Definition ginbtree.c:198
ItemPointer ginPostingListDecodeAllSegments(GinPostingList *segment, int len, int *ndecoded_out)
void ginBeginBAScan(BuildAccumulator *accum)
Definition ginbulk.c:256
void ginInsertValue(GinBtree btree, GinBtreeStack *stack, void *insertdata, GinStatsData *buildStats)
Definition ginbtree.c:816
GinScanOpaqueData * GinScanOpaque
void GinInitPage(Page page, uint32 f, Size pageSize)
Definition ginutil.c:345
bytea * ginoptions(Datum reloptions, bool validate)
Definition ginutil.c:571
int64 gingetbitmap(IndexScanDesc scan, TIDBitmap *tbm)
Definition ginget.c:1931
void ginInsertCleanup(GinState *ginstate, bool full_clean, bool fill_fsm, bool forceCleanup, IndexBulkDeleteResult *stats)
Definition ginfast.c:780
void ginHeapTupleFastCollect(GinState *ginstate, GinTupleCollector *collector, OffsetNumber attnum, Datum value, bool isNull, ItemPointer ht_ctid)
Definition ginfast.c:483
void ginFreeScanKeys(GinScanOpaque so)
Definition ginscan.c:237
ItemPointerData * ginGetBAEntry(BuildAccumulator *accum, OffsetNumber *attnum, Datum *key, GinNullCategory *category, uint32 *n)
Definition ginbulk.c:267
void ginEntryFillRoot(GinBtree btree, Page root, BlockNumber lblkno, Page lpage, BlockNumber rblkno, Page rpage)
OffsetNumber gintuple_get_attrnum(GinState *ginstate, IndexTuple tuple)
Definition ginutil.c:233
GinPostingList * ginCompressPostingList(const ItemPointerData *ipd, int nipd, int maxsize, int *nwritten)
Buffer GinNewBuffer(Relation index)
Definition ginutil.c:307
BlockNumber createPostingTree(Relation index, ItemPointerData *items, uint32 nitems, GinStatsData *buildStats, Buffer entrybuffer)
bool ginvalidate(Oid opclassoid)
Definition ginvalidate.c:31
int ginPostingListDecodeAllSegmentsToTbm(GinPostingList *ptr, int len, TIDBitmap *tbm)
void GinInitBuffer(Buffer b, uint32 f)
Definition ginutil.c:357
void ginEntryInsert(GinState *ginstate, OffsetNumber attnum, Datum key, GinNullCategory category, ItemPointerData *items, uint32 nitem, GinStatsData *buildStats)
Definition gininsert.c:351
void ginendscan(IndexScanDesc scan)
Definition ginscan.c:504
void ginNewScanKey(IndexScanDesc scan)
Definition ginscan.c:267
void ginInsertBAEntries(BuildAccumulator *accum, ItemPointer heapptr, OffsetNumber attnum, Datum *entries, GinNullCategory *categories, int32 nentries)
Definition ginbulk.c:209
Datum * ginExtractEntries(GinState *ginstate, OffsetNumber attnum, Datum value, bool isNull, int32 *nentries, GinNullCategory **categories)
Definition ginutil.c:452
GinBtreeStack * ginScanBeginPostingTree(GinBtree btree, Relation index, BlockNumber rootBlkno)
void ginrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys, ScanKey orderbys, int norderbys)
Definition ginscan.c:491
void GinPageDeletePostingItem(Page page, OffsetNumber offset)
ItemPointer ginVacuumItemPointers(GinVacuumState *gvs, ItemPointerData *items, int nitem, int *nremaining)
Definition ginvacuum.c:48
void ginInitConsistentFunction(GinState *ginstate, GinScanKey key)
Definition ginlogic.c:227
GinPlaceToPageRC
@ GPTP_INSERT
@ GPTP_SPLIT
@ GPTP_NO_WORK
struct GinScanEntryData * GinScanEntry
static int ginCompareItemPointers(const ItemPointerData *a, const ItemPointerData *b)
static int ginCompareAttEntries(GinState *ginstate, OffsetNumber attnuma, Datum a, GinNullCategory categorya, OffsetNumber attnumb, Datum b, GinNullCategory categoryb)
static int ginCompareEntries(GinState *ginstate, OffsetNumber attnum, Datum a, GinNullCategory categorya, Datum b, GinNullCategory categoryb)
bool gininsert(Relation index, Datum *values, bool *isnull, ItemPointer ht_ctid, Relation heapRel, IndexUniqueCheck checkUnique, bool indexUnchanged, struct IndexInfo *indexInfo)
Definition gininsert.c:865
ItemPointer ginPostingListDecode(GinPostingList *plist, int *ndecoded_out)
int GinDataLeafPageGetItemsToTbm(Page page, TIDBitmap *tbm)
Datum gintuple_get_key(GinState *ginstate, IndexTuple tuple, GinNullCategory *category)
Definition ginutil.c:266
struct GinBtreeData * GinBtree
void GinDataPageAddPostingItem(Page page, PostingItem *data, OffsetNumber offset)
void ginInsertItemPointers(Relation index, BlockNumber rootBlkno, ItemPointerData *items, uint32 nitem, GinStatsData *buildStats)
void GinInitMetabuffer(Buffer b)
Definition ginutil.c:363
void ginInitBA(BuildAccumulator *accum)
Definition ginbulk.c:109
void ginbuildempty(Relation index)
Definition gininsert.c:812
void ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector)
Definition ginfast.c:219
char * ginbuildphasename(int64 phasenum)
Definition ginutil.c:676
IndexBuildResult * ginbuild(Relation heap, Relation index, struct IndexInfo *indexInfo)
Definition gininsert.c:618
void initGinState(GinState *state, Relation index)
Definition ginutil.c:103
struct GinScanKeyData * GinScanKey
GinBtreeStack * ginFindLeafPage(GinBtree btree, bool searchMode, bool rootConflictCheck)
Definition ginbtree.c:83
IndexBulkDeleteResult * ginbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, IndexBulkDeleteCallback callback, void *callback_state)
Definition ginvacuum.c:602
IndexBulkDeleteResult * ginvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats)
Definition ginvacuum.c:725
ItemPointer ginReadTuple(GinState *ginstate, OffsetNumber attnum, IndexTuple itup, int *nitems)
void ginadjustmembers(Oid opfamilyoid, Oid opclassoid, List *operators, List *functions)
void ginVacuumPostingTreeLeaf(Relation indexrel, Buffer buffer, GinVacuumState *gvs)
IndexTuple GinFormTuple(GinState *ginstate, OffsetNumber attnum, Datum key, GinNullCategory category, Pointer data, Size dataSize, int nipd, bool errorTooBig)
void ginPrepareEntryScan(GinBtree btree, OffsetNumber attnum, Datum key, GinNullCategory category, GinState *ginstate)
ItemPointer ginMergeItemPointers(ItemPointerData *a, uint32 na, ItemPointerData *b, uint32 nb, int *nmerged)
void ginDataFillRoot(GinBtree btree, Page root, BlockNumber lblkno, Page lpage, BlockNumber rblkno, Page rpage)
Buffer ginStepRight(Buffer buffer, Relation index, int lockmode)
Definition ginbtree.c:177
ItemPointer GinDataLeafPageGetItems(Page page, int *nitems, ItemPointerData advancePast)
#define GinItemPointerGetOffsetNumber(pointer)
Definition ginblock.h:146
#define GIN_CAT_NORM_KEY
Definition ginblock.h:208
signed char GinNullCategory
Definition ginblock.h:206
#define GinItemPointerGetBlockNumber(pointer)
Definition ginblock.h:143
#define nitems(x)
Definition indent.h:31
static struct @174 value
static int pg_cmp_u64(uint64 a, uint64 b)
Definition int.h:731
int b
Definition isn.c:74
int a
Definition isn.c:73
uint16 OffsetNumber
Definition off.h:24
int16 attnum
#define INDEX_MAX_KEYS
const void size_t len
const void * data
uint64_t Datum
Definition postgres.h:70
static int32 DatumGetInt32(Datum X)
Definition postgres.h:202
unsigned int Oid
static int fb(int x)
tree ctl root
Definition radixtree.h:1857
static const struct fns functions
Definition regcomp.c:358
uint16 StrategyNumber
Definition stratnum.h:22
GinState * ginstate
RBTreeIterator tree_walk
GinEntryAccumulator * entryallocator
ItemPointerData * items
BlockNumber(* findChildPage)(GinBtree, GinBtreeStack *)
GinState * ginstate
void(* execPlaceToPage)(GinBtree, Buffer, GinBtreeStack *, void *, BlockNumber, void *)
BlockNumber(* getLeftMostChild)(GinBtree, Page)
bool(* findItem)(GinBtree, GinBtreeStack *)
bool(* isMoveRight)(GinBtree, Page)
ItemPointerData itemptr
GinPlaceToPageRC(* beginPlaceToPage)(GinBtree, Buffer, GinBtreeStack *, void *, BlockNumber, void **, Page *, Page *)
GinNullCategory entryCategory
OffsetNumber entryAttnum
OffsetNumber(* findChildPtr)(GinBtree, Page, BlockNumber, OffsetNumber)
Relation index
void(* fillRoot)(GinBtree, Page, BlockNumber, Page, BlockNumber, Page)
BlockNumber rootBlkno
OffsetNumber off
uint32 predictNumber
ItemPointerData iptr
struct GinBtreeStack * parent
BlockNumber blkno
OffsetNumber attnum
ItemPointerData * list
GinNullCategory category
int32 vl_len_
Definition gin_private.h:30
bool useFastUpdate
Definition gin_private.h:31
int pendingListCleanupSize
Definition gin_private.h:32
ItemPointerData curItem
GinBtreeData btree
TBMIterateResult matchResult
OffsetNumber matchOffsets[TBM_MAX_TUPLES_PER_PAGE]
TIDBitmap * matchBitmap
ItemPointerData * list
TBMPrivateIterator * matchIterator
GinNullCategory queryCategory
StrategyNumber strategy
OffsetNumber offset
uint32 predictNumberResult
OffsetNumber attnum
GinScanEntry * scanEntry
uint32 nuserentries
StrategyNumber strategy
GinScanEntry * additionalEntries
Datum * queryValues
GinScanEntry * requiredEntries
FmgrInfo * triConsistentFmgrInfo
ItemPointerData curItem
GinNullCategory * queryCategories
FmgrInfo * consistentFmgrInfo
GinTernaryValue * entryRes
Pointer * extra_data
GinTernaryValue(* triConsistentFn)(GinScanKey key)
bool(* boolConsistentFn)(GinScanKey key)
OffsetNumber attnum
MemoryContext keyCtx
GinScanEntry * entries
MemoryContext tempCtx
FmgrInfo comparePartialFn[INDEX_MAX_KEYS]
Definition gin_private.h:86
bool oneCol
Definition gin_private.h:62
FmgrInfo extractQueryFn[INDEX_MAX_KEYS]
Definition gin_private.h:83
TupleDesc tupdesc[INDEX_MAX_KEYS]
Definition gin_private.h:76
FmgrInfo triConsistentFn[INDEX_MAX_KEYS]
Definition gin_private.h:85
TupleDesc origTupdesc
Definition gin_private.h:75
FmgrInfo extractValueFn[INDEX_MAX_KEYS]
Definition gin_private.h:82
Relation index
Definition gin_private.h:61
FmgrInfo consistentFn[INDEX_MAX_KEYS]
Definition gin_private.h:84
Oid supportCollation[INDEX_MAX_KEYS]
Definition gin_private.h:90
bool canPartialMatch[INDEX_MAX_KEYS]
Definition gin_private.h:88
FmgrInfo compareFn[INDEX_MAX_KEYS]
Definition gin_private.h:81
IndexTuple * tuples
Definition pg_list.h:54
Definition type.h:96
Definition c.h:778
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
static ItemArray items
#define TBM_MAX_TUPLES_PER_PAGE
Definition tidbitmap.h:34