diff options
| author | Tom Lane | 2022-11-08 15:36:04 +0000 |
|---|---|---|
| committer | Tom Lane | 2022-11-08 15:36:04 +0000 |
| commit | 042c9091f0fc131d001516bafc9ce334fe20d711 (patch) | |
| tree | d6ef16c8e060558b8d4b57cfa226bea5c89b9bf3 /contrib | |
| parent | 05a7be93558c614ab89c794cb1d301ea9ff33199 (diff) | |
Produce more-optimal plans for bitmap scans on boolean columns.
The planner simplifies boolean comparisons such as "x = true" and
"x = false" down to "x" and "NOT x" respectively, to have a canonical
form to ease comparisons. However, if we want to use an index on x,
the index AM APIs require us to reconstitute the comparison-operator
form of the indexqual. While that works, in bitmap indexscans the
canonical form of the qual was emitted as a "filter" condition
although it really only needs to be a "recheck" condition, because
create_bitmap_scan_plan didn't recognize the equivalence of that
form with the generated indexqual. booleq() is pretty cheap so that
likely doesn't make very much difference, but it's unsightly so
let's clean it up.
To fix, add a case to predicate_implied_by() to recognize the
equivalence of such clauses. This is a relatively low-cost place to
add a check, and perhaps it will have additional use cases in future.
Richard Guo and Tom Lane, per discussion of bug #17618 from Sindy
Senorita.
Discussion: https://postgr.es/m/17618-7a2240bfaa7e84ae@postgresql.org
Diffstat (limited to 'contrib')
| -rw-r--r-- | contrib/btree_gin/expected/bool.out | 14 | ||||
| -rw-r--r-- | contrib/btree_gin/sql/bool.sql | 2 |
2 files changed, 15 insertions, 1 deletions
diff --git a/contrib/btree_gin/expected/bool.out b/contrib/btree_gin/expected/bool.out index 207a3f23281..b379622baf7 100644 --- a/contrib/btree_gin/expected/bool.out +++ b/contrib/btree_gin/expected/bool.out @@ -92,7 +92,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i=true ORDER BY i; Sort Sort Key: i -> Bitmap Heap Scan on test_bool - Filter: i + Recheck Cond: i -> Bitmap Index Scan on idx_bool Index Cond: (i = true) (6 rows) @@ -119,3 +119,15 @@ EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i>true ORDER BY i; Index Cond: (i > true) (6 rows) +-- probably sufficient to check just this one: +EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i=false ORDER BY i; + QUERY PLAN +------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_bool + Recheck Cond: (NOT i) + -> Bitmap Index Scan on idx_bool + Index Cond: (i = false) +(6 rows) + diff --git a/contrib/btree_gin/sql/bool.sql b/contrib/btree_gin/sql/bool.sql index dad2ff32b82..08f2986e8c6 100644 --- a/contrib/btree_gin/sql/bool.sql +++ b/contrib/btree_gin/sql/bool.sql @@ -25,3 +25,5 @@ EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i<=true ORDER BY i; EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i=true ORDER BY i; EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i>=true ORDER BY i; EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i>true ORDER BY i; +-- probably sufficient to check just this one: +EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i=false ORDER BY i; |
