pg.ddx.io  pgsql-committers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Peter Geoghegan <pg@bowt.ie>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Fix btmarkpos/btrestrpos array key wraparound bug.
Date: Thu, 28 Sep 2023 23:30:00 +0000
Message-ID: <E1qm0SG-006XJN-HU@gemulon.postgresql.org> (raw)

Fix btmarkpos/btrestrpos array key wraparound bug.

nbtree's mark/restore processing failed to correctly handle an edge case
involving array key advancement and related search-type scan key state.
Scans with ScalarArrayScalarArrayOpExpr quals requiring mark/restore
processing (for a merge join) could incorrectly conclude that an
affected array/scan key must not have advanced during the time between
marking and restoring the scan's position.

As a result of all this, array key handling within btrestrpos could skip
a required call to _bt_preprocess_keys().  This confusion allowed later
primitive index scans to overlook tuples matching the true current array
keys.  The scan's search-type scan keys would still have spurious values
corresponding to the final array element(s) -- not values matching the
first/now-current array element(s).

To fix, remember that "array key wraparound" has taken place during the
ongoing btrescan in a flag variable stored in the scan's state, and use
that information at the point where btrestrpos decides if another call
to _bt_preprocess_keys is required.

Oversight in commit 70bc5833, which taught nbtree to handle array keys
during mark/restore processing, but missed this subtlety.  That commit
was itself a bug fix for an issue in commit 9e8da0f7, which taught
nbtree to handle ScalarArrayOpExpr quals natively.

Author: Peter Geoghegan <pg@bowt.ie>
Discussion: https://postgr.es/m/CAH2-WzkgP3DDRJxw6DgjCxo-cu-DKrvjEv_ArkP2ctBJatDCYg@mail.gmail.com
Backpatch: 11- (all supported branches).

Branch
------
REL_15_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/cac37c1a1b7c64e60832b764e3828a9aca95bc48

Modified Files
--------------
src/backend/access/nbtree/nbtree.c   |  1 +
src/backend/access/nbtree/nbtutils.c | 17 ++++++++++++++++-
src/include/access/nbtree.h          |  4 +++-
3 files changed, 20 insertions(+), 2 deletions(-)



view thread (7+ messages)  latest in thread

Message-ID: <E1qm0SG-006XJN-HU@gemulon.postgresql.org>
Permalink:  ../E1qm0SG-006XJN-HU@gemulon.postgresql.org/
Also on:    postgresql.org/message-id/E1qm0SG-006XJN-HU@gemulon.postgresql.org

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-committers@postgresql.org
  Cc: pg@bowt.ie, pgsql-committers@lists.postgresql.org
  Subject: Re: pgsql: Fix btmarkpos/btrestrpos array key wraparound bug.
  In-Reply-To: <E1qm0SG-006XJN-HU@gemulon.postgresql.org>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox