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]
static Datum
leftmostvalue_char(void)
{
- return CharGetDatum(SCHAR_MIN);
+ return CharGetDatum(0);
}
GIN_SUPPORT(char, false, leftmostvalue_char, btcharcmp)
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