pg_upgrade: warn about extensions that need updating
authorBruce Momjian <[email protected]>
Tue, 3 Aug 2021 15:58:14 +0000 (11:58 -0400)
committerBruce Momjian <[email protected]>
Tue, 3 Aug 2021 15:58:14 +0000 (11:58 -0400)
Also create a script that can be run to update them.

Reported-by: Dave Cramer
Discussion: https://postgr.es/m/CADK3HHKawwbOcGwMGnDuAf3-U8YfvTcS8jqDv3UM=niijs3MMA@mail.gmail.com

Backpatch-through: 9.6

src/bin/pg_upgrade/check.c
src/bin/pg_upgrade/pg_upgrade.h
src/bin/pg_upgrade/version.c

index d4f84915b44af8bb0d739bf99c9e510fd30fd450..09376a62f16398dbb804bfd61495112cf18ea608 100644 (file)
@@ -183,6 +183,8 @@ issue_warnings_and_set_wal_level(void)
    if (GET_MAJOR_VERSION(old_cluster.major_version) <= 804)
        new_9_0_populate_pg_largeobject_metadata(&new_cluster, false);
 
+   report_extension_updates(&new_cluster);
+
    stop_postmaster(false);
 }
 
index a7f6e4920e81e3da5c57402d9f434bdbd65f8e5e..e03ae1eb2b535c926f0b8a30efa4596d0364f4a8 100644 (file)
@@ -451,6 +451,7 @@ bool        check_for_data_type_usage(ClusterInfo *cluster,
 void new_9_0_populate_pg_largeobject_metadata(ClusterInfo *cluster,
                                         bool check_mode);
 void       old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster);
+void       report_extension_updates(ClusterInfo *cluster);
 
 /* parallel.c */
 void parallel_exec_prog(const char *log_file, const char *opt_log_file,
index 422ec65e4efa653cb88462f164ee2542a1bb8e4c..ffdafb8c0973c850eb4f5c6f93e353024c74a043 100644 (file)
@@ -289,3 +289,81 @@ old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster)
    else
        check_ok();
 }
+
+
+/*
+ * report_extension_updates()
+ * Report extensions that should be updated.
+ */
+void
+report_extension_updates(ClusterInfo *cluster)
+{
+   int         dbnum;
+   FILE       *script = NULL;
+   bool        found = false;
+   char       *output_path = "update_extensions.sql";
+
+   prep_status("Checking for extension updates");
+
+   for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+   {
+       PGresult   *res;
+       bool        db_used = false;
+       int         ntups;
+       int         rowno;
+       int         i_name;
+       DbInfo     *active_db = &cluster->dbarr.dbs[dbnum];
+       PGconn     *conn = connectToServer(cluster, active_db->db_name);
+
+       /* find hash indexes */
+       res = executeQueryOrDie(conn,
+                               "SELECT name "
+                               "FROM pg_available_extensions "
+                               "WHERE installed_version != default_version"
+           );
+
+       ntups = PQntuples(res);
+       i_name = PQfnumber(res, "name");
+       for (rowno = 0; rowno < ntups; rowno++)
+       {
+           found = true;
+
+           if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+               pg_fatal("could not open file \"%s\": %s\n", output_path,
+                        strerror(errno));
+           if (!db_used)
+           {
+               PQExpBufferData connectbuf;
+
+               initPQExpBuffer(&connectbuf);
+               appendPsqlMetaConnect(&connectbuf, active_db->db_name);
+               fputs(connectbuf.data, script);
+               termPQExpBuffer(&connectbuf);
+               db_used = true;
+           }
+           fprintf(script, "ALTER EXTENSION %s UPDATE;\n",
+                   quote_identifier(PQgetvalue(res, rowno, i_name)));
+       }
+
+       PQclear(res);
+
+       PQfinish(conn);
+   }
+
+   if (script)
+       fclose(script);
+
+   if (found)
+   {
+       report_status(PG_REPORT, "notice");
+       pg_log(PG_REPORT, "\n"
+              "Your installation contains extensions that should be updated\n"
+              "with the ALTER EXTENSION command.  The file\n"
+              "    %s\n"
+              "when executed by psql by the database superuser will update\n"
+              "these extensions.\n\n",
+              output_path);
+   }
+   else
+       check_ok();
+}