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 */
127
128 /* required */
129 bool (*char_is_cased) (char ch, pg_locale_t locale);
130
131 /*
132 * Optional. If defined, will only be called for single-byte encodings. If
133 * not defined, or if the encoding is multibyte, will fall back to
134 * pg_strlower().
135 */
136 char (*char_tolower) (unsigned char ch, pg_locale_t locale);
137
138 /*
139 * For regex and pattern matching efficiency, the maximum char value
140 * supported by the above methods. If zero, limit is set by regex code.
141 */
143};
144
145/*
146 * We use a discriminated union to hold either a locale_t or an ICU collator.
147 * pg_locale_t is occasionally checked for truth, so make it a pointer.
148 *
149 * Also, hold two flags: whether the collation's LC_COLLATE or LC_CTYPE is C
150 * (or POSIX), so we can optimize a few code paths in various places. For the
151 * built-in C and POSIX collations, we can know that without even doing a
152 * cache lookup, but we want to support aliases for C/POSIX too. For the
153 * "default" collation, there are separate static cache variables, since
154 * consulting the pg_collation catalog doesn't tell us what we need.
155 *
156 * Note that some code, such as wchar2char(), relies on the flags not
157 * reporting false negatives (that is, saying it's not C when it is).
158 */
160{
165
166 const struct collate_methods *collate; /* NULL if collate_is_c */
167 const struct ctype_methods *ctype; /* NULL if ctype_is_c */
168
169 union
170 {
171 struct
172 {
173 const char *locale;
177#ifdef USE_ICU
178 struct
179 {
180 const char *locale;
181 UCollator *ucol;
182 } icu;
183#endif
184 };
185};
186
187extern void init_database_collation(void);
190
191extern char *get_collation_actual_version(char collprovider, const char *collcollate);
192
193extern bool char_is_cased(char ch, pg_locale_t locale);
195extern char char_tolower(unsigned char ch, pg_locale_t locale);
196extern size_t pg_strlower(char *dst, size_t dstsize,
197 const char *src, ssize_t srclen,
199extern size_t pg_strtitle(char *dst, size_t dstsize,
200 const char *src, ssize_t srclen,
202extern size_t pg_strupper(char *dst, size_t dstsize,
203 const char *src, ssize_t srclen,
205extern size_t pg_strfold(char *dst, size_t dstsize,
206 const char *src, ssize_t srclen,
208extern int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale);
209extern int pg_strncoll(const char *arg1, ssize_t len1,
210 const char *arg2, ssize_t len2, pg_locale_t locale);
212extern size_t pg_strxfrm(char *dest, const char *src, size_t destsize,
214extern size_t pg_strnxfrm(char *dest, size_t destsize, const char *src,
215 ssize_t srclen, pg_locale_t locale);
217extern size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize,
219extern size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src,
220 ssize_t srclen, pg_locale_t locale);
221
222extern bool pg_iswdigit(pg_wchar wc, pg_locale_t locale);
223extern bool pg_iswalpha(pg_wchar wc, pg_locale_t locale);
224extern bool pg_iswalnum(pg_wchar wc, pg_locale_t locale);
225extern bool pg_iswupper(pg_wchar wc, pg_locale_t locale);
226extern bool pg_iswlower(pg_wchar wc, pg_locale_t locale);
227extern bool pg_iswgraph(pg_wchar wc, pg_locale_t locale);
228extern bool pg_iswprint(pg_wchar wc, pg_locale_t locale);
229extern bool pg_iswpunct(pg_wchar wc, pg_locale_t locale);
230extern bool pg_iswspace(pg_wchar wc, pg_locale_t locale);
231extern bool pg_iswxdigit(pg_wchar wc, pg_locale_t locale);
234
235extern int builtin_locale_encoding(const char *locale);
236extern const char *builtin_validate_locale(int encoding, const char *locale);
237extern void icu_validate_locale(const char *loc_str);
238extern char *icu_language_tag(const char *loc_str, int elevel);
239extern void report_newlocale_failure(const char *localename);
240
241/* This function converts from libc's wchar_t, *not* pg_wchar */
242extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen,
243 locale_t loc);
244
245#endif /* _PG_LOCALE_ */
#define PGDLLIMPORT
Definition: c.h:1310
Oid collid
static char * locale
Definition: initdb.c:140
unsigned int pg_wchar
Definition: mbprint.c:31
int32 encoding
Definition: pg_database.h:41
char char_tolower(unsigned char ch, pg_locale_t locale)
Definition: pg_locale.c:1651
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:1605
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:1785
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:1663
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:1592
bool char_tolower_enabled(pg_locale_t locale)
Definition: pg_locale.c:1638
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:1727
bool char_is_cased(char ch, pg_locale_t locale)
Definition: pg_locale.c:1625
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:1687
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:129
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:125
pg_wchar max_chr
Definition: pg_locale.h:142
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:126
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
char(* char_tolower)(unsigned char ch, pg_locale_t locale)
Definition: pg_locale.h:136
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
const struct ctype_methods * ctype
Definition: pg_locale.h:167
const struct collate_methods * collate
Definition: pg_locale.h:166
struct pg_locale_struct::@166::@168 builtin
const char * locale
Definition: pg_locale.h:173
#define locale_t
Definition: win32_port.h:432