diff --git a/contrib/pg_upgrade/info.c b/contrib/pg_upgrade/info.c
new file mode 100644
index 6205c74..17e4d5b
*** a/contrib/pg_upgrade/info.c
--- b/contrib/pg_upgrade/info.c
*************** gen_db_file_maps(DbInfo *old_db, DbInfo
*** 38,58 ****
  				 int *nmaps, const char *old_pgdata, const char *new_pgdata)
  {
  	FileNameMap *maps;
! 	int			relnum;
  	int			num_maps = 0;
  
  	maps = (FileNameMap *) pg_malloc(sizeof(FileNameMap) *
  									 old_db->rel_arr.nrels);
  
! 	for (relnum = 0; relnum < Min(old_db->rel_arr.nrels, new_db->rel_arr.nrels);
! 		 relnum++)
  	{
! 		RelInfo    *old_rel = &old_db->rel_arr.rels[relnum];
! 		RelInfo    *new_rel = &new_db->rel_arr.rels[relnum];
  
  		if (old_rel->reloid != new_rel->reloid)
! 			pg_fatal("Mismatch of relation OID in database \"%s\": old OID %d, new OID %d\n",
! 					 old_db->db_name, old_rel->reloid, new_rel->reloid);
  
  		/*
  		 * TOAST table names initially match the heap pg_class oid. In
--- 38,85 ----
  				 int *nmaps, const char *old_pgdata, const char *new_pgdata)
  {
  	FileNameMap *maps;
! 	int			old_relnum, new_relnum;
  	int			num_maps = 0;
  
  	maps = (FileNameMap *) pg_malloc(sizeof(FileNameMap) *
  									 old_db->rel_arr.nrels);
  
! 	/*
! 	 * The old database shouldn't have more relations than the new one.
! 	 * We force the new cluster to have a TOAST table if the old table
! 	 * had one.
! 	 */
! 	if (old_db->rel_arr.nrels > new_db->rel_arr.nrels)
! 		pg_fatal("old and new databases \"%s\" have a mismatched number of relations\n",
! 				 old_db->db_name);
! 
! 	/* Drive the loop using new_relnum, which might be higher. */
! 	for (old_relnum = new_relnum = 0; new_relnum < new_db->rel_arr.nrels;
! 		 new_relnum++)
  	{
! 		RelInfo    *old_rel = &old_db->rel_arr.rels[old_relnum];
! 		RelInfo    *new_rel = &new_db->rel_arr.rels[new_relnum];
! 
  
  		if (old_rel->reloid != new_rel->reloid)
! 		{
! 			if (strcmp(new_rel->nspname, "pg_toast") == 0)
! 				/*
! 				 * It is possible that the new cluster has a TOAST table
! 				 * for a table that didn't need one in the old cluster,
! 				 * e.g. 9.0 to 9.1 changed the NUMERIC length computation.
! 				 * Therefore, if we have a TOAST table in the new cluster
! 				 * that doesn't match, skip over it and continue processing.
! 				 * It is possible this TOAST table used an OID that was
! 				 * reserved in the old cluster, but we have no way of
! 				 * testing that, and we would have already gotten an error
! 				 * at the new cluster schema creation stage.
! 				 */
! 				continue;
! 			else
! 				pg_fatal("Mismatch of relation OID in database \"%s\": old OID %d, new OID %d\n",
! 						 old_db->db_name, old_rel->reloid, new_rel->reloid);
! 		}
  
  		/*
  		 * TOAST table names initially match the heap pg_class oid. In
*************** gen_db_file_maps(DbInfo *old_db, DbInfo
*** 76,89 ****
  		create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
  								old_rel, new_rel, maps + num_maps);
  		num_maps++;
  	}
  
! 	/*
! 	 * Do this check after the loop so hopefully we will produce a clearer
! 	 * error above
! 	 */
! 	if (old_db->rel_arr.nrels != new_db->rel_arr.nrels)
! 		pg_fatal("old and new databases \"%s\" have a different number of relations\n",
  				 old_db->db_name);
  
  	*nmaps = num_maps;
--- 103,114 ----
  		create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
  								old_rel, new_rel, maps + num_maps);
  		num_maps++;
+ 		old_relnum++;
  	}
  
! 	/* Did we fail to exhaust the old array? */
! 	if (old_relnum != old_db->rel_arr.nrels)
! 		pg_fatal("old and new databases \"%s\" have a mismatched number of relations\n",
  				 old_db->db_name);
  
  	*nmaps = num_maps;
