mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-21 23:03:23 +02:00
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
134 lines
2.9 KiB
Plaintext
134 lines
2.9 KiB
Plaintext
set enable_seqscan=off;
|
|
CREATE TABLE test_bool (
|
|
i boolean
|
|
);
|
|
INSERT INTO test_bool VALUES (false),(true),(null);
|
|
CREATE INDEX idx_bool ON test_bool USING gin (i);
|
|
SELECT * FROM test_bool WHERE i<true ORDER BY i;
|
|
i
|
|
---
|
|
f
|
|
(1 row)
|
|
|
|
SELECT * FROM test_bool WHERE i<=true ORDER BY i;
|
|
i
|
|
---
|
|
f
|
|
t
|
|
(2 rows)
|
|
|
|
SELECT * FROM test_bool WHERE i=true ORDER BY i;
|
|
i
|
|
---
|
|
t
|
|
(1 row)
|
|
|
|
SELECT * FROM test_bool WHERE i>=true ORDER BY i;
|
|
i
|
|
---
|
|
t
|
|
(1 row)
|
|
|
|
SELECT * FROM test_bool WHERE i>true ORDER BY i;
|
|
i
|
|
---
|
|
(0 rows)
|
|
|
|
SELECT * FROM test_bool WHERE i<false ORDER BY i;
|
|
i
|
|
---
|
|
(0 rows)
|
|
|
|
SELECT * FROM test_bool WHERE i<=false ORDER BY i;
|
|
i
|
|
---
|
|
f
|
|
(1 row)
|
|
|
|
SELECT * FROM test_bool WHERE i=false ORDER BY i;
|
|
i
|
|
---
|
|
f
|
|
(1 row)
|
|
|
|
SELECT * FROM test_bool WHERE i>=false ORDER BY i;
|
|
i
|
|
---
|
|
f
|
|
t
|
|
(2 rows)
|
|
|
|
SELECT * FROM test_bool WHERE i>false ORDER BY i;
|
|
i
|
|
---
|
|
t
|
|
(1 row)
|
|
|
|
EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i<true ORDER BY i;
|
|
QUERY PLAN
|
|
-------------------------------------------
|
|
Sort
|
|
Sort Key: i
|
|
-> Bitmap Heap Scan on test_bool
|
|
Recheck Cond: (i < true)
|
|
-> Bitmap Index Scan on idx_bool
|
|
Index Cond: (i < true)
|
|
(6 rows)
|
|
|
|
EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i<=true ORDER BY i;
|
|
QUERY PLAN
|
|
-------------------------------------------
|
|
Sort
|
|
Sort Key: i
|
|
-> Bitmap Heap Scan on test_bool
|
|
Recheck Cond: (i <= true)
|
|
-> Bitmap Index Scan on idx_bool
|
|
Index Cond: (i <= true)
|
|
(6 rows)
|
|
|
|
EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i=true ORDER BY i;
|
|
QUERY PLAN
|
|
-------------------------------------------
|
|
Sort
|
|
Sort Key: i
|
|
-> Bitmap Heap Scan on test_bool
|
|
Recheck Cond: i
|
|
-> Bitmap Index Scan on idx_bool
|
|
Index Cond: (i = true)
|
|
(6 rows)
|
|
|
|
EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i>=true ORDER BY i;
|
|
QUERY PLAN
|
|
-------------------------------------------
|
|
Sort
|
|
Sort Key: i
|
|
-> Bitmap Heap Scan on test_bool
|
|
Recheck Cond: (i >= true)
|
|
-> Bitmap Index Scan on idx_bool
|
|
Index Cond: (i >= true)
|
|
(6 rows)
|
|
|
|
EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i>true ORDER BY i;
|
|
QUERY PLAN
|
|
-------------------------------------------
|
|
Sort
|
|
Sort Key: i
|
|
-> Bitmap Heap Scan on test_bool
|
|
Recheck Cond: (i > true)
|
|
-> Bitmap Index Scan on idx_bool
|
|
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)
|
|
|