63 void *callback_state,
bool readonly);
112 if (nipd != ndecoded)
113 elog(
ERROR,
"number of items mismatch in GIN entry tuple, %d in tuple header, %d decoded",
145 "posting tree check context",
160 stack->
blkno = posting_tree_root;
162 elog(
DEBUG3,
"processing posting tree at blk %u", posting_tree_root);
195 leafdepth = stack->
depth;
196 else if (stack->
depth != leafdepth)
198 (
errcode(ERRCODE_INDEX_CORRUPTED),
199 errmsg(
"index \"%s\": internal pages traversal encountered leaf page unexpectedly on block %u",
204 snprintf(tidrange_buf,
sizeof(tidrange_buf),
205 "%d tids (%u, %u) - (%u, %u)",
212 snprintf(tidrange_buf,
sizeof(tidrange_buf),
"0 tids");
215 elog(
DEBUG3,
"blk %u: parent %u highkey (%u, %u), %s",
230 (
errcode(ERRCODE_INDEX_CORRUPTED),
231 errmsg(
"index \"%s\": tid exceeds parent's high key in postingTree leaf on block %u",
247 elog(
DEBUG1,
"page blk: %u, type data, maxoff %d", stack->
blkno, maxoff);
250 elog(
DEBUG3,
"blk %u: internal posting tree page with %u items, parent %u highkey (%u, %u)",
255 elog(
DEBUG3,
"blk %u: root internal posting tree page with %u items",
256 stack->
blkno, maxoff);
273 (
errcode(ERRCODE_INDEX_CORRUPTED),
274 errmsg(
"index \"%s\" has unexpected pd_lower %u in posting tree block %u with maxoff %u)",
293 (
errcode(ERRCODE_INDEX_CORRUPTED),
294 errmsg(
"index \"%s\": posting tree page's high key (%u, %u) doesn't match the downlink on block %u (parent blk %u, key (%u, %u))",
327 (
errcode(ERRCODE_INDEX_CORRUPTED),
328 errmsg(
"index \"%s\": rightmost posting tree page (blk %u) has unexpected last key (%u, %u)",
340 (
errcode(ERRCODE_INDEX_CORRUPTED),
341 errmsg(
"index \"%s\" has wrong tuple order in posting tree, block %u, offset %u",
352 (
errcode(ERRCODE_INDEX_CORRUPTED),
353 errmsg(
"index \"%s\": posting item exceeds parent's high key in postingTree internal page on block %u offset %u",
380 stack_next = stack->
next;
397 void *callback_state,
408 "amcheck consistency check context",
452 elog(
DEBUG3,
"processing entry tree page at blk %u, maxoff: %u", stack->
blkno, maxoff);
465 &parent_key_category);
475 page_max_key_category, parent_key,
476 parent_key_category) > 0)
488 ptr->
blkno = rightlink;
498 leafdepth = stack->
depth;
499 else if (stack->
depth != leafdepth)
501 (
errcode(ERRCODE_INDEX_CORRUPTED),
502 errmsg(
"index \"%s\": internal pages traversal encountered leaf page unexpectedly on block %u",
524 (
errcode(ERRCODE_INDEX_CORRUPTED),
525 errmsg(
"index \"%s\" has inconsistent tuple sizes, block %u, offset %u",
543 prev_key_category, current_key,
544 current_key_category) >= 0)
546 (
errcode(ERRCODE_INDEX_CORRUPTED),
547 errmsg(
"index \"%s\" has wrong tuple order on entry tree page, block %u, offset %u, rightlink %u",
561 &parent_key_category);
564 current_key_category, parent_key,
565 parent_key_category) > 0)
576 stack->
blkno, strategy);
580 elog(
NOTICE,
"Unable to find parent tuple for block %u on block %u due to concurrent split",
586 &parent_key_category);
593 current_key_category, parent_key,
594 parent_key_category) > 0)
596 (
errcode(ERRCODE_INDEX_CORRUPTED),
597 errmsg(
"index \"%s\" has inconsistent records on page %u offset %u",
635 for (
int j = 0;
j < nipd;
j++)
639 (
errcode(ERRCODE_INDEX_CORRUPTED),
640 errmsg(
"index \"%s\": posting list contains invalid heap pointer on block %u",
654 stack_next = stack->
next;
681 (
errcode(ERRCODE_INDEX_CORRUPTED),
682 errmsg(
"index \"%s\" contains unexpected zero page at block %u",
685 errhint(
"Please REINDEX it.")));
692 (
errcode(ERRCODE_INDEX_CORRUPTED),
693 errmsg(
"index \"%s\" contains corrupted page at block %u",
696 errhint(
"Please REINDEX it.")));
702 (
errcode(ERRCODE_INDEX_CORRUPTED),
703 errmsg(
"index \"%s\" has deleted internal page %d",
707 (
errcode(ERRCODE_INDEX_CORRUPTED),
708 errmsg(
"index \"%s\" has deleted page %d with tuples",
713 (
errcode(ERRCODE_INDEX_CORRUPTED),
714 errmsg(
"index \"%s\" has page %d with exceeding count of tuples",
774 (
errcode(ERRCODE_INDEX_CORRUPTED),
775 errmsg(
"line pointer points past end of tuple space in index \"%s\"",
790 (
errcode(ERRCODE_INDEX_CORRUPTED),
791 errmsg(
"invalid line pointer storage in index \"%s\"",
#define InvalidAttrNumber
#define InvalidBlockNumber
static BlockNumber BlockIdGetBlockNumber(const BlockIdData *blockId)
BlockNumber BufferGetBlockNumber(Buffer buffer)
void ReleaseBuffer(Buffer buffer)
XLogRecPtr BufferGetLSNAtomic(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void LockBuffer(Buffer buffer, int mode)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
static Page BufferGetPage(Buffer buffer)
PageHeaderData * PageHeader
static uint16 PageGetSpecialSize(const PageData *page)
static Item PageGetItem(const PageData *page, const ItemIdData *itemId)
static bool PageIsNew(const PageData *page)
#define SizeOfPageHeaderData
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
int errdetail_internal(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype)
#define GinIsPostingTree(itup)
#define GinPageGetOpaque(page)
#define GinGetPosting(itup)
#define GinGetDownlink(itup)
#define GinItupIsCompressed(itup)
#define GinGetNPosting(itup)
#define GinDataPageGetRightBound(page)
#define GinGetPostingTree(itup)
#define GinPageIsData(page)
signed char GinNullCategory
#define ItemPointerSetMin(p)
#define GinDataPageGetPostingItem(page, i)
#define GinPageIsDeleted(page)
#define GinPageIsLeaf(page)
ItemPointer GinDataLeafPageGetItems(Page page, int *nitems, ItemPointerData advancePast)
ItemPointer ginPostingListDecode(GinPostingList *plist, int *ndecoded_out)
OffsetNumber gintuple_get_attrnum(GinState *ginstate, IndexTuple tuple)
Datum gintuple_get_key(GinState *ginstate, IndexTuple tuple, GinNullCategory *category)
void initGinState(GinState *state, Relation index)
int ginCompareEntries(GinState *ginstate, OffsetNumber attnum, Datum a, GinNullCategory categorya, Datum b, GinNullCategory categoryb)
Assert(PointerIsAligned(start, uint64))
IndexTuple CopyIndexTuple(IndexTuple source)
#define ItemIdGetLength(itemId)
#define ItemIdGetOffset(itemId)
#define ItemIdIsDead(itemId)
#define ItemIdIsUsed(itemId)
#define ItemIdIsRedirected(itemId)
#define ItemIdGetFlags(itemId)
int32 ItemPointerCompare(ItemPointer arg1, ItemPointer arg2)
bool ItemPointerEquals(ItemPointer pointer1, ItemPointer pointer2)
static void ItemPointerSetInvalid(ItemPointerData *pointer)
static OffsetNumber ItemPointerGetOffsetNumber(const ItemPointerData *pointer)
static OffsetNumber ItemPointerGetOffsetNumberNoCheck(const ItemPointerData *pointer)
static BlockNumber ItemPointerGetBlockNumber(const ItemPointerData *pointer)
static BlockNumber ItemPointerGetBlockNumberNoCheck(const ItemPointerData *pointer)
ItemPointerData * ItemPointer
static bool ItemPointerIsValid(const ItemPointerData *pointer)
IndexTupleData * IndexTuple
static Size IndexTupleSize(const IndexTupleData *itup)
#define MaxIndexTuplesPerPage
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define CHECK_FOR_INTERRUPTS()
#define InvalidOffsetNumber
#define OffsetNumberIsValid(offsetNumber)
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define RelationGetRelationName(relation)
ItemPointerData parentkey
struct GinPostingTreeScanItem * next
struct GinScanItem * next
void amcheck_lock_relation_and_check(Oid indrelid, Oid am_id, IndexDoCheckCallback check, LOCKMODE lockmode, void *state)
Datum gin_index_check(PG_FUNCTION_ARGS)
static IndexTuple gin_refind_parent(Relation rel, BlockNumber parentblkno, BlockNumber childblkno, BufferAccessStrategy strategy)
static void gin_check_parent_keys_consistency(Relation rel, Relation heaprel, void *callback_state, bool readonly)
static ItemPointer ginReadTupleWithoutState(IndexTuple itup, int *nitems)
static void gin_check_posting_tree_parent_keys_consistency(Relation rel, BlockNumber posting_tree_root)
struct GinPostingTreeScanItem GinPostingTreeScanItem
static void check_index_page(Relation rel, Buffer buffer, BlockNumber blockNo)
static ItemId PageGetItemIdCareful(Relation rel, BlockNumber block, Page page, OffsetNumber offset)
struct GinScanItem GinScanItem
PG_FUNCTION_INFO_V1(gin_index_check)
#define InvalidXLogRecPtr