}
/*
- * Check that ICU accepts the locale name; or if not specified, retrieve the
- * default ICU locale.
+ * Determine default ICU locale by opening the default collator and reading
+ * its locale.
+ *
+ * NB: The default collator (opened using NULL) is different from the collator
+ * for the root locale (opened with "", "und", or "root"). The former depends
+ * on the environment (useful at initdb time) and the latter does not.
*/
-static void
-check_icu_locale(void)
+static char *
+default_icu_locale(void)
{
#ifdef USE_ICU
UCollator *collator;
UErrorCode status;
+ const char *valid_locale;
+ char *default_locale;
status = U_ZERO_ERROR;
- collator = ucol_open(icu_locale, &status);
+ collator = ucol_open(NULL, &status);
if (U_FAILURE(status))
- {
- if (icu_locale)
- pg_fatal("could not open collator for locale \"%s\": %s",
- icu_locale, u_errorName(status));
- else
- pg_fatal("could not open collator for default locale: %s",
- u_errorName(status));
- }
+ pg_fatal("could not open collator for default locale: %s",
+ u_errorName(status));
- /* if not specified, get locale from default collator */
- if (icu_locale == NULL)
+ status = U_ZERO_ERROR;
+ valid_locale = ucol_getLocaleByType(collator, ULOC_VALID_LOCALE,
+ &status);
+ if (U_FAILURE(status))
{
- const char *default_locale;
-
- status = U_ZERO_ERROR;
- default_locale = ucol_getLocaleByType(collator, ULOC_VALID_LOCALE,
- &status);
- if (U_FAILURE(status))
- {
- ucol_close(collator);
- pg_fatal("could not determine default ICU locale");
- }
-
- icu_locale = pg_strdup(default_locale);
+ ucol_close(collator);
+ pg_fatal("could not determine default ICU locale");
}
+ default_locale = pg_strdup(valid_locale);
+
ucol_close(collator);
+
+ return default_locale;
+#else
+ pg_fatal("ICU is not supported in this build");
#endif
}
if (locale_provider == COLLPROVIDER_ICU)
{
- check_icu_locale();
+ /* acquire default locale from the environment, if not specified */
+ if (icu_locale == NULL)
+ icu_locale = default_icu_locale();
/*
* In supported builds, the ICU locale ID will be checked by the