Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix 9637badd9f.
authorJeff Davis <jdavis@postgresql.org>
Thu, 9 Mar 2023 17:32:24 +0000 (09:32 -0800)
committerJeff Davis <jdavis@postgresql.org>
Thu, 9 Mar 2023 18:26:47 +0000 (10:26 -0800)
Discussion: https://postgr.es/m/0a364430-266e-1e1a-d5d8-1a5273c9ddb6@dunslane.net
Reported-by: Andrew Dunstan
src/bin/pg_upgrade/info.c
src/bin/pg_upgrade/pg_upgrade.c
src/bin/pg_upgrade/t/002_pg_upgrade.pl

index 33b10aac3c96e1bfec57a33c2d2a55ddce37839c..85ed15ae4adba02cba9c0a68bd01270d540e7d61 100644 (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");
index 8c6009151fe0063fabe98e4ac58cbef2624b0f23..4fca466ace0f65a93cff561ddf31dbb4776fa646 100644 (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);
index a6a0162d5ad5dbb308eff82f69e75d7cf2ab7e05..1b5df730e99d4cf03af5cb39441412df2e31deff 100644 (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"
    );