mirror of
https://github.com/postgres/postgres.git
synced 2025-06-25 01:02:05 +03:00
Fix planner's test for case-foldable characters in ILIKE with ICU.
As coded, the ICU-collation path in pattern_char_isalpha() failed
to consider regular ASCII letters to be case-varying. This led to
like_fixed_prefix treating too much of an ILIKE pattern as being a
fixed prefix, so that indexscans derived from an ILIKE clause might
miss entries that they should find.
Per bug #15892 from James Inform. This is an oversight in the original
ICU patch (commit eccfef81e
), so back-patch to v10 where that came in.
Discussion: https://postgr.es/m/15892-e5d2bea3e8a04a1b@postgresql.org
This commit is contained in:
@ -5815,9 +5815,10 @@ find_join_input_rel(PlannerInfo *root, Relids relids)
|
||||
/*
|
||||
* Check whether char is a letter (and, hence, subject to case-folding)
|
||||
*
|
||||
* In multibyte character sets or with ICU, we can't use isalpha, and it does not seem
|
||||
* worth trying to convert to wchar_t to use iswalpha. Instead, just assume
|
||||
* any multibyte char is potentially case-varying.
|
||||
* In multibyte character sets or with ICU, we can't use isalpha, and it does
|
||||
* not seem worth trying to convert to wchar_t to use iswalpha or u_isalpha.
|
||||
* Instead, just assume any non-ASCII char is potentially case-varying, and
|
||||
* hard-wire knowledge of which ASCII chars are letters.
|
||||
*/
|
||||
static int
|
||||
pattern_char_isalpha(char c, bool is_multibyte,
|
||||
@ -5828,7 +5829,8 @@ pattern_char_isalpha(char c, bool is_multibyte,
|
||||
else if (is_multibyte && IS_HIGHBIT_SET(c))
|
||||
return true;
|
||||
else if (locale && locale->provider == COLLPROVIDER_ICU)
|
||||
return IS_HIGHBIT_SET(c) ? true : false;
|
||||
return IS_HIGHBIT_SET(c) ||
|
||||
(c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
|
||||
#ifdef HAVE_LOCALE_T
|
||||
else if (locale && locale->provider == COLLPROVIDER_LIBC)
|
||||
return isalpha_l((unsigned char) c, locale->info.lt);
|
||||
|
Reference in New Issue
Block a user