70 oldItems =
ginReadTuple(ginstate, attnum, old, &oldNPosting);
73 oldItems, oldNPosting,
84 (
char *) compressedList,
88 pfree(compressedList);
112 res =
GinFormTuple(ginstate, attnum, key, category, NULL, 0, 0,
true);
142 (
char *) compressedList,
145 pfree(compressedList);
156 res =
GinFormTuple(ginstate, attnum, key, category, NULL, 0, 0,
true);
193 btree.
isBuild = (buildStats != NULL);
223 items, nitem, buildStats, stack->
buffer);
233 items, nitem, buildStats, stack->
buffer);
244 insertdata.
entry = itup;
268 &nentries, &categories);
272 entries, categories, nentries);
281 bool *isnull,
bool tupleIsAlive,
void *
state)
291 values[i], isnull[i], tid);
304 &attnum, &key, &category, &nlist)) != NULL)
335 elog(
ERROR,
"index \"%s\" already contains data",
367 "Gin build temporary context",
375 "Gin build temporary context for user-defined function",
393 &attnum, &key, &category, &nlist)) != NULL)
398 list, nlist, &buildstate.buildStats);
480 &nentries, &categories);
482 for (i = 0; i < nentries; i++)
500 if (ginstate == NULL)
510 "Gin insert temporary context",
524 values[
i], isnull[i],
533 values[
i], isnull[i],
GinPostingList * ginCompressPostingList(const ItemPointer ipd, int nipd, int maxsize, int *nwritten)
Buffer GinNewBuffer(Relation index)
void GinInitMetabuffer(Buffer b)
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
void ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector)
XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std)
void ginInsertItemPointers(Relation index, BlockNumber rootBlkno, ItemPointerData *items, uint32 nitem, GinStatsData *buildStats)
void MarkBufferDirty(Buffer buffer)
BlockNumber createPostingTree(Relation index, ItemPointerData *items, uint32 nitems, GinStatsData *buildStats, Buffer entrybuffer)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
GinBtreeStack * ginFindLeafPage(GinBtree btree, bool searchMode, bool rootConflictCheck, Snapshot snapshot)
#define END_CRIT_SECTION()
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define START_CRIT_SECTION()
void MemoryContextReset(MemoryContext context)
void ginbuildempty(Relation index)
static void ginBuildCallback(Relation index, ItemPointer tid, Datum *values, bool *isnull, bool tupleIsAlive, void *state)
#define BUFFER_LOCK_EXCLUSIVE
ItemPointer ginMergeItemPointers(ItemPointerData *a, uint32 na, ItemPointerData *b, uint32 nb, int *nmerged)
static void ginHeapTupleInsert(GinState *ginstate, OffsetNumber attnum, Datum value, bool isNull, ItemPointer item)
static IndexTuple addItemPointersToLeafTuple(GinState *ginstate, IndexTuple old, ItemPointerData *items, uint32 nitem, GinStatsData *buildStats, Buffer buffer)
bool(* findItem)(GinBtree, GinBtreeStack *)
#define GinSetPostingTree(itup, blkno)
void pfree(void *pointer)
void ginEntryInsert(GinState *ginstate, OffsetNumber attnum, Datum key, GinNullCategory category, ItemPointerData *items, uint32 nitem, GinStatsData *buildStats)
void UnlockReleaseBuffer(Buffer buffer)
IndexBuildResult * ginbuild(Relation heap, Relation index, IndexInfo *indexInfo)
signed char GinNullCategory
static double table_index_build_scan(Relation table_rel, Relation index_rel, struct IndexInfo *index_info, bool allow_sync, bool progress, IndexBuildCallback callback, void *callback_state, TableScanDesc scan)
#define ALLOCSET_DEFAULT_SIZES
OffsetNumber gintuple_get_attrnum(GinState *ginstate, IndexTuple tuple)
static void ginHeapTupleBulkInsert(GinBuildState *buildstate, OffsetNumber attnum, Datum value, bool isNull, ItemPointer heapptr)
IndexTupleData * IndexTuple
void initGinState(GinState *state, Relation index)
static IndexTuple buildFreshLeafTuple(GinState *ginstate, OffsetNumber attnum, Datum key, GinNullCategory category, ItemPointerData *items, uint32 nitem, GinStatsData *buildStats, Buffer buffer)
#define RelationGetRelationName(relation)
MemoryContext CurrentMemoryContext
Datum gintuple_get_key(GinState *ginstate, IndexTuple tuple, GinNullCategory *category)
#define BufferGetPage(buffer)
void ginPrepareEntryScan(GinBtree btree, OffsetNumber attnum, Datum key, GinNullCategory category, GinState *ginstate)
#define PageGetItemId(page, offsetNumber)
void ginInsertBAEntries(BuildAccumulator *accum, ItemPointer heapptr, OffsetNumber attnum, Datum *entries, GinNullCategory *categories, int32 nentries)
void LockBuffer(Buffer buffer, int mode)
#define RelationGetNumberOfBlocks(reln)
void ginInsertValue(GinBtree btree, GinBtreeStack *stack, void *insertdata, GinStatsData *buildStats)
void CheckForSerializableConflictIn(Relation relation, ItemPointer tid, BlockNumber blkno)
#define Assert(condition)
IndexTuple GinFormTuple(GinState *ginstate, OffsetNumber attnum, Datum key, GinNullCategory category, Pointer data, Size dataSize, int nipd, bool errorTooBig)
void GinInitBuffer(Buffer b, uint32 f)
ItemPointerData * ginGetBAEntry(BuildAccumulator *accum, OffsetNumber *attnum, Datum *key, GinNullCategory *category, uint32 *n)
ItemPointer ginReadTuple(GinState *ginstate, OffsetNumber attnum, IndexTuple itup, int *nitems)
#define GinGetUseFastUpdate(relation)
#define RelationNeedsWAL(relation)
#define GinGetPostingTree(itup)
void ginBeginBAScan(BuildAccumulator *accum)
static Datum values[MAXATTR]
void log_newpage_range(Relation rel, ForkNumber forkNum, BlockNumber startblk, BlockNumber endblk, bool page_std)
BlockNumber BufferGetBlockNumber(Buffer buffer)
void ginUpdateStats(Relation index, const GinStatsData *stats, bool is_build)
#define GinIsPostingTree(itup)
#define SizeOfGinPostingList(plist)
void freeGinBtreeStack(GinBtreeStack *stack)
bool gininsert(Relation index, Datum *values, bool *isnull, ItemPointer ht_ctid, Relation heapRel, IndexUniqueCheck checkUnique, bool indexUnchanged, IndexInfo *indexInfo)
void ginHeapTupleFastCollect(GinState *ginstate, GinTupleCollector *collector, OffsetNumber attnum, Datum value, bool isNull, ItemPointer ht_ctid)
#define CHECK_FOR_INTERRUPTS()
Datum * ginExtractEntries(GinState *ginstate, OffsetNumber attnum, Datum value, bool isNull, int32 *nentries, GinNullCategory **categories)
#define PageGetItem(page, itemId)
void ginInitBA(BuildAccumulator *accum)