mirror of
https://github.com/postgres/postgres.git
synced 2025-12-09 02:08:45 +03:00
Make collation not depend on setlocale().
Now that the result of pg_newlocale_from_collation() is always non-NULL, then we can move the collate_is_c and ctype_is_c flags into pg_locale_t. That simplifies the logic in lc_collate_is_c() and lc_ctype_is_c(), removing the dependence on setlocale(). This commit also eliminates the multi-stage initialization of the collation cache. As long as we have catalog access, then it's now safe to call pg_newlocale_from_collation() without checking lc_collate_is_c() first. Discussion: https://postgr.es/m/cfd9eb85-c52a-4ec9-a90e-a5e4de56e57d@eisentraut.org Reviewed-by: Peter Eisentraut, Andreas Karlsson
This commit is contained in:
@@ -69,11 +69,25 @@ extern void cache_locale_time(void);
|
||||
/*
|
||||
* We use a discriminated union to hold either a locale_t or an ICU collator.
|
||||
* pg_locale_t is occasionally checked for truth, so make it a pointer.
|
||||
*
|
||||
* Also, hold two flags: whether the collation's LC_COLLATE or LC_CTYPE is C
|
||||
* (or POSIX), so we can optimize a few code paths in various places. For the
|
||||
* built-in C and POSIX collations, we can know that without even doing a
|
||||
* cache lookup, but we want to support aliases for C/POSIX too. For the
|
||||
* "default" collation, there are separate static cache variables, since
|
||||
* consulting the pg_collation catalog doesn't tell us what we need.
|
||||
*
|
||||
* Note that some code relies on the flags not reporting false negatives
|
||||
* (that is, saying it's not C when it is). For example, char2wchar()
|
||||
* could fail if the locale is C, so str_tolower() shouldn't call it
|
||||
* in that case.
|
||||
*/
|
||||
struct pg_locale_struct
|
||||
{
|
||||
char provider;
|
||||
bool deterministic;
|
||||
bool collate_is_c;
|
||||
bool ctype_is_c;
|
||||
union
|
||||
{
|
||||
struct
|
||||
|
||||
Reference in New Issue
Block a user