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_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");

View File

@ -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);

View File

@ -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"
);