PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
pg_locale.h
Go to the documentation of this file.
1/*-----------------------------------------------------------------------
2 *
3 * PostgreSQL locale utilities
4 *
5 * src/include/utils/pg_locale.h
6 *
7 * Copyright (c) 2002-2025, PostgreSQL Global Development Group
8 *
9 *-----------------------------------------------------------------------
10 */
11
12#ifndef _PG_LOCALE_
13#define _PG_LOCALE_
14
15#ifdef USE_ICU
16#include <unicode/ucol.h>
17#endif
18
19/* use for libc locale names */
20#define LOCALE_NAME_BUFLEN 128
21
22/* GUC settings */
23extern PGDLLIMPORT char *locale_messages;
24extern PGDLLIMPORT char *locale_monetary;
25extern PGDLLIMPORT char *locale_numeric;
26extern PGDLLIMPORT char *locale_time;
28
29/* lc_time localization cache */
31extern PGDLLIMPORT char *localized_full_days[];
34
35/* is the databases's LC_CTYPE the C locale? */
37
38extern bool check_locale(int category, const char *locale, char **canonname);
39extern char *pg_perm_setlocale(int category, const char *locale);
40
41/*
42 * Return the POSIX lconv struct (contains number/money formatting
43 * information) with locale information for all categories.
44 */
45extern struct lconv *PGLC_localeconv(void);
46
47extern void cache_locale_time(void);
48
49
50struct pg_locale_struct;
52
53/* methods that define collation behavior */
55{
56 /* required */
57 int (*strncoll) (const char *arg1, ssize_t len1,
58 const char *arg2, ssize_t len2,
60
61 /* required */
62 size_t (*strnxfrm) (char *dest, size_t destsize,
63 const char *src, ssize_t srclen,
65
66 /* optional */
67 size_t (*strnxfrm_prefix) (char *dest, size_t destsize,
68 const char *src, ssize_t srclen,
70
71 /*
72 * If the strnxfrm method is not trusted to return the correct results,
73 * set strxfrm_is_safe to false. It set to false, the method will not be
74 * used in most cases, but the planner still expects it to be there for
75 * estimation purposes (where incorrect results are acceptable).
76 */
78};
79
80/*
81 * We use a discriminated union to hold either a locale_t or an ICU collator.
82 * pg_locale_t is occasionally checked for truth, so make it a pointer.
83 *
84 * Also, hold two flags: whether the collation's LC_COLLATE or LC_CTYPE is C
85 * (or POSIX), so we can optimize a few code paths in various places. For the
86 * built-in C and POSIX collations, we can know that without even doing a
87 * cache lookup, but we want to support aliases for C/POSIX too. For the
88 * "default" collation, there are separate static cache variables, since
89 * consulting the pg_collation catalog doesn't tell us what we need.
90 *
91 * Note that some code relies on the flags not reporting false negatives
92 * (that is, saying it's not C when it is). For example, char2wchar()
93 * could fail if the locale is C, so str_tolower() shouldn't call it
94 * in that case.
95 */
97{
103
104 const struct collate_methods *collate; /* NULL if collate_is_c */
105
106 union
107 {
108 struct
109 {
110 const char *locale;
114#ifdef USE_ICU
115 struct
116 {
117 const char *locale;
118 UCollator *ucol;
119 } icu;
120#endif
122};
123
124extern void init_database_collation(void);
126
127extern char *get_collation_actual_version(char collprovider, const char *collcollate);
128extern size_t pg_strlower(char *dest, size_t destsize,
129 const char *src, ssize_t srclen,
131extern size_t pg_strtitle(char *dest, size_t destsize,
132 const char *src, ssize_t srclen,
134extern size_t pg_strupper(char *dest, size_t destsize,
135 const char *src, ssize_t srclen,
137extern size_t pg_strfold(char *dest, size_t destsize,
138 const char *src, ssize_t srclen,
140extern int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale);
141extern int pg_strncoll(const char *arg1, ssize_t len1,
142 const char *arg2, ssize_t len2, pg_locale_t locale);
144extern size_t pg_strxfrm(char *dest, const char *src, size_t destsize,
146extern size_t pg_strnxfrm(char *dest, size_t destsize, const char *src,
147 ssize_t srclen, pg_locale_t locale);
149extern size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize,
151extern size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src,
152 ssize_t srclen, pg_locale_t locale);
153
154extern int builtin_locale_encoding(const char *locale);
155extern const char *builtin_validate_locale(int encoding, const char *locale);
156extern void icu_validate_locale(const char *loc_str);
157extern char *icu_language_tag(const char *loc_str, int elevel);
158extern void report_newlocale_failure(const char *localename);
159
160/* These functions convert from/to libc's wchar_t, *not* pg_wchar_t */
161extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen,
163extern size_t char2wchar(wchar_t *to, size_t tolen,
164 const char *from, size_t fromlen, pg_locale_t locale);
165
166#endif /* _PG_LOCALE_ */
#define PGDLLIMPORT
Definition: c.h:1291
Oid collid
static char * locale
Definition: initdb.c:140
int32 encoding
Definition: pg_database.h:41
size_t pg_strupper(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1292
struct pg_locale_struct * pg_locale_t
Definition: pg_locale.h:51
size_t pg_strtitle(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1273
PGDLLIMPORT int icu_validation_level
Definition: pg_locale.c:113
void cache_locale_time(void)
Definition: pg_locale.c:720
size_t pg_strnxfrm(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1411
bool pg_strxfrm_enabled(pg_locale_t locale)
Definition: pg_locale.c:1370
size_t wchar2char(char *to, const wchar_t *from, size_t tolen, pg_locale_t locale)
void icu_validate_locale(const char *loc_str)
Definition: pg_locale.c:1591
char * get_collation_actual_version(char collprovider, const char *collcollate)
Definition: pg_locale.c:1237
PGDLLIMPORT char * locale_time
Definition: pg_locale.c:111
pg_locale_t pg_newlocale_from_collation(Oid collid)
Definition: pg_locale.c:1188
PGDLLIMPORT char * localized_abbrev_days[]
Definition: pg_locale.c:122
size_t pg_strfold(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1311
int builtin_locale_encoding(const char *locale)
Definition: pg_locale.c:1469
size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1458
char * pg_perm_setlocale(int category, const char *locale)
Definition: pg_locale.c:190
PGDLLIMPORT char * locale_numeric
Definition: pg_locale.c:110
PGDLLIMPORT char * localized_full_days[]
Definition: pg_locale.c:123
struct lconv * PGLC_localeconv(void)
Definition: pg_locale.c:524
int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale)
Definition: pg_locale.c:1336
PGDLLIMPORT char * localized_full_months[]
Definition: pg_locale.c:125
PGDLLIMPORT char * localized_abbrev_months[]
Definition: pg_locale.c:124
PGDLLIMPORT char * locale_monetary
Definition: pg_locale.c:109
bool pg_strxfrm_prefix_enabled(pg_locale_t locale)
Definition: pg_locale.c:1422
char * icu_language_tag(const char *loc_str, int elevel)
Definition: pg_locale.c:1533
PGDLLIMPORT char * locale_messages
Definition: pg_locale.c:108
void report_newlocale_failure(const char *localename)
int pg_strncoll(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2, pg_locale_t locale)
Definition: pg_locale.c:1356
void init_database_collation(void)
Definition: pg_locale.c:1146
PGDLLIMPORT bool database_ctype_is_c
Definition: pg_locale.c:128
size_t pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale)
Definition: pg_locale.c:1386
const char * builtin_validate_locale(int encoding, const char *locale)
Definition: pg_locale.c:1493
bool check_locale(int category, const char *locale, char **canonname)
Definition: pg_locale.c:293
size_t pg_strlower(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1254
size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize, pg_locale_t locale)
Definition: pg_locale.c:1433
size_t char2wchar(wchar_t *to, size_t tolen, const char *from, size_t fromlen, pg_locale_t locale)
unsigned int Oid
Definition: postgres_ext.h:30
size_t(* strnxfrm_prefix)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:67
size_t(* strnxfrm)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:62
int(* strncoll)(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2, pg_locale_t locale)
Definition: pg_locale.h:57
bool strxfrm_is_safe
Definition: pg_locale.h:77
const struct collate_methods * collate
Definition: pg_locale.h:104
struct pg_locale_struct::@161::@162 builtin
const char * locale
Definition: pg_locale.h:110
bool deterministic
Definition: pg_locale.h:99
union pg_locale_struct::@161 info
#define locale_t
Definition: win32_port.h:432