PostgreSQL Source Code git master
Loading...
Searching...
No Matches
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, size_t len1,
67 const char *arg2, size_t len2,
68 pg_locale_t locale);
69
70 int (*strcoll) (const char *arg1, const char *arg2,
71 pg_locale_t locale);
72
73 /* required */
74 size_t (*strnxfrm) (char *dest, size_t destsize,
75 const char *src, size_t srclen,
76 pg_locale_t locale);
77
78 size_t (*strxfrm) (char *dest, size_t destsize,
79 const char *src, pg_locale_t locale);
80
81 /* optional */
82 size_t (*strnxfrm_prefix) (char *dest, size_t destsize,
83 const char *src, size_t srclen,
84 pg_locale_t locale);
85
86 size_t (*strxfrm_prefix) (char *dest, size_t destsize,
87 const char *src, pg_locale_t locale);
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, size_t srclen,
103 pg_locale_t locale);
104 size_t (*strtitle) (char *dest, size_t destsize,
105 const char *src, size_t srclen,
106 pg_locale_t locale);
107 size_t (*strupper) (char *dest, size_t destsize,
108 const char *src, size_t srclen,
109 pg_locale_t locale);
110 size_t (*strfold) (char *dest, size_t destsize,
111 const char *src, size_t srclen,
112 pg_locale_t locale);
113 size_t (*downcase_ident) (char *dest, size_t destsize,
114 const char *src, size_t srclen,
115 pg_locale_t locale);
116
117 /* required */
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 struct UCollator *ucol;
170 struct UCaseMap *ucasemap;
171 locale_t lt;
172 } icu;
173#endif
174 };
175};
176
177extern void init_database_collation(void);
180
181extern char *get_collation_actual_version(char collprovider, const char *collcollate);
182
183extern size_t pg_strlower(char *dst, size_t dstsize,
184 const char *src, size_t srclen,
185 pg_locale_t locale);
186extern size_t pg_strtitle(char *dst, size_t dstsize,
187 const char *src, size_t srclen,
188 pg_locale_t locale);
189extern size_t pg_strupper(char *dst, size_t dstsize,
190 const char *src, size_t srclen,
191 pg_locale_t locale);
192extern size_t pg_strfold(char *dst, size_t dstsize,
193 const char *src, size_t srclen,
194 pg_locale_t locale);
195extern size_t pg_downcase_ident(char *dst, size_t dstsize,
196 const char *src, size_t srclen);
197extern int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale);
198extern int pg_strncoll(const char *arg1, size_t len1,
199 const char *arg2, size_t len2, pg_locale_t locale);
200extern bool pg_strxfrm_enabled(pg_locale_t locale);
201extern size_t pg_strxfrm(char *dest, const char *src, size_t destsize,
202 pg_locale_t locale);
203extern size_t pg_strnxfrm(char *dest, size_t destsize, const char *src,
204 size_t srclen, pg_locale_t locale);
205extern bool pg_strxfrm_prefix_enabled(pg_locale_t locale);
206extern size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize,
207 pg_locale_t locale);
208extern size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src,
209 size_t srclen, pg_locale_t locale);
210
211extern bool pg_iswdigit(pg_wchar wc, pg_locale_t locale);
212extern bool pg_iswalpha(pg_wchar wc, pg_locale_t locale);
213extern bool pg_iswalnum(pg_wchar wc, pg_locale_t locale);
214extern bool pg_iswupper(pg_wchar wc, pg_locale_t locale);
215extern bool pg_iswlower(pg_wchar wc, pg_locale_t locale);
216extern bool pg_iswgraph(pg_wchar wc, pg_locale_t locale);
217extern bool pg_iswprint(pg_wchar wc, pg_locale_t locale);
218extern bool pg_iswpunct(pg_wchar wc, pg_locale_t locale);
219extern bool pg_iswspace(pg_wchar wc, pg_locale_t locale);
220extern bool pg_iswxdigit(pg_wchar wc, pg_locale_t locale);
221extern bool pg_iswcased(pg_wchar wc, pg_locale_t locale);
222extern pg_wchar pg_towupper(pg_wchar wc, pg_locale_t locale);
223extern pg_wchar pg_towlower(pg_wchar wc, pg_locale_t locale);
224
225extern const char *pg_icu_unicode_version(void);
226
227extern int builtin_locale_encoding(const char *locale);
228extern const char *builtin_validate_locale(int encoding, const char *locale);
229extern void icu_validate_locale(const char *loc_str);
230extern char *icu_language_tag(const char *loc_str, int elevel);
231extern void report_newlocale_failure(const char *localename);
232
233/* This function converts from libc's wchar_t, *not* pg_wchar */
234extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen,
235 locale_t loc);
236
237#endif /* _PG_LOCALE_ */
#define PGDLLIMPORT
Definition c.h:1421
Oid collid
static char * encoding
Definition initdb.c:139
unsigned int pg_wchar
Definition mbprint.c:31
size_t pg_strfold(char *dst, size_t dstsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.c:1345
struct pg_locale_struct * pg_locale_t
Definition pg_locale.h:60
size_t pg_strnxfrm(char *dest, size_t destsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.c:1454
const char * pg_icu_unicode_version(void)
Definition pg_locale.c:1647
PGDLLIMPORT int icu_validation_level
Definition pg_locale.c:92
void cache_locale_time(void)
Definition pg_locale.c:702
bool pg_strxfrm_enabled(pg_locale_t locale)
Definition pg_locale.c:1414
int pg_strncoll(const char *arg1, size_t len1, const char *arg2, size_t len2, pg_locale_t locale)
Definition pg_locale.c:1400
pg_wchar pg_towlower(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.c:1633
bool pg_iswalnum(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.c:1527
void icu_validate_locale(const char *loc_str)
Definition pg_locale.c:1783
bool pg_iswcased(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.c:1609
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
size_t pg_strlower(char *dst, size_t dstsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.c:1315
bool pg_iswgraph(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.c:1557
bool pg_iswprint(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.c:1567
pg_locale_t pg_newlocale_from_collation(Oid collid)
Definition pg_locale.c:1189
PGDLLIMPORT char * localized_abbrev_days[]
Definition pg_locale.c:101
size_t pg_strtitle(char *dst, size_t dstsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.c:1325
bool pg_iswdigit(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.c:1507
bool pg_iswupper(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.c:1537
int builtin_locale_encoding(const char *locale)
Definition pg_locale.c:1661
bool pg_iswxdigit(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.c:1597
char * pg_perm_setlocale(int category, const char *locale)
Definition pg_locale.c:172
size_t pg_downcase_ident(char *dst, size_t dstsize, const char *src, size_t srclen)
Definition pg_locale.c:1363
pg_wchar pg_towupper(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.c:1620
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:1587
size_t pg_strupper(char *dst, size_t dstsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.c:1335
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
int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale)
Definition pg_locale.c:1381
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:1577
bool pg_strxfrm_prefix_enabled(pg_locale_t locale)
Definition pg_locale.c:1465
char * icu_language_tag(const char *loc_str, int elevel)
Definition pg_locale.c:1725
PGDLLIMPORT char * locale_messages
Definition pg_locale.c:87
void report_newlocale_failure(const char *localename)
size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.c:1500
bool pg_iswlower(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.c:1547
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:1430
const char * builtin_validate_locale(int encoding, const char *locale)
Definition pg_locale.c:1685
bool pg_iswalpha(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.c:1517
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:1476
unsigned int Oid
static int fb(int x)
size_t(* strnxfrm)(char *dest, size_t destsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.h:74
size_t(* strxfrm)(char *dest, size_t destsize, const char *src, pg_locale_t locale)
Definition pg_locale.h:78
size_t(* strxfrm_prefix)(char *dest, size_t destsize, const char *src, pg_locale_t locale)
Definition pg_locale.h:86
size_t(* strnxfrm_prefix)(char *dest, size_t destsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.h:82
int(* strncoll)(const char *arg1, size_t len1, const char *arg2, size_t len2, pg_locale_t locale)
Definition pg_locale.h:66
int(* strcoll)(const char *arg1, const char *arg2, pg_locale_t locale)
Definition pg_locale.h:70
bool strxfrm_is_safe
Definition pg_locale.h:95
size_t(* strfold)(char *dest, size_t destsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.h:110
size_t(* downcase_ident)(char *dest, size_t destsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.h:113
pg_wchar(* wc_toupper)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:129
bool(* wc_isxdigit)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:127
bool(* wc_ispunct)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:125
bool(* wc_isprint)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:124
size_t(* strlower)(char *dest, size_t destsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.h:101
bool(* wc_isalpha)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:119
pg_wchar(* wc_tolower)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:130
size_t(* strtitle)(char *dest, size_t destsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.h:104
bool(* wc_isupper)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:121
bool(* wc_isspace)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:126
bool(* wc_isgraph)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:123
bool(* wc_islower)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:122
size_t(* strupper)(char *dest, size_t destsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.h:107
bool(* wc_isalnum)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:120
bool(* wc_isdigit)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:118
bool(* wc_iscased)(pg_wchar wc, pg_locale_t locale)
Definition pg_locale.h:128
const struct ctype_methods * ctype
Definition pg_locale.h:155
const struct collate_methods * collate
Definition pg_locale.h:154
const char * locale
Definition pg_locale.h:161
struct pg_locale_struct::@172::@174 builtin
#define locale_t
Definition win32_port.h:429