static void set_locale_and_encoding(ClusterInfo *cluster);
 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_is_super_user(ClusterInfo *cluster);
 
    check_new_cluster_is_empty();
    check_for_prepared_transactions(&new_cluster);
-   check_old_cluster_has_new_cluster_dbs();
 
    check_loadable_libraries();
 
 }
 
 
-/*
- * 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.  We would detect this as a database count mismatch during
- * upgrade, but we want to detect it during the check phase and report
- * the database name.
- */
-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)
-       {
-           if (strcmp(new_cluster.dbarr.dbs[new_dbnum].db_name, "postgres") == 0)
-               pg_log(PG_FATAL, "The \"postgres\" database must exist in the old cluster\n");
-           else
-               pg_log(PG_FATAL, "New cluster database \"%s\" does not exist in the old cluster\n",
-                      new_cluster.dbarr.dbs[new_dbnum].db_name);
-       }
-   }
-}
-
-
 /*
  * create_script_for_old_cluster_deletion()
  *
                fprintf(script, RM_CMD " %s%s/PG_VERSION\n",
                 os_info.tablespaces[tblnum], old_cluster.tablespace_suffix);
 
-           for (dbnum = 0; dbnum < new_cluster.dbarr.ndbs; dbnum++)
+           for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
            {
                fprintf(script, RMDIR_CMD " %s%s/%d\n",
                  os_info.tablespaces[tblnum], old_cluster.tablespace_suffix,
 
 transfer_all_new_dbs(DbInfoArr *old_db_arr,
                   DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata)
 {
-   int         dbnum;
+   int         old_dbnum, new_dbnum;
    const char *msg = NULL;
 
    prep_status("Restoring user relation files\n");
 
-   if (old_db_arr->ndbs != new_db_arr->ndbs)
-       pg_log(PG_FATAL, "old and new clusters have a different number of databases\n");
-
-   for (dbnum = 0; dbnum < old_db_arr->ndbs; dbnum++)
+   /* Scan the old cluster databases and transfer their files */
+   for (old_dbnum = new_dbnum = 0;
+        old_dbnum < old_db_arr->ndbs && new_dbnum < new_db_arr->ndbs;
+        old_dbnum++, new_dbnum++)
    {
-       DbInfo     *old_db = &old_db_arr->dbs[dbnum];
-       DbInfo     *new_db = &new_db_arr->dbs[dbnum];
+       DbInfo     *old_db = &old_db_arr->dbs[old_dbnum];
+       DbInfo     *new_db = &new_db_arr->dbs[new_dbnum];
        FileNameMap *mappings;
        int         n_maps;
        pageCnvCtx *pageConverter = NULL;
 
+       /*
+        *  Advance past any databases that exist in the new cluster
+        *  but not in the old, e.g. "postgres".
+        */
+       while (strcmp(old_db->db_name, new_db->db_name) != 0 &&
+              new_dbnum < new_db_arr->ndbs)
+           new_db = &new_db_arr->dbs[++new_dbnum];
+
        if (strcmp(old_db->db_name, new_db->db_name) != 0)
            pg_log(PG_FATAL, "old and new databases have different names: old \"%s\", new \"%s\"\n",
                   old_db->db_name, new_db->db_name);