39 memset(state, 0,
sizeof(*state));
60 elog(
ERROR,
"SPGiST tuple to be replaced is not a placeholder");
70 if (
PageAddItem(page, tuple, size, offset,
false,
false) != offset)
71 elog(
ERROR,
"failed to add item of size %u to SPGiST index page",
134 (
Item) leafTuple, leafTupleHdr.
size,
136 elog(
ERROR,
"failed to add item of size %u to SPGiST index page",
224 for (i = 0; i < nInsert; i++)
234 memcpy(&leafTupleHdr, leafTuple,
238 leafTupleHdr.
size, toInsert[i]);
239 ptr += leafTupleHdr.
size;
257 toInsert[nInsert - 1]);
276 blknoDst, toInsert[nInsert - 1]);
316 false,
false) != xldata->
offnum)
317 elog(
ERROR,
"failed to add item of size %u to SPGiST index page",
397 false,
false) != xldata->
offnum)
398 elog(
ERROR,
"failed to add item of size %u to SPGiST index page",
470 ptr += prefixTupleHdr.
size;
515 elog(
ERROR,
"failed to add item of size %u to SPGiST index page",
516 prefixTupleHdr.
size);
520 postfixTupleHdr.
size,
541 uint8 *leafPageSelect;
561 leafPageSelect = (
uint8 *) ptr;
567 ptr += innerTupleHdr.
size;
653 for (i = 0; i < xldata->
nInsert; i++)
661 ptr += leafTupleHdr.
size;
663 page = leafPageSelect[
i] ? destPage : srcPage;
677 if (destPage != NULL)
789 toDead, xldata->
nDead,
801 for (i = 0; i < xldata->
nMove; i++)
813 moveSrc, xldata->
nMove,
818 for (i = 0; i < xldata->
nChain; i++)
870 itemToPlaceholder = xldata->
offsets;
972 elog(
PANIC,
"spg_redo: unknown op code %u", info);
983 "SP-GiST temporary context",
#define XLOG_SPGIST_MOVE_LEAFS
void spg_mask(char *pagedata, BlockNumber blkno)
static void spgRedoVacuumRedirect(XLogReaderState *record)
#define XLOG_SPGIST_VACUUM_REDIRECT
OffsetNumber offnumPostfix
static void fillFakeState(SpGistState *state, spgxlogState stateSrc)
static MemoryContext opCtx
void spgUpdateNodeLink(SpGistInnerTuple tup, int nodeN, BlockNumber blkno, OffsetNumber offset)
OffsetNumber offnumParent
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
SpGistInnerTupleData * SpGistInnerTuple
SpGistDeadTuple spgFormDeadTuple(SpGistState *state, int tupstate, BlockNumber blkno, OffsetNumber offnum)
#define XLOG_SPGIST_SPLIT_TUPLE
#define SGLT_SET_NEXTOFFSET(spgLeafTuple, offsetNumber)
struct spgxlogAddLeaf spgxlogAddLeaf
void PageIndexTupleDelete(Page page, OffsetNumber offnum)
void MarkBufferDirty(Buffer buffer)
#define SizeOfSpgxlogMoveLeafs
static void spgRedoAddNode(XLogReaderState *record)
#define SizeOfSpgxlogPickSplit
#define SPGIST_PLACEHOLDER
OffsetNumber firstPlaceholder
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
void spg_xlog_cleanup(void)
void mask_page_hint_bits(Page page)
static void spgRedoSplitTuple(XLogReaderState *record)
#define XLogRecHasBlockRef(decoder, block_id)
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
#define XLOG_SPGIST_ADD_NODE
void MemoryContextReset(MemoryContext context)
#define XLOG_SPGIST_ADD_LEAF
static void addOrReplaceTuple(Page page, Item tuple, int size, OffsetNumber offset)
#define SizeOfPageHeaderData
#define PageGetMaxOffsetNumber(page)
void mask_unused_space(Page page)
#define XLOG_SPGIST_PICKSPLIT
TransactionId newestRedirectXid
#define XLOG_SPGIST_VACUUM_ROOT
static void spgRedoAddLeaf(XLogReaderState *record)
void pfree(void *pointer)
#define XLogRecGetData(decoder)
void spgPageIndexMultiDelete(SpGistState *state, Page page, OffsetNumber *itemnos, int nitems, int firststate, int reststate, BlockNumber blkno, OffsetNumber offnum)
void UnlockReleaseBuffer(Buffer buffer)
Buffer XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id)
OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER]
#define ALLOCSET_DEFAULT_SIZES
struct SpGistLeafTupleData * SpGistLeafTuple
OffsetNumber offnumParent
static void spgRedoVacuumLeaf(XLogReaderState *record)
static void spgRedoPickSplit(XLogReaderState *record)
SpGistDeadTupleData * SpGistDeadTuple
MemoryContext CurrentMemoryContext
void SpGistInitBuffer(Buffer b, uint16 f)
#define BufferGetPage(buffer)
static void spgRedoVacuumRoot(XLogReaderState *record)
#define XLogRecGetInfo(decoder)
#define PageGetItemId(page, offsetNumber)
bool XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, RelFileNode *rnode, ForkNumber *forknum, BlockNumber *blknum)
OffsetNumber offnumPrefix
void * palloc0(Size size)
void mask_page_lsn_and_checksum(Page page)
OffsetNumber offnumHeadLeaf
void spg_redo(XLogReaderState *record)
#define InvalidOffsetNumber
XLogRedoAction XLogReadBufferForRedo(XLogReaderState *record, uint8 block_id, Buffer *buf)
OffsetNumber offnumParent
#define SizeOfSpgxlogVacuumLeaf
PageHeaderData * PageHeader
#define Assert(condition)
void spg_xlog_startup(void)
void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems)
#define InvalidBlockNumber
#define BufferIsValid(bufnum)
#define XLOG_SPGIST_VACUUM_LEAF
#define SpGistPageGetOpaque(page)
OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER]
#define ItemPointerSetInvalid(pointer)
#define SGLT_GET_NEXTOFFSET(spgLeafTuple)
struct spgxlogAddNode spgxlogAddNode
OffsetNumber offnumParent
void ResolveRecoveryConflictWithSnapshot(TransactionId latestRemovedXid, RelFileNode node)
#define TransactionIdIsValid(xid)
#define PageSetLSN(page, lsn)
struct spgxlogSplitTuple spgxlogSplitTuple
#define PageGetItem(page, itemId)
static void spgRedoMoveLeafs(XLogReaderState *record)