diff options
author | Daniel Gustafsson <dgustafsson@postgresql.org> | 2022-12-02 13:10:21 +0100 |
---|---|---|
committer | Daniel Gustafsson <dgustafsson@postgresql.org> | 2022-12-02 13:10:21 +0100 |
commit | c76da690ba141160d23cae715922932b7efa5b23 (patch) | |
tree | 26e3b3ea251b9bcae2da916f5f6a6b66dee85c24 | |
parent | ab810062991295f63612a997e872232a6f1a3ef6 (diff) | |
download | postgresql-c76da690ba141160d23cae715922932b7efa5b23.tar.gz postgresql-c76da690ba141160d23cae715922932b7efa5b23.zip |
Report incompatible roles in pg_upgrade checking
When checking for roles with a pg_ prefix in <= 9.5 servers, report
all found roles in a text file as how other checks are done instead
of just reporting that they exist. Rolenames are printed with their
Oids to match other reports.
Author: Daniel Gustafsson <daniel@yesql.se>
Reviewed-by: Bruce Momjian <bruce@momjian.us>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/4BB2735C-C347-4CF7-AFB1-8573BE930066@yesql.se
-rw-r--r-- | src/bin/pg_upgrade/check.c | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index 615a53a8648..d4a3691438e 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -1395,27 +1395,52 @@ check_for_pg_role_prefix(ClusterInfo *cluster) { PGresult *res; PGconn *conn = connectToServer(cluster, "template1"); + int ntups; + int i_roloid; + int i_rolname; + FILE *script = NULL; + char output_path[MAXPGPATH]; prep_status("Checking for roles starting with \"pg_\""); + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, + "pg_role_prefix.txt"); + res = executeQueryOrDie(conn, - "SELECT * " + "SELECT oid AS roloid, rolname " "FROM pg_catalog.pg_roles " "WHERE rolname ~ '^pg_'"); - if (PQntuples(res) != 0) + ntups = PQntuples(res); + i_roloid = PQfnumber(res, "roloid"); + i_rolname = PQfnumber(res, "rolname"); + for (int rowno = 0; rowno < ntups; rowno++) { - if (cluster == &old_cluster) - pg_fatal("The source cluster contains roles starting with \"pg_\""); - else - pg_fatal("The target cluster contains roles starting with \"pg_\""); + if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) + pg_fatal("could not open file \"%s\": %s", + output_path, strerror(errno)); + fprintf(script, "%s (oid=%s)\n", + PQgetvalue(res, rowno, i_rolname), + PQgetvalue(res, rowno, i_roloid)); } PQclear(res); PQfinish(conn); - check_ok(); + if (script) + { + fclose(script); + pg_log(PG_REPORT, "fatal"); + pg_fatal("Your installation contains roles starting with \"pg_\".\n" + "\"pg_\" is a reserved prefix for system roles, the cluster\n" + "cannot be upgraded until these roles are renamed.\n" + "A list of roles starting with \"pg_\" is in the file:\n" + " %s", output_path); + } + else + check_ok(); } /* |