diff options
author | Peter Geoghegan <pg@bowt.ie> | 2021-10-27 12:10:43 -0700 |
---|---|---|
committer | Peter Geoghegan <pg@bowt.ie> | 2021-10-27 12:10:43 -0700 |
commit | f8cce4a3d88ccce830086bc80b563bd152f4955f (patch) | |
tree | b1cfe6302e0832dfd1d5c8a41376932dadd65ff2 /src/backend/access/nbtree/nbtsearch.c | |
parent | dd111887fbaead778d1077dfbc92b520a5188b51 (diff) |
Further harden nbtree posting split code.
Add more defensive checks around posting list split code. These should
detect corruption involving duplicate table TIDs earlier and more
reliably than any existing check.
Follow up to commit 8f72bbac.
Discussion: https://postgr.es/m/CAH2-WzkrSY_kjyd1_M5xJK1uM0govJXMxPn8JUSvwcUOiHuWVw@mail.gmail.com
Backpatch: 13-, where nbtree deduplication was introduced.
Diffstat (limited to 'src/backend/access/nbtree/nbtsearch.c')
-rw-r--r-- | src/backend/access/nbtree/nbtsearch.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c index 4de452357c1..8b2aad4d2b2 100644 --- a/src/backend/access/nbtree/nbtsearch.c +++ b/src/backend/access/nbtree/nbtsearch.c @@ -530,7 +530,24 @@ _bt_binsrch_insert(Relation rel, BTInsertState insertstate) * infrequently. */ if (unlikely(result == 0 && key->scantid != NULL)) + { + /* + * postingoff should never be set more than once per leaf page + * binary search. That would mean that there are duplicate table + * TIDs in the index, which is never okay. Check for that here. + */ + if (insertstate->postingoff != 0) + ereport(ERROR, + (errcode(ERRCODE_INDEX_CORRUPTED), + errmsg_internal("table tid from new index tuple (%u,%u) cannot find insert offset between offsets %u and %u of block %u in index \"%s\"", + ItemPointerGetBlockNumber(key->scantid), + ItemPointerGetOffsetNumber(key->scantid), + low, stricthigh, + BufferGetBlockNumber(insertstate->buf), + RelationGetRelationName(rel)))); + insertstate->postingoff = _bt_binsrch_posting(key, page, mid); + } } /* |