mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-06 15:24:56 +08:00
a6bd28beb0
As a result of confusion about whether the "char" type is signed or unsigned, scans for index searches like "col < 'x'" or "col <= 'x'" would start at the middle of the index not the left end, thus missing many or all of the entries they should find. Fortunately, this is not a symptom of index corruption. It's only the search logic that is broken, and we can fix it without unpleasant side-effects. Per report from Jason Kim. This has been wrong since btree_gin's beginning, so back-patch to all supported branches. Discussion: https://postgr.es/m/20210810001649.htnltbh7c63re42p@jasonk.me
45 lines
588 B
Plaintext
45 lines
588 B
Plaintext
set enable_seqscan=off;
|
|
CREATE TABLE test_char (
|
|
i "char"
|
|
);
|
|
INSERT INTO test_char VALUES ('a'),('b'),('c'),('d'),('e'),('f');
|
|
CREATE INDEX idx_char ON test_char USING gin (i);
|
|
SELECT * FROM test_char WHERE i<'d'::"char" ORDER BY i;
|
|
i
|
|
---
|
|
a
|
|
b
|
|
c
|
|
(3 rows)
|
|
|
|
SELECT * FROM test_char WHERE i<='d'::"char" ORDER BY i;
|
|
i
|
|
---
|
|
a
|
|
b
|
|
c
|
|
d
|
|
(4 rows)
|
|
|
|
SELECT * FROM test_char WHERE i='d'::"char" ORDER BY i;
|
|
i
|
|
---
|
|
d
|
|
(1 row)
|
|
|
|
SELECT * FROM test_char WHERE i>='d'::"char" ORDER BY i;
|
|
i
|
|
---
|
|
d
|
|
e
|
|
f
|
|
(3 rows)
|
|
|
|
SELECT * FROM test_char WHERE i>'d'::"char" ORDER BY i;
|
|
i
|
|
---
|
|
e
|
|
f
|
|
(2 rows)
|
|
|