From ee646df59ae76d14f76e6fd305c1f9f2eeafd682 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 4 Aug 2014 11:56:16 -0400 Subject: [PATCH] pg_upgrade: assume user is install user The user specified to the upgrade was effectively the install user, but that was not clearly stated in the comments, documentation, or error messages. --- contrib/pg_upgrade/check.c | 51 ++++++++++++++++----------------- contrib/pg_upgrade/pg_upgrade.h | 2 -- doc/src/sgml/pgupgrade.sgml | 2 +- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c index 79b6c3caee..b216e61a4e 100644 --- a/contrib/pg_upgrade/check.c +++ b/contrib/pg_upgrade/check.c @@ -9,6 +9,7 @@ #include "postgres_fe.h" +#include "catalog/pg_authid.h" #include "mb/pg_wchar.h" #include "pg_upgrade.h" @@ -19,7 +20,7 @@ static void check_locale_and_encoding(ControlData *oldctrl, ControlData *newctrl); static bool equivalent_locale(const char *loca, const char *locb); static bool equivalent_encoding(const char *chara, const char *charb); -static void check_is_super_user(ClusterInfo *cluster); +static void check_is_install_user(ClusterInfo *cluster); static void check_for_prepared_transactions(ClusterInfo *cluster); static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster); static void check_for_reg_data_type_usage(ClusterInfo *cluster); @@ -94,7 +95,7 @@ check_and_dump_old_cluster(bool live_check, char **sequence_script_file_name) /* * Check for various failure cases */ - check_is_super_user(&old_cluster); + check_is_install_user(&old_cluster); check_for_prepared_transactions(&old_cluster); check_for_reg_data_type_usage(&old_cluster); check_for_isn_and_int8_passing_mismatch(&old_cluster); @@ -158,22 +159,7 @@ check_new_cluster(void) if (user_opts.transfer_mode == TRANSFER_MODE_LINK) check_hard_link(); - check_is_super_user(&new_cluster); - - /* - * We don't restore our own user, so both clusters must match have - * matching install-user oids. - */ - if (old_cluster.install_role_oid != new_cluster.install_role_oid) - pg_fatal("Old and new cluster install users have different values for pg_authid.oid.\n"); - - /* - * We only allow the install user in the new cluster because other defined - * users might match users defined in the old cluster and generate an - * error during pg_dump restore. - */ - if (new_cluster.role_count != 1) - pg_fatal("Only the install user can be defined in the new cluster.\n"); + check_is_install_user(&new_cluster); check_for_prepared_transactions(&new_cluster); } @@ -698,17 +684,18 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name) /* - * check_is_super_user() + * check_is_install_user() * - * Check we are superuser, and output user id and user count + * Check we are the install user, and that the new cluster + * has no other users. */ static void -check_is_super_user(ClusterInfo *cluster) +check_is_install_user(ClusterInfo *cluster) { PGresult *res; PGconn *conn = connectToServer(cluster, "template1"); - prep_status("Checking database user is a superuser"); + prep_status("Checking database user is the install user"); /* Can't use pg_authid because only superusers can view it. */ res = executeQueryOrDie(conn, @@ -716,12 +703,16 @@ check_is_super_user(ClusterInfo *cluster) "FROM pg_catalog.pg_roles " "WHERE rolname = current_user"); - if (PQntuples(res) != 1 || strcmp(PQgetvalue(res, 0, 0), "t") != 0) - pg_fatal("database user \"%s\" is not a superuser\n", + /* + * We only allow the install user in the new cluster (see comment below) + * and we preserve pg_authid.oid, so this must be the install user in + * the old cluster too. + */ + if (PQntuples(res) != 1 || + atooid(PQgetvalue(res, 0, 1)) != BOOTSTRAP_SUPERUSERID) + pg_fatal("database user \"%s\" is not the install user\n", os_info.user); - cluster->install_role_oid = atooid(PQgetvalue(res, 0, 1)); - PQclear(res); res = executeQueryOrDie(conn, @@ -731,7 +722,13 @@ check_is_super_user(ClusterInfo *cluster) if (PQntuples(res) != 1) pg_fatal("could not determine the number of users\n"); - cluster->role_count = atoi(PQgetvalue(res, 0, 0)); + /* + * We only allow the install user in the new cluster because other defined + * users might match users defined in the old cluster and generate an + * error during pg_dump restore. + */ + if (cluster == &new_cluster && atooid(PQgetvalue(res, 0, 0)) != 1) + pg_fatal("Only the install user can be defined in the new cluster.\n"); PQclear(res); diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h index 0410b02293..61e5de015c 100644 --- a/contrib/pg_upgrade/pg_upgrade.h +++ b/contrib/pg_upgrade/pg_upgrade.h @@ -256,8 +256,6 @@ typedef struct char major_version_str[64]; /* string PG_VERSION of cluster */ uint32 bin_version; /* version returned from pg_ctl */ Oid pg_database_oid; /* OID of pg_database relation */ - Oid install_role_oid; /* OID of connected role */ - Oid role_count; /* number of roles defined in the cluster */ const char *tablespace_suffix; /* directory specification */ } ClusterInfo; diff --git a/doc/src/sgml/pgupgrade.sgml b/doc/src/sgml/pgupgrade.sgml index b5267b69d8..b79f0db7de 100644 --- a/doc/src/sgml/pgupgrade.sgml +++ b/doc/src/sgml/pgupgrade.sgml @@ -164,7 +164,7 @@ username username - cluster's super user name; environment + cluster's install user name; environment variable PGUSER