initdb: change default --locale-provider back to libc.
authorJeff Davis <[email protected]>
Wed, 21 Jun 2023 18:10:03 +0000 (11:10 -0700)
committerJeff Davis <[email protected]>
Wed, 21 Jun 2023 18:10:03 +0000 (11:10 -0700)
Reverts 27b62377b4.

Discussion: https://postgr.es/m/eff031036baa07f325de29215371a4c9e69d61f3[email protected]
Discussion: https://postgr.es/m/3353947.1682092131@sss.pgh.pa.us

doc/src/sgml/ref/initdb.sgml
src/bin/initdb/initdb.c
src/bin/initdb/t/001_initdb.pl
src/bin/pg_dump/t/002_pg_dump.pl
src/bin/scripts/t/020_createdb.pl
src/test/icu/t/010_database.pl
src/test/regress/expected/collate.icu.utf8.out
src/test/regress/sql/collate.icu.utf8.sql

index f850dc404d1bd0354fdd79af859a1616804cd2e5..22f1011781fb8ce2ec04ea46a6f66fb22abd89d3 100644 (file)
@@ -93,24 +93,10 @@ PostgreSQL documentation
   </para>
 
   <para>
-   By default, <command>initdb</command> uses the ICU library to provide
-   locale services if the server was built with ICU support; otherwise it uses
-   the <literal>libc</literal> locale provider (see <xref
-   linkend="locale-providers"/>). To choose the specific ICU locale ID to
-   apply, use the option <option>--icu-locale</option>.  Note that for
-   implementation reasons and to support legacy code,
-   <command>initdb</command> will still select and initialize libc locale
-   settings when the ICU locale provider is used.
-  </para>
-
-  <para>
-   Alternatively, <command>initdb</command> can use the locale provider
-   <literal>libc</literal>. To select this option, specify
-   <literal>--locale-provider=libc</literal>, or build the server without ICU
-   support. The <literal>libc</literal> locale provider takes the locale
-   settings from the environment, and determines the encoding from the locale
-   settings.  This is almost always sufficient, unless there are special
-   requirements.
+   By default, <command>initdb</command> uses the locale provider
+   <literal>libc</literal> (see <xref linkend="locale-providers"/>). The
+   <literal>libc</literal> locale provider takes the locale settings from the
+   environment, and determines the encoding from the locale settings.
   </para>
 
   <para>
@@ -122,6 +108,16 @@ PostgreSQL documentation
    this should be used with care.
   </para>
 
+  <para>
+   Alternatively, <command>initdb</command> can use the ICU library to provide
+   locale services by specifying <literal>--locale-provider=icu</literal>. The
+   server must be built with ICU support. To choose the specific ICU locale ID
+   to apply, use the option <option>--icu-locale</option>.  Note that for
+   implementation reasons and to support legacy code,
+   <command>initdb</command> will still select and initialize libc locale
+   settings when the ICU locale provider is used.
+  </para>
+
   <para>
    When <command>initdb</command> runs, it will print out the locale settings
    it has chosen.  If you have complex requirements or specified multiple
@@ -251,11 +247,6 @@ PostgreSQL documentation
         Specifies the ICU locale when the ICU provider is used. Locale support
         is described in <xref linkend="locale"/>.
        </para>
-       <para>
-        If this option is not specified, the locale is inherited from the
-        environment in which <command>initdb</command> runs. The environment's
-        locale is matched to a similar ICU locale name, if possible.
-       </para>
       </listitem>
      </varlistentry>
 
@@ -330,9 +321,8 @@ PostgreSQL documentation
         This option sets the locale provider for databases created in the new
         cluster.  It can be overridden in the <command>CREATE
         DATABASE</command> command when new databases are subsequently
-        created.  The default is <literal>icu</literal> if the server was
-        built with ICU support; otherwise the default is
-        <literal>libc</literal> (see <xref linkend="locale-providers"/>).
+        created.  The default is <literal>libc</literal> (see <xref
+        linkend="locale-providers"/>).
        </para>
       </listitem>
      </varlistentry>
index 71a3d26c378a079e7cfae0471093a40e7eeeb2b5..fa3af0d75c5b83e1e178a402c67f7d8e8e144c8a 100644 (file)
@@ -143,11 +143,7 @@ static char *lc_monetary = NULL;
 static char *lc_numeric = NULL;
 static char *lc_time = NULL;
 static char *lc_messages = NULL;
-#ifdef USE_ICU
-static char locale_provider = COLLPROVIDER_ICU;
-#else
 static char locale_provider = COLLPROVIDER_LIBC;
-#endif
 static char *icu_locale = NULL;
 static char *icu_rules = NULL;
 static const char *default_text_search_config = NULL;
@@ -2357,19 +2353,6 @@ icu_validate_locale(const char *loc_str)
 #endif
 }
 
-/*
- * Determine the default ICU locale
- */
-static char *
-default_icu_locale(void)
-{
-#ifdef USE_ICU
-   return pg_strdup(uloc_getDefault());
-#else
-   pg_fatal("ICU is not supported in this build");
-#endif
-}
-
 /*
  * set up the locale variables
  *
@@ -2429,10 +2412,7 @@ setlocales(void)
 
        /* acquire default locale from the environment, if not specified */
        if (icu_locale == NULL)
-       {
-           icu_locale = default_icu_locale();
-           printf(_("Using default ICU locale \"%s\".\n"), icu_locale);
-       }
+           pg_fatal("ICU locale must be specified");
 
        /* canonicalize to a language tag */
        langtag = icu_language_tag(icu_locale);
@@ -3273,7 +3253,6 @@ main(int argc, char *argv[])
                break;
            case 8:
                locale = "C";
-               locale_provider = COLLPROVIDER_LIBC;
                break;
            case 9:
                pwfilename = pg_strdup(optarg);
index 8b4acb7148eba525dffdc1eeb1e8e8d4ca220a83..2d7469d2fc339a3b045be69a1012e3e74ed038da 100644 (file)
@@ -103,6 +103,11 @@ SKIP:
 
 if ($ENV{with_icu} eq 'yes')
 {
+   command_fails_like(
+       [ 'initdb', '--no-sync', '--locale-provider=icu', "$tempdir/data2" ],
+       qr/initdb: error: ICU locale must be specified/,
+       'locale provider ICU requires --icu-locale');
+
    command_ok(
        [
            'initdb', '--no-sync',
index 15852188c423894f3147d07e1be1a52b4f8faaa7..63bb4689d448c3853cec2a1ba6c65bd4635ac9bf 100644 (file)
@@ -1965,7 +1965,7 @@ my %tests = (
        create_sql =>
          "CREATE DATABASE dump_test2 LOCALE = 'C' TEMPLATE = template0;",
        regexp => qr/^
-           \QCREATE DATABASE dump_test2 \E.*\QLOCALE = 'C'\E
+           \QCREATE DATABASE dump_test2 \E.*\QLOCALE = 'C';\E
            /xm,
        like => { pg_dumpall_dbprivs => 1, },
    },
index 57383561a0cd7baaf8247a3c2d8ec77374bb1974..40291924e5d1295da2c087170967089e08b0a579 100644 (file)
@@ -13,7 +13,7 @@ program_version_ok('createdb');
 program_options_handling_ok('createdb');
 
 my $node = PostgreSQL::Test::Cluster->new('main');
-$node->init(extra => ['--locale-provider=libc']);
+$node->init;
 $node->start;
 
 $node->issues_sql_like(
index cbe5467f3c6706135339b8c7cb6b2ab9ad49836a..3beee2ff969e9d207bb02980fd383d993b68875a 100644 (file)
@@ -12,7 +12,7 @@ if ($ENV{with_icu} ne 'yes')
 }
 
 my $node1 = PostgreSQL::Test::Cluster->new('node1');
-$node1->init(extra => ['--locale-provider=libc']);
+$node1->init;
 $node1->start;
 
 $node1->safe_psql('postgres',
index dc96e590f747f1c833fc923e2aadba260b6e0b32..b7fbee447f1ebd301c5d47d33fca99c6f0b27866 100644 (file)
@@ -1023,7 +1023,7 @@ SET client_min_messages TO WARNING;
 do $$
 BEGIN
   EXECUTE 'CREATE COLLATION test0 (provider = icu, locale = ' ||
-          quote_literal((SELECT daticulocale FROM pg_database WHERE datname = current_database())) || ');';
+          quote_literal((SELECT CASE WHEN datlocprovider='i' THEN daticulocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');';
 END
 $$;
 CREATE COLLATION test0 FROM "C"; -- fail, duplicate name
@@ -1031,7 +1031,7 @@ ERROR:  collation "test0" already exists
 do $$
 BEGIN
   EXECUTE 'CREATE COLLATION test1 (provider = icu, locale = ' ||
-          quote_literal((SELECT daticulocale FROM pg_database WHERE datname = current_database())) || ');';
+          quote_literal((SELECT CASE WHEN datlocprovider='i' THEN daticulocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');';
 END
 $$;
 RESET client_min_messages;
index a8001b4b8e9a322db5c788d8cc8358490654c72d..079d7ae39ded680943031f359d2cac7fb39a9c37 100644 (file)
@@ -362,14 +362,14 @@ SET client_min_messages TO WARNING;
 do $$
 BEGIN
   EXECUTE 'CREATE COLLATION test0 (provider = icu, locale = ' ||
-          quote_literal((SELECT daticulocale FROM pg_database WHERE datname = current_database())) || ');';
+          quote_literal((SELECT CASE WHEN datlocprovider='i' THEN daticulocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');';
 END
 $$;
 CREATE COLLATION test0 FROM "C"; -- fail, duplicate name
 do $$
 BEGIN
   EXECUTE 'CREATE COLLATION test1 (provider = icu, locale = ' ||
-          quote_literal((SELECT daticulocale FROM pg_database WHERE datname = current_database())) || ');';
+          quote_literal((SELECT CASE WHEN datlocprovider='i' THEN daticulocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');';
 END
 $$;