diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml index f850dc404d..22f1011781 100644 --- a/doc/src/sgml/ref/initdb.sgml +++ b/doc/src/sgml/ref/initdb.sgml @@ -93,24 +93,10 @@ PostgreSQL documentation - By default, initdb uses the ICU library to provide - locale services if the server was built with ICU support; otherwise it uses - the libc locale provider (see ). To choose the specific ICU locale ID to - apply, use the option . Note that for - implementation reasons and to support legacy code, - initdb will still select and initialize libc locale - settings when the ICU locale provider is used. - - - - Alternatively, initdb can use the locale provider - libc. To select this option, specify - --locale-provider=libc, or build the server without ICU - support. The libc 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, initdb uses the locale provider + libc (see ). The + libc locale provider takes the locale settings from the + environment, and determines the encoding from the locale settings. @@ -122,6 +108,16 @@ PostgreSQL documentation this should be used with care. + + Alternatively, initdb can use the ICU library to provide + locale services by specifying --locale-provider=icu. The + server must be built with ICU support. To choose the specific ICU locale ID + to apply, use the option . Note that for + implementation reasons and to support legacy code, + initdb will still select and initialize libc locale + settings when the ICU locale provider is used. + + When initdb 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 . - - If this option is not specified, the locale is inherited from the - environment in which initdb runs. The environment's - locale is matched to a similar ICU locale name, if possible. - @@ -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 CREATE DATABASE command when new databases are subsequently - created. The default is icu if the server was - built with ICU support; otherwise the default is - libc (see ). + created. The default is libc (see ). diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 71a3d26c37..fa3af0d75c 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -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); diff --git a/src/bin/initdb/t/001_initdb.pl b/src/bin/initdb/t/001_initdb.pl index 8b4acb7148..2d7469d2fc 100644 --- a/src/bin/initdb/t/001_initdb.pl +++ b/src/bin/initdb/t/001_initdb.pl @@ -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', diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index 15852188c4..63bb4689d4 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -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, }, }, diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl index 57383561a0..40291924e5 100644 --- a/src/bin/scripts/t/020_createdb.pl +++ b/src/bin/scripts/t/020_createdb.pl @@ -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( diff --git a/src/test/icu/t/010_database.pl b/src/test/icu/t/010_database.pl index cbe5467f3c..3beee2ff96 100644 --- a/src/test/icu/t/010_database.pl +++ b/src/test/icu/t/010_database.pl @@ -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', diff --git a/src/test/regress/expected/collate.icu.utf8.out b/src/test/regress/expected/collate.icu.utf8.out index dc96e590f7..b7fbee447f 100644 --- a/src/test/regress/expected/collate.icu.utf8.out +++ b/src/test/regress/expected/collate.icu.utf8.out @@ -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; diff --git a/src/test/regress/sql/collate.icu.utf8.sql b/src/test/regress/sql/collate.icu.utf8.sql index a8001b4b8e..079d7ae39d 100644 --- a/src/test/regress/sql/collate.icu.utf8.sql +++ b/src/test/regress/sql/collate.icu.utf8.sql @@ -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 $$;