aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Gustafsson <dgustafsson@postgresql.org>2022-12-02 13:10:21 +0100
committerDaniel Gustafsson <dgustafsson@postgresql.org>2022-12-02 13:10:21 +0100
commitc76da690ba141160d23cae715922932b7efa5b23 (patch)
tree26e3b3ea251b9bcae2da916f5f6a6b66dee85c24
parentab810062991295f63612a997e872232a6f1a3ef6 (diff)
downloadpostgresql-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.c39
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();
}
/*