Avoid extra lookups with nbtree array inequalities.
authorPeter Geoghegan <[email protected]>
Sun, 7 Apr 2024 18:15:54 +0000 (14:15 -0400)
committerPeter Geoghegan <[email protected]>
Sun, 7 Apr 2024 18:15:54 +0000 (14:15 -0400)
nbtree index scans with SAOP inequalities (but no SAOP equalities)
performed extra ORDER proc lookups for any remaining equality strategy
scan keys.  This could waste cycles, and caused assertion failures.
Keeping around a separate ORDER proc is only necessary for a scan's
non-array/non-SAOP equality scan keys when the scan has at least one
other SAOP equality strategy key (a SAOP inequality shouldn't count).

To fix, replace _bt_preprocess_array_keys_final's assertion with a test
that makes the function return early when the scan has no SAOP equality
scan keys.

Oversight in commit 1b134ca5, which enhanced nbtree ScalarArrayOp
execution.

Reported-By: Alexander Lakhin <[email protected]>
Discussion: https://postgr.es/m/0539d3d3-a402-0a49-ed5e-26429dffc4bd@gmail.com

src/backend/access/nbtree/nbtutils.c

index e963de78a7bea106752e82d2bdf135fbae57af35..9b9efe062fce68e2e721ec7258af7786e4d22a47 100644 (file)
@@ -557,7 +557,13 @@ _bt_preprocess_array_keys_final(IndexScanDesc scan, int *keyDataMap)
    int         last_equal_output_ikey PG_USED_FOR_ASSERTS_ONLY = -1;
 
    Assert(so->qual_ok);
-   Assert(so->numArrayKeys);
+
+   /*
+    * Nothing for us to do when _bt_preprocess_array_keys only had to deal
+    * with array inequalities
+    */
+   if (so->numArrayKeys == 0)
+       return;
 
    for (int output_ikey = 0; output_ikey < so->numberOfKeys; output_ikey++)
    {