From a44fb0dbfbf086c08a8e88b9c096c0bf36052df6 Mon Sep 17 00:00:00 2001 From: Jim Vanns Date: Sun, 1 Mar 2026 11:10:04 +0000 Subject: [PATCH 3/3] [PATCH 3/3] Extend expected output for bitmapops test We now include the expected output from the new SAOP BitmapOr optimisation. diff --git a/src/test/regress/expected/bitmapops.out b/src/test/regress/expected/bitmapops.out index 64068e0469c..2d632edfab1 100644 --- a/src/test/regress/expected/bitmapops.out +++ b/src/test/regress/expected/bitmapops.out @@ -46,3 +46,118 @@ SELECT count(*) FROM bmscantest WHERE a = 1 OR b = 1; -- clean up DROP TABLE bmscantest; +-- Test ScalarArrayOpExpr (SAOP) for partial indexes +-- Generate enough data that we can test the use of an index +CREATE TABLE ipairs( + key INT, + value INT +) +WITH (autovacuum_enabled = false); +-- Install the partial index on these values +CREATE INDEX ipairs_key_idx1 ON ipairs(key) WHERE key = 507; +CREATE INDEX ipairs_key_idx2 ON ipairs(key) WHERE key = 508; +CREATE INDEX ipairs_key_idx3 ON ipairs(key) WHERE key = 509; +CREATE INDEX ipairs_key_idx4 ON ipairs(key) WHERE key <= 508; -- Give planner a choice +-- Dummy data to surround ours +INSERT INTO ipairs(key, value) +SELECT n, -n +FROM generate_series(1, 1000) AS tmp(n); +-- Update statistics +VACUUM (ANALYZE) ipairs; +-- Our specific test data to force the partial index +EXPLAIN (ANALYZE, COSTS OFF, BUFFERS OFF, SUMMARY OFF, TIMING OFF) +UPDATE ipairs +SET value = 0 +WHERE key IN (507,508,509); + QUERY PLAN +----------------------------------------------------------------------------------- + Update on ipairs (actual rows=0.00 loops=1) + -> Bitmap Heap Scan on ipairs (actual rows=3.00 loops=1) + Recheck Cond: ((key = 507) OR (key = 508) OR (key = 509)) + Heap Blocks: exact=1 + -> BitmapOr (actual rows=0.00 loops=1) + -> Bitmap Index Scan on ipairs_key_idx1 (actual rows=1.00 loops=1) + Index Cond: (key = 507) + Index Searches: 1 + -> Bitmap Index Scan on ipairs_key_idx2 (actual rows=1.00 loops=1) + Index Cond: (key = 508) + Index Searches: 1 + -> Bitmap Index Scan on ipairs_key_idx3 (actual rows=1.00 loops=1) + Index Cond: (key = 509) + Index Searches: 1 +(14 rows) + +-- We want ensure that an index use is always attempted - just for the test +SET enable_seqscan=false; +-- Variant 1 (works without the SAOP optimiser patch) +EXPLAIN (COSTS OFF) +SELECT value = 0 +FROM ipairs +WHERE + key = 507 OR + key = 508 OR + key = 509; + QUERY PLAN +------------------------------------------------------------- + Bitmap Heap Scan on ipairs + Recheck Cond: ((key = 507) OR (key = 508) OR (key = 509)) + -> BitmapOr + -> Bitmap Index Scan on ipairs_key_idx1 + Index Cond: (key = 507) + -> Bitmap Index Scan on ipairs_key_idx2 + Index Cond: (key = 508) + -> Bitmap Index Scan on ipairs_key_idx3 + Index Cond: (key = 509) +(9 rows) + +-- Variant 2 (works only with the SAOP optimiser patch) +EXPLAIN (COSTS OFF) +SELECT value = 0 +FROM ipairs +WHERE key IN (507, 508, 509); + QUERY PLAN +------------------------------------------------------------- + Bitmap Heap Scan on ipairs + Recheck Cond: ((key = 507) OR (key = 508) OR (key = 509)) + -> BitmapOr + -> Bitmap Index Scan on ipairs_key_idx1 + Index Cond: (key = 507) + -> Bitmap Index Scan on ipairs_key_idx2 + Index Cond: (key = 508) + -> Bitmap Index Scan on ipairs_key_idx3 + Index Cond: (key = 509) +(9 rows) + +-- Variant 3 (as above) +EXPLAIN (COSTS OFF) +SELECT value = 0 +FROM ipairs +WHERE key = ANY('{507,508,509}'::INT[]); + QUERY PLAN +------------------------------------------------------------- + Bitmap Heap Scan on ipairs + Recheck Cond: ((key = 507) OR (key = 508) OR (key = 509)) + -> BitmapOr + -> Bitmap Index Scan on ipairs_key_idx1 + Index Cond: (key = 507) + -> Bitmap Index Scan on ipairs_key_idx2 + Index Cond: (key = 508) + -> Bitmap Index Scan on ipairs_key_idx3 + Index Cond: (key = 509) +(9 rows) + +-- Variant 5 (should use only ipairs_key_idx4) +EXPLAIN (COSTS OFF) +SELECT value = 0 +FROM ipairs +WHERE key < ANY('{508}'::INT[]); + QUERY PLAN +------------------------------------------------------ + Bitmap Heap Scan on ipairs + Recheck Cond: (key < ANY ('{508}'::integer[])) + -> Bitmap Index Scan on ipairs_key_idx4 + Index Cond: (key < ANY ('{508}'::integer[])) +(4 rows) + +-- Clean up +DROP TABLE ipairs; -- 2.43.0