Fix failure of btree_gin indexscans with "char" type and
authorTom Lane
Tue, 10 Aug 2021 22:10:29 +0000 (18:10 -0400)
committerTom Lane
Tue, 10 Aug 2021 22:10:29 +0000 (18:10 -0400)
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[email protected]

contrib/btree_gin/btree_gin.c
contrib/btree_gin/expected/char.out

index e05b5c60ca5fafa0de4cefe2e56afe374975005c..c50d68ce186057f313d879dcab99dd12532bd78f 100644 (file)
@@ -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)
index 09e0315de0ac942205fe1e5d75c9b4a725d9674f..6563546d3ce5315c450f4982b73d5e7a4d146b06 100644 (file)
@@ -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