36#include <unicode/ucol.h>
60#define PGLOCALE_SUPPORT_ERROR(provider) \
61 elog(ERROR, "unsupported collprovider for %s: %c", __func__, provider)
67#define TEXTBUFLEN 1024
69#define MAX_L10N_DATA 80
114 .collate_is_c =
true,
130#define SH_PREFIX collation_cache
131#define SH_ELEMENT_TYPE collation_cache_entry
132#define SH_KEY_TYPE Oid
134#define SH_HASH_KEY(tb, key) murmurhash32((uint32) key)
135#define SH_EQUAL(tb, a, b) (a == b)
136#define SH_GET_HASH(tb, a) a->hash
137#define SH_SCOPE static inline
153#if defined(WIN32) && defined(LC_MESSAGES)
227 envvar =
"LC_COLLATE";
234 envvar =
"LC_MESSAGES";
239 elog(
DEBUG3,
"IsoLocaleName() executed; locale: \"%s\"", result);
244 envvar =
"LC_MONETARY";
247 envvar =
"LC_NUMERIC";
253 elog(
FATAL,
"unrecognized LC category: %d", category);
257 if (
setenv(envvar, result, 1) != 0)
285 errmsg(
"locale name \"%s\" contains non-ASCII characters",
317 errmsg(
"locale name \"%s\" contains non-ASCII characters",
324 return (res !=
NULL);
401#if defined(LC_MESSAGES) && !defined(WIN32)
428 free(s->decimal_point);
429 free(s->thousands_sep);
431 free(s->int_curr_symbol);
432 free(s->currency_symbol);
433 free(s->mon_decimal_point);
434 free(s->mon_thousands_sep);
435 free(s->mon_grouping);
436 free(s->positive_sign);
437 free(s->negative_sign);
447 if (s->decimal_point ==
NULL)
449 if (s->thousands_sep ==
NULL)
451 if (s->grouping ==
NULL)
453 if (s->int_curr_symbol ==
NULL)
455 if (s->currency_symbol ==
NULL)
457 if (s->mon_decimal_point ==
NULL)
459 if (s->mon_thousands_sep ==
NULL)
461 if (s->mon_grouping ==
NULL)
463 if (s->positive_sign ==
NULL)
465 if (s->negative_sign ==
NULL)
491 errmsg(
"out of memory")));
533 "could not get lconv for LC_MONETARY = \"%s\", LC_NUMERIC = \"%s\": %m",
565 errmsg(
"out of memory")));
645 elog(
ERROR,
"could not convert format string from UTF-8: error code %lu",
661 elog(
ERROR,
"could not convert string to UTF-8: error code %lu",
670#define strftime_l(a,b,c,d,e) strftime_l_win32(a,b,c,d,e)
749 for (
i = 0;
i < 7;
i++)
761 for (
i = 0;
i < 12;
i++)
810 for (
i = 0;
i < 7;
i++)
821 for (
i = 0;
i < 12;
i++)
835#if defined(WIN32) && defined(LC_MESSAGES)
895 argv = (
wchar_t **)
lparam;
977 memset(buffer, 0,
sizeof(buffer));
997 argv[2] = (
wchar_t *) &
ret_val;
1104 (
errmsg(
"collation \"%s\" has no actual version, but a version was recorded",
1110 (
errmsg(
"collation \"%s\" has version mismatch",
1112 errdetail(
"The collation in the database was created using version %s, "
1113 "but the operating system provides version %s.",
1115 errhint(
"Rebuild all objects affected by this collation and run "
1116 "ALTER COLLATION %s REFRESH VERSION, "
1117 "or build PostgreSQL with the right library version.",
1295 (
c >=
'A' &&
c <=
'Z') ||
1296 (
c >=
'a' &&
c <=
'z'));
1608 ((wc >=
'A' && wc <=
'F') ||
1609 (wc >=
'a' && wc <=
'f'))));
1669 if (
strcmp(locale,
"C") == 0)
1671 else if (
strcmp(locale,
"C.UTF-8") == 0)
1673 else if (
strcmp(locale,
"PG_UNICODE_FAST") == 0)
1679 errmsg(
"invalid locale name \"%s\" for builtin provider",
1696 if (
strcmp(locale,
"C") == 0)
1698 else if (
strcmp(locale,
"C.UTF-8") == 0 ||
strcmp(locale,
"C.UTF8") == 0)
1700 else if (
strcmp(locale,
"PG_UNICODE_FAST") == 0)
1706 errmsg(
"invalid locale name \"%s\" for builtin provider",
1713 errmsg(
"encoding \"%s\" does not match locale \"%s\"",
1737 const bool strict =
true;
1771 errmsg(
"could not convert locale name \"%s\" to language tag: %s",
1780 errmsg(
"ICU is not supported in this build")));
1813 errmsg(
"could not get language from ICU locale \"%s\": %s",
1815 errhint(
"To disable ICU locale validation, set the parameter \"%s\" to \"%s\".",
1816 "icu_validation_level",
"disabled")));
1821 if (
strcmp(lang,
"") == 0 ||
1843 errmsg(
"ICU locale \"%s\" has unknown language \"%s\"",
1845 errhint(
"To disable ICU locale validation, set the parameter \"%s\" to \"%s\".",
1846 "icu_validation_level",
"disabled")));
1855 errmsg(
"ICU is not supported in this build")));
#define TextDatumGetCString(d)
#define Assert(condition)
#define OidIsValid(objectId)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define HeapTupleIsValid(tuple)
static void * GETSTRUCT(const HeapTupleData *tuple)
char * get_namespace_name(Oid nspid)
int GetDatabaseEncoding(void)
char * pg_any_to_server(const char *s, int len, int encoding)
int pg_mbstrlen(const char *mbstr)
void SetMessageEncoding(int encoding)
char * MemoryContextStrdup(MemoryContext context, const char *string)
char * pstrdup(const char *in)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
MemoryContext TopMemoryContext
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
FormData_pg_collation * Form_pg_collation
FormData_pg_database * Form_pg_database
size_t pg_downcase_ident(char *dst, size_t dstsize, const char *src, ssize_t srclen)
static pg_locale_t last_collation_cache_locale
void cache_locale_time(void)
size_t pg_strnxfrm(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
bool pg_strxfrm_enabled(pg_locale_t locale)
char * localized_full_months[12+1]
pg_wchar pg_towlower(pg_wchar wc, pg_locale_t locale)
bool pg_iswalnum(pg_wchar wc, pg_locale_t locale)
void icu_validate_locale(const char *loc_str)
bool pg_iswcased(pg_wchar wc, pg_locale_t locale)
pg_locale_t create_pg_locale_libc(Oid collid, MemoryContext context)
static bool CurrentLCTimeValid
void assign_locale_time(const char *newval, void *extra)
char * get_collation_actual_version(char collprovider, const char *collcollate)
pg_locale_t create_pg_locale_builtin(Oid collid, MemoryContext context)
bool check_locale_time(char **newval, void **extra, GucSource source)
bool pg_iswgraph(pg_wchar wc, pg_locale_t locale)
bool pg_iswprint(pg_wchar wc, pg_locale_t locale)
static size_t strupper_c(char *dst, size_t dstsize, const char *src, ssize_t srclen)
pg_locale_t pg_newlocale_from_collation(Oid collid)
bool pg_iswdigit(pg_wchar wc, pg_locale_t locale)
bool pg_iswupper(pg_wchar wc, pg_locale_t locale)
size_t pg_strfold(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
int builtin_locale_encoding(const char *locale)
size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
static struct pg_locale_struct c_locale
bool pg_iswxdigit(pg_wchar wc, pg_locale_t locale)
char * pg_perm_setlocale(int category, const char *locale)
#define PGLOCALE_SUPPORT_ERROR(provider)
static pg_locale_t create_pg_locale(Oid collid, MemoryContext context)
static void cache_single_string(char **dst, const char *src, int encoding)
char * get_collation_actual_version_libc(const char *collcollate)
size_t pg_strlower(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
pg_wchar pg_towupper(pg_wchar wc, pg_locale_t locale)
bool check_locale_numeric(char **newval, void **extra, GucSource source)
const char * pg_icu_unicode_version()
pg_locale_t pg_database_locale(void)
bool pg_iswspace(pg_wchar wc, pg_locale_t locale)
static void db_encoding_convert(int encoding, char **str)
void assign_locale_numeric(const char *newval, void *extra)
bool check_locale_messages(char **newval, void **extra, GucSource source)
char * get_collation_actual_version_builtin(const char *collcollate)
static void free_struct_lconv(struct lconv *s)
static MemoryContext CollationCacheContext
void assign_locale_messages(const char *newval, void *extra)
static bool CurrentLocaleConvValid
struct lconv * PGLC_localeconv(void)
pg_locale_t create_pg_locale_icu(Oid collid, MemoryContext context)
size_t pg_strtitle(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale)
bool pg_iswpunct(pg_wchar wc, pg_locale_t locale)
bool pg_strxfrm_prefix_enabled(pg_locale_t locale)
char * icu_language_tag(const char *loc_str, int elevel)
char * localized_abbrev_months[12+1]
static pg_locale_t default_locale
static collation_cache_hash * CollationCache
int pg_strncoll(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2, pg_locale_t locale)
bool pg_iswlower(pg_wchar wc, pg_locale_t locale)
static size_t strlower_c(char *dst, size_t dstsize, const char *src, ssize_t srclen)
static bool struct_lconv_is_valid(struct lconv *s)
void init_database_collation(void)
char * localized_full_days[7+1]
size_t pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale)
const char * builtin_validate_locale(int encoding, const char *locale)
size_t pg_strupper(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
bool pg_iswalpha(pg_wchar wc, pg_locale_t locale)
void assign_locale_monetary(const char *newval, void *extra)
bool check_locale(int category, const char *locale, char **canonname)
char * localized_abbrev_days[7+1]
size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize, pg_locale_t locale)
static size_t strtitle_c(char *dst, size_t dstsize, const char *src, ssize_t srclen)
bool check_locale_monetary(char **newval, void **extra, GucSource source)
static Oid last_collation_cache_oid
#define LOCALE_NAME_BUFLEN
static const unsigned char pg_char_properties[128]
size_t wchar2char(char *to, const wchar_t *from, size_t tolen, locale_t loc)
void report_newlocale_failure(const char *localename)
static rewind_source * source
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define pg_encoding_to_char
int pg_strcasecmp(const char *s1, const char *s2)
int pg_localeconv_r(const char *lc_monetary, const char *lc_numeric, struct lconv *output)
static unsigned char pg_ascii_tolower(unsigned char ch)
static unsigned char pg_ascii_toupper(unsigned char ch)
int pg_get_encoding_from_locale(const char *ctype, bool write_message)
size_t strlcpy(char *dst, const char *src, size_t siz)
void pg_localeconv_free(struct lconv *lconv)
static Datum ObjectIdGetDatum(Oid X)
static void AssertCouldGetRelation(void)
char * quote_qualified_identifier(const char *qualifier, const char *ident)
bool pg_is_ascii(const char *str)
size_t(* strnxfrm_prefix)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
size_t(* strnxfrm)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
int(* strncoll)(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2, pg_locale_t locale)
size_t(* strlower)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
size_t(* strupper)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
pg_wchar(* wc_toupper)(pg_wchar wc, pg_locale_t locale)
bool(* wc_isxdigit)(pg_wchar wc, pg_locale_t locale)
bool(* wc_ispunct)(pg_wchar wc, pg_locale_t locale)
size_t(* downcase_ident)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
bool(* wc_isprint)(pg_wchar wc, pg_locale_t locale)
bool(* wc_isalpha)(pg_wchar wc, pg_locale_t locale)
pg_wchar(* wc_tolower)(pg_wchar wc, pg_locale_t locale)
bool(* wc_isupper)(pg_wchar wc, pg_locale_t locale)
size_t(* strtitle)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
bool(* wc_isspace)(pg_wchar wc, pg_locale_t locale)
bool(* wc_isgraph)(pg_wchar wc, pg_locale_t locale)
bool(* wc_islower)(pg_wchar wc, pg_locale_t locale)
bool(* wc_isalnum)(pg_wchar wc, pg_locale_t locale)
bool(* wc_isdigit)(pg_wchar wc, pg_locale_t locale)
size_t(* strfold)(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)
bool(* wc_iscased)(pg_wchar wc, pg_locale_t locale)
const struct ctype_methods * ctype
const struct collate_methods * collate
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup, AttrNumber attributeNumber)
void _dosmaperr(unsigned long)