1
0
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:
Jeff Davis
2024-07-30 00:58:06 -07:00
parent 9b282a9359
commit 72fe6d24a3
4 changed files with 81 additions and 154 deletions

View File

@@ -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