pgsql: Prevent premature nbtree array advancement.

From: Peter Geoghegan <pg(at)bowt(dot)ie>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Prevent premature nbtree array advancement.
Date: 2025-05-07 19:21:02
Message-ID: E1uCkKE-000eri-1f@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

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(at)bowt(dot)ie>
Reviewed-By: Mark Dilger <mark(dot)dilger(at)enterprisedb(dot)com>
Discussion: https://postgr.es/m/CAH2-WzmodSE+gpTd1CRGU9ez8ytyyDS+Kns2r9NzgUp1s56kpw@mail.gmail.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/5f4d98d4f3718cf7a0597c37f3ee4a4485de6ef8

Modified Files
--------------
src/backend/access/nbtree/nbtsearch.c | 8 ++++++-
src/backend/access/nbtree/nbtutils.c | 42 ++++++++++++++++++++++++++---------
2 files changed, 39 insertions(+), 11 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Nathan Bossart 2025-05-07 19:48:50 pgsql: Remove pg_replication_origin's TOAST table.
Previous Message Peter Geoghegan 2025-05-07 19:18:11 pgsql: nbtree: tighten up array recheck rules.