diff options
Diffstat (limited to 'src/bin')
-rw-r--r-- | src/bin/initdb/initdb.c | 34 | ||||
-rw-r--r-- | src/bin/pg_dump/pg_dump.c | 56 | ||||
-rw-r--r-- | src/bin/pg_upgrade/info.c | 31 | ||||
-rw-r--r-- | src/bin/pg_upgrade/pg_upgrade.c | 34 | ||||
-rw-r--r-- | src/bin/pg_upgrade/pg_upgrade.h | 2 | ||||
-rw-r--r-- | src/bin/pg_upgrade/t/002_pg_upgrade.pl | 29 | ||||
-rw-r--r-- | src/bin/psql/describe.c | 20 |
7 files changed, 127 insertions, 79 deletions
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 200b2e8e317..de58002a5d4 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -145,7 +145,7 @@ static char *lc_numeric = NULL; static char *lc_time = NULL; static char *lc_messages = NULL; static char locale_provider = COLLPROVIDER_LIBC; -static char *icu_locale = NULL; +static char *datlocale = NULL; static char *icu_rules = NULL; static const char *default_text_search_config = NULL; static char *username = NULL; @@ -1520,8 +1520,8 @@ bootstrap_template1(void) bki_lines = replace_token(bki_lines, "LC_CTYPE", escape_quotes_bki(lc_ctype)); - bki_lines = replace_token(bki_lines, "ICU_LOCALE", - icu_locale ? escape_quotes_bki(icu_locale) : "_null_"); + bki_lines = replace_token(bki_lines, "DATLOCALE", + datlocale ? escape_quotes_bki(datlocale) : "_null_"); bki_lines = replace_token(bki_lines, "ICU_RULES", icu_rules ? escape_quotes_bki(icu_rules) : "_null_"); @@ -2352,7 +2352,7 @@ setlocales(void) { char *canonname; - /* set empty lc_* and iculocale values to locale config if set */ + /* set empty lc_* and datlocale values to locale config if set */ if (locale) { @@ -2368,8 +2368,8 @@ setlocales(void) lc_monetary = locale; if (!lc_messages) lc_messages = locale; - if (!icu_locale && locale_provider == COLLPROVIDER_ICU) - icu_locale = locale; + if (!datlocale && locale_provider == COLLPROVIDER_ICU) + datlocale = locale; } /* @@ -2400,17 +2400,17 @@ setlocales(void) char *langtag; /* acquire default locale from the environment, if not specified */ - if (icu_locale == NULL) + if (datlocale == NULL) pg_fatal("ICU locale must be specified"); /* canonicalize to a language tag */ - langtag = icu_language_tag(icu_locale); + langtag = icu_language_tag(datlocale); printf(_("Using language tag \"%s\" for ICU locale \"%s\".\n"), - langtag, icu_locale); - pg_free(icu_locale); - icu_locale = langtag; + langtag, datlocale); + pg_free(datlocale); + datlocale = langtag; - icu_validate_locale(icu_locale); + icu_validate_locale(datlocale); /* * In supported builds, the ICU locale ID will be opened during @@ -2604,14 +2604,14 @@ setup_locale_encoding(void) strcmp(lc_ctype, lc_numeric) == 0 && strcmp(lc_ctype, lc_monetary) == 0 && strcmp(lc_ctype, lc_messages) == 0 && - (!icu_locale || strcmp(lc_ctype, icu_locale) == 0)) + (!datlocale || strcmp(lc_ctype, datlocale) == 0)) printf(_("The database cluster will be initialized with locale \"%s\".\n"), lc_ctype); else { printf(_("The database cluster will be initialized with this locale configuration:\n")); printf(_(" provider: %s\n"), collprovider_name(locale_provider)); - if (icu_locale) - printf(_(" ICU locale: %s\n"), icu_locale); + if (datlocale) + printf(_(" ICU locale: %s\n"), datlocale); printf(_(" LC_COLLATE: %s\n" " LC_CTYPE: %s\n" " LC_MESSAGES: %s\n" @@ -3282,7 +3282,7 @@ main(int argc, char *argv[]) pg_fatal("unrecognized locale provider: %s", optarg); break; case 16: - icu_locale = pg_strdup(optarg); + datlocale = pg_strdup(optarg); break; case 17: icu_rules = pg_strdup(optarg); @@ -3317,7 +3317,7 @@ main(int argc, char *argv[]) exit(1); } - if (icu_locale && locale_provider != COLLPROVIDER_ICU) + if (datlocale && locale_provider != COLLPROVIDER_ICU) pg_fatal("%s cannot be specified unless locale provider \"%s\" is chosen", "--icu-locale", "icu"); diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 10cbf02bebd..23e6217b73f 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -2984,7 +2984,7 @@ dumpDatabase(Archive *fout) i_datlocprovider, i_collate, i_ctype, - i_daticulocale, + i_datlocale, i_daticurules, i_frozenxid, i_minmxid, @@ -3003,7 +3003,7 @@ dumpDatabase(Archive *fout) *datlocprovider, *collate, *ctype, - *iculocale, + *locale, *icurules, *datistemplate, *datconnlimit, @@ -3027,10 +3027,12 @@ dumpDatabase(Archive *fout) appendPQExpBufferStr(dbQry, "datminmxid, "); else appendPQExpBufferStr(dbQry, "0 AS datminmxid, "); - if (fout->remoteVersion >= 150000) - appendPQExpBufferStr(dbQry, "datlocprovider, daticulocale, datcollversion, "); + if (fout->remoteVersion >= 170000) + appendPQExpBufferStr(dbQry, "datlocprovider, datlocale, datcollversion, "); + else if (fout->remoteVersion >= 150000) + appendPQExpBufferStr(dbQry, "datlocprovider, daticulocale AS datlocale, datcollversion, "); else - appendPQExpBufferStr(dbQry, "'c' AS datlocprovider, NULL AS daticulocale, NULL AS datcollversion, "); + appendPQExpBufferStr(dbQry, "'c' AS datlocprovider, NULL AS datlocale, NULL AS datcollversion, "); if (fout->remoteVersion >= 160000) appendPQExpBufferStr(dbQry, "daticurules, "); else @@ -3051,7 +3053,7 @@ dumpDatabase(Archive *fout) i_datlocprovider = PQfnumber(res, "datlocprovider"); i_collate = PQfnumber(res, "datcollate"); i_ctype = PQfnumber(res, "datctype"); - i_daticulocale = PQfnumber(res, "daticulocale"); + i_datlocale = PQfnumber(res, "datlocale"); i_daticurules = PQfnumber(res, "daticurules"); i_frozenxid = PQfnumber(res, "datfrozenxid"); i_minmxid = PQfnumber(res, "datminmxid"); @@ -3070,10 +3072,10 @@ dumpDatabase(Archive *fout) datlocprovider = PQgetvalue(res, 0, i_datlocprovider); collate = PQgetvalue(res, 0, i_collate); ctype = PQgetvalue(res, 0, i_ctype); - if (!PQgetisnull(res, 0, i_daticulocale)) - iculocale = PQgetvalue(res, 0, i_daticulocale); + if (!PQgetisnull(res, 0, i_datlocale)) + locale = PQgetvalue(res, 0, i_datlocale); else - iculocale = NULL; + locale = NULL; if (!PQgetisnull(res, 0, i_daticurules)) icurules = PQgetvalue(res, 0, i_daticurules); else @@ -3138,11 +3140,12 @@ dumpDatabase(Archive *fout) appendStringLiteralAH(creaQry, ctype, fout); } } - if (iculocale) + if (locale) { appendPQExpBufferStr(creaQry, " ICU_LOCALE = "); - appendStringLiteralAH(creaQry, iculocale, fout); + appendStringLiteralAH(creaQry, locale, fout); } + if (icurules) { appendPQExpBufferStr(creaQry, " ICU_RULES = "); @@ -13756,12 +13759,12 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) int i_collisdeterministic; int i_collcollate; int i_collctype; - int i_colliculocale; + int i_colllocale; int i_collicurules; const char *collprovider; const char *collcollate; const char *collctype; - const char *colliculocale; + const char *colllocale; const char *collicurules; /* Do nothing in data-only dump */ @@ -13793,12 +13796,15 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) appendPQExpBufferStr(query, "true AS collisdeterministic, "); - if (fout->remoteVersion >= 150000) + if (fout->remoteVersion >= 170000) + appendPQExpBufferStr(query, + "colllocale, "); + else if (fout->remoteVersion >= 150000) appendPQExpBufferStr(query, - "colliculocale, "); + "colliculocale AS colllocale, "); else appendPQExpBufferStr(query, - "NULL AS colliculocale, "); + "NULL AS colllocale, "); if (fout->remoteVersion >= 160000) appendPQExpBufferStr(query, @@ -13820,7 +13826,7 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) i_collisdeterministic = PQfnumber(res, "collisdeterministic"); i_collcollate = PQfnumber(res, "collcollate"); i_collctype = PQfnumber(res, "collctype"); - i_colliculocale = PQfnumber(res, "colliculocale"); + i_colllocale = PQfnumber(res, "colllocale"); i_collicurules = PQfnumber(res, "collicurules"); collprovider = PQgetvalue(res, 0, i_collprovider); @@ -13847,10 +13853,10 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) collctype = NULL; } - if (!PQgetisnull(res, 0, i_colliculocale)) - colliculocale = PQgetvalue(res, 0, i_colliculocale); + if (!PQgetisnull(res, 0, i_colllocale)) + colllocale = PQgetvalue(res, 0, i_colllocale); else - colliculocale = NULL; + colllocale = NULL; if (!PQgetisnull(res, 0, i_collicurules)) collicurules = PQgetvalue(res, 0, i_collicurules); @@ -13880,7 +13886,7 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) if (collprovider[0] == 'd') { - if (collcollate || collctype || colliculocale || collicurules) + if (collcollate || collctype || colllocale || collicurules) pg_log_warning("invalid collation \"%s\"", qcollname); /* no locale -- the default collation cannot be reloaded anyway */ @@ -13889,16 +13895,16 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) { if (fout->remoteVersion >= 150000) { - if (collcollate || collctype || !colliculocale) + if (collcollate || collctype || !colllocale) pg_log_warning("invalid collation \"%s\"", qcollname); appendPQExpBufferStr(q, ", locale = "); - appendStringLiteralAH(q, colliculocale ? colliculocale : "", + appendStringLiteralAH(q, colllocale ? colllocale : "", fout); } else { - if (!collcollate || !collctype || colliculocale || + if (!collcollate || !collctype || colllocale || strcmp(collcollate, collctype) != 0) pg_log_warning("invalid collation \"%s\"", qcollname); @@ -13914,7 +13920,7 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) } else if (collprovider[0] == 'c') { - if (colliculocale || collicurules || !collcollate || !collctype) + if (colllocale || collicurules || !collcollate || !collctype) pg_log_warning("invalid collation \"%s\"", qcollname); if (collcollate && collctype && strcmp(collcollate, collctype) == 0) diff --git a/src/bin/pg_upgrade/info.c b/src/bin/pg_upgrade/info.c index 183c2f84eb4..b5b8d116027 100644 --- a/src/bin/pg_upgrade/info.c +++ b/src/bin/pg_upgrade/info.c @@ -328,18 +328,24 @@ get_template0_info(ClusterInfo *cluster) int i_datlocprovider; int i_datcollate; int i_datctype; - int i_daticulocale; + int i_datlocale; - if (GET_MAJOR_VERSION(cluster->major_version) >= 1500) + if (GET_MAJOR_VERSION(cluster->major_version) >= 1700) dbres = executeQueryOrDie(conn, "SELECT encoding, datlocprovider, " - " datcollate, datctype, daticulocale " + " datcollate, datctype, datlocale " + "FROM pg_catalog.pg_database " + "WHERE datname='template0'"); + else if (GET_MAJOR_VERSION(cluster->major_version) >= 1500) + dbres = executeQueryOrDie(conn, + "SELECT encoding, datlocprovider, " + " datcollate, datctype, daticulocale AS datlocale " "FROM pg_catalog.pg_database " "WHERE datname='template0'"); else dbres = executeQueryOrDie(conn, "SELECT encoding, 'c' AS datlocprovider, " - " datcollate, datctype, NULL AS daticulocale " + " datcollate, datctype, NULL AS datlocale " "FROM pg_catalog.pg_database " "WHERE datname='template0'"); @@ -353,16 +359,16 @@ get_template0_info(ClusterInfo *cluster) i_datlocprovider = PQfnumber(dbres, "datlocprovider"); i_datcollate = PQfnumber(dbres, "datcollate"); i_datctype = PQfnumber(dbres, "datctype"); - i_daticulocale = PQfnumber(dbres, "daticulocale"); + i_datlocale = PQfnumber(dbres, "datlocale"); locale->db_encoding = atoi(PQgetvalue(dbres, 0, i_datencoding)); locale->db_collprovider = PQgetvalue(dbres, 0, i_datlocprovider)[0]; locale->db_collate = pg_strdup(PQgetvalue(dbres, 0, i_datcollate)); locale->db_ctype = pg_strdup(PQgetvalue(dbres, 0, i_datctype)); - if (PQgetisnull(dbres, 0, i_daticulocale)) - locale->db_iculocale = NULL; + if (PQgetisnull(dbres, 0, i_datlocale)) + locale->db_locale = NULL; else - locale->db_iculocale = pg_strdup(PQgetvalue(dbres, 0, i_daticulocale)); + locale->db_locale = pg_strdup(PQgetvalue(dbres, 0, i_datlocale)); cluster->template0 = locale; @@ -392,12 +398,15 @@ get_db_infos(ClusterInfo *cluster) snprintf(query, sizeof(query), "SELECT d.oid, d.datname, d.encoding, d.datcollate, d.datctype, "); - if (GET_MAJOR_VERSION(cluster->major_version) < 1500) + if (GET_MAJOR_VERSION(cluster->major_version) >= 1700) + snprintf(query + strlen(query), sizeof(query) - strlen(query), + "datlocprovider, datlocale, "); + else if (GET_MAJOR_VERSION(cluster->major_version) >= 1500) snprintf(query + strlen(query), sizeof(query) - strlen(query), - "'c' AS datlocprovider, NULL AS daticulocale, "); + "datlocprovider, daticulocale AS datlocale, "); else snprintf(query + strlen(query), sizeof(query) - strlen(query), - "datlocprovider, daticulocale, "); + "'c' AS datlocprovider, NULL AS datlocale, "); snprintf(query + strlen(query), sizeof(query) - strlen(query), "pg_catalog.pg_tablespace_location(t.oid) AS spclocation " "FROM pg_catalog.pg_database d " diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c index 10c94a6c1fc..bb261353bdd 100644 --- a/src/bin/pg_upgrade/pg_upgrade.c +++ b/src/bin/pg_upgrade/pg_upgrade.c @@ -391,7 +391,7 @@ setup(char *argv0, bool *live_check) * Copy locale and encoding information into the new cluster's template0. * * We need to copy the encoding, datlocprovider, datcollate, datctype, and - * daticulocale. We don't need datcollversion because that's never set for + * datlocale. We don't need datcollversion because that's never set for * template0. */ static void @@ -400,7 +400,7 @@ set_locale_and_encoding(void) PGconn *conn_new_template1; char *datcollate_literal; char *datctype_literal; - char *daticulocale_literal = NULL; + char *datlocale_literal = NULL; DbLocaleInfo *locale = old_cluster.template0; prep_status("Setting locale and encoding for new cluster"); @@ -414,15 +414,29 @@ set_locale_and_encoding(void) datctype_literal = PQescapeLiteral(conn_new_template1, locale->db_ctype, strlen(locale->db_ctype)); - if (locale->db_iculocale) - daticulocale_literal = PQescapeLiteral(conn_new_template1, - locale->db_iculocale, - strlen(locale->db_iculocale)); + if (locale->db_locale) + datlocale_literal = PQescapeLiteral(conn_new_template1, + locale->db_locale, + strlen(locale->db_locale)); else - daticulocale_literal = pg_strdup("NULL"); + datlocale_literal = pg_strdup("NULL"); /* update template0 in new cluster */ - if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1500) + if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1700) + PQclear(executeQueryOrDie(conn_new_template1, + "UPDATE pg_catalog.pg_database " + " SET encoding = %d, " + " datlocprovider = '%c', " + " datcollate = %s, " + " datctype = %s, " + " datlocale = %s " + " WHERE datname = 'template0' ", + locale->db_encoding, + locale->db_collprovider, + datcollate_literal, + datctype_literal, + datlocale_literal)); + else if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1500) PQclear(executeQueryOrDie(conn_new_template1, "UPDATE pg_catalog.pg_database " " SET encoding = %d, " @@ -435,7 +449,7 @@ set_locale_and_encoding(void) locale->db_collprovider, datcollate_literal, datctype_literal, - daticulocale_literal)); + datlocale_literal)); else PQclear(executeQueryOrDie(conn_new_template1, "UPDATE pg_catalog.pg_database " @@ -449,7 +463,7 @@ set_locale_and_encoding(void) PQfreemem(datcollate_literal); PQfreemem(datctype_literal); - PQfreemem(daticulocale_literal); + PQfreemem(datlocale_literal); PQfinish(conn_new_template1); diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h index 857d715049e..c0bfb002d2d 100644 --- a/src/bin/pg_upgrade/pg_upgrade.h +++ b/src/bin/pg_upgrade/pg_upgrade.h @@ -208,7 +208,7 @@ typedef struct char *db_collate; char *db_ctype; char db_collprovider; - char *db_iculocale; + char *db_locale; int db_encoding; } DbLocaleInfo; diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl index fa836e83e57..78fa319fa71 100644 --- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -92,6 +92,10 @@ my $oldnode = PostgreSQL::Test::Cluster->new('old_node', install_path => $ENV{oldinstall}); +# Numeric major version of old cluster, ignoring "devel" suffix. +# Needed for testing upgrades from development version to itself. +my $old_major_version = int($oldnode->pg_version =~ s/devel//rg); + my %node_params = (); # To increase coverage of non-standard segment size and group access without @@ -111,15 +115,22 @@ if ($oldnode->pg_version >= 11) my $original_encoding = "6"; # UTF-8 my $original_provider = "c"; my $original_locale = "C"; -my $original_iculocale = ""; +my $original_datlocale = ""; my $provider_field = "'c' AS datlocprovider"; -my $iculocale_field = "NULL AS daticulocale"; -if ($oldnode->pg_version >= 15 && $ENV{with_icu} eq 'yes') +my $old_datlocale_field = "NULL AS datlocale"; +if ($old_major_version >= 15 && $ENV{with_icu} eq 'yes') { $provider_field = "datlocprovider"; - $iculocale_field = "daticulocale"; + if ($old_major_version >= 17) + { + $old_datlocale_field = "datlocale"; + } + else + { + $old_datlocale_field = "daticulocale AS datlocale"; + } $original_provider = "i"; - $original_iculocale = "fr-CA"; + $original_datlocale = "fr-CA"; } my @initdb_params = @custom_opts; @@ -139,10 +150,10 @@ $oldnode->start; my $result; $result = $oldnode->safe_psql( 'postgres', - "SELECT encoding, $provider_field, datcollate, datctype, $iculocale_field + "SELECT encoding, $provider_field, datcollate, datctype, $old_datlocale_field FROM pg_database WHERE datname='template0'"); is( $result, - "$original_encoding|$original_provider|$original_locale|$original_locale|$original_iculocale", + "$original_encoding|$original_provider|$original_locale|$original_locale|$original_datlocale", "check locales in original cluster"); # The default location of the source code is the root of this directory. @@ -426,10 +437,10 @@ if (-d $log_path) # Test that upgraded cluster has original locale settings. $result = $newnode->safe_psql( 'postgres', - "SELECT encoding, $provider_field, datcollate, datctype, $iculocale_field + "SELECT encoding, $provider_field, datcollate, datctype, datlocale FROM pg_database WHERE datname='template0'"); is( $result, - "$original_encoding|$original_provider|$original_locale|$original_locale|$original_iculocale", + "$original_encoding|$original_provider|$original_locale|$original_locale|$original_datlocale", "check that locales in new cluster match original cluster"); # Second dump from the upgraded instance. diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index c05befbb6f2..68b2ea8872a 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -937,14 +937,18 @@ listAllDbs(const char *pattern, bool verbose) " d.datctype as \"%s\",\n", gettext_noop("Collate"), gettext_noop("Ctype")); - if (pset.sversion >= 150000) + if (pset.sversion >= 170000) + appendPQExpBuffer(&buf, + " d.datlocale as \"%s\",\n", + gettext_noop("Locale")); + else if (pset.sversion >= 150000) appendPQExpBuffer(&buf, " d.daticulocale as \"%s\",\n", - gettext_noop("ICU Locale")); + gettext_noop("Locale")); else appendPQExpBuffer(&buf, " NULL as \"%s\",\n", - gettext_noop("ICU Locale")); + gettext_noop("Locale")); if (pset.sversion >= 160000) appendPQExpBuffer(&buf, " d.daticurules as \"%s\",\n", @@ -4983,14 +4987,18 @@ listCollations(const char *pattern, bool verbose, bool showSystem) gettext_noop("Collate"), gettext_noop("Ctype")); - if (pset.sversion >= 150000) + if (pset.sversion >= 170000) + appendPQExpBuffer(&buf, + " c.colllocale AS \"%s\",\n", + gettext_noop("Locale")); + else if (pset.sversion >= 150000) appendPQExpBuffer(&buf, " c.colliculocale AS \"%s\",\n", - gettext_noop("ICU Locale")); + gettext_noop("Locale")); else appendPQExpBuffer(&buf, " c.collcollate AS \"%s\",\n", - gettext_noop("ICU Locale")); + gettext_noop("Locale")); if (pset.sversion >= 160000) appendPQExpBuffer(&buf, |