I have applied the attached patch to clean up pg_upgrade cache lookup
code and remove useless NULL pointer tests.
--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com
+ It's impossible for everything to be true. +
diff --git a/contrib/pg_upgrade/info.c b/contrib/pg_upgrade/info.c
index 257f5a8..67528b0 100644
*** a/contrib/pg_upgrade/info.c
--- b/contrib/pg_upgrade/info.c
*************** gen_db_file_maps(DbInfo *old_db, DbInfo
*** 74,81 ****
num_maps++;
/*
! * so much for the mapping of this relation. Now we need a mapping for
! * its corresponding toast relation if any.
*/
if (oldrel->toastrelid > 0)
{
--- 74,81 ----
num_maps++;
/*
! * So much for mapping this relation; now we need a mapping
! * for its corresponding toast relation, if any.
*/
if (oldrel->toastrelid > 0)
{
*************** gen_db_file_maps(DbInfo *old_db, DbInfo
*** 117,122 ****
--- 117,123 ----
newrel->reloid);
/* look them up in their respective arrays */
+ /* we lose our cache location here */
old_toast = relarr_lookup_rel(&old_db->rel_arr,
"pg_toast", old_name, CLUSTER_OLD);
new_toast = relarr_lookup_rel(&new_db->rel_arr,
*************** get_rel_infos(const DbInfo *dbinfo, RelI
*** 385,391 ****
relarr->rels = relinfos;
relarr->nrels = num_rels;
! relarr->cache_name_rel = 0;
}
--- 386,392 ----
relarr->rels = relinfos;
relarr->nrels = num_rels;
! relarr->last_relname_lookup = 0;
}
*************** dbarr_lookup_db(DbInfoArr *db_arr, const
*** 399,407 ****
{
int dbnum;
- if (!db_arr || !db_name)
- return NULL;
-
for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
{
if (strcmp(db_arr->dbs[dbnum].db_name, db_name) == 0)
--- 400,405 ----
*************** relarr_lookup_rel(RelInfoArr *rel_arr, c
*** 424,439 ****
{
int relnum;
- if (!rel_arr || !relname)
- return NULL;
-
/* Test next lookup first, for speed */
! if (rel_arr->cache_name_rel + 1 < rel_arr->nrels &&
! strcmp(rel_arr->rels[rel_arr->cache_name_rel + 1].nspname, nspname) == 0 &&
! strcmp(rel_arr->rels[rel_arr->cache_name_rel + 1].relname, relname) == 0)
{
! rel_arr->cache_name_rel++;
! return &rel_arr->rels[rel_arr->cache_name_rel];
}
for (relnum = 0; relnum < rel_arr->nrels; relnum++)
--- 422,434 ----
{
int relnum;
/* Test next lookup first, for speed */
! if (rel_arr->last_relname_lookup + 1 < rel_arr->nrels &&
! strcmp(rel_arr->rels[rel_arr->last_relname_lookup + 1].nspname, nspname) == 0 &&
! strcmp(rel_arr->rels[rel_arr->last_relname_lookup + 1].relname, relname) == 0)
{
! rel_arr->last_relname_lookup++;
! return &rel_arr->rels[rel_arr->last_relname_lookup];
}
for (relnum = 0; relnum < rel_arr->nrels; relnum++)
*************** relarr_lookup_rel(RelInfoArr *rel_arr, c
*** 441,447 ****
if (strcmp(rel_arr->rels[relnum].nspname, nspname) == 0 &&
strcmp(rel_arr->rels[relnum].relname, relname) == 0)
{
! rel_arr->cache_name_rel = relnum;
return &rel_arr->rels[relnum];
}
}
--- 436,442 ----
if (strcmp(rel_arr->rels[relnum].nspname, nspname) == 0 &&
strcmp(rel_arr->rels[relnum].relname, relname) == 0)
{
! rel_arr->last_relname_lookup = relnum;
return &rel_arr->rels[relnum];
}
}
*************** relarr_lookup_reloid(RelInfoArr *rel_arr
*** 464,472 ****
{
int relnum;
- if (!rel_arr || !oid)
- return NULL;
-
for (relnum = 0; relnum < rel_arr->nrels; relnum++)
{
if (rel_arr->rels[relnum].reloid == oid)
--- 459,464 ----
*************** relarr_free(RelInfoArr *rel_arr)
*** 483,489 ****
{
pg_free(rel_arr->rels);
rel_arr->nrels = 0;
! rel_arr->cache_name_rel = 0;
}
--- 475,481 ----
{
pg_free(rel_arr->rels);
rel_arr->nrels = 0;
! rel_arr->last_relname_lookup = 0;
}
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
index e40f58d..439c0a7 100644
*** a/contrib/pg_upgrade/pg_upgrade.h
--- b/contrib/pg_upgrade/pg_upgrade.h
*************** typedef struct
*** 78,84 ****
{
RelInfo *rels;
int nrels;
! int cache_name_rel; /* cache of last lookup location */
} RelInfoArr;
/*
--- 78,84 ----
{
RelInfo *rels;
int nrels;
! int last_relname_lookup; /* cache of last lookup location */
} RelInfoArr;
/*