diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2021-08-10 18:10:30 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2021-08-10 18:10:30 -0400 |
commit | 7ba487cf90071717c9c352dc074a9140860eba55 (patch) | |
tree | f2c367a9c5507ef1ad7bfa120a886a61187ce1d1 | |
parent | e849f3f1f884ad140b60a24354c6371cbd2efbb6 (diff) | |
download | postgresql-7ba487cf90071717c9c352dc074a9140860eba55.tar.gz postgresql-7ba487cf90071717c9c352dc074a9140860eba55.zip |
Fix failure of btree_gin indexscans with "char" type and </<= operators.
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
-rw-r--r-- | contrib/btree_gin/btree_gin.c | 2 | ||||
-rw-r--r-- | contrib/btree_gin/expected/char.out | 11 |
2 files changed, 10 insertions, 3 deletions
diff --git a/contrib/btree_gin/btree_gin.c b/contrib/btree_gin/btree_gin.c index e05b5c60ca5..c50d68ce186 100644 --- a/contrib/btree_gin/btree_gin.c +++ b/contrib/btree_gin/btree_gin.c @@ -357,7 +357,7 @@ GIN_SUPPORT(bpchar, true, leftmostvalue_text, bpcharcmp) static Datum leftmostvalue_char(void) { - return CharGetDatum(SCHAR_MIN); + return CharGetDatum(0); } GIN_SUPPORT(char, false, leftmostvalue_char, btcharcmp) diff --git a/contrib/btree_gin/expected/char.out b/contrib/btree_gin/expected/char.out index 09e0315de0a..6563546d3ce 100644 --- a/contrib/btree_gin/expected/char.out +++ b/contrib/btree_gin/expected/char.out @@ -7,12 +7,19 @@ CREATE INDEX idx_char ON test_char USING gin (i); SELECT * FROM test_char WHERE i<'d'::"char" ORDER BY i; i --- -(0 rows) + a + b + c +(3 rows) SELECT * FROM test_char WHERE i<='d'::"char" ORDER BY i; i --- -(0 rows) + a + b + c + d +(4 rows) SELECT * FROM test_char WHERE i='d'::"char" ORDER BY i; i |