Prevent premature nbtree array advancement.
authorPeter Geoghegan <pg@bowt.ie>
Wed, 7 May 2025 19:20:42 +0000 (15:20 -0400)
committerPeter Geoghegan <pg@bowt.ie>
Wed, 7 May 2025 19:20:42 +0000 (15:20 -0400)
commit5f4d98d4f3718cf7a0597c37f3ee4a4485de6ef8
treeb635f978d9fb77102b8a7b67d249dc3e7c1f46c9
parent7e25c9363a82b6974c1ca2303ae8ded98af3bb24
Prevent premature nbtree array advancement.

nbtree array index scans could fail to return matching tuples in rare
cases where the missed tuples cover key space that the scan's arrays
incorrectly indicate has already been read.  These cases involved nearby
tuples with NULL values that were evaluated using a skip array key while
in pstate.forcenonrequired mode.

To fix, prevent forcenonrequired mode from prematurely advancing the
scan's array keys beyond key space that the scan has yet to read tuples
from: reset the scan's array keys (to the first elements in the current
scan direction) before the _bt_checkkeys call for pstate.finaltup.  That
way _bt_checkkeys starts from a clean slate, which ensures that it will
call _bt_advance_array_keys (while passing it sktrig_required=true).
This reliably restores the invariant that the scan's arrays always
accurately track its progress through the index's key space (at least
when the scan is "between pages").

Oversight in commit 8a510275, which optimized nbtree search scan key
comparisons.

Author: Peter Geoghegan <pg@bowt.ie>
Reviewed-By: Mark Dilger <mark.dilger@enterprisedb.com>
Discussion: https://postgr.es/m/CAH2-WzmodSE+gpTd1CRGU9ez8ytyyDS+Kns2r9NzgUp1s56kpw@mail.gmail.com
src/backend/access/nbtree/nbtsearch.c
src/backend/access/nbtree/nbtutils.c