PostgreSQL Source Code git master
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#include "mb/pg_wchar.h"
16
17#ifdef USE_ICU
18/* only include the C APIs, to avoid errors in cpluspluscheck */
19#undef U_SHOW_CPLUSPLUS_API
20#define U_SHOW_CPLUSPLUS_API 0
21#undef U_SHOW_CPLUSPLUS_HEADER_API
22#define U_SHOW_CPLUSPLUS_HEADER_API 0
23#include <unicode/ucol.h>
24#endif
25
26/* use for libc locale names */
27#define LOCALE_NAME_BUFLEN 128
28
29/*
30 * Maximum number of bytes needed to map a single codepoint. Useful for
31 * mapping and processing a single input codepoint at a time with a
32 * statically-allocated buffer.
33 *
34 * With full case mapping, an input codepoint may be mapped to as many as
35 * three output codepoints. See Unicode 16.0.0, section 5.18.2, "Change in
36 * Length":
37 *
38 * https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-5/#G29675
39 */
40#define UNICODE_CASEMAP_LEN 3
41#define UNICODE_CASEMAP_BUFSZ (UNICODE_CASEMAP_LEN * sizeof(char32_t))
42
43/* GUC settings */
44extern PGDLLIMPORT char *locale_messages;
45extern PGDLLIMPORT char *locale_monetary;
46extern PGDLLIMPORT char *locale_numeric;
47extern PGDLLIMPORT char *locale_time;
49
50/* lc_time localization cache */
52extern PGDLLIMPORT char *localized_full_days[];
55
56extern bool check_locale(int category, const char *locale, char **canonname);
57extern char *pg_perm_setlocale(int category, const char *locale);
58
59/*
60 * Return the POSIX lconv struct (contains number/money formatting
61 * information) with locale information for all categories.
62 */
63extern struct lconv *PGLC_localeconv(void);
64
65extern void cache_locale_time(void);
66
67
68struct pg_locale_struct;
70
71/* methods that define collation behavior */
73{
74 /* required */
75 int (*strncoll) (const char *arg1, ssize_t len1,
76 const char *arg2, ssize_t len2,
78
79 /* required */
80 size_t (*strnxfrm) (char *dest, size_t destsize,
81 const char *src, ssize_t srclen,
83
84 /* optional */
85 size_t (*strnxfrm_prefix) (char *dest, size_t destsize,
86 const char *src, ssize_t srclen,
88
89 /*
90 * If the strnxfrm method is not trusted to return the correct results,
91 * set strxfrm_is_safe to false. It set to false, the method will not be
92 * used in most cases, but the planner still expects it to be there for
93 * estimation purposes (where incorrect results are acceptable).
94 */
96};
97
99{
100 /* case mapping: LOWER()/INITCAP()/UPPER() */
101 size_t (*strlower) (char *dest, size_t destsize,
102 const char *src, ssize_t srclen,
104 size_t (*strtitle) (char *dest, size_t destsize,
105 const char *src, ssize_t srclen,
107 size_t (*strupper) (char *dest, size_t destsize,
108 const char *src, ssize_t srclen,
110 size_t (*strfold) (char *dest, size_t destsize,
111 const char *src, ssize_t srclen,
113
114 /* required */
128
129 /* required */
130 bool (*char_is_cased) (char ch, pg_locale_t locale);
131};
132
133/*
134 * We use a discriminated union to hold either a locale_t or an ICU collator.
135 * pg_locale_t is occasionally checked for truth, so make it a pointer.
136 *
137 * Also, hold two flags: whether the collation's LC_COLLATE or LC_CTYPE is C
138 * (or POSIX), so we can optimize a few code paths in various places. For the
139 * built-in C and POSIX collations, we can know that without even doing a
140 * cache lookup, but we want to support aliases for C/POSIX too. For the
141 * "default" collation, there are separate static cache variables, since
142 * consulting the pg_collation catalog doesn't tell us what we need.
143 *
144 * Note that some code, such as wchar2char(), relies on the flags not
145 * reporting false negatives (that is, saying it's not C when it is).
146 */
148{
153
154 const struct collate_methods *collate; /* NULL if collate_is_c */
155 const struct ctype_methods *ctype; /* NULL if ctype_is_c */
156
157 union
158 {
159 struct
160 {
161 const char *locale;
165#ifdef USE_ICU
166 struct
167 {
168 const char *locale;
169 UCollator *ucol;
170 } icu;
171#endif
172 };
173};
174
175extern void init_database_collation(void);
178
179extern char *get_collation_actual_version(char collprovider, const char *collcollate);
180
181extern bool char_is_cased(char ch, pg_locale_t locale);
182extern size_t pg_strlower(char *dst, size_t dstsize,
183 const char *src, ssize_t srclen,
185extern size_t pg_strtitle(char *dst, size_t dstsize,
186 const char *src, ssize_t srclen,
188extern size_t pg_strupper(char *dst, size_t dstsize,
189 const char *src, ssize_t srclen,
191extern size_t pg_strfold(char *dst, size_t dstsize,
192 const char *src, ssize_t srclen,
194extern int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale);
195extern int pg_strncoll(const char *arg1, ssize_t len1,
196 const char *arg2, ssize_t len2, pg_locale_t locale);
198extern size_t pg_strxfrm(char *dest, const char *src, size_t destsize,
200extern size_t pg_strnxfrm(char *dest, size_t destsize, const char *src,
201 ssize_t srclen, pg_locale_t locale);
203extern size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize,
205extern size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src,
206 ssize_t srclen, pg_locale_t locale);
207
208extern bool pg_iswdigit(pg_wchar wc, pg_locale_t locale);
209extern bool pg_iswalpha(pg_wchar wc, pg_locale_t locale);
210extern bool pg_iswalnum(pg_wchar wc, pg_locale_t locale);
211extern bool pg_iswupper(pg_wchar wc, pg_locale_t locale);
212extern bool pg_iswlower(pg_wchar wc, pg_locale_t locale);
213extern bool pg_iswgraph(pg_wchar wc, pg_locale_t locale);
214extern bool pg_iswprint(pg_wchar wc, pg_locale_t locale);
215extern bool pg_iswpunct(pg_wchar wc, pg_locale_t locale);
216extern bool pg_iswspace(pg_wchar wc, pg_locale_t locale);
217extern bool pg_iswxdigit(pg_wchar wc, pg_locale_t locale);
218extern bool pg_iswcased(pg_wchar wc, pg_locale_t locale);
221
222extern int builtin_locale_encoding(const char *locale);
223extern const char *builtin_validate_locale(int encoding, const char *locale);
224extern void icu_validate_locale(const char *loc_str);
225extern char *icu_language_tag(const char *loc_str, int elevel);
226extern void report_newlocale_failure(const char *localename);
227
228/* This function converts from libc's wchar_t, *not* pg_wchar */
229extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen,
230 locale_t loc);
231
232#endif /* _PG_LOCALE_ */
#define PGDLLIMPORT
Definition: c.h:1318
Oid collid
static char * locale
Definition: initdb.c:140
unsigned int pg_wchar
Definition: mbprint.c:31
int32 encoding
Definition: pg_database.h:41
struct pg_locale_struct * pg_locale_t
Definition: pg_locale.h:69
PGDLLIMPORT int icu_validation_level
Definition: pg_locale.c:89
void cache_locale_time(void)
Definition: pg_locale.c:699
size_t pg_strnxfrm(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1436
bool pg_strxfrm_enabled(pg_locale_t locale)
Definition: pg_locale.c:1395
pg_wchar pg_towlower(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1616
bool pg_iswalnum(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1510
void icu_validate_locale(const char *loc_str)
Definition: pg_locale.c:1770
bool pg_iswcased(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1592
size_t wchar2char(char *to, const wchar_t *from, size_t tolen, locale_t loc)
char * get_collation_actual_version(char collprovider, const char *collcollate)
Definition: pg_locale.c:1244
PGDLLIMPORT char * locale_time
Definition: pg_locale.c:87
bool pg_iswgraph(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1540
bool pg_iswprint(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1550
pg_locale_t pg_newlocale_from_collation(Oid collid)
Definition: pg_locale.c:1186
PGDLLIMPORT char * localized_abbrev_days[]
Definition: pg_locale.c:98
bool pg_iswdigit(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1490
bool pg_iswupper(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1520
size_t pg_strfold(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1345
int builtin_locale_encoding(const char *locale)
Definition: pg_locale.c:1648
size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1483
bool pg_iswxdigit(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1580
char * pg_perm_setlocale(int category, const char *locale)
Definition: pg_locale.c:169
size_t pg_strlower(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1315
pg_wchar pg_towupper(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1603
pg_locale_t pg_database_locale(void)
Definition: pg_locale.c:1172
bool pg_iswspace(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1570
PGDLLIMPORT char * locale_numeric
Definition: pg_locale.c:86
PGDLLIMPORT char * localized_full_days[]
Definition: pg_locale.c:99
struct lconv * PGLC_localeconv(void)
Definition: pg_locale.c:503
size_t pg_strtitle(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1325
int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale)
Definition: pg_locale.c:1361
PGDLLIMPORT char * localized_full_months[]
Definition: pg_locale.c:101
PGDLLIMPORT char * localized_abbrev_months[]
Definition: pg_locale.c:100
PGDLLIMPORT char * locale_monetary
Definition: pg_locale.c:85
bool pg_iswpunct(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1560
bool pg_strxfrm_prefix_enabled(pg_locale_t locale)
Definition: pg_locale.c:1447
char * icu_language_tag(const char *loc_str, int elevel)
Definition: pg_locale.c:1712
bool char_is_cased(char ch, pg_locale_t locale)
Definition: pg_locale.c:1636
PGDLLIMPORT char * locale_messages
Definition: pg_locale.c:84
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:1381
bool pg_iswlower(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1530
void init_database_collation(void)
Definition: pg_locale.c:1128
size_t pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale)
Definition: pg_locale.c:1411
const char * builtin_validate_locale(int encoding, const char *locale)
Definition: pg_locale.c:1672
size_t pg_strupper(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1335
bool pg_iswalpha(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1500
bool check_locale(int category, const char *locale, char **canonname)
Definition: pg_locale.c:272
size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize, pg_locale_t locale)
Definition: pg_locale.c:1458
unsigned int Oid
Definition: postgres_ext.h:32
size_t(* strnxfrm_prefix)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:85
size_t(* strnxfrm)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:80
int(* strncoll)(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2, pg_locale_t locale)
Definition: pg_locale.h:75
bool strxfrm_is_safe
Definition: pg_locale.h:95
size_t(* strlower)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:101
bool(* char_is_cased)(char ch, pg_locale_t locale)
Definition: pg_locale.h:130
size_t(* strupper)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:107
pg_wchar(* wc_toupper)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:126
bool(* wc_isxdigit)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:124
bool(* wc_ispunct)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:122
bool(* wc_isprint)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:121
bool(* wc_isalpha)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:116
pg_wchar(* wc_tolower)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:127
bool(* wc_isupper)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:118
size_t(* strtitle)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:104
bool(* wc_isspace)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:123
bool(* wc_isgraph)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:120
bool(* wc_islower)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:119
bool(* wc_isalnum)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:117
bool(* wc_isdigit)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:115
size_t(* strfold)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:110
bool(* wc_iscased)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:125
const struct ctype_methods * ctype
Definition: pg_locale.h:155
const struct collate_methods * collate
Definition: pg_locale.h:154
struct pg_locale_struct::@166::@168 builtin
const char * locale
Definition: pg_locale.h:161
#define locale_t
Definition: win32_port.h:429