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/* GUC settings */
30extern PGDLLIMPORT char *locale_messages;
31extern PGDLLIMPORT char *locale_monetary;
32extern PGDLLIMPORT char *locale_numeric;
33extern PGDLLIMPORT char *locale_time;
35
36/* lc_time localization cache */
38extern PGDLLIMPORT char *localized_full_days[];
41
42extern bool check_locale(int category, const char *locale, char **canonname);
43extern char *pg_perm_setlocale(int category, const char *locale);
44
45/*
46 * Return the POSIX lconv struct (contains number/money formatting
47 * information) with locale information for all categories.
48 */
49extern struct lconv *PGLC_localeconv(void);
50
51extern void cache_locale_time(void);
52
53
54struct pg_locale_struct;
56
57/* methods that define collation behavior */
59{
60 /* required */
61 int (*strncoll) (const char *arg1, ssize_t len1,
62 const char *arg2, ssize_t len2,
64
65 /* required */
66 size_t (*strnxfrm) (char *dest, size_t destsize,
67 const char *src, ssize_t srclen,
69
70 /* optional */
71 size_t (*strnxfrm_prefix) (char *dest, size_t destsize,
72 const char *src, ssize_t srclen,
74
75 /*
76 * If the strnxfrm method is not trusted to return the correct results,
77 * set strxfrm_is_safe to false. It set to false, the method will not be
78 * used in most cases, but the planner still expects it to be there for
79 * estimation purposes (where incorrect results are acceptable).
80 */
82};
83
85{
86 /* case mapping: LOWER()/INITCAP()/UPPER() */
87 size_t (*strlower) (char *dest, size_t destsize,
88 const char *src, ssize_t srclen,
90 size_t (*strtitle) (char *dest, size_t destsize,
91 const char *src, ssize_t srclen,
93 size_t (*strupper) (char *dest, size_t destsize,
94 const char *src, ssize_t srclen,
96 size_t (*strfold) (char *dest, size_t destsize,
97 const char *src, ssize_t srclen,
99
100 /* required */
113
114 /* required */
115 bool (*char_is_cased) (char ch, pg_locale_t locale);
116
117 /*
118 * Optional. If defined, will only be called for single-byte encodings. If
119 * not defined, or if the encoding is multibyte, will fall back to
120 * pg_strlower().
121 */
122 char (*char_tolower) (unsigned char ch, pg_locale_t locale);
123
124 /*
125 * For regex and pattern matching efficiency, the maximum char value
126 * supported by the above methods. If zero, limit is set by regex code.
127 */
129};
130
131/*
132 * We use a discriminated union to hold either a locale_t or an ICU collator.
133 * pg_locale_t is occasionally checked for truth, so make it a pointer.
134 *
135 * Also, hold two flags: whether the collation's LC_COLLATE or LC_CTYPE is C
136 * (or POSIX), so we can optimize a few code paths in various places. For the
137 * built-in C and POSIX collations, we can know that without even doing a
138 * cache lookup, but we want to support aliases for C/POSIX too. For the
139 * "default" collation, there are separate static cache variables, since
140 * consulting the pg_collation catalog doesn't tell us what we need.
141 *
142 * Note that some code, such as wchar2char(), relies on the flags not
143 * reporting false negatives (that is, saying it's not C when it is).
144 */
146{
151
152 const struct collate_methods *collate; /* NULL if collate_is_c */
153 const struct ctype_methods *ctype; /* NULL if ctype_is_c */
154
155 union
156 {
157 struct
158 {
159 const char *locale;
163#ifdef USE_ICU
164 struct
165 {
166 const char *locale;
167 UCollator *ucol;
168 } icu;
169#endif
170 };
171};
172
173extern void init_database_collation(void);
176
177extern char *get_collation_actual_version(char collprovider, const char *collcollate);
178
179extern bool char_is_cased(char ch, pg_locale_t locale);
181extern char char_tolower(unsigned 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);
220
221extern int builtin_locale_encoding(const char *locale);
222extern const char *builtin_validate_locale(int encoding, const char *locale);
223extern void icu_validate_locale(const char *loc_str);
224extern char *icu_language_tag(const char *loc_str, int elevel);
225extern void report_newlocale_failure(const char *localename);
226
227/* This function converts from libc's wchar_t, *not* pg_wchar */
228extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen,
229 locale_t loc);
230
231#endif /* _PG_LOCALE_ */
#define PGDLLIMPORT
Definition: c.h:1324
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:1583
struct pg_locale_struct * pg_locale_t
Definition: pg_locale.h:55
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:1372
bool pg_strxfrm_enabled(pg_locale_t locale)
Definition: pg_locale.c:1331
pg_wchar pg_towlower(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1541
bool pg_iswalnum(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1446
void icu_validate_locale(const char *loc_str)
Definition: pg_locale.c:1715
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:1476
bool pg_iswprint(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1486
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:1426
bool pg_iswupper(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1456
size_t pg_strfold(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1282
int builtin_locale_encoding(const char *locale)
Definition: pg_locale.c:1593
size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1419
bool pg_iswxdigit(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1516
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:1261
pg_wchar pg_towupper(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1528
bool char_tolower_enabled(pg_locale_t locale)
Definition: pg_locale.c:1572
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:1506
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:1268
int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale)
Definition: pg_locale.c:1297
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:1496
bool pg_strxfrm_prefix_enabled(pg_locale_t locale)
Definition: pg_locale.c:1383
char * icu_language_tag(const char *loc_str, int elevel)
Definition: pg_locale.c:1657
bool char_is_cased(char ch, pg_locale_t locale)
Definition: pg_locale.c:1561
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:1317
bool pg_iswlower(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1466
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:1347
const char * builtin_validate_locale(int encoding, const char *locale)
Definition: pg_locale.c:1617
size_t pg_strupper(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1275
bool pg_iswalpha(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.c:1436
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:1394
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:71
size_t(* strnxfrm)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:66
int(* strncoll)(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2, pg_locale_t locale)
Definition: pg_locale.h:61
bool strxfrm_is_safe
Definition: pg_locale.h:81
size_t(* strlower)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:87
bool(* char_is_cased)(char ch, pg_locale_t locale)
Definition: pg_locale.h:115
size_t(* strupper)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:93
pg_wchar(* wc_toupper)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:111
pg_wchar max_chr
Definition: pg_locale.h:128
bool(* wc_isxdigit)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:110
bool(* wc_ispunct)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:108
bool(* wc_isprint)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:107
bool(* wc_isalpha)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:102
pg_wchar(* wc_tolower)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:112
bool(* wc_isupper)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:104
size_t(* strtitle)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:90
bool(* wc_isspace)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:109
bool(* wc_isgraph)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:106
bool(* wc_islower)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:105
char(* char_tolower)(unsigned char ch, pg_locale_t locale)
Definition: pg_locale.h:122
bool(* wc_isalnum)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:103
bool(* wc_isdigit)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:101
size_t(* strfold)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:96
const struct ctype_methods * ctype
Definition: pg_locale.h:153
const struct collate_methods * collate
Definition: pg_locale.h:152
struct pg_locale_struct::@166::@168 builtin
const char * locale
Definition: pg_locale.h:159
#define locale_t
Definition: win32_port.h:432