diff options
Diffstat (limited to 'src/bin/pg_upgrade')
-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 |
4 files changed, 65 insertions, 31 deletions
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. |