skip_vacuumed_tuple.diff
application/octet-stream
Filename: skip_vacuumed_tuple.diff
Type: application/octet-stream
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| contrib/amcheck/verify_nbtree.c | 22 | 2 |
diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c
index f23bc1473b..fd67ad4089 100644
--- a/contrib/amcheck/verify_nbtree.c
+++ b/contrib/amcheck/verify_nbtree.c
@@ -2499,16 +2499,36 @@ bt_tuple_present_callback(Relation index, ItemPointer tid, Datum *values,
/* Probe Bloom filter -- tuple should be present */
if (bloom_lacks_element(state->filter, (unsigned char *) norm,
IndexTupleSize(norm)))
+{
+ BlockIdData bid = tid->ip_blkid;
+ Buffer buf = ReadBufferExtended(state->heaprel, MAIN_FORKNUM, BlockIdGetBlockNumber(&bid), RBM_NORMAL, NULL);
+ LockBuffer(buf, BUFFER_LOCK_SHARE);
+ Page page = BufferGetPage(buf);
+
+ if (!ItemIdHasStorage(PageGetItemId(page,tid->ip_posid)))
+ {
+ //elog(WARNING,"tid has no storage");
+ UnlockReleaseBuffer(buf);
+ return;
+ }
+
+ HeapTupleHeader tuphdr = (HeapTupleHeader) PageGetItem(page, PageGetItemId(page,tid->ip_posid));
+
+ LockBuffer(buf, BUFFER_LOCK_UNLOCK);
+ ReleaseBuffer(buf);
ereport(ERROR,
(errcode(ERRCODE_DATA_CORRUPTED),
- errmsg("heap tuple (%u,%u) from table \"%s\" lacks matching index tuple within index \"%s\"",
+ errmsg("heap tuple (%u,%u) from table \"%s\" lacks matching index tuple within index \"%s\" xmin %d xmax %d",
ItemPointerGetBlockNumber(&(itup->t_tid)),
ItemPointerGetOffsetNumber(&(itup->t_tid)),
RelationGetRelationName(state->heaprel),
- RelationGetRelationName(state->rel)),
+ RelationGetRelationName(state->rel),
+ HeapTupleHeaderGetRawXmin(tuphdr),
+ HeapTupleHeaderGetRawXmax(tuphdr)),
!state->readonly
? errhint("Retrying verification using the function bt_index_parent_check() might provide a more specific error.")
: 0));
+ }
state->heaptuplespresent++;
pfree(itup);