diff --git a/src/bin/pg_upgrade/info.c b/src/bin/pg_upgrade/info.c index 33b10aac3c..85ed15ae4a 100644 --- a/src/bin/pg_upgrade/info.c +++ b/src/bin/pg_upgrade/info.c @@ -311,11 +311,19 @@ get_template0_info(ClusterInfo *cluster) int i_datctype; int i_daticulocale; - dbres = executeQueryOrDie(conn, - "SELECT encoding, datlocprovider, " - " datcollate, datctype, daticulocale " - "FROM pg_catalog.pg_database " - "WHERE datname='template0'"); + if (GET_MAJOR_VERSION(cluster->major_version) >= 1500) + dbres = executeQueryOrDie(conn, + "SELECT encoding, datlocprovider, " + " datcollate, datctype, daticulocale " + "FROM pg_catalog.pg_database " + "WHERE datname='template0'"); + else + dbres = executeQueryOrDie(conn, + "SELECT encoding, 'c' AS datlocprovider, " + " datcollate, datctype, NULL AS daticulocale " + "FROM pg_catalog.pg_database " + "WHERE datname='template0'"); + if (PQntuples(dbres) != 1) pg_fatal("template0 not found"); diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c index 8c6009151f..4fca466ace 100644 --- a/src/bin/pg_upgrade/pg_upgrade.c +++ b/src/bin/pg_upgrade/pg_upgrade.c @@ -404,19 +404,30 @@ set_locale_and_encoding(void) daticulocale_literal = pg_strdup("NULL"); /* update template0 in new cluster */ - PQclear(executeQueryOrDie(conn_new_template1, - "UPDATE pg_catalog.pg_database " - " SET encoding = %u, " - " datlocprovider = '%c', " - " datcollate = %s, " - " datctype = %s, " - " daticulocale = %s " - " WHERE datname = 'template0' ", - locale->db_encoding, - locale->db_collprovider, - datcollate_literal, - datctype_literal, - daticulocale_literal)); + if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1500) + PQclear(executeQueryOrDie(conn_new_template1, + "UPDATE pg_catalog.pg_database " + " SET encoding = %u, " + " datlocprovider = '%c', " + " datcollate = %s, " + " datctype = %s, " + " daticulocale = %s " + " WHERE datname = 'template0' ", + locale->db_encoding, + locale->db_collprovider, + datcollate_literal, + datctype_literal, + daticulocale_literal)); + else + PQclear(executeQueryOrDie(conn_new_template1, + "UPDATE pg_catalog.pg_database " + " SET encoding = %u, " + " datcollate = %s, " + " datctype = %s " + " WHERE datname = 'template0' ", + locale->db_encoding, + datcollate_literal, + datctype_literal)); PQfreemem(datcollate_literal); PQfreemem(datctype_literal); diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl index a6a0162d5a..1b5df730e9 100644 --- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -110,8 +110,12 @@ my $original_encoding = "6"; # UTF-8 my $original_provider = "c"; my $original_collate = "C"; my $original_iculocale = ""; +my $provider_field = "'c' AS datlocprovider"; +my $iculocale_field = "NULL AS daticulocale"; if ($oldnode->pg_version >= 15 && $ENV{with_icu} eq 'yes') { + $provider_field = "datlocprovider"; + $iculocale_field = "daticulocale"; $original_provider = "i"; $original_iculocale = "fr-CA"; } @@ -132,8 +136,8 @@ $oldnode->start; my $result; $result = $oldnode->safe_psql( - 'postgres', q{SELECT encoding, datlocprovider, datcollate, daticulocale - FROM pg_database WHERE datname='template0'}); + 'postgres', "SELECT encoding, $provider_field, datcollate, $iculocale_field + FROM pg_database WHERE datname='template0'"); is($result, "$original_encoding|$original_provider|$original_collate|$original_iculocale", "check locales in original cluster" ); @@ -395,8 +399,8 @@ if (-d $log_path) # Test that upgraded cluster has original locale settings. $result = $newnode->safe_psql( - 'postgres', q{SELECT encoding, datlocprovider, datcollate, datctype, daticulocale - FROM pg_database WHERE datname='template0'}); + 'postgres', "SELECT encoding, $provider_field, datcollate, datctype, $iculocale_field + FROM pg_database WHERE datname='template0'"); is($result, "$original_encoding|$original_provider|$original_collate|$original_ctype|$original_iculocale", "check that locales in new cluster match original cluster" );