45 if (searchMode ==
false)
81 bool rootConflictCheck,
Snapshot snapshot)
91 if (rootConflictCheck)
128 stack->
blkno = rightlink;
149 stack->
blkno = child;
158 stack->
blkno = child;
188 elog(
ERROR,
"right sibling of GIN page is of different type");
308 blkno = leftmostBlkno;
337 Page childpage = NULL;
338 Page newlpage = NULL,
340 void *ptp_workspace = NULL;
351 "ginPlaceToPage temporary context",
377 insertdata, updateblkno,
379 &newlpage, &newrpage);
401 insertdata, updateblkno, ptp_workspace);
418 xlrec.
flags = xlflags;
456 Page newrootpg = NULL;
474 data.
flags = xlflags;
483 if (stack->
parent == NULL)
535 data.
rrlink = savedRightLink;
567 if (stack->
parent == NULL)
571 memcpy(page, newrootpg, BLCKSZ);
578 memcpy(page, newlpage, BLCKSZ);
601 if (stack->
parent == NULL)
621 if (stack->
parent == NULL)
633 if (stack->
parent == NULL)
641 result = (stack->
parent == NULL);
645 elog(
ERROR,
"invalid return code from GIN beginPlaceToPage method: %d", rc);
680 elog(
DEBUG1,
"finishing incomplete split of block %u in gin index \"%s\"",
734 insertdata, updateblkno,
735 stack->
buffer, buildStats);
744 if (!first || freestack)
Buffer GinNewBuffer(Relation index)
static void ginFindParents(GinBtree btree, GinBtreeStack *stack)
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
static void TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
void(* fillRoot)(GinBtree, Page, BlockNumber, Page, BlockNumber, Page)
void GinInitPage(Page page, uint32 f, Size pageSize)
#define GinPageIsIncompleteSplit(page)
void MarkBufferDirty(Buffer buffer)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
bool(* isMoveRight)(GinBtree, Page)
GinBtreeStack * ginFindLeafPage(GinBtree btree, bool searchMode, bool rootConflictCheck, Snapshot snapshot)
#define END_CRIT_SECTION()
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static void ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, GinStatsData *buildStats)
BlockNumber rightChildBlkno
#define START_CRIT_SECTION()
void ReleaseBuffer(Buffer buffer)
#define GinPageGetOpaque(page)
#define GIN_INSERT_ISLEAF
void pfree(void *pointer)
void UnlockReleaseBuffer(Buffer buffer)
GinPlaceToPageRC(* beginPlaceToPage)(GinBtree, Buffer, GinBtreeStack *, void *, BlockNumber, void **, Page *, Page *)
#define GinPageRightMost(page)
void(* execPlaceToPage)(GinBtree, Buffer, GinBtreeStack *, void *, BlockNumber, void *)
BlockNumber(* findChildPage)(GinBtree, GinBtreeStack *)
#define ALLOCSET_DEFAULT_SIZES
#define GIN_INSERT_ISDATA
BlockNumber(* getLeftMostChild)(GinBtree, Page)
Buffer ginStepRight(Buffer buffer, Relation index, int lockmode)
#define RelationGetRelationName(relation)
MemoryContext CurrentMemoryContext
#define GinPageIsLeaf(page)
#define BufferGetPage(buffer)
#define REGBUF_FORCE_IMAGE
void XLogRegisterData(char *data, int len)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
Page PageGetTempPage(Page page)
struct GinBtreeStack * parent
void LockBuffer(Buffer buffer, int mode)
void ginInsertValue(GinBtree btree, GinBtreeStack *stack, void *insertdata, GinStatsData *buildStats)
void CheckForSerializableConflictIn(Relation relation, ItemPointer tid, BlockNumber blkno)
#define InvalidOffsetNumber
BlockNumber leftChildBlkno
#define GinPageIsData(page)
#define Assert(condition)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
#define InvalidBlockNumber
Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation, BlockNumber blockNum)
#define BufferIsValid(bufnum)
#define RelationNeedsWAL(relation)
#define BlockIdSet(blockId, blockNumber)
#define GIN_INCOMPLETE_SPLIT
BlockNumber BufferGetBlockNumber(Buffer buffer)
void *(* prepareDownlink)(GinBtree, Buffer)
void freeGinBtreeStack(GinBtreeStack *stack)
OffsetNumber(* findChildPtr)(GinBtree, Page, BlockNumber, OffsetNumber)
void XLogBeginInsert(void)
static bool ginPlaceToPage(GinBtree btree, GinBtreeStack *stack, void *insertdata, BlockNumber updateblkno, Buffer childbuf, GinStatsData *buildStats)
#define PageSetLSN(page, lsn)
void PredicateLockPageSplit(Relation relation, BlockNumber oldblkno, BlockNumber newblkno)
int ginTraverseLock(Buffer buffer, bool searchMode)