mirror of
https://github.com/postgres/postgres.git
synced 2025-06-27 23:21:58 +03:00
Document issue with heapam line pointer truncation.
Checking that an offset number isn't past the end of a heap page's line
pointer array was just a defensive sanity check for HOT-chain traversal
code before commit 3c3b8a4b
. It's etrictly necessary now, though. Add
comments that reference the issue to code in heapam that needs to get it
right.
Per suggestion from Alexander Lakhin.
Discussion: https://postgr.es/m/f76a292c-9170-1aef-91a0-59d9443b99a3@gmail.com
This commit is contained in:
@ -7483,8 +7483,15 @@ heap_index_delete_tuples(Relation rel, TM_IndexDeleteOp *delstate)
|
|||||||
ItemId lp;
|
ItemId lp;
|
||||||
HeapTupleHeader htup;
|
HeapTupleHeader htup;
|
||||||
|
|
||||||
/* Some sanity checks */
|
/* Sanity check (pure paranoia) */
|
||||||
if (offnum < FirstOffsetNumber || offnum > maxoff)
|
if (offnum < FirstOffsetNumber)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* An offset past the end of page's line pointer array is possible
|
||||||
|
* when the array was truncated
|
||||||
|
*/
|
||||||
|
if (offnum > maxoff)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
lp = PageGetItemId(page, offnum);
|
lp = PageGetItemId(page, offnum);
|
||||||
|
@ -581,8 +581,15 @@ heap_prune_chain(Buffer buffer, OffsetNumber rootoffnum, PruneState *prstate)
|
|||||||
bool tupdead,
|
bool tupdead,
|
||||||
recent_dead;
|
recent_dead;
|
||||||
|
|
||||||
/* Some sanity checks */
|
/* Sanity check (pure paranoia) */
|
||||||
if (offnum < FirstOffsetNumber || offnum > maxoff)
|
if (offnum < FirstOffsetNumber)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* An offset past the end of page's line pointer array is possible
|
||||||
|
* when the array was truncated (original item must have been unused)
|
||||||
|
*/
|
||||||
|
if (offnum > maxoff)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* If item is already processed, stop --- it must not be same chain */
|
/* If item is already processed, stop --- it must not be same chain */
|
||||||
@ -962,8 +969,15 @@ heap_get_root_tuples(Page page, OffsetNumber *root_offsets)
|
|||||||
*/
|
*/
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
/* Sanity check */
|
/* Sanity check (pure paranoia) */
|
||||||
if (nextoffnum < FirstOffsetNumber || nextoffnum > maxoff)
|
if (offnum < FirstOffsetNumber)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* An offset past the end of page's line pointer array is possible
|
||||||
|
* when the array was truncated
|
||||||
|
*/
|
||||||
|
if (offnum > maxoff)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
lp = PageGetItemId(page, nextoffnum);
|
lp = PageGetItemId(page, nextoffnum);
|
||||||
|
Reference in New Issue
Block a user