diff options
author | Peter Geoghegan | 2025-05-02 21:50:58 +0000 |
---|---|---|
committer | Peter Geoghegan | 2025-05-02 21:50:58 +0000 |
commit | 0f08df406822bfa697dbcabef55728a8cb3e7fdb (patch) | |
tree | 463fec3e2d1b435ebbf1e0f2d03fd28f3fc35425 | |
parent | 1681a70df3d68b6f9dc82645f97f8d4668edc42f (diff) |
Avoid treating nonrequired nbtree keys as required.
Consistently prevent nbtree array advancement from treating a scankey as
required when operating in pstate.forcenonrequired mode. Otherwise, we
risk a NULL pointer dereference. This was possible in the path where
_bt_check_compare is called to recheck a tuple that advanced all of the
scan's arrays to matching values: its continuescan=false handling
expects _bt_advance_array_keys to have been called with a valid pstate,
but it'll always be NULL during sktrig_required=false calls (which is
how _bt_advance_array_keys must be called when pstate.forcenonrequired).
Oversight in commit 8a510275, which optimized nbtree search scan key
comparisons.
Author: Peter Geoghegan <[email protected]>
Reported-By: Mark Dilger <[email protected]>
Discussion: https://postgr.es/m/CAHgHdKsn2W=gPBmj7p6MjQFvxB+zZDBkwTSg0o3f5Hh8rkRrsA@mail.gmail.com
Discussion: https://postgr.es/m/CAH2-WzmodSE+gpTd1CRGU9ez8ytyyDS+Kns2r9NzgUp1s56kpw@mail.gmail.com
-rw-r--r-- | src/backend/access/nbtree/nbtutils.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c index 11802a4c215..adfa2fd292f 100644 --- a/src/backend/access/nbtree/nbtutils.c +++ b/src/backend/access/nbtree/nbtutils.c @@ -1826,7 +1826,7 @@ _bt_advance_array_keys(IndexScanDesc scan, BTReadPageState *pstate, /* Recheck _bt_check_compare on behalf of caller */ if (_bt_check_compare(scan, dir, tuple, tupnatts, tupdesc, false, - false, &continuescan, + !sktrig_required, &continuescan, &nsktrig) && !so->scanBehind) { @@ -2799,8 +2799,6 @@ _bt_check_compare(IndexScanDesc scan, ScanDirection dir, { BTScanOpaque so = (BTScanOpaque) scan->opaque; - Assert(!forcenonrequired || advancenonrequired); - *continuescan = true; /* default assumption */ for (; *ikey < so->numberOfKeys; (*ikey)++) |