diff options
Diffstat (limited to 'contrib/pg_upgrade/check.c')
| -rw-r--r-- | contrib/pg_upgrade/check.c | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c index 747244072d4..173b29a2c5f 100644 --- a/contrib/pg_upgrade/check.c +++ b/contrib/pg_upgrade/check.c @@ -11,7 +11,8 @@ static void set_locale_and_encoding(ClusterInfo *cluster); -static void check_new_db_is_empty(void); +static void check_new_cluster_is_empty(void); +static void check_old_cluster_has_new_cluster_dbs(void); static void check_locale_and_encoding(ControlData *oldctrl, ControlData *newctrl); static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster); @@ -112,7 +113,10 @@ check_new_cluster(void) { set_locale_and_encoding(&new_cluster); - check_new_db_is_empty(); + get_db_and_rel_infos(&new_cluster); + + check_new_cluster_is_empty(); + check_old_cluster_has_new_cluster_dbs(); check_loadable_libraries(); @@ -341,12 +345,9 @@ check_locale_and_encoding(ControlData *oldctrl, static void -check_new_db_is_empty(void) +check_new_cluster_is_empty(void) { int dbnum; - bool found = false; - - get_db_and_rel_infos(&new_cluster); for (dbnum = 0; dbnum < new_cluster.dbarr.ndbs; dbnum++) { @@ -358,15 +359,36 @@ check_new_db_is_empty(void) { /* pg_largeobject and its index should be skipped */ if (strcmp(rel_arr->rels[relnum].nspname, "pg_catalog") != 0) - { - found = true; - break; - } + pg_log(PG_FATAL, "New cluster database \"%s\" is not empty\n", + new_cluster.dbarr.dbs[dbnum].db_name); } } - if (found) - pg_log(PG_FATAL, "New cluster is not empty; exiting\n"); +} + + +/* + * If someone removes the 'postgres' database from the old cluster and + * the new cluster has a 'postgres' database, the number of databases + * will not match. We actually could upgrade such a setup, but it would + * violate the 1-to-1 mapping of database counts, so we throw an error + * instead. + */ +static void +check_old_cluster_has_new_cluster_dbs(void) +{ + int old_dbnum, new_dbnum; + + for (new_dbnum = 0; new_dbnum < new_cluster.dbarr.ndbs; new_dbnum++) + { + for (old_dbnum = 0; old_dbnum < old_cluster.dbarr.ndbs; old_dbnum++) + if (strcmp(old_cluster.dbarr.dbs[old_dbnum].db_name, + new_cluster.dbarr.dbs[new_dbnum].db_name) == 0) + break; + if (old_dbnum == old_cluster.dbarr.ndbs) + pg_log(PG_FATAL, "New cluster database \"%s\" does not exist in the old cluster\n", + new_cluster.dbarr.dbs[new_dbnum].db_name); + } } |
