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-2026, 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/* use for libc locale names */
18#define LOCALE_NAME_BUFLEN 128
19
20/*
21 * Maximum number of bytes needed to map a single codepoint. Useful for
22 * mapping and processing a single input codepoint at a time with a
23 * statically-allocated buffer.
24 *
25 * With full case mapping, an input codepoint may be mapped to as many as
26 * three output codepoints. See Unicode 16.0.0, section 5.18.2, "Change in
27 * Length":
28 *
29 * https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-5/#G29675
30 */
31#define UNICODE_CASEMAP_LEN 3
32#define UNICODE_CASEMAP_BUFSZ (UNICODE_CASEMAP_LEN * MAX_MULTIBYTE_CHAR_LEN)
33
34/* GUC settings */
35extern PGDLLIMPORT char *locale_messages;
36extern PGDLLIMPORT char *locale_monetary;
37extern PGDLLIMPORT char *locale_numeric;
38extern PGDLLIMPORT char *locale_time;
40
41/* lc_time localization cache */
43extern PGDLLIMPORT char *localized_full_days[];
46
47extern bool check_locale(int category, const char *locale, char **canonname);
48extern char *pg_perm_setlocale(int category, const char *locale);
49
50/*
51 * Return the POSIX lconv struct (contains number/money formatting
52 * information) with locale information for all categories.
53 */
54extern struct lconv *PGLC_localeconv(void);
55
56extern void cache_locale_time(void);
57
58
59struct pg_locale_struct;
61
62/* methods that define collation behavior */
64{
65 /* required */
66 int (*strncoll) (const char *arg1, ssize_t len1,
67 const char *arg2, ssize_t len2,
69
70 /* required */
71 size_t (*strnxfrm) (char *dest, size_t destsize,
72 const char *src, ssize_t srclen,
74
75 /* optional */
76 size_t (*strnxfrm_prefix) (char *dest, size_t destsize,
77 const char *src, ssize_t srclen,
79
80 /*
81 * If the strnxfrm method is not trusted to return the correct results,
82 * set strxfrm_is_safe to false. It set to false, the method will not be
83 * used in most cases, but the planner still expects it to be there for
84 * estimation purposes (where incorrect results are acceptable).
85 */
87};
88
90{
91 /* case mapping: LOWER()/INITCAP()/UPPER() */
92 size_t (*strlower) (char *dest, size_t destsize,
93 const char *src, ssize_t srclen,
95 size_t (*strtitle) (char *dest, size_t destsize,
96 const char *src, ssize_t srclen,
98 size_t (*strupper) (char *dest, size_t destsize,
99 const char *src, ssize_t srclen,
101 size_t (*strfold) (char *dest, size_t destsize,
102 const char *src, ssize_t srclen,
104 size_t (*downcase_ident) (char *dest, size_t destsize,
105 const char *src, ssize_t srclen,
107
108 /* required */
122};
123
124/*
125 * We use a discriminated union to hold either a locale_t or an ICU collator.
126 * pg_locale_t is occasionally checked for truth, so make it a pointer.
127 *
128 * Also, hold two flags: whether the collation's LC_COLLATE or LC_CTYPE is C
129 * (or POSIX), so we can optimize a few code paths in various places. For the
130 * built-in C and POSIX collations, we can know that without even doing a
131 * cache lookup, but we want to support aliases for C/POSIX too. For the
132 * "default" collation, there are separate static cache variables, since
133 * consulting the pg_collation catalog doesn't tell us what we need.
134 *
135 * Note that some code, such as wchar2char(), relies on the flags not
136 * reporting false negatives (that is, saying it's not C when it is).
137 */
139{
144
145 const struct collate_methods *collate; /* NULL if collate_is_c */
146 const struct ctype_methods *ctype; /* NULL if ctype_is_c */
147
148 union
149 {
150 struct
151 {
152 const char *locale;
156#ifdef USE_ICU
157 struct
158 {
159 const char *locale;
160 struct UCollator *ucol;
161 struct UCaseMap *ucasemap;
162 locale_t lt;
163 } icu;
164#endif
165 };
166};
167
168extern void init_database_collation(void);
171
172extern char *get_collation_actual_version(char collprovider, const char *collcollate);
173
174extern size_t pg_strlower(char *dst, size_t dstsize,
175 const char *src, ssize_t srclen,
177extern size_t pg_strtitle(char *dst, size_t dstsize,
178 const char *src, ssize_t srclen,
180extern size_t pg_strupper(char *dst, size_t dstsize,
181 const char *src, ssize_t srclen,
183extern size_t pg_strfold(char *dst, size_t dstsize,
184 const char *src, ssize_t srclen,
186extern size_t pg_downcase_ident(char *dst, size_t dstsize,
187 const char *src, ssize_t srclen);
188extern int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale);
189extern int pg_strncoll(const char *arg1, ssize_t len1,
190 const char *arg2, ssize_t len2, pg_locale_t locale);
192extern size_t pg_strxfrm(char *dest, const char *src, size_t destsize,
194extern size_t pg_strnxfrm(char *dest, size_t destsize, const char *src,
195 ssize_t srclen, pg_locale_t locale);
197extern size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize,
199extern size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src,
200 ssize_t srclen, pg_locale_t locale);
201
202extern bool pg_iswdigit(pg_wchar wc, pg_locale_t locale);
203extern bool pg_iswalpha(pg_wchar wc, pg_locale_t locale);
204extern bool pg_iswalnum(pg_wchar wc, pg_locale_t locale);
205extern bool pg_iswupper(pg_wchar wc, pg_locale_t locale);
206extern bool pg_iswlower(pg_wchar wc, pg_locale_t locale);
207extern bool pg_iswgraph(pg_wchar wc, pg_locale_t locale);
208extern bool pg_iswprint(pg_wchar wc, pg_locale_t locale);
209extern bool pg_iswpunct(pg_wchar wc, pg_locale_t locale);
210extern bool pg_iswspace(pg_wchar wc, pg_locale_t locale);
211extern bool pg_iswxdigit(pg_wchar wc, pg_locale_t locale);
212extern bool pg_iswcased(pg_wchar wc, pg_locale_t locale);
215
216extern const char *pg_icu_unicode_version(void);
217
218extern int builtin_locale_encoding(const char *locale);
219extern const char *builtin_validate_locale(int encoding, const char *locale);
220extern void icu_validate_locale(const char *loc_str);
221extern char *icu_language_tag(const char *loc_str, int elevel);
222extern void report_newlocale_failure(const char *localename);
223
224/* This function converts from libc's wchar_t, *not* pg_wchar */
225extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen,
226 locale_t loc);
227
228#endif /* _PG_LOCALE_ */
#define PGDLLIMPORT
Definition: c.h:1305
Oid collid
static char * locale
Definition: initdb.c:140
unsigned int pg_wchar
Definition: mbprint.c:31
int32 encoding
Definition: pg_database.h:41
size_t pg_downcase_ident(char *dst, size_t dstsize, const char *src, ssize_t srclen)
Definition: pg_locale.c:1366
struct pg_locale_struct * pg_locale_t
Definition: pg_locale.h:60
const char * pg_icu_unicode_version(void)
Definition: pg_locale.c:1653
PGDLLIMPORT int icu_validation_level
Definition: pg_locale.c:92
void cache_locale_time(void)
Definition: pg_locale.c:702
size_t pg_strnxfrm(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1459
bool pg_strxfrm_enabled(pg_locale_t locale)
Definition: pg_locale.c:1418
pg_wchar pg_towlower(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1639
bool pg_iswalnum(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1533
void icu_validate_locale(const char *loc_str)
Definition: pg_locale.c:1789
bool pg_iswcased(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1615
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:1247
PGDLLIMPORT char * locale_time
Definition: pg_locale.c:90
bool pg_iswgraph(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1563
bool pg_iswprint(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1573
pg_locale_t pg_newlocale_from_collation(Oid collid)
Definition: pg_locale.c:1189
PGDLLIMPORT char * localized_abbrev_days[]
Definition: pg_locale.c:101
bool pg_iswdigit(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1513
bool pg_iswupper(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1543
size_t pg_strfold(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1348
int builtin_locale_encoding(const char *locale)
Definition: pg_locale.c:1667
size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1506
bool pg_iswxdigit(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1603
char * pg_perm_setlocale(int category, const char *locale)
Definition: pg_locale.c:172
size_t pg_strlower(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1318
pg_wchar pg_towupper(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1626
pg_locale_t pg_database_locale(void)
Definition: pg_locale.c:1175
bool pg_iswspace(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1593
PGDLLIMPORT char * locale_numeric
Definition: pg_locale.c:89
PGDLLIMPORT char * localized_full_days[]
Definition: pg_locale.c:102
struct lconv * PGLC_localeconv(void)
Definition: pg_locale.c:506
size_t pg_strtitle(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1328
int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale)
Definition: pg_locale.c:1384
PGDLLIMPORT char * localized_full_months[]
Definition: pg_locale.c:104
PGDLLIMPORT char * localized_abbrev_months[]
Definition: pg_locale.c:103
PGDLLIMPORT char * locale_monetary
Definition: pg_locale.c:88
bool pg_iswpunct(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1583
bool pg_strxfrm_prefix_enabled(pg_locale_t locale)
Definition: pg_locale.c:1470
char * icu_language_tag(const char *loc_str, int elevel)
Definition: pg_locale.c:1731
PGDLLIMPORT char * locale_messages
Definition: pg_locale.c:87
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:1404
bool pg_iswlower(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1553
void init_database_collation(void)
Definition: pg_locale.c:1131
size_t pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale)
Definition: pg_locale.c:1434
const char * builtin_validate_locale(int encoding, const char *locale)
Definition: pg_locale.c:1691
size_t pg_strupper(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1338
bool pg_iswalpha(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1523
bool check_locale(int category, const char *locale, char **canonname)
Definition: pg_locale.c:275
size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize, pg_locale_t locale)
Definition: pg_locale.c:1481
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:76
size_t(* strnxfrm)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:71
int(* strncoll)(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2, pg_locale_t locale)
Definition: pg_locale.h:66
bool strxfrm_is_safe
Definition: pg_locale.h:86
size_t(* strlower)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:92
size_t(* strupper)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:98
pg_wchar(* wc_toupper)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:120
bool(* wc_isxdigit)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:118
bool(* wc_ispunct)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:116
size_t(* downcase_ident)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:104
bool(* wc_isprint)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:115
bool(* wc_isalpha)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:110
pg_wchar(* wc_tolower)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:121
bool(* wc_isupper)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:112
size_t(* strtitle)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:95
bool(* wc_isspace)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:117
bool(* wc_isgraph)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:114
bool(* wc_islower)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:113
bool(* wc_isalnum)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:111
bool(* wc_isdigit)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:109
size_t(* strfold)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:101
bool(* wc_iscased)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:119
const struct ctype_methods * ctype
Definition: pg_locale.h:146
const struct collate_methods * collate
Definition: pg_locale.h:145
struct pg_locale_struct::@166::@168 builtin
const char * locale
Definition: pg_locale.h:152
#define locale_t
Definition: win32_port.h:429