72 #include <unicode/ucnv.h> 76 #include <gnu/libc-version.h> 83 #define MAX_L10N_DATA 80 122 #if defined(WIN32) && defined(LC_MESSAGES) 123 static char *IsoLocaleName(
const char *);
127 static void icu_set_collation_attributes(UCollator *collator,
const char *loc);
131 const char *collcollate);
164 if (category == LC_MESSAGES)
166 result = (
char *) locale;
167 if (locale == NULL || locale[0] ==
'\0')
185 if (category == LC_CTYPE)
190 strlcpy(save_lc_ctype, result,
sizeof(save_lc_ctype));
191 result = save_lc_ctype;
203 envvar =
"LC_COLLATE";
210 envvar =
"LC_MESSAGES";
212 result = IsoLocaleName(locale);
214 result = (
char *) locale;
215 elog(
DEBUG3,
"IsoLocaleName() executed; locale: \"%s\"", result);
220 envvar =
"LC_MONETARY";
223 envvar =
"LC_NUMERIC";
229 elog(
FATAL,
"unrecognized LC category: %d", category);
233 if (
setenv(envvar, result, 1) != 0)
270 if (res && canonname)
275 elog(
WARNING,
"failed to restore old locale \"%s\"", save);
278 return (res != NULL);
342 if (**newval ==
'\0')
355 #if defined(LC_MESSAGES) && !defined(WIN32) 382 if (s->decimal_point)
383 free(s->decimal_point);
384 if (s->thousands_sep)
385 free(s->thousands_sep);
388 if (s->int_curr_symbol)
389 free(s->int_curr_symbol);
390 if (s->currency_symbol)
391 free(s->currency_symbol);
392 if (s->mon_decimal_point)
393 free(s->mon_decimal_point);
394 if (s->mon_thousands_sep)
395 free(s->mon_thousands_sep);
397 free(s->mon_grouping);
398 if (s->positive_sign)
399 free(s->positive_sign);
400 if (s->negative_sign)
401 free(s->negative_sign);
411 if (s->decimal_point == NULL)
413 if (s->thousands_sep == NULL)
415 if (s->grouping == NULL)
417 if (s->int_curr_symbol == NULL)
419 if (s->currency_symbol == NULL)
421 if (s->mon_decimal_point == NULL)
423 if (s->mon_thousands_sep == NULL)
425 if (s->mon_grouping == NULL)
427 if (s->positive_sign == NULL)
429 if (s->negative_sign == NULL)
454 (
errcode(ERRCODE_OUT_OF_MEMORY),
455 errmsg(
"out of memory")));
472 static struct lconv CurrentLocaleConv;
473 static bool CurrentLocaleConvAllocated =
false;
474 struct lconv *extlconv;
475 struct lconv worklconv;
476 char *save_lc_monetary;
477 char *save_lc_numeric;
484 return &CurrentLocaleConv;
487 if (CurrentLocaleConvAllocated)
490 CurrentLocaleConvAllocated =
false;
505 memset(&worklconv, 0,
sizeof(worklconv));
508 save_lc_monetary =
setlocale(LC_MONETARY, NULL);
509 if (!save_lc_monetary)
511 save_lc_monetary =
pstrdup(save_lc_monetary);
513 save_lc_numeric =
setlocale(LC_NUMERIC, NULL);
514 if (!save_lc_numeric)
516 save_lc_numeric =
pstrdup(save_lc_numeric);
535 save_lc_ctype =
setlocale(LC_CTYPE, NULL);
538 save_lc_ctype =
pstrdup(save_lc_ctype);
548 extlconv = localeconv();
551 worklconv.decimal_point = strdup(extlconv->decimal_point);
552 worklconv.thousands_sep = strdup(extlconv->thousands_sep);
553 worklconv.grouping = strdup(extlconv->grouping);
562 extlconv = localeconv();
565 worklconv.int_curr_symbol = strdup(extlconv->int_curr_symbol);
566 worklconv.currency_symbol = strdup(extlconv->currency_symbol);
567 worklconv.mon_decimal_point = strdup(extlconv->mon_decimal_point);
568 worklconv.mon_thousands_sep = strdup(extlconv->mon_thousands_sep);
569 worklconv.mon_grouping = strdup(extlconv->mon_grouping);
570 worklconv.positive_sign = strdup(extlconv->positive_sign);
571 worklconv.negative_sign = strdup(extlconv->negative_sign);
573 worklconv.int_frac_digits = extlconv->int_frac_digits;
574 worklconv.frac_digits = extlconv->frac_digits;
575 worklconv.p_cs_precedes = extlconv->p_cs_precedes;
576 worklconv.p_sep_by_space = extlconv->p_sep_by_space;
577 worklconv.n_cs_precedes = extlconv->n_cs_precedes;
578 worklconv.n_sep_by_space = extlconv->n_sep_by_space;
579 worklconv.p_sign_posn = extlconv->p_sign_posn;
580 worklconv.n_sign_posn = extlconv->n_sign_posn;
592 elog(
FATAL,
"failed to restore LC_CTYPE to \"%s\"", save_lc_ctype);
594 if (!
setlocale(LC_MONETARY, save_lc_monetary))
595 elog(
FATAL,
"failed to restore LC_MONETARY to \"%s\"", save_lc_monetary);
596 if (!
setlocale(LC_NUMERIC, save_lc_numeric))
597 elog(
FATAL,
"failed to restore LC_NUMERIC to \"%s\"", save_lc_numeric);
609 pfree(save_lc_monetary);
610 pfree(save_lc_numeric);
612 pfree(save_lc_ctype);
618 (
errcode(ERRCODE_OUT_OF_MEMORY),
619 errmsg(
"out of memory")));
658 CurrentLocaleConv = worklconv;
659 CurrentLocaleConvAllocated =
true;
661 return &CurrentLocaleConv;
681 strftime_win32(
char *dst,
size_t dstlen,
692 len = MultiByteToWideChar(CP_UTF8, 0,
format, -1,
695 elog(
ERROR,
"could not convert format string from UTF-8: error code %lu",
708 len = WideCharToMultiByte(CP_UTF8, 0, wbuf, len, dst, dstlen - 1,
711 elog(
ERROR,
"could not convert string to UTF-8: error code %lu",
720 #define strftime(a,b,c,d) strftime_win32(a,b,c,d) 758 bool strftimefail =
false;
783 save_lc_time =
pstrdup(save_lc_time);
795 save_lc_ctype =
setlocale(LC_CTYPE, NULL);
798 save_lc_ctype =
pstrdup(save_lc_ctype);
807 timenow = time(NULL);
808 timeinfo = localtime(&timenow);
824 for (i = 0; i < 7; i++)
826 timeinfo->tm_wday =
i;
836 for (i = 0; i < 12; i++)
838 timeinfo->tm_mon =
i;
839 timeinfo->tm_mday = 1;
854 elog(
FATAL,
"failed to restore LC_CTYPE to \"%s\"", save_lc_ctype);
857 elog(
FATAL,
"failed to restore LC_TIME to \"%s\"", save_lc_time);
869 pfree(save_lc_ctype);
896 for (i = 0; i < 7; i++)
907 for (i = 0; i < 12; i++)
921 #if defined(WIN32) && defined(LC_MESSAGES) 982 search_locale_enum(LPWSTR pStr, DWORD dwFlags, LPARAM lparam)
984 wchar_t test_locale[LOCALE_NAME_MAX_LENGTH];
989 argv = (
wchar_t **) lparam;
990 *argv[2] = (wchar_t) 0;
992 memset(test_locale, 0,
sizeof(test_locale));
995 if (GetLocaleInfoEx(pStr, LOCALE_SENGLISHLANGUAGENAME,
996 test_locale, LOCALE_NAME_MAX_LENGTH))
1003 if (wcsrchr(pStr,
'-') == NULL || wcsrchr(argv[0],
'_') == NULL)
1005 if (_wcsicmp(argv[0], test_locale) == 0)
1007 wcscpy(argv[1], pStr);
1008 *argv[2] = (wchar_t) 1;
1022 wcscat(test_locale, L
"_");
1023 len = wcslen(test_locale);
1024 if (GetLocaleInfoEx(pStr, LOCALE_SENGLISHCOUNTRYNAME,
1026 LOCALE_NAME_MAX_LENGTH - len))
1028 if (_wcsicmp(argv[0], test_locale) == 0)
1030 wcscpy(argv[1], pStr);
1031 *argv[2] = (wchar_t) 1;
1048 get_iso_localename(
const char *winlocname)
1050 wchar_t wc_locale_name[LOCALE_NAME_MAX_LENGTH];
1051 wchar_t buffer[LOCALE_NAME_MAX_LENGTH];
1052 static char iso_lc_messages[LOCALE_NAME_MAX_LENGTH];
1064 period = strchr(winlocname,
'.');
1066 len = period - winlocname;
1070 memset(wc_locale_name, 0,
sizeof(wc_locale_name));
1071 memset(buffer, 0,
sizeof(buffer));
1072 MultiByteToWideChar(CP_ACP, 0, winlocname, len, wc_locale_name,
1073 LOCALE_NAME_MAX_LENGTH);
1079 ret_val = GetLocaleInfoEx(wc_locale_name, LOCALE_SNAME, (LPWSTR) &buffer,
1080 LOCALE_NAME_MAX_LENGTH);
1089 argv[0] = wc_locale_name;
1091 argv[2] = (
wchar_t *) &ret_val;
1092 EnumSystemLocalesEx(search_locale_enum, LOCALE_WINDOWS, (LPARAM) argv,
1102 rc =
wchar2char(iso_lc_messages, buffer,
sizeof(iso_lc_messages), NULL);
1103 if (rc == -1 || rc ==
sizeof(iso_lc_messages))
1110 hyphen = strchr(iso_lc_messages,
'-');
1113 return iso_lc_messages;
1121 IsoLocaleName(
const char *winlocname)
1123 #if defined(_MSC_VER) 1124 static char iso_lc_messages[LOCALE_NAME_MAX_LENGTH];
1129 strcpy(iso_lc_messages,
"C");
1130 return iso_lc_messages;
1134 #if (_MSC_VER >= 1900) 1135 return get_iso_localename(winlocname);
1139 loct = _create_locale(LC_CTYPE, winlocname);
1146 rc =
wchar2char(iso_lc_messages, loct->locinfo->locale_name[LC_CTYPE],
1147 sizeof(iso_lc_messages), NULL);
1149 if (rc == -1 || rc ==
sizeof(iso_lc_messages))
1166 hyphen = strchr(iso_lc_messages,
'-');
1169 return iso_lc_messages;
1195 const int canary = 0x7F;
1209 (void) strxfrm(buf,
"ab", 7);
1210 if (buf[7] != canary)
1224 (void) strxfrm(buf,
"a", 1);
1225 if (buf[1] != canary)
1230 (
errcode(ERRCODE_SYSTEM_ERROR),
1231 errmsg_internal(
"strxfrm(), in locale \"%s\", writes past the specified array length",
1233 errhint(
"Apply system library package updates.")));
1268 Assert(collation != DEFAULT_COLLATION_OID);
1270 if (collation_cache == NULL)
1277 collation_cache =
hash_create(
"Collation cache", 100, &ctl,
1297 const char *collcollate;
1298 const char *collctype;
1302 elog(
ERROR,
"cache lookup failed for collation %u", collation);
1305 collcollate =
NameStr(collform->collcollate);
1306 collctype =
NameStr(collform->collctype);
1308 cache_entry->
collate_is_c = ((strcmp(collcollate,
"C") == 0) ||
1309 (strcmp(collcollate,
"POSIX") == 0));
1310 cache_entry->
ctype_is_c = ((strcmp(collctype,
"C") == 0) ||
1311 (strcmp(collctype,
"POSIX") == 0));
1339 if (collation == DEFAULT_COLLATION_OID)
1341 static int result = -1;
1345 return (
bool) result;
1346 localeptr =
setlocale(LC_COLLATE, NULL);
1348 elog(
ERROR,
"invalid LC_COLLATE setting");
1350 if (strcmp(localeptr,
"C") == 0)
1352 else if (strcmp(localeptr,
"POSIX") == 0)
1356 return (
bool) result;
1362 if (collation == C_COLLATION_OID ||
1363 collation == POSIX_COLLATION_OID)
1389 if (collation == DEFAULT_COLLATION_OID)
1391 static int result = -1;
1395 return (
bool) result;
1398 elog(
ERROR,
"invalid LC_CTYPE setting");
1400 if (strcmp(localeptr,
"C") == 0)
1402 else if (strcmp(localeptr,
"POSIX") == 0)
1406 return (
bool) result;
1412 if (collation == C_COLLATION_OID ||
1413 collation == POSIX_COLLATION_OID)
1424 #ifdef HAVE_LOCALE_T 1426 report_newlocale_failure(
const char *localename)
1446 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1447 errmsg(
"could not create locale \"%s\": %m",
1449 (save_errno == ENOENT ?
1450 errdetail(
"The operating system could not find any locale data for the locale name \"%s\".",
1481 if (collid == DEFAULT_COLLATION_OID)
1486 if (cache_entry->
locale == 0)
1498 elog(
ERROR,
"cache lookup failed for collation %u", collid);
1501 collcollate =
NameStr(collform->collcollate);
1502 collctype =
NameStr(collform->collctype);
1505 memset(&result, 0,
sizeof(result));
1506 result.
provider = collform->collprovider;
1509 if (collform->collprovider == COLLPROVIDER_LIBC)
1511 #ifdef HAVE_LOCALE_T 1514 if (strcmp(collcollate, collctype) == 0)
1519 loc = newlocale(LC_COLLATE_MASK | LC_CTYPE_MASK, collcollate,
1522 loc = _create_locale(LC_ALL, collcollate);
1525 report_newlocale_failure(collcollate);
1534 loc1 = newlocale(LC_COLLATE_MASK, collcollate, NULL);
1536 report_newlocale_failure(collcollate);
1538 loc = newlocale(LC_CTYPE_MASK, collctype, loc1);
1540 report_newlocale_failure(collctype);
1549 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1550 errmsg(
"collations with different collate and ctype values are not supported on this platform")));
1554 result.
info.lt = loc;
1558 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1559 errmsg(
"collation provider LIBC is not supported on this platform")));
1562 else if (collform->collprovider == COLLPROVIDER_ICU)
1565 UCollator *collator;
1568 if (strcmp(collcollate, collctype) != 0)
1570 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1571 errmsg(
"collations with different collate and ctype values are not supported by ICU")));
1573 status = U_ZERO_ERROR;
1574 collator = ucol_open(collcollate, &status);
1575 if (U_FAILURE(status))
1577 (
errmsg(
"could not open collator for locale \"%s\": %s",
1578 collcollate, u_errorName(status))));
1580 if (U_ICU_VERSION_MAJOR_NUM < 54)
1581 icu_set_collation_attributes(collator, collcollate);
1586 result.
info.icu.ucol = collator;
1590 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1591 errmsg(
"ICU is not supported in this build"), \
1592 errhint(
"You need to rebuild PostgreSQL using --with-icu.")));
1602 cache_entry->
locale = resultp;
1605 return cache_entry->
locale;
1615 char *collversion = NULL;
1618 if (collprovider == COLLPROVIDER_ICU)
1620 UCollator *collator;
1622 UVersionInfo versioninfo;
1623 char buf[U_MAX_VERSION_STRING_LENGTH];
1625 status = U_ZERO_ERROR;
1626 collator = ucol_open(collcollate, &status);
1627 if (U_FAILURE(status))
1629 (
errmsg(
"could not open collator for locale \"%s\": %s",
1630 collcollate, u_errorName(status))));
1631 ucol_getVersion(collator, versioninfo);
1632 ucol_close(collator);
1634 u_versionToString(versioninfo, buf);
1639 if (collprovider == COLLPROVIDER_LIBC &&
1644 #if defined(__GLIBC__) 1646 collversion =
pstrdup(gnu_get_libc_version());
1647 #elif defined(LC_VERSION_MASK) 1651 loc = newlocale(LC_COLLATE, collcollate, NULL);
1655 pstrdup(querylocale(LC_COLLATE_MASK | LC_VERSION_MASK, loc));
1660 (
errmsg(
"could not load locale \"%s\"", collcollate)));
1661 #elif defined(WIN32) && _WIN32_WINNT >= 0x0600 1667 NLSVERSIONINFOEX version = {
sizeof(NLSVERSIONINFOEX)};
1668 WCHAR wide_collcollate[LOCALE_NAME_MAX_LENGTH];
1670 MultiByteToWideChar(CP_ACP, 0, collcollate, -1, wide_collcollate,
1671 LOCALE_NAME_MAX_LENGTH);
1672 if (!GetNLSVersionEx(COMPARE_STRING, wide_collcollate, &version))
1681 if (GetLastError() == ERROR_INVALID_PARAMETER)
1685 (
errmsg(
"could not get collation version for locale \"%s\": error code %lu",
1689 collversion =
psprintf(
"%d.%d,%d.%d",
1690 (version.dwNLSVersion >> 8) & 0xFFFF,
1691 version.dwNLSVersion & 0xFF,
1692 (version.dwDefinedVersion >> 8) & 0xFFFF,
1693 version.dwDefinedVersion & 0xFF);
1712 if (oid == DEFAULT_COLLATION_OID)
1732 elog(
ERROR,
"cache lookup failed for collation %u", oid);
1736 NameStr(collform->collcollate));
1750 static UConverter *icu_converter = NULL;
1753 init_icu_converter(
void)
1755 const char *icu_encoding_name;
1763 if (!icu_encoding_name)
1765 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1766 errmsg(
"encoding \"%s\" not supported by ICU",
1769 status = U_ZERO_ERROR;
1770 conv = ucnv_open(icu_encoding_name, &status);
1771 if (U_FAILURE(status))
1773 (
errmsg(
"could not open ICU converter for encoding \"%s\": %s",
1774 icu_encoding_name, u_errorName(status))));
1776 icu_converter = conv;
1792 icu_to_uchar(UChar **buff_uchar,
const char *buff,
size_t nbytes)
1797 init_icu_converter();
1799 status = U_ZERO_ERROR;
1800 len_uchar = ucnv_toUChars(icu_converter, NULL, 0,
1801 buff, nbytes, &status);
1802 if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR)
1804 (
errmsg(
"%s failed: %s",
"ucnv_toUChars", u_errorName(status))));
1806 *buff_uchar =
palloc((len_uchar + 1) *
sizeof(**buff_uchar));
1808 status = U_ZERO_ERROR;
1809 len_uchar = ucnv_toUChars(icu_converter, *buff_uchar, len_uchar + 1,
1810 buff, nbytes, &status);
1811 if (U_FAILURE(status))
1813 (
errmsg(
"%s failed: %s",
"ucnv_toUChars", u_errorName(status))));
1830 icu_from_uchar(
char **result,
const UChar *buff_uchar, int32_t len_uchar)
1835 init_icu_converter();
1837 status = U_ZERO_ERROR;
1838 len_result = ucnv_fromUChars(icu_converter, NULL, 0,
1839 buff_uchar, len_uchar, &status);
1840 if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR)
1842 (
errmsg(
"%s failed: %s",
"ucnv_fromUChars",
1843 u_errorName(status))));
1845 *result =
palloc(len_result + 1);
1847 status = U_ZERO_ERROR;
1848 len_result = ucnv_fromUChars(icu_converter, *result, len_result + 1,
1849 buff_uchar, len_uchar, &status);
1850 if (U_FAILURE(status))
1852 (
errmsg(
"%s failed: %s",
"ucnv_fromUChars",
1853 u_errorName(status))));
1869 icu_set_collation_attributes(UCollator *collator,
const char *loc)
1873 str = strchr(str,
'@');
1878 for (
char *token = strtok(str,
";"); token; token = strtok(NULL,
";"))
1880 char *
e = strchr(token,
'=');
1886 UColAttribute uattr;
1887 UColAttributeValue uvalue;
1890 status = U_ZERO_ERROR;
1899 if (strcmp(name,
"colstrength") == 0)
1900 uattr = UCOL_STRENGTH;
1901 else if (strcmp(name,
"colbackwards") == 0)
1902 uattr = UCOL_FRENCH_COLLATION;
1903 else if (strcmp(name,
"colcaselevel") == 0)
1904 uattr = UCOL_CASE_LEVEL;
1905 else if (strcmp(name,
"colcasefirst") == 0)
1906 uattr = UCOL_CASE_FIRST;
1907 else if (strcmp(name,
"colalternate") == 0)
1908 uattr = UCOL_ALTERNATE_HANDLING;
1909 else if (strcmp(name,
"colnormalization") == 0)
1910 uattr = UCOL_NORMALIZATION_MODE;
1911 else if (strcmp(name,
"colnumeric") == 0)
1912 uattr = UCOL_NUMERIC_COLLATION;
1917 if (strcmp(value,
"primary") == 0)
1918 uvalue = UCOL_PRIMARY;
1919 else if (strcmp(value,
"secondary") == 0)
1920 uvalue = UCOL_SECONDARY;
1921 else if (strcmp(value,
"tertiary") == 0)
1922 uvalue = UCOL_TERTIARY;
1923 else if (strcmp(value,
"quaternary") == 0)
1924 uvalue = UCOL_QUATERNARY;
1925 else if (strcmp(value,
"identical") == 0)
1926 uvalue = UCOL_IDENTICAL;
1927 else if (strcmp(value,
"no") == 0)
1929 else if (strcmp(value,
"yes") == 0)
1931 else if (strcmp(value,
"shifted") == 0)
1932 uvalue = UCOL_SHIFTED;
1933 else if (strcmp(value,
"non-ignorable") == 0)
1934 uvalue = UCOL_NON_IGNORABLE;
1935 else if (strcmp(value,
"lower") == 0)
1936 uvalue = UCOL_LOWER_FIRST;
1937 else if (strcmp(value,
"upper") == 0)
1938 uvalue = UCOL_UPPER_FIRST;
1940 status = U_ILLEGAL_ARGUMENT_ERROR;
1942 if (status == U_ZERO_ERROR)
1943 ucol_setAttribute(collator, uattr, uvalue, &status);
1949 if (U_FAILURE(status))
1951 (
errmsg(
"could not open collator for locale \"%s\": %s",
1952 loc, u_errorName(status))));
1990 result = WideCharToMultiByte(CP_UTF8, 0, from, -1, to, tolen,
2007 result = wcstombs(to, from, tolen);
2011 #ifdef HAVE_LOCALE_T 2012 #ifdef HAVE_WCSTOMBS_L 2019 result = wcstombs(to, from, tolen);
2021 uselocale(save_locale);
2025 elog(
ERROR,
"wcstombs_l is not available");
2043 char2wchar(
wchar_t *to,
size_t tolen,
const char *from,
size_t fromlen,
2062 result = MultiByteToWideChar(CP_UTF8, 0, from, fromlen, to, tolen - 1);
2084 result = mbstowcs(to, str, tolen);
2088 #ifdef HAVE_LOCALE_T 2089 #ifdef HAVE_MBSTOWCS_L 2096 result = mbstowcs(to, str, tolen);
2098 uselocale(save_locale);
2102 elog(
ERROR,
"mbstowcs_l is not available");
2123 (
errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
2124 errmsg(
"invalid multibyte character for locale"),
2125 errhint(
"The server's LC_CTYPE locale is probably incompatible with the database encoding.")));
void SetMessageEncoding(int encoding)
int errhint(const char *fmt,...)
char * pnstrdup(const char *in, Size len)
static bool CurrentLocaleConvValid
FormData_pg_database * Form_pg_database
char * pstrdup(const char *in)
char * psprintf(const char *fmt,...)
union pg_locale_struct::@141 info
bool check_locale(int category, const char *locale, char **canonname)
bool check_locale_time(char **newval, void **extra, GucSource source)
int errcode(int sqlerrcode)
void assign_locale_numeric(const char *newval, void *extra)
int pg_strcasecmp(const char *s1, const char *s2)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
#define OidIsValid(objectId)
void assign_locale_monetary(const char *newval, void *extra)
char * pg_perm_setlocale(int category, const char *locale)
static void free_struct_lconv(struct lconv *s)
char * get_collation_version_for_oid(Oid oid, bool missing_ok)
void assign_locale_time(const char *newval, void *extra)
int pg_strncasecmp(const char *s1, const char *s2, size_t n)
void pfree(void *pointer)
#define ObjectIdGetDatum(X)
static char * get_collation_actual_version(char collprovider, const char *collcollate)
bool lc_collate_is_c(Oid collation)
char * localized_abbrev_months[12+1]
const char * get_encoding_name_for_icu(int encoding)
void check_strxfrm_bug(void)
int errdetail(const char *fmt,...)
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
char * localized_full_days[7+1]
MemoryContext TopMemoryContext
size_t char2wchar(wchar_t *to, size_t tolen, const char *from, size_t fromlen, pg_locale_t locale)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
pg_locale_t pg_newlocale_from_collation(Oid collid)
bool check_locale_numeric(char **newval, void **extra, GucSource source)
void ReleaseSysCache(HeapTuple tuple)
int GetDatabaseEncoding(void)
int pg_mbstrlen(const char *mbstr)
static HTAB * collation_cache
int pg_get_encoding_from_locale(const char *ctype, bool write_message)
bool pg_verifymbstr(const char *mbstr, int len, bool noError)
#define ereport(elevel,...)
size_t strlcpy(char *dst, const char *src, size_t siz)
const char * pg_encoding_to_char(int encoding)
int errmsg_internal(const char *fmt,...)
char * localized_full_months[12+1]
#define HeapTupleIsValid(tuple)
#define Assert(condition)
void cache_locale_time(void)
void assign_locale_messages(const char *newval, void *extra)
bool check_locale_messages(char **newval, void **extra, GucSource source)
static bool struct_lconv_is_valid(struct lconv *s)
bool check_locale_monetary(char **newval, void **extra, GucSource source)
static rewind_source * source
struct lconv * PGLC_localeconv(void)
static void cache_single_string(char **dst, const char *src, int encoding)
FormData_pg_collation * Form_pg_collation
int errmsg(const char *fmt,...)
char * MemoryContextStrdup(MemoryContext context, const char *string)
void * MemoryContextAlloc(MemoryContext context, Size size)
size_t wchar2char(char *to, const wchar_t *from, size_t tolen, pg_locale_t locale)
char * localized_abbrev_days[7+1]
bool lc_ctype_is_c(Oid collation)
static collation_cache_entry * lookup_collation_cache(Oid collation, bool set_flags)
static void static void status(const char *fmt,...) pg_attribute_printf(1
char * pg_any_to_server(const char *s, int len, int encoding)
static void db_encoding_convert(int encoding, char **str)
static bool CurrentLCTimeValid