diff_log_icu_collator_locale.patch
text/x-diff
Filename: diff_log_icu_collator_locale.patch
Type: text/x-diff
Part: 0
Message:
Re: ICU for global collation
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/utils/adt/pg_locale.c | 68 | 2 |
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index 1a047a97d74e7fe5b2cad22cd54cf30f7129bf84..21cfbfffdd1b58df821adbdd577fb599bc2747cf 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -1406,6 +1406,14 @@ make_icu_collator(const char *iculocstr,
#ifdef USE_ICU
UCollator *collator;
UErrorCode status;
+ const char *default_icu_locale;
+ UVersionInfo versioninfo;
+ char buf[U_MAX_VERSION_STRING_LENGTH];
+ const char *valid_locale;
+
+ default_icu_locale = uloc_getDefault();
+ elog(LOG, "make_icu_collator uloc_getDefault() %s",
+ default_icu_locale ? default_icu_locale : "(null)");
status = U_ZERO_ERROR;
collator = ucol_open(iculocstr, &status);
@@ -1417,6 +1425,20 @@ make_icu_collator(const char *iculocstr,
if (U_ICU_VERSION_MAJOR_NUM < 54)
icu_set_collation_attributes(collator, iculocstr);
+ status = U_ZERO_ERROR;
+ valid_locale = ucol_getLocaleByType(collator, ULOC_VALID_LOCALE, &status);
+ if (U_FAILURE(status) || valid_locale == NULL)
+ ereport(ERROR,
+ (errmsg("failed to get valid locale for collator with "
+ "requested locale \"%s\": %s",
+ iculocstr, u_errorName(status))));
+
+ ucol_getVersion(collator, versioninfo);
+ u_versionToString(versioninfo, buf);
+
+ elog(LOG, "make_icu_collator icu_locale %s valid_locale %s version %s",
+ iculocstr ? iculocstr : "(null)", valid_locale, buf);
+
/* We will leak this string if the caller errors later :-( */
resultp->info.icu.locale = MemoryContextStrdup(TopMemoryContext, iculocstr);
resultp->info.icu.ucol = collator;
@@ -1654,6 +1676,12 @@ get_collation_actual_version(char collprovider, const char *collcollate)
UErrorCode status;
UVersionInfo versioninfo;
char buf[U_MAX_VERSION_STRING_LENGTH];
+ const char *default_icu_locale;
+ const char *valid_locale;
+
+ default_icu_locale = uloc_getDefault();
+ elog(LOG, "get_collation_actual_version uloc_getDefault() %s",
+ default_icu_locale ? default_icu_locale : "(null)");
status = U_ZERO_ERROR;
collator = ucol_open(collcollate, &status);
@@ -1661,10 +1689,25 @@ get_collation_actual_version(char collprovider, const char *collcollate)
ereport(ERROR,
(errmsg("could not open collator for locale \"%s\": %s",
collcollate, u_errorName(status))));
- ucol_getVersion(collator, versioninfo);
- ucol_close(collator);
+ status = U_ZERO_ERROR;
+ valid_locale = ucol_getLocaleByType(collator, ULOC_VALID_LOCALE,
+ &status);
+ if (U_FAILURE(status) || valid_locale == NULL)
+ ereport(ERROR,
+ (errmsg("failed to get valid locale for collator with "
+ "requested locale \"%s\": %s",
+ collcollate, u_errorName(status))));
+
+ ucol_getVersion(collator, versioninfo);
u_versionToString(versioninfo, buf);
+
+ elog(LOG,
+ "get_collation_actual_version icu_locale %s valid_locale %s "
+ "version %s",
+ collcollate ? collcollate : "(null)", valid_locale, buf);
+
+ ucol_close(collator);
collversion = pstrdup(buf);
}
else
@@ -1955,6 +1998,14 @@ check_icu_locale(const char *icu_locale)
#ifdef USE_ICU
UCollator *collator;
UErrorCode status;
+ const char *default_icu_locale;
+ UVersionInfo versioninfo;
+ char buf[U_MAX_VERSION_STRING_LENGTH];
+ const char *valid_locale;
+
+ default_icu_locale = uloc_getDefault();
+ elog(LOG, "check_icu_locale uloc_getDefault() %s",
+ default_icu_locale ? default_icu_locale : "(null)");
status = U_ZERO_ERROR;
collator = ucol_open(icu_locale, &status);
@@ -1965,6 +2016,21 @@ check_icu_locale(const char *icu_locale)
if (U_ICU_VERSION_MAJOR_NUM < 54)
icu_set_collation_attributes(collator, icu_locale);
+
+ status = U_ZERO_ERROR;
+ valid_locale = ucol_getLocaleByType(collator, ULOC_VALID_LOCALE, &status);
+ if (U_FAILURE(status) || valid_locale == NULL)
+ ereport(ERROR,
+ (errmsg("failed to get valid locale for collator with "
+ "requested locale \"%s\": %s",
+ icu_locale, u_errorName(status))));
+
+ ucol_getVersion(collator, versioninfo);
+ u_versionToString(versioninfo, buf);
+
+ elog(LOG, "check_icu_locale icu_locale %s valid_locale %s version %s",
+ icu_locale ? icu_locale : "(null)", valid_locale, buf);
+
ucol_close(collator);
#else
ereport(ERROR,