71 while (*listLink != NULL)
76 listLink = &pitem->
next;
95 for (pitem = bds->
pendingList; pitem != NULL; pitem = nitem)
143 memset(predecessor, 0,
sizeof(predecessor));
144 memset(deletable, 0,
sizeof(deletable));
177 elog(
ERROR,
"inconsistent tuple chain links in page %u of index \"%s\"",
237 bool interveningDeletable;
245 if (predecessor[
i] != 0)
249 interveningDeletable =
false;
263 elog(
ERROR,
"unexpected SPGiST tuple state: %d",
273 interveningDeletable =
true;
282 moveDest[xlrec.
nMove] =
i;
286 interveningDeletable =
false;
294 if (interveningDeletable)
296 chainSrc[xlrec.
nChain] = prevLive;
301 interveningDeletable =
false;
313 else if (interveningDeletable)
316 chainSrc[xlrec.
nChain] = prevLive;
324 elog(
ERROR,
"inconsistent counts of deletable tuples");
358 moveSrc, xlrec.
nMove,
442 elog(
ERROR,
"unexpected SPGiST tuple state: %d",
499 bool hasNonPlaceholder =
false;
500 bool hasUpdate =
false;
550 if (!hasNonPlaceholder)
551 firstPlaceholder =
i;
555 hasNonPlaceholder =
true;
569 for (
i = firstPlaceholder;
i <= max;
i++)
570 itemnos[
i - firstPlaceholder] =
i;
572 i = max - firstPlaceholder + 1;
715 elog(
ERROR,
"redirection leads to root page of index \"%s\"",
731 for (nitem = pitem->
next; nitem != NULL; nitem = nitem->
next)
746 for (nitem = pitem; nitem != NULL; nitem = nitem->
next)
776 elog(
ERROR,
"unexpected SPGiST tuple state: %d",
837 if (blkno >= num_pages)
840 for (; blkno < num_pages; blkno++)
#define InvalidBlockNumber
BlockNumber BufferGetBlockNumber(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
void LockBuffer(Buffer buffer, int mode)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
#define RelationGetNumberOfBlocks(reln)
static Page BufferGetPage(Buffer buffer)
#define BUFFER_LOCK_EXCLUSIVE
void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems)
static bool PageIsEmpty(Page page)
static Item PageGetItem(Page page, ItemId itemId)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static bool PageIsNew(Page page)
static void PageSetLSN(Page page, XLogRecPtr lsn)
static OffsetNumber PageGetMaxOffsetNumber(Page page)
elog(ERROR, "%s: %s", p2, msg)
bool(* IndexBulkDeleteCallback)(ItemPointer itemptr, void *state)
void IndexFreeSpaceMapVacuum(Relation rel)
void RecordFreeIndexPage(Relation rel, BlockNumber freeBlock)
bool ItemPointerEquals(ItemPointer pointer1, ItemPointer pointer2)
static void ItemPointerSetInvalid(ItemPointerData *pointer)
static OffsetNumber ItemPointerGetOffsetNumber(const ItemPointerData *pointer)
static BlockNumber ItemPointerGetBlockNumber(const ItemPointerData *pointer)
static bool ItemPointerIsValid(const ItemPointerData *pointer)
#define MaxIndexTuplesPerPage
Assert(fmt[strlen(fmt) - 1] !='\n')
void LockRelationForExtension(Relation relation, LOCKMODE lockmode)
void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode)
void pfree(void *pointer)
void * palloc0(Size size)
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
#define InvalidOffsetNumber
#define FirstOffsetNumber
bool GlobalVisTestIsRemovableXid(GlobalVisState *state, TransactionId xid)
GlobalVisState * GlobalVisTestFor(Relation rel)
#define RELATION_IS_LOCAL(relation)
#define RelationGetRelationName(relation)
#define RelationIsAccessibleInLogicalDecoding(relation)
#define RelationNeedsWAL(relation)
Snapshot GetActiveSnapshot(void)
void spgPageIndexMultiDelete(SpGistState *state, Page page, OffsetNumber *itemnos, int nitems, int firststate, int reststate, BlockNumber blkno, OffsetNumber offnum)
SpGistDeadTupleData * SpGistDeadTuple
SpGistInnerTupleData * SpGistInnerTuple
#define SGLT_GET_NEXTOFFSET(spgLeafTuple)
#define SPGIST_PLACEHOLDER
#define SGITITERATE(x, i, nt)
#define SpGistPageIsLeaf(page)
#define SPGIST_METAPAGE_BLKNO
#define SpGistPageIsDeleted(page)
#define SGLT_SET_NEXTOFFSET(spgLeafTuple, offsetNumber)
#define SpGistBlockIsRoot(blkno)
struct SpGistLeafTupleData * SpGistLeafTuple
#define STORE_STATE(s, d)
#define SpGistPageGetOpaque(page)
#define SPGIST_LAST_FIXED_BLKNO
void initSpGistState(SpGistState *state, Relation index)
void SpGistUpdateMetaPage(Relation index)
void SpGistSetLastUsedPage(Relation index, Buffer buffer)
struct spgBulkDeleteState spgBulkDeleteState
static void vacuumRedirectAndPlaceholder(Relation index, Relation heaprel, Buffer buffer)
static bool dummy_callback(ItemPointer itemptr, void *state)
struct spgVacPendingItem spgVacPendingItem
IndexBulkDeleteResult * spgvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats)
static void vacuumLeafPage(spgBulkDeleteState *bds, Relation index, Buffer buffer, bool forPending)
static void spgvacuumscan(spgBulkDeleteState *bds)
static void spgprocesspending(spgBulkDeleteState *bds)
IndexBulkDeleteResult * spgbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, IndexBulkDeleteCallback callback, void *callback_state)
static void vacuumLeafRoot(spgBulkDeleteState *bds, Relation index, Buffer buffer)
static void spgClearPendingList(spgBulkDeleteState *bds)
static void spgvacuumpage(spgBulkDeleteState *bds, BlockNumber blkno)
static void spgAddPendingTID(spgBulkDeleteState *bds, ItemPointer tid)
#define XLOG_SPGIST_VACUUM_ROOT
#define SizeOfSpgxlogVacuumLeaf
#define SizeOfSpgxlogVacuumRedirect
#define XLOG_SPGIST_VACUUM_LEAF
#define XLOG_SPGIST_VACUUM_REDIRECT
#define SizeOfSpgxlogVacuumRoot
void RelationTruncate(Relation rel, BlockNumber nblocks)
BlockNumber pages_deleted
BlockNumber pages_newly_deleted
BufferAccessStrategy strategy
IndexBulkDeleteResult * stats
IndexBulkDeleteCallback callback
spgVacPendingItem * pendingList
BlockNumber lastFilledBlock
struct spgVacPendingItem * next
OffsetNumber firstPlaceholder
TransactionId snapshotConflictHorizon
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
bool TransactionIdFollowsOrEquals(TransactionId id1, TransactionId id2)
#define InvalidTransactionId
#define TransactionIdIsValid(xid)
void vacuum_delay_point(void)
void XLogRegisterData(char *data, uint32 len)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
void XLogBeginInsert(void)