summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2021-08-10 22:10:29 +0000
committerTom Lane2021-08-10 22:10:29 +0000
commita6bd28beb0639d4cf424e961862a65c466ca65bf (patch)
tree836db5b4b9079c8ff479624f823afe791ebb2b1e
parent72bbff4cd6eaf55239ccef79cec61766b5f8f1d2 (diff)
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/[email protected]
-rw-r--r--contrib/btree_gin/btree_gin.c2
-rw-r--r--contrib/btree_gin/expected/char.out11
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