Introduce t_isalnum() to replace t_isalpha() || t_isdigit() tests.
ts_locale.c omitted support for "isalnum" tests, perhaps on the grounds that there were initially no use-cases for that. However, both ltree and pg_trgm need such tests, and we do also have one use-case now in the core backend. The workaround of testing isalpha and isdigit separately seems quite inefficient, especially when dealing with multibyte characters; so let's fill in the missing support. Discussion: https://postgr.es/m/2548310.1664999615@sss.pgh.pa.us
This commit is contained in:
parent
5757141cae
commit
ca71131eeb
|
@ -126,7 +126,7 @@ typedef struct
|
||||||
|
|
||||||
#define LQUERY_HASNOT 0x01
|
#define LQUERY_HASNOT 0x01
|
||||||
|
|
||||||
#define ISALNUM(x) ( t_isalpha(x) || t_isdigit(x) || ( pg_mblen(x) == 1 && t_iseq((x), '_') ) )
|
#define ISALNUM(x) ( t_isalnum(x) || ( pg_mblen(x) == 1 && t_iseq((x), '_') ) )
|
||||||
|
|
||||||
/* full text query */
|
/* full text query */
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ typedef char trgm[3];
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#ifdef KEEPONLYALNUM
|
#ifdef KEEPONLYALNUM
|
||||||
#define ISWORDCHR(c) (t_isalpha(c) || t_isdigit(c))
|
#define ISWORDCHR(c) (t_isalnum(c))
|
||||||
#define ISPRINTABLECHAR(a) ( isascii( *(unsigned char*)(a) ) && (isalnum( *(unsigned char*)(a) ) || *(unsigned char*)(a)==' ') )
|
#define ISPRINTABLECHAR(a) ( isascii( *(unsigned char*)(a) ) && (isalnum( *(unsigned char*)(a) ) || *(unsigned char*)(a)==' ') )
|
||||||
#else
|
#else
|
||||||
#define ISWORDCHR(c) (!t_isspace(c))
|
#define ISWORDCHR(c) (!t_isspace(c))
|
||||||
|
|
|
@ -81,6 +81,22 @@ t_isalpha(const char *ptr)
|
||||||
return iswalpha((wint_t) character[0]);
|
return iswalpha((wint_t) character[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
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))
|
||||||
|
return isalnum(TOUCHAR(ptr));
|
||||||
|
|
||||||
|
char2wchar(character, WC_BUF_LEN, ptr, clen, mylocale);
|
||||||
|
|
||||||
|
return iswalnum((wint_t) character[0]);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
t_isprint(const char *ptr)
|
t_isprint(const char *ptr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -248,7 +248,7 @@ parse_or_operator(TSQueryParserState pstate)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* it shouldn't be a part of any word */
|
/* it shouldn't be a part of any word */
|
||||||
if (t_iseq(ptr, '-') || t_iseq(ptr, '_') || t_isalpha(ptr) || t_isdigit(ptr))
|
if (t_iseq(ptr, '-') || t_iseq(ptr, '_') || t_isalnum(ptr))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
|
|
|
@ -42,6 +42,7 @@ typedef struct
|
||||||
extern int t_isdigit(const char *ptr);
|
extern int t_isdigit(const char *ptr);
|
||||||
extern int t_isspace(const char *ptr);
|
extern int t_isspace(const char *ptr);
|
||||||
extern int t_isalpha(const char *ptr);
|
extern int t_isalpha(const char *ptr);
|
||||||
|
extern int t_isalnum(const char *ptr);
|
||||||
extern int t_isprint(const char *ptr);
|
extern int t_isprint(const char *ptr);
|
||||||
|
|
||||||
extern char *lowerstr(const char *str);
|
extern char *lowerstr(const char *str);
|
||||||
|
|
Loading…
Reference in a new issue