summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Davis2023-03-09 17:32:24 +0000
committerJeff Davis2023-03-09 18:26:47 +0000
commit206b44bb24b3785bf6360361b757c1dae77ab0bb (patch)
tree01813ff272abb88d42be6c48c96655836adc7e42
parent9637badd9f9209166140eb567602e91699dd2ffb (diff)
Fix 9637badd9f.
Discussion: https://postgr.es/m/[email protected] Reported-by: Andrew Dunstan
-rw-r--r--src/bin/pg_upgrade/info.c18
-rw-r--r--src/bin/pg_upgrade/pg_upgrade.c37
-rw-r--r--src/bin/pg_upgrade/t/002_pg_upgrade.pl12
3 files changed, 45 insertions, 22 deletions
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"
);