@@ -21,10 +21,6 @@ static void create_rel_filename_map(const char *old_data, const char *new_data,
2121const DbInfo * old_db ,const DbInfo * new_db ,
2222const RelInfo * old_rel ,const RelInfo * new_rel ,
2323FileNameMap * map );
24- static RelInfo * relarr_lookup_rel_name (ClusterInfo * cluster ,RelInfoArr * rel_arr ,
25- const char * nspname ,const char * relname );
26- static RelInfo * relarr_lookup_rel_oid (ClusterInfo * cluster ,RelInfoArr * rel_arr ,
27- Oid oid );
2824
2925
3026/*
@@ -42,18 +38,22 @@ gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
4238int relnum ;
4339int num_maps = 0 ;
4440
41+ if (old_db -> rel_arr .nrels != new_db -> rel_arr .nrels )
42+ pg_log (PG_FATAL ,"old and new databases \"%s\" have a different number of relations\n" ,
43+ old_db -> db_name );
44+
4545maps = (FileNameMap * )pg_malloc (sizeof (FileNameMap )*
4646old_db -> rel_arr .nrels );
4747
4848for (relnum = 0 ;relnum < old_db -> rel_arr .nrels ;relnum ++ )
4949{
5050RelInfo * old_rel = & old_db -> rel_arr .rels [relnum ];
51- RelInfo * new_rel ;
52-
53- /* old/new relation names always match */
54- new_rel = relarr_lookup_rel_name (& new_cluster ,& new_db -> rel_arr ,
55- old_rel -> nspname ,old_rel -> relname );
51+ RelInfo * new_rel = & old_db -> rel_arr .rels [relnum ];
5652
53+ if (old_rel -> reloid != new_rel -> reloid )
54+ pg_log (PG_FATAL ,"mismatch of relation id: database \"%s\", old relid %d, new relid %d\n" ,
55+ old_db -> db_name ,old_rel -> reloid ,new_rel -> reloid );
56+
5757create_rel_filename_map (old_pgdata ,new_pgdata ,old_db ,new_db ,
5858old_rel ,new_rel ,maps + num_maps );
5959num_maps ++ ;
@@ -153,7 +153,9 @@ get_db_infos(ClusterInfo *cluster)
153153"FROM pg_catalog.pg_database d "
154154" LEFT OUTER JOIN pg_catalog.pg_tablespace t "
155155" ON d.dattablespace = t.oid "
156- "WHERE d.datallowconn = true" );
156+ "WHERE d.datallowconn = true "
157+ /* we don't preserve pg_database.oid so we sort by name */
158+ "ORDER BY 2" );
157159
158160i_datname = PQfnumber (res ,"datname" );
159161i_oid = PQfnumber (res ,"oid" );
@@ -258,7 +260,8 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
258260"GROUP BY c.oid, n.nspname, c.relname, c.relfilenode,"
259261"c.reltoastrelid, t.spclocation, "
260262"n.nspname "
261- "ORDER BY t.spclocation, n.nspname, c.relname;" ,
263+ /* we preserve pg_class.oid so we sort by it to match old/new */
264+ "ORDER BY 1;" ,
262265FirstNormalObjectId ,
263266/* does pg_largeobject_metadata need to be migrated? */
264267 (GET_MAJOR_VERSION (old_cluster .major_version ) <=804 ) ?
@@ -308,86 +311,6 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
308311
309312dbinfo -> rel_arr .rels = relinfos ;
310313dbinfo -> rel_arr .nrels = num_rels ;
311- dbinfo -> rel_arr .last_relname_lookup = 0 ;
312- }
313-
314-
315- /*
316- * dbarr_lookup_db()
317- *
318- * Returns the pointer to the DbInfo structure
319- */
320- DbInfo *
321- dbarr_lookup_db (DbInfoArr * db_arr ,const char * db_name )
322- {
323- int dbnum ;
324-
325- for (dbnum = 0 ;dbnum < db_arr -> ndbs ;dbnum ++ )
326- {
327- if (strcmp (db_arr -> dbs [dbnum ].db_name ,db_name )== 0 )
328- return & db_arr -> dbs [dbnum ];
329- }
330-
331- return NULL ;
332- }
333-
334-
335- /*
336- * relarr_lookup_rel_name()
337- *
338- * Searches "relname" in rel_arr. Returns the *real* pointer to the
339- * RelInfo structure.
340- */
341- static RelInfo *
342- relarr_lookup_rel_name (ClusterInfo * cluster ,RelInfoArr * rel_arr ,
343- const char * nspname ,const char * relname )
344- {
345- int relnum ;
346-
347- /* Test next lookup first, for speed */
348- if (rel_arr -> last_relname_lookup + 1 < rel_arr -> nrels &&
349- strcmp (rel_arr -> rels [rel_arr -> last_relname_lookup + 1 ].nspname ,nspname )== 0 &&
350- strcmp (rel_arr -> rels [rel_arr -> last_relname_lookup + 1 ].relname ,relname )== 0 )
351- {
352- rel_arr -> last_relname_lookup ++ ;
353- return & rel_arr -> rels [rel_arr -> last_relname_lookup ];
354- }
355-
356- for (relnum = 0 ;relnum < rel_arr -> nrels ;relnum ++ )
357- {
358- if (strcmp (rel_arr -> rels [relnum ].nspname ,nspname )== 0 &&
359- strcmp (rel_arr -> rels [relnum ].relname ,relname )== 0 )
360- {
361- rel_arr -> last_relname_lookup = relnum ;
362- return & rel_arr -> rels [relnum ];
363- }
364- }
365- pg_log (PG_FATAL ,"Could not find %s.%s in %s cluster\n" ,
366- nspname ,relname ,CLUSTER_NAME (cluster ));
367- return NULL ;
368- }
369-
370-
371- /*
372- * relarr_lookup_rel_oid()
373- *
374- *Returns a pointer to the RelInfo structure for the
375- *given oid or NULL if the desired entry cannot be
376- *found.
377- */
378- static RelInfo *
379- relarr_lookup_rel_oid (ClusterInfo * cluster ,RelInfoArr * rel_arr ,Oid oid )
380- {
381- int relnum ;
382-
383- for (relnum = 0 ;relnum < rel_arr -> nrels ;relnum ++ )
384- {
385- if (rel_arr -> rels [relnum ].reloid == oid )
386- return & rel_arr -> rels [relnum ];
387- }
388- pg_log (PG_FATAL ,"Could not find %d in %s cluster\n" ,
389- oid ,CLUSTER_NAME (cluster ));
390- return NULL ;
391314}
392315
393316
@@ -396,7 +319,6 @@ free_rel_arr(RelInfoArr *rel_arr)
396319{
397320pg_free (rel_arr -> rels );
398321rel_arr -> nrels = 0 ;
399- rel_arr -> last_relname_lookup = 0 ;
400322}
401323
402324