34#define GinPostingListSegmentMaxSize 384
35#define GinPostingListSegmentTargetSize 256
36#define GinPostingListSegmentMinSize 128
43#define MinTuplesPerSegment ((GinPostingListSegmentMaxSize - 2) / 6)
143 char *endptr = (
char *) seg +
len;
150 while ((
char *)
next < endptr &&
156 len = endptr - (
char *) seg;
395 if (offset != maxoff + 1)
424 if (offset != maxoff)
476 for (
i = 0;
i < maxitems;
i++)
561 items->curitem += maxitems;
580 elog(
ERROR,
"could not split GIN page; all old items didn't fit");
583 for (
i = 0;
i < maxitems;
i++)
589 elog(
ERROR,
"could not split GIN page; no new items fit");
609 elog(
DEBUG2,
"appended %d new items to block %u; %d bytes (%d to go)",
613 elog(
DEBUG2,
"inserted %d new items to block %u; %d bytes (%d to go)",
695 elog(
DEBUG2,
"appended %d items to block %u; split %d/%d (%d to go)",
699 elog(
DEBUG2,
"inserted %d items to block %u; split %d/%d (%d to go)",
704 items->curitem += maxitems;
782 elog(
ERROR,
"could not fit vacuumed posting list");
945 datalen +=
sizeof(
uint16);
955 elog(
ERROR,
"unexpected GIN leaf action %d", action);
1388 while ((
char *) seg <
segend)
1400 leaf->oldformat =
false;
1428 leaf->oldformat =
true;
1785 bool is_build = (buildStats !=
NULL);
#define InvalidBlockNumber
BlockNumber BufferGetBlockNumber(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
static Page BufferGetPage(Buffer buffer)
void PageRestoreTempPage(Page tempPage, Page oldPage)
Page PageGetTempPage(const PageData *page)
static Size PageGetPageSize(const PageData *page)
static void PageSetLSN(Page page, XLogRecPtr lsn)
#define Assert(condition)
#define palloc_object(type)
#define palloc0_object(type)
static int ginCompareItemPointers(ItemPointer a, ItemPointer b)
#define GinDataLeafPageGetFreeSpace(page)
#define GinPageGetOpaque(page)
#define SizeOfGinPostingList(plist)
#define GinDataLeafPageGetPostingListSize(page)
#define GinDataPageSetDataSize(page, size)
#define GinDataPageMaxDataSize
#define GinDataPageGetRightBound(page)
#define GinPageSetCompressed(page)
#define GinNextPostingListSegment(cur)
#define GinNonLeafDataPageGetFreeSpace(page)
#define GinPageIsData(page)
#define GinPageRightMost(page)
#define ItemPointerSetMin(p)
#define GinDataPageGetPostingItem(page, i)
#define PostingItemGetBlockNumber(pointer)
#define GinDataPageGetData(page)
#define PostingItemSetBlockNumber(pointer, blockNumber)
#define GinPageIsDeleted(page)
#define GinPageIsCompressed(page)
#define GinPageIsLeaf(page)
#define GinDataLeafPageGetPostingList(page)
void ginInsertValue(GinBtree btree, GinBtreeStack *stack, void *insertdata, GinStatsData *buildStats)
GinBtreeStack * ginFindLeafPage(GinBtree btree, bool searchMode, bool rootConflictCheck)
static OffsetNumber dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber storedOff)
static void dataSplitPageInternal(GinBtree btree, Buffer origbuf, GinBtreeStack *stack, void *insertdata, BlockNumber updateblkno, Page *newlpage, Page *newrpage)
#define MinTuplesPerSegment
static bool addItemsToLeaf(disassembledLeaf *leaf, ItemPointer newItems, int nNewItems)
static bool leafRepackItems(disassembledLeaf *leaf, ItemPointer remaining)
#define GinPostingListSegmentTargetSize
static BlockNumber dataGetLeftMostPage(GinBtree btree, Page page)
static void * dataPrepareDownlink(GinBtree btree, Buffer lbuf)
BlockNumber createPostingTree(Relation index, ItemPointerData *items, uint32 nitems, GinStatsData *buildStats, Buffer entrybuffer)
GinBtreeStack * ginScanBeginPostingTree(GinBtree btree, Relation index, BlockNumber rootBlkno)
void GinPageDeletePostingItem(Page page, OffsetNumber offset)
static GinPlaceToPageRC dataBeginPlaceToPageLeaf(GinBtree btree, Buffer buf, GinBtreeStack *stack, void *insertdata, void **ptp_workspace, Page *newlpage, Page *newrpage)
static GinPlaceToPageRC dataBeginPlaceToPageInternal(GinBtree btree, Buffer buf, GinBtreeStack *stack, void *insertdata, BlockNumber updateblkno, void **ptp_workspace, Page *newlpage, Page *newrpage)
static void dataExecPlaceToPageLeaf(GinBtree btree, Buffer buf, GinBtreeStack *stack, void *insertdata, void *ptp_workspace)
static void dataPlaceToPageLeafRecompress(Buffer buf, disassembledLeaf *leaf)
int GinDataLeafPageGetItemsToTbm(Page page, TIDBitmap *tbm)
void GinDataPageAddPostingItem(Page page, PostingItem *data, OffsetNumber offset)
#define GinPostingListSegmentMaxSize
void ginInsertItemPointers(Relation index, BlockNumber rootBlkno, ItemPointerData *items, uint32 nitem, GinStatsData *buildStats)
static GinPlaceToPageRC dataBeginPlaceToPage(GinBtree btree, Buffer buf, GinBtreeStack *stack, void *insertdata, BlockNumber updateblkno, void **ptp_workspace, Page *newlpage, Page *newrpage)
static void dataExecPlaceToPage(GinBtree btree, Buffer buf, GinBtreeStack *stack, void *insertdata, BlockNumber updateblkno, void *ptp_workspace)
static bool dataIsMoveRight(GinBtree btree, Page page)
static void dataPlaceToPageLeafSplit(disassembledLeaf *leaf, ItemPointerData lbound, ItemPointerData rbound, Page lpage, Page rpage)
static void dataExecPlaceToPageInternal(GinBtree btree, Buffer buf, GinBtreeStack *stack, void *insertdata, BlockNumber updateblkno, void *ptp_workspace)
static void ginPrepareDataScan(GinBtree btree, Relation index, BlockNumber rootBlkno)
static BlockNumber dataLocateItem(GinBtree btree, GinBtreeStack *stack)
static void computeLeafRecompressWALData(disassembledLeaf *leaf)
void ginVacuumPostingTreeLeaf(Relation indexrel, Buffer buffer, GinVacuumState *gvs)
static ItemPointer dataLeafPageGetUncompressed(Page page, int *nitems)
void ginDataFillRoot(GinBtree btree, Page root, BlockNumber lblkno, Page lpage, BlockNumber rblkno, Page rpage)
#define GinPostingListSegmentMinSize
static disassembledLeaf * disassembleLeaf(Page page)
ItemPointer GinDataLeafPageGetItems(Page page, int *nitems, ItemPointerData advancePast)
ItemPointer ginPostingListDecodeAllSegments(GinPostingList *segment, int len, int *ndecoded_out)
GinPostingList * ginCompressPostingList(const ItemPointerData *ipd, int nipd, int maxsize, int *nwritten)
int ginPostingListDecodeAllSegmentsToTbm(GinPostingList *ptr, int len, TIDBitmap *tbm)
ItemPointer ginPostingListDecode(GinPostingList *plist, int *ndecoded_out)
ItemPointer ginMergeItemPointers(ItemPointerData *a, uint32 na, ItemPointerData *b, uint32 nb, int *nmerged)
void GinInitPage(Page page, uint32 f, Size pageSize)
Buffer GinNewBuffer(Relation index)
ItemPointer ginVacuumItemPointers(GinVacuumState *gvs, ItemPointerData *items, int nitem, int *nremaining)
#define GIN_SEGMENT_ADDITEMS
#define GIN_SEGMENT_DELETE
#define XLOG_GIN_CREATE_PTREE
#define XLOG_GIN_VACUUM_DATA_LEAF_PAGE
#define GIN_SEGMENT_UNMODIFIED
#define GIN_SEGMENT_INSERT
#define GIN_SEGMENT_REPLACE
static void dlist_insert_after(dlist_node *after, dlist_node *node)
#define dlist_foreach(iter, lhead)
static void dlist_init(dlist_head *head)
static bool dlist_has_next(const dlist_head *head, const dlist_node *node)
static bool dlist_has_prev(const dlist_head *head, const dlist_node *node)
static dlist_node * dlist_prev_node(dlist_head *head, dlist_node *node)
static dlist_node * dlist_next_node(dlist_head *head, dlist_node *node)
static void dlist_delete(dlist_node *node)
static dlist_node * dlist_head_node(dlist_head *head)
static bool dlist_is_empty(const dlist_head *head)
static void dlist_push_tail(dlist_head *head, dlist_node *node)
static dlist_node * dlist_tail_node(dlist_head *head)
#define dlist_container(type, membername, ptr)
int32 ItemPointerCompare(const ItemPointerData *arg1, const ItemPointerData *arg2)
static void ItemPointerSetInvalid(ItemPointerData *pointer)
ItemPointerData * ItemPointer
static bool ItemPointerIsValid(const ItemPointerData *pointer)
void pfree(void *pointer)
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
#define InvalidOffsetNumber
#define FirstOffsetNumber
static char buf[DEFAULT_XLOG_SEG_SIZE]
void PredicateLockPageSplit(Relation relation, BlockNumber oldblkno, BlockNumber newblkno)
#define RelationNeedsWAL(relation)
BlockNumber(* findChildPage)(GinBtree, GinBtreeStack *)
void(* execPlaceToPage)(GinBtree, Buffer, GinBtreeStack *, void *, BlockNumber, void *)
BlockNumber(* getLeftMostChild)(GinBtree, Page)
bool(* findItem)(GinBtree, GinBtreeStack *)
void *(* prepareDownlink)(GinBtree, Buffer)
bool(* isMoveRight)(GinBtree, Page)
GinPlaceToPageRC(* beginPlaceToPage)(GinBtree, Buffer, GinBtreeStack *, void *, BlockNumber, void **, Page *, Page *)
OffsetNumber(* findChildPtr)(GinBtree, Page, BlockNumber, OffsetNumber)
void(* fillRoot)(GinBtree, Page, BlockNumber, Page, BlockNumber, Page)
ItemPointerData * modifieditems
void tbm_add_tuples(TIDBitmap *tbm, const ItemPointerData *tids, int ntids, bool recheck)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterBufData(uint8 block_id, const void *data, uint32 len)
void XLogRegisterData(const void *data, uint32 len)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
void XLogBeginInsert(void)