| От | Jeff Davis |
|---|---|
| Тема | unaccent fails when datlocprovider=i and datctype=C |
| Дата | |
| Msg-id | 79e4354d9eccfdb00483146a6b9f6295202e7890.camel@j-davis.com обсуждение |
| Ответы |
Re: unaccent fails when datlocprovider=i and datctype=C
|
| Список | pgsql-bugs |
Repro:
$ initdb -D data -N --locale-provider=icu --icu-locale=en --locale=C
=# create extension unaccent;
ERROR: invalid multibyte character for locale
HINT: The server's LC_CTYPE locale is probably incompatible with the
database encoding.
CONTEXT: line 1 of configuration file
".../share/tsearch_data/unaccent.rules": "¡ !
"
Cause: t_isspace() implementation is incomplete (notice "TODO"
comments):
Oid collation = DEFAULT_COLLATION_OID; /* TODO */
pg_locale_t mylocale = 0; /* TODO */
if (clen == 1 || lc_ctype_is_c(collation))
return isspace(TOUCHAR(ptr));
char2wchar(character, WC_BUF_LEN, ptr, clen, mylocale);
return iswspace((wint_t) character[0]);
If using datlocprovider=c, then the earlier branch goes straight to
isspace(). But if datlocprovider=i, then
lc_ctype_is_c(DEFAULT_COLLATION_OID) returns false, and it goes into
char2wchar(). char2wchar() is essentially a wrapper around mbstowcs(),
which does not work on multibyte input when LC_CTYPE=C.
Quick fix (attached): check whether datctype is C rather than the
default collation.
Eventually this should be fixed by doing character classification in
ICU when the provider is ICU.
--
Jeff Davis
PostgreSQL Contributor Team - AWS
В списке pgsql-bugs по дате отправления:
Сайт использует файлы cookie для корректной работы и повышения удобства. Нажимая кнопку «Принять» или продолжая пользоваться сайтом, вы соглашаетесь на их использование в соответствии с Политикой в отношении обработки cookie ООО «ППГ», в том числе на передачу данных из файлов cookie сторонним статистическим и рекламным службам. Вы можете управлять настройками cookie через параметры вашего браузера