Thanks to visit codestin.com
Credit goes to doxygen.postgresql.org

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
42/* is the databases's LC_CTYPE the C locale? */
44
45extern bool check_locale(int category, const char *locale, char **canonname);
46extern char *pg_perm_setlocale(int category, const char *locale);
47
48/*
49 * Return the POSIX lconv struct (contains number/money formatting
50 * information) with locale information for all categories.
51 */
52extern struct lconv *PGLC_localeconv(void);
53
54extern void cache_locale_time(void);
55
56
57struct pg_locale_struct;
59
60/* methods that define collation behavior */
62{
63 /* required */
64 int (*strncoll) (const char *arg1, ssize_t len1,
65 const char *arg2, ssize_t len2,
67
68 /* required */
69 size_t (*strnxfrm) (char *dest, size_t destsize,
70 const char *src, ssize_t srclen,
72
73 /* optional */
74 size_t (*strnxfrm_prefix) (char *dest, size_t destsize,
75 const char *src, ssize_t srclen,
77
78 /*
79 * If the strnxfrm method is not trusted to return the correct results,
80 * set strxfrm_is_safe to false. It set to false, the method will not be
81 * used in most cases, but the planner still expects it to be there for
82 * estimation purposes (where incorrect results are acceptable).
83 */
85};
86
88{
89 /* case mapping: LOWER()/INITCAP()/UPPER() */
90 size_t (*strlower) (char *dest, size_t destsize,
91 const char *src, ssize_t srclen,
93 size_t (*strtitle) (char *dest, size_t destsize,
94 const char *src, ssize_t srclen,
96 size_t (*strupper) (char *dest, size_t destsize,
97 const char *src, ssize_t srclen,
99 size_t (*strfold) (char *dest, size_t destsize,
100 const char *src, ssize_t srclen,
102
103 /* required */
115
116 /* required */
117 bool (*char_is_cased) (char ch, pg_locale_t locale);
118
119 /*
120 * Optional. If defined, will only be called for single-byte encodings. If
121 * not defined, or if the encoding is multibyte, will fall back to
122 * pg_strlower().
123 */
124 char (*char_tolower) (unsigned char ch, pg_locale_t locale);
125
126 /*
127 * For regex and pattern matching efficiency, the maximum char value
128 * supported by the above methods. If zero, limit is set by regex code.
129 */
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 relies on the flags not reporting false negatives
145 * (that is, saying it's not C when it is). For example, char2wchar()
146 * could fail if the locale is C, so str_tolower() shouldn't call it
147 * in that case.
148 */
150{
155
156 const struct collate_methods *collate; /* NULL if collate_is_c */
157 const struct ctype_methods *ctype; /* NULL if ctype_is_c */
158
159 union
160 {
161 struct
162 {
163 const char *locale;
167#ifdef USE_ICU
168 struct
169 {
170 const char *locale;
171 UCollator *ucol;
172 } icu;
173#endif
175};
176
177extern void init_database_collation(void);
179
180extern char *get_collation_actual_version(char collprovider, const char *collcollate);
181
182extern bool char_is_cased(char ch, pg_locale_t locale);
184extern char char_tolower(unsigned char ch, pg_locale_t locale);
185extern size_t pg_strlower(char *dst, size_t dstsize,
186 const char *src, ssize_t srclen,
188extern size_t pg_strtitle(char *dst, size_t dstsize,
189 const char *src, ssize_t srclen,
191extern size_t pg_strupper(char *dst, size_t dstsize,
192 const char *src, ssize_t srclen,
194extern size_t pg_strfold(char *dst, size_t dstsize,
195 const char *src, ssize_t srclen,
197extern int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale);
198extern int pg_strncoll(const char *arg1, ssize_t len1,
199 const char *arg2, ssize_t len2, pg_locale_t locale);
201extern size_t pg_strxfrm(char *dest, const char *src, size_t destsize,
203extern size_t pg_strnxfrm(char *dest, size_t destsize, const char *src,
204 ssize_t srclen, pg_locale_t locale);
206extern size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize,
208extern size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src,
209 ssize_t srclen, pg_locale_t locale);
210
211extern int builtin_locale_encoding(const char *locale);
212extern const char *builtin_validate_locale(int encoding, const char *locale);
213extern void icu_validate_locale(const char *loc_str);
214extern char *icu_language_tag(const char *loc_str, int elevel);
215extern void report_newlocale_failure(const char *localename);
216
217/* These functions convert from/to libc's wchar_t, *not* pg_wchar_t */
218extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen,
219 locale_t loc);
220extern size_t char2wchar(wchar_t *to, size_t tolen,
221 const char *from, size_t fromlen, locale_t loc);
222
223#endif /* _PG_LOCALE_ */
#define PGDLLIMPORT
Definition: c.h:1320
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:1428
struct pg_locale_struct * pg_locale_t
Definition: pg_locale.h:58
PGDLLIMPORT int icu_validation_level
Definition: pg_locale.c:88
void cache_locale_time(void)
Definition: pg_locale.c:695
size_t pg_strnxfrm(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1345
bool pg_strxfrm_enabled(pg_locale_t locale)
Definition: pg_locale.c:1304
void icu_validate_locale(const char *loc_str)
Definition: pg_locale.c:1560
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:1217
PGDLLIMPORT char * locale_time
Definition: pg_locale.c:86
size_t char2wchar(wchar_t *to, size_t tolen, const char *from, size_t fromlen, locale_t loc)
pg_locale_t pg_newlocale_from_collation(Oid collid)
Definition: pg_locale.c:1166
PGDLLIMPORT char * localized_abbrev_days[]
Definition: pg_locale.c:97
size_t pg_strfold(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1255
int builtin_locale_encoding(const char *locale)
Definition: pg_locale.c:1438
size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1392
char * pg_perm_setlocale(int category, const char *locale)
Definition: pg_locale.c:165
size_t pg_strlower(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1234
bool char_tolower_enabled(pg_locale_t locale)
Definition: pg_locale.c:1417
PGDLLIMPORT char * locale_numeric
Definition: pg_locale.c:85
PGDLLIMPORT char * localized_full_days[]
Definition: pg_locale.c:98
struct lconv * PGLC_localeconv(void)
Definition: pg_locale.c:499
size_t pg_strtitle(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1241
int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale)
Definition: pg_locale.c:1270
PGDLLIMPORT char * localized_full_months[]
Definition: pg_locale.c:100
PGDLLIMPORT char * localized_abbrev_months[]
Definition: pg_locale.c:99
PGDLLIMPORT char * locale_monetary
Definition: pg_locale.c:84
bool pg_strxfrm_prefix_enabled(pg_locale_t locale)
Definition: pg_locale.c:1356
char * icu_language_tag(const char *loc_str, int elevel)
Definition: pg_locale.c:1502
bool char_is_cased(char ch, pg_locale_t locale)
Definition: pg_locale.c:1406
PGDLLIMPORT char * locale_messages
Definition: pg_locale.c:83
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:1290
void init_database_collation(void)
Definition: pg_locale.c:1124
PGDLLIMPORT bool database_ctype_is_c
Definition: pg_locale.c:103
size_t pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale)
Definition: pg_locale.c:1320
const char * builtin_validate_locale(int encoding, const char *locale)
Definition: pg_locale.c:1462
size_t pg_strupper(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.c:1248
bool check_locale(int category, const char *locale, char **canonname)
Definition: pg_locale.c:268
size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize, pg_locale_t locale)
Definition: pg_locale.c:1367
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:74
size_t(* strnxfrm)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:69
int(* strncoll)(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2, pg_locale_t locale)
Definition: pg_locale.h:64
bool strxfrm_is_safe
Definition: pg_locale.h:84
size_t(* strlower)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:90
bool(* char_is_cased)(char ch, pg_locale_t locale)
Definition: pg_locale.h:117
size_t(* strupper)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:96
pg_wchar(* wc_toupper)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:113
pg_wchar max_chr
Definition: pg_locale.h:130
bool(* wc_ispunct)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:111
bool(* wc_isprint)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:110
bool(* wc_isalpha)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:105
pg_wchar(* wc_tolower)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:114
bool(* wc_isupper)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:107
size_t(* strtitle)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:93
bool(* wc_isspace)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:112
bool(* wc_isgraph)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:109
bool(* wc_islower)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:108
char(* char_tolower)(unsigned char ch, pg_locale_t locale)
Definition: pg_locale.h:124
bool(* wc_isalnum)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:106
bool(* wc_isdigit)(pg_wchar wc, pg_locale_t locale)
Definition: pg_locale.h:104
size_t(* strfold)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
Definition: pg_locale.h:99
struct pg_locale_struct::@162::@163 builtin
const struct ctype_methods * ctype
Definition: pg_locale.h:157
const struct collate_methods * collate
Definition: pg_locale.h:156
union pg_locale_struct::@162 info
const char * locale
Definition: pg_locale.h:163
#define locale_t
Definition: win32_port.h:432