mirror of
https://github.com/postgres/postgres.git
synced 2025-10-22 14:32:25 +03:00
Fix t_isspace(), etc., when datlocprovider=i and datctype=C.
Check whether the datctype is C to determine whether t_isspace() and related functions use isspace() or iswspace(). Previously, t_isspace() checked whether the database default collation was C; which is incorrect when the default collation uses the ICU provider. Discussion: https://postgr.es/m/79e4354d9eccfdb00483146a6b9f6295202e7890.camel@j-davis.com Reviewed-by: Peter Eisentraut Backpatch-through: 15
This commit is contained in:
@@ -38,10 +38,9 @@ t_isdigit(const char *ptr)
|
||||
{
|
||||
int clen = pg_mblen(ptr);
|
||||
wchar_t character[WC_BUF_LEN];
|
||||
Oid collation = DEFAULT_COLLATION_OID; /* TODO */
|
||||
pg_locale_t mylocale = 0; /* TODO */
|
||||
|
||||
if (clen == 1 || lc_ctype_is_c(collation))
|
||||
if (clen == 1 || database_ctype_is_c)
|
||||
return isdigit(TOUCHAR(ptr));
|
||||
|
||||
char2wchar(character, WC_BUF_LEN, ptr, clen, mylocale);
|
||||
@@ -54,10 +53,9 @@ t_isspace(const char *ptr)
|
||||
{
|
||||
int clen = pg_mblen(ptr);
|
||||
wchar_t character[WC_BUF_LEN];
|
||||
Oid collation = DEFAULT_COLLATION_OID; /* TODO */
|
||||
pg_locale_t mylocale = 0; /* TODO */
|
||||
|
||||
if (clen == 1 || lc_ctype_is_c(collation))
|
||||
if (clen == 1 || database_ctype_is_c)
|
||||
return isspace(TOUCHAR(ptr));
|
||||
|
||||
char2wchar(character, WC_BUF_LEN, ptr, clen, mylocale);
|
||||
@@ -70,10 +68,9 @@ t_isalpha(const char *ptr)
|
||||
{
|
||||
int clen = pg_mblen(ptr);
|
||||
wchar_t character[WC_BUF_LEN];
|
||||
Oid collation = DEFAULT_COLLATION_OID; /* TODO */
|
||||
pg_locale_t mylocale = 0; /* TODO */
|
||||
|
||||
if (clen == 1 || lc_ctype_is_c(collation))
|
||||
if (clen == 1 || database_ctype_is_c)
|
||||
return isalpha(TOUCHAR(ptr));
|
||||
|
||||
char2wchar(character, WC_BUF_LEN, ptr, clen, mylocale);
|
||||
@@ -86,10 +83,9 @@ t_isalnum(const char *ptr)
|
||||
{
|
||||
int clen = pg_mblen(ptr);
|
||||
wchar_t character[WC_BUF_LEN];
|
||||
Oid collation = DEFAULT_COLLATION_OID; /* TODO */
|
||||
pg_locale_t mylocale = 0; /* TODO */
|
||||
|
||||
if (clen == 1 || lc_ctype_is_c(collation))
|
||||
if (clen == 1 || database_ctype_is_c)
|
||||
return isalnum(TOUCHAR(ptr));
|
||||
|
||||
char2wchar(character, WC_BUF_LEN, ptr, clen, mylocale);
|
||||
@@ -102,10 +98,9 @@ t_isprint(const char *ptr)
|
||||
{
|
||||
int clen = pg_mblen(ptr);
|
||||
wchar_t character[WC_BUF_LEN];
|
||||
Oid collation = DEFAULT_COLLATION_OID; /* TODO */
|
||||
pg_locale_t mylocale = 0; /* TODO */
|
||||
|
||||
if (clen == 1 || lc_ctype_is_c(collation))
|
||||
if (clen == 1 || database_ctype_is_c)
|
||||
return isprint(TOUCHAR(ptr));
|
||||
|
||||
char2wchar(character, WC_BUF_LEN, ptr, clen, mylocale);
|
||||
@@ -273,7 +268,6 @@ char *
|
||||
lowerstr_with_len(const char *str, int len)
|
||||
{
|
||||
char *out;
|
||||
Oid collation = DEFAULT_COLLATION_OID; /* TODO */
|
||||
pg_locale_t mylocale = 0; /* TODO */
|
||||
|
||||
if (len == 0)
|
||||
@@ -285,7 +279,7 @@ lowerstr_with_len(const char *str, int len)
|
||||
* Also, for a C locale there is no need to process as multibyte. From
|
||||
* backend/utils/adt/oracle_compat.c Teodor
|
||||
*/
|
||||
if (pg_database_encoding_max_length() > 1 && !lc_ctype_is_c(collation))
|
||||
if (pg_database_encoding_max_length() > 1 && !database_ctype_is_c)
|
||||
{
|
||||
wchar_t *wstr,
|
||||
*wptr;
|
||||
|
@@ -297,11 +297,10 @@ TParserInit(char *str, int len)
|
||||
*/
|
||||
if (prs->charmaxlen > 1)
|
||||
{
|
||||
Oid collation = DEFAULT_COLLATION_OID; /* TODO */
|
||||
pg_locale_t mylocale = 0; /* TODO */
|
||||
|
||||
prs->usewide = true;
|
||||
if (lc_ctype_is_c(collation))
|
||||
if (database_ctype_is_c)
|
||||
{
|
||||
/*
|
||||
* char2wchar doesn't work for C-locale and sizeof(pg_wchar) could
|
||||
|
Reference in New Issue
Block a user