28 #ifdef USE_ASSERT_CHECKING 29 static bool _bt_posting_valid(
IndexTuple posting);
55 Size newitemsz,
bool checkingunique)
65 bool singlevalstrat =
false;
123 elog(
ERROR,
"deduplication failed to add highkey");
126 for (offnum = minoff;
135 if (offnum == minoff)
187 singlevalstrat =
false;
353 for (offnum = minoff;
362 if (offnum == minoff)
485 htids = &itup->
t_tid;
562 elog(
ERROR,
"deduplication failed to add tuple to page");
573 Assert(tuplesz <= state->maxpostingsize);
581 elog(
ERROR,
"deduplication failed to add tuple to page");
587 Assert(spacesaving > 0 && spacesaving < BLCKSZ);
638 bool dupinterval = (state->
nitems > 1);
678 bool firstpromising =
false;
679 bool lastpromising =
false;
681 Assert(_bt_posting_valid(itup));
704 firstpromising = (minblocklist == midblocklist);
705 lastpromising = (!firstpromising &&
706 midblocklist == maxblocklist);
709 for (
int p = 0; p < nitem; p++)
713 ideltid->
tid = *htid;
718 if ((firstpromising && p == 0) ||
719 (lastpromising && p == nitem - 1))
886 memcpy(itup, base, keysize);
895 Assert(_bt_posting_valid(itup));
932 Assert(_bt_posting_valid(origtuple));
954 memcpy(itup, origtuple, keysize);
968 htids = &itup->
t_tid;
975 if (d < vacposting->ndeletedtids && vacposting->
deletetids[d] ==
i)
984 Assert(nhtids == 1 || _bt_posting_valid(itup));
988 vacposting->
itup = itup;
1021 char *replaceposright;
1026 Assert(_bt_posting_valid(oposting));
1027 Assert(postingoff > 0 && postingoff < nhtids);
1039 memmove(replaceposright, replacepos, nmovebytes);
1050 Assert(_bt_posting_valid(nposting));
1059 #ifdef USE_ASSERT_CHECKING int32 ItemPointerCompare(ItemPointer arg1, ItemPointer arg2)
#define ItemPointerIsValid(pointer)
void XLogRegisterBufData(uint8 block_id, char *data, int len)
IndexTuple _bt_form_posting(IndexTuple base, ItemPointer htids, int nhtids)
void _bt_delitems_delete_check(Relation rel, Buffer buf, Relation heapRel, TM_IndexDeleteOp *delstate)
void _bt_update_posting(BTVacuumPosting vacposting)
void PageRestoreTempPage(Page tempPage, Page oldPage)
static bool BTreeTupleIsPivot(IndexTuple itup)
static ItemPointer BTreeTupleGetHeapTID(IndexTuple itup)
void MarkBufferDirty(Buffer buffer)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
static ItemPointer BTreeTupleGetPosting(IndexTuple posting)
#define P_FIRSTDATAKEY(opaque)
#define END_CRIT_SECTION()
#define P_HAS_GARBAGE(opaque)
#define START_CRIT_SECTION()
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
void _bt_dedup_start_pending(BTDedupState state, IndexTuple base, OffsetNumber baseoff)
#define SizeOfPageHeaderData
#define MaxTIDsPerBTreePage
#define ItemIdIsDead(itemId)
IndexTuple _bt_swap_posting(IndexTuple newitem, IndexTuple oposting, int postingoff)
Size _bt_dedup_finish_pending(Page newpage, BTDedupState state)
#define PageGetMaxOffsetNumber(page)
BTPageOpaqueData * BTPageOpaque
Page PageGetTempPageCopySpecial(Page page)
void pfree(void *pointer)
#define ItemIdGetLength(itemId)
#define INDEX_ALT_TID_MASK
BTDedupInterval intervals[MaxIndexTuplesPerPage]
static void BTreeTupleSetPosting(IndexTuple itup, uint16 nhtids, int postingoffset)
static bool _bt_do_singleval(Relation rel, Page page, BTDedupState state, OffsetNumber minoff, IndexTuple newitem)
IndexTuple CopyIndexTuple(IndexTuple source)
bool _bt_dedup_save_htid(BTDedupState state, IndexTuple itup)
IndexTupleData * IndexTuple
#define PageGetPageSize(page)
struct ItemIdData ItemIdData
#define IndexRelationGetNumberOfKeyAttributes(relation)
#define BufferGetPage(buffer)
#define BTREE_SINGLEVAL_FILLFACTOR
#define PageGetItemId(page, offsetNumber)
static ItemPointer BTreeTupleGetMaxHeapTID(IndexTuple itup)
void XLogRegisterData(char *data, int len)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void * palloc0(Size size)
uint16 deletetids[FLEXIBLE_ARRAY_MEMBER]
static void _bt_bottomupdel_finish_pending(Page page, BTDedupState state, TM_IndexDeleteOp *delstate)
#define InvalidOffsetNumber
void _bt_dedup_pass(Relation rel, Buffer buf, Relation heapRel, IndexTuple newitem, Size newitemsz, bool checkingunique)
static ItemPointer BTreeTupleGetPostingN(IndexTuple posting, int n)
static bool BTreeTupleIsPosting(IndexTuple itup)
static uint32 BTreeTupleGetPostingOffset(IndexTuple posting)
bool _bt_bottomupdel_pass(Relation rel, Buffer buf, Relation heapRel, Size newitemsz)
#define Assert(condition)
struct ItemPointerData ItemPointerData
#define OffsetNumberNext(offsetNumber)
#define PageGetSpecialPointer(page)
#define RelationNeedsWAL(relation)
Size PageGetExactFreeSpace(Page page)
#define BTMaxItemSize(page)
int _bt_keep_natts_fast(Relation rel, IndexTuple lastleft, IndexTuple firstright)
static uint16 BTreeTupleGetNPosting(IndexTuple posting)
#define ItemPointerGetBlockNumber(pointer)
BTDedupStateData * BTDedupState
void XLogBeginInsert(void)
#define PageSetLSN(page, lsn)
#define P_RIGHTMOST(opaque)
#define PageGetItem(page, itemId)
static void _bt_singleval_fillfactor(Page page, BTDedupState state, Size newitemsz)
#define IndexTupleSize(itup)
#define ItemPointerCopy(fromPointer, toPointer)