aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2017-08-21 09:17:06 -0400
committerPeter Eisentraut <peter_e@gmx.net>2017-08-21 19:21:07 -0400
commit51e225da306e14616b690308a59fd89e22335035 (patch)
tree909bde30fc3ea82dc71eed3c35f19dc081371824
parent1f6d515a67ec98194c23a5db25660856c9aab944 (diff)
downloadpostgresql-51e225da306e14616b690308a59fd89e22335035.tar.gz
postgresql-51e225da306e14616b690308a59fd89e22335035.zip
Expand set of predefined ICU locales
Install language+region combinations even if they are not distinct from the language's base locale. This gives better long-term stability of the set of predefined locales and makes the predefined locales less implementation-dependent and more practical for users. Reviewed-by: Peter Geoghegan <pg@bowt.ie>
-rw-r--r--doc/src/sgml/charset.sgml13
-rw-r--r--src/backend/commands/collationcmds.c15
2 files changed, 18 insertions, 10 deletions
diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml
index 48ecfc5f48e..f2a4acc1150 100644
--- a/doc/src/sgml/charset.sgml
+++ b/doc/src/sgml/charset.sgml
@@ -653,9 +653,8 @@ SELECT a COLLATE "C" &lt; b COLLATE "POSIX" FROM test1;
string will be accepted as a locale name.)
See <ulink url="http://userguide.icu-project.org/locale"></ulink> for
information on ICU locale naming. <command>initdb</command> uses the ICU
- APIs to extract a set of locales with distinct collation rules to populate
- the initial set of collations. Here are some example collations that
- might be created:
+ APIs to extract a set of distinct locales to populate the initial set of
+ collations. Here are some example collations that might be created:
<variablelist>
<varlistentry>
@@ -677,9 +676,9 @@ SELECT a COLLATE "C" &lt; b COLLATE "POSIX" FROM test1;
<listitem>
<para>German collation for Austria, default variant</para>
<para>
- (As of this writing, there is no,
- say, <literal>de-DE-x-icu</literal> or <literal>de-CH-x-icu</literal>,
- because those are equivalent to <literal>de-x-icu</literal>.)
+ (There are also, say, <literal>de-DE-x-icu</literal>
+ or <literal>de-CH-x-icu</literal>, but as of this writing, they are
+ equivalent to <literal>de-x-icu</literal>.)
</para>
</listitem>
</varlistentry>
@@ -690,6 +689,7 @@ SELECT a COLLATE "C" &lt; b COLLATE "POSIX" FROM test1;
<para>German collation for Austria, phone book variant</para>
</listitem>
</varlistentry>
+
<varlistentry>
<term><literal>und-x-icu</literal> (for <quote>undefined</quote>)</term>
<listitem>
@@ -724,7 +724,6 @@ SELECT a COLLATE "C" &lt; b COLLATE "POSIX" FROM test1;
<programlisting>
CREATE COLLATION german FROM "de_DE";
CREATE COLLATION french FROM "fr-x-icu";
-CREATE COLLATION "de-DE-x-icu" FROM "de-x-icu";
</programlisting>
</para>
diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c
index 8572b2dedc4..d36ce535604 100644
--- a/src/backend/commands/collationcmds.c
+++ b/src/backend/commands/collationcmds.c
@@ -667,7 +667,16 @@ pg_import_system_collations(PG_FUNCTION_ARGS)
}
#endif /* READ_LOCALE_A_OUTPUT */
- /* Load collations known to ICU */
+ /*
+ * Load collations known to ICU
+ *
+ * We use uloc_countAvailable()/uloc_getAvailable() rather than
+ * ucol_countAvailable()/ucol_getAvailable(). The former returns a full
+ * set of language+region combinations, whereas the latter only returns
+ * language+region combinations of they are distinct from the language's
+ * base collation. So there might not be a de-DE or en-GB, which would be
+ * confusing.
+ */
#ifdef USE_ICU
{
int i;
@@ -676,7 +685,7 @@ pg_import_system_collations(PG_FUNCTION_ARGS)
* Start the loop at -1 to sneak in the root locale without too much
* code duplication.
*/
- for (i = -1; i < ucol_countAvailable(); i++)
+ for (i = -1; i < uloc_countAvailable(); i++)
{
/*
* In ICU 4.2, ucol_getKeywordValuesForLocale() sometimes returns
@@ -706,7 +715,7 @@ pg_import_system_collations(PG_FUNCTION_ARGS)
if (i == -1)
name = ""; /* ICU root locale */
else
- name = ucol_getAvailable(i);
+ name = uloc_getAvailable(i);
langtag = get_icu_language_tag(name);
collcollate = U_ICU_VERSION_MAJOR_NUM >= 54 ? langtag : name;