62 void *callback_state,
bool readonly);
111 if (nipd != ndecoded)
112 elog(
ERROR,
"number of items mismatch in GIN entry tuple, %d in tuple header, %d decoded",
144 "posting tree check context",
159 stack->
blkno = posting_tree_root;
161 elog(
DEBUG3,
"processing posting tree at blk %u", posting_tree_root);
194 leafdepth = stack->
depth;
195 else if (stack->
depth != leafdepth)
197 (
errcode(ERRCODE_INDEX_CORRUPTED),
198 errmsg(
"index \"%s\": internal pages traversal encountered leaf page unexpectedly on block %u",
203 snprintf(tidrange_buf,
sizeof(tidrange_buf),
204 "%d tids (%u, %u) - (%u, %u)",
211 snprintf(tidrange_buf,
sizeof(tidrange_buf),
"0 tids");
214 elog(
DEBUG3,
"blk %u: parent %u highkey (%u, %u), %s",
229 (
errcode(ERRCODE_INDEX_CORRUPTED),
230 errmsg(
"index \"%s\": tid exceeds parent's high key in postingTree leaf on block %u",
246 elog(
DEBUG1,
"page blk: %u, type data, maxoff %d", stack->
blkno, maxoff);
249 elog(
DEBUG3,
"blk %u: internal posting tree page with %u items, parent %u highkey (%u, %u)",
254 elog(
DEBUG3,
"blk %u: root internal posting tree page with %u items",
255 stack->
blkno, maxoff);
272 (
errcode(ERRCODE_INDEX_CORRUPTED),
273 errmsg(
"index \"%s\" has unexpected pd_lower %u in posting tree block %u with maxoff %u)",
292 (
errcode(ERRCODE_INDEX_CORRUPTED),
293 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))",
326 (
errcode(ERRCODE_INDEX_CORRUPTED),
327 errmsg(
"index \"%s\": rightmost posting tree page (blk %u) has unexpected last key (%u, %u)",
339 (
errcode(ERRCODE_INDEX_CORRUPTED),
340 errmsg(
"index \"%s\" has wrong tuple order in posting tree, block %u, offset %u",
351 (
errcode(ERRCODE_INDEX_CORRUPTED),
352 errmsg(
"index \"%s\": posting item exceeds parent's high key in postingTree internal page on block %u offset %u",
375 stack_next = stack->
next;
392 void *callback_state,
403 "amcheck consistency check context",
444 elog(
DEBUG3,
"processing entry tree page at blk %u, maxoff: %u", stack->
blkno, maxoff);
457 &parent_key_category);
468 page_max_key_category, parent_key_attnum,
469 parent_key, parent_key_category) < 0)
480 ptr->
blkno = rightlink;
490 leafdepth = stack->
depth;
491 else if (stack->
depth != leafdepth)
493 (
errcode(ERRCODE_INDEX_CORRUPTED),
494 errmsg(
"index \"%s\": internal pages traversal encountered leaf page unexpectedly on block %u",
514 (
errcode(ERRCODE_INDEX_CORRUPTED),
515 errmsg(
"index \"%s\" has inconsistent tuple sizes, block %u, offset %u",
537 prev_key_category, current_attnum,
538 current_key, current_key_category) >= 0)
540 (
errcode(ERRCODE_INDEX_CORRUPTED),
541 errmsg(
"index \"%s\" has wrong tuple order on entry tree page, block %u, offset %u, rightlink %u",
571 stack->
blkno, strategy);
575 elog(
NOTICE,
"Unable to find parent tuple for block %u on block %u due to concurrent split",
593 errmsg(
"index \"%s\" has inconsistent records on page %u offset %u",
635 errmsg(
"index \"%s\": posting list contains invalid heap pointer on block %u",
677 errmsg(
"index \"%s\" contains unexpected zero page at block %u",
680 errhint(
"Please REINDEX it.")));
688 errmsg(
"index \"%s\" contains corrupted page at block %u",
691 errhint(
"Please REINDEX it.")));
698 errmsg(
"index \"%s\" has deleted internal page %u",
703 errmsg(
"index \"%s\" has deleted page %u with tuples",
709 errmsg(
"index \"%s\" has page %u with exceeding count of tuples",
770 errmsg(
"line pointer points past end of tuple space in index \"%s\"",
786 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)
void UnlockReleaseBuffer(Buffer buffer)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
static Page BufferGetPage(Buffer buffer)
static void LockBuffer(Buffer buffer, BufferLockMode mode)
PageHeaderData * PageHeader
static uint16 PageGetSpecialSize(const PageData *page)
static bool PageIsNew(const PageData *page)
#define SizeOfPageHeaderData
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static void * PageGetItem(PageData *page, const ItemIdData *itemId)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define Assert(condition)
int errdetail_internal(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define palloc_object(type)
#define palloc_array(type, count)
#define palloc0_object(type)
#define PG_FUNCTION_INFO_V1(funcname)
BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype)
static int ginCompareAttEntries(GinState *ginstate, OffsetNumber attnuma, Datum a, GinNullCategory categorya, OffsetNumber attnumb, Datum b, GinNullCategory categoryb)
#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)
IndexTuple CopyIndexTuple(IndexTuple source)
#define ItemIdGetLength(itemId)
#define ItemIdGetOffset(itemId)
#define ItemIdIsDead(itemId)
#define ItemIdIsUsed(itemId)
#define ItemIdIsRedirected(itemId)
#define ItemIdGetFlags(itemId)
int32 ItemPointerCompare(const ItemPointerData *arg1, const ItemPointerData *arg2)
bool ItemPointerEquals(const ItemPointerData *pointer1, const ItemPointerData *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)
static bool ItemPointerIsValid(const ItemPointerData *pointer)
IndexTupleData * IndexTuple
static Size IndexTupleSize(const IndexTupleData *itup)
#define MaxIndexTuplesPerPage
void pfree(void *pointer)
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)
static void check_index_page(Relation rel, Buffer buffer, BlockNumber blockNo)
static ItemId PageGetItemIdCareful(Relation rel, BlockNumber block, Page page, OffsetNumber offset)