]> granicus.if.org Git - postgresql/commitdiff
Expand set of predefined ICU locales
authorPeter Eisentraut <peter_e@gmx.net>
Mon, 21 Aug 2017 13:17:06 +0000 (09:17 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Mon, 21 Aug 2017 23:21:14 +0000 (19:21 -0400)
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>
doc/src/sgml/charset.sgml
src/backend/commands/collationcmds.c

index 48ecfc5f48e083c8b562a444b27e459d60619e1f..f2a4acc11502bfd34faca05b5f3fd50f810aed15 100644 (file)
@@ -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>
 
index 8572b2dedc485cacc1d052a56c9c5ade2ec8edde..d36ce5356047c9c45a7bf553f78508b68ed09e50 100644 (file)
@@ -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;