1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-11 05:41:32 +03:00

Fix 9637badd9f.

Discussion: https://postgr.es/m/0a364430-266e-1e1a-d5d8-1a5273c9ddb6@dunslane.net
Reported-by: Andrew Dunstan
This commit is contained in:
Jeff Davis 2023-03-09 09:32:24 -08:00
parent 9637badd9f
commit 206b44bb24
3 changed files with 45 additions and 22 deletions

View File

@ -311,11 +311,19 @@ get_template0_info(ClusterInfo *cluster)
int i_datctype; int i_datctype;
int i_daticulocale; int i_daticulocale;
dbres = executeQueryOrDie(conn, if (GET_MAJOR_VERSION(cluster->major_version) >= 1500)
"SELECT encoding, datlocprovider, " dbres = executeQueryOrDie(conn,
" datcollate, datctype, daticulocale " "SELECT encoding, datlocprovider, "
"FROM pg_catalog.pg_database " " datcollate, datctype, daticulocale "
"WHERE datname='template0'"); "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) if (PQntuples(dbres) != 1)
pg_fatal("template0 not found"); pg_fatal("template0 not found");

View File

@ -404,19 +404,30 @@ set_locale_and_encoding(void)
daticulocale_literal = pg_strdup("NULL"); daticulocale_literal = pg_strdup("NULL");
/* update template0 in new cluster */ /* update template0 in new cluster */
PQclear(executeQueryOrDie(conn_new_template1, if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1500)
"UPDATE pg_catalog.pg_database " PQclear(executeQueryOrDie(conn_new_template1,
" SET encoding = %u, " "UPDATE pg_catalog.pg_database "
" datlocprovider = '%c', " " SET encoding = %u, "
" datcollate = %s, " " datlocprovider = '%c', "
" datctype = %s, " " datcollate = %s, "
" daticulocale = %s " " datctype = %s, "
" WHERE datname = 'template0' ", " daticulocale = %s "
locale->db_encoding, " WHERE datname = 'template0' ",
locale->db_collprovider, locale->db_encoding,
datcollate_literal, locale->db_collprovider,
datctype_literal, datcollate_literal,
daticulocale_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(datcollate_literal);
PQfreemem(datctype_literal); PQfreemem(datctype_literal);

View File

@ -110,8 +110,12 @@ my $original_encoding = "6"; # UTF-8
my $original_provider = "c"; my $original_provider = "c";
my $original_collate = "C"; my $original_collate = "C";
my $original_iculocale = ""; 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') if ($oldnode->pg_version >= 15 && $ENV{with_icu} eq 'yes')
{ {
$provider_field = "datlocprovider";
$iculocale_field = "daticulocale";
$original_provider = "i"; $original_provider = "i";
$original_iculocale = "fr-CA"; $original_iculocale = "fr-CA";
} }
@ -132,8 +136,8 @@ $oldnode->start;
my $result; my $result;
$result = $oldnode->safe_psql( $result = $oldnode->safe_psql(
'postgres', q{SELECT encoding, datlocprovider, datcollate, daticulocale 'postgres', "SELECT encoding, $provider_field, datcollate, $iculocale_field
FROM pg_database WHERE datname='template0'}); FROM pg_database WHERE datname='template0'");
is($result, "$original_encoding|$original_provider|$original_collate|$original_iculocale", is($result, "$original_encoding|$original_provider|$original_collate|$original_iculocale",
"check locales in original cluster" "check locales in original cluster"
); );
@ -395,8 +399,8 @@ if (-d $log_path)
# Test that upgraded cluster has original locale settings. # Test that upgraded cluster has original locale settings.
$result = $newnode->safe_psql( $result = $newnode->safe_psql(
'postgres', q{SELECT encoding, datlocprovider, datcollate, datctype, daticulocale 'postgres', "SELECT encoding, $provider_field, datcollate, datctype, $iculocale_field
FROM pg_database WHERE datname='template0'}); FROM pg_database WHERE datname='template0'");
is($result, "$original_encoding|$original_provider|$original_collate|$original_ctype|$original_iculocale", is($result, "$original_encoding|$original_provider|$original_collate|$original_ctype|$original_iculocale",
"check that locales in new cluster match original cluster" "check that locales in new cluster match original cluster"
); );