From a81c71e3a830aecdfea7a53ae75781e50ba66018 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 3 Aug 2021 11:58:15 -0400 Subject: [PATCH] pg_upgrade: warn about extensions that need updating 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 | 2 + src/bin/pg_upgrade/pg_upgrade.h | 1 + src/bin/pg_upgrade/version.c | 78 +++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index 7de610b758..3633737006 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -223,6 +223,8 @@ issue_warnings_and_set_wal_level(void) if (GET_MAJOR_VERSION(old_cluster.major_version) <= 906) old_9_6_invalidate_hash_indexes(&new_cluster, false); + report_extension_updates(&new_cluster); + stop_postmaster(false); } diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h index f08b90bfbd..ddd510a24f 100644 --- a/src/bin/pg_upgrade/pg_upgrade.h +++ b/src/bin/pg_upgrade/pg_upgrade.h @@ -457,6 +457,7 @@ void old_9_6_invalidate_hash_indexes(ClusterInfo *cluster, bool check_mode); void old_11_check_for_sql_identifier_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, diff --git a/src/bin/pg_upgrade/version.c b/src/bin/pg_upgrade/version.c index bda11664c5..90787149e6 100644 --- a/src/bin/pg_upgrade/version.c +++ b/src/bin/pg_upgrade/version.c @@ -466,3 +466,81 @@ old_11_check_for_sql_identifier_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(); +}