mirror of
https://github.com/postgres/postgres.git
synced 2025-07-07 00:36:50 +03:00
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 commit70bc5833
, 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 commit9e8da0f7
, 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).
This commit is contained in:
@ -1043,6 +1043,8 @@ typedef struct BTScanOpaqueData
|
||||
|
||||
/* workspace for SK_SEARCHARRAY support */
|
||||
ScanKey arrayKeyData; /* modified copy of scan->keyData */
|
||||
bool arraysStarted; /* Started array keys, but have yet to "reach
|
||||
* past the end" of all arrays? */
|
||||
int numArrayKeys; /* number of equality-type array keys (-1 if
|
||||
* there are any unsatisfiable array keys) */
|
||||
int arrayKeyCount; /* count indicating number of array scan keys
|
||||
|
Reference in New Issue
Block a user