On Thu, Jul 3, 2014 at 05:09:41PM -0400, Tom Lane wrote:
> Bruce Momjian <[email protected]> writes:
> > I have had trouble getting a table schema that is causing problems, but
> > received a report via EDB support recently that had a simple schema
> > (anonymized):
> > ...
> > needs_toast_table() computes the length of this table as 2024 bytes in
> > 9.0, and 2064 bytes on 9.1, with the TOAST threshold being 2032 bytes.
>
> > My initial idea is to to allow for toast tables in the new cluster that
> > aren't in the old cluster by skipping over the extra toast tables. This
> > would only be for pre-9.1 old clusters.
>
> TBH, it has never been more than the shakiest of assumptions that the new
> version could not create toast tables where the old one hadn't. I think
> you should just allow for that case, independently of specific PG
> versions. Fortunately it seems easy enough, since you certainly don't
> need to put any data into the new toast tables.
OK, patch attached.
--
Bruce Momjian <[email protected]> http://momjian.us
EnterpriseDB http://enterprisedb.com
+ Everyone has their own god. +
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;
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers