@@ -66,7 +66,7 @@ gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
6666if (strcmp (newrel -> nspname ,"pg_toast" )== 0 )
6767continue ;
6868
69- oldrel = relarr_lookup_rel (& ( old_db -> rel_arr ) ,newrel -> nspname ,
69+ oldrel = relarr_lookup_rel (& old_db -> rel_arr ,newrel -> nspname ,
7070newrel -> relname ,CLUSTER_OLD );
7171
7272map_rel (oldrel ,newrel ,old_db ,new_db ,old_pgdata ,new_pgdata ,
@@ -275,7 +275,7 @@ get_db_and_rel_infos(DbInfoArr *db_arr, Cluster whichCluster)
275275
276276for (dbnum = 0 ;dbnum < db_arr -> ndbs ;dbnum ++ )
277277get_rel_infos (& db_arr -> dbs [dbnum ],
278- & ( db_arr -> dbs [dbnum ].rel_arr ) ,whichCluster );
278+ & db_arr -> dbs [dbnum ].rel_arr ,whichCluster );
279279
280280if (log .debug )
281281dbarr_print (db_arr ,whichCluster );
@@ -292,8 +292,7 @@ get_db_and_rel_infos(DbInfoArr *db_arr, Cluster whichCluster)
292292 * FirstNormalObjectId belongs to the user
293293 */
294294static void
295- get_rel_infos (const DbInfo * dbinfo ,
296- RelInfoArr * relarr ,Cluster whichCluster )
295+ get_rel_infos (const DbInfo * dbinfo ,RelInfoArr * relarr ,Cluster whichCluster )
297296{
298297PGconn * conn = connectToServer (dbinfo -> db_name ,whichCluster );
299298PGresult * res ;
@@ -386,6 +385,7 @@ get_rel_infos(const DbInfo *dbinfo,
386385
387386relarr -> rels = relinfos ;
388387relarr -> nrels = num_rels ;
388+ relarr -> cache_name_rel = 0 ;
389389}
390390
391391
@@ -419,31 +419,31 @@ dbarr_lookup_db(DbInfoArr *db_arr, const char *db_name)
419419 * RelInfo structure.
420420 */
421421static RelInfo *
422- relarr_lookup_rel (RelInfoArr * rel_arr ,
423- const char * nspname ,const char * relname ,
424- Cluster whichCluster )
422+ relarr_lookup_rel (RelInfoArr * rel_arr ,const char * nspname ,
423+ const char * relname ,Cluster whichCluster )
425424{
426- static int relnum = 0 ;
425+ int relnum ;
427426
428427if (!rel_arr || !relname )
429428return NULL ;
430429
431- /* Test most recent lookup first, for speed */
432- if (relnum < rel_arr -> nrels &&
433- strcmp (rel_arr -> rels [relnum ].nspname ,nspname )== 0 &&
434- strcmp (rel_arr -> rels [relnum ].relname ,relname )== 0 )
435- return & rel_arr -> rels [relnum ];
436-
437- if (relnum + 1 < rel_arr -> nrels &&
438- strcmp (rel_arr -> rels [relnum + 1 ].nspname ,nspname )== 0 &&
439- strcmp (rel_arr -> rels [relnum + 1 ].relname ,relname )== 0 )
440- return & rel_arr -> rels [relnum + 1 ];
441-
430+ /* Test next lookup first, for speed */
431+ if (rel_arr -> cache_name_rel + 1 < rel_arr -> nrels &&
432+ strcmp (rel_arr -> rels [rel_arr -> cache_name_rel + 1 ].nspname ,nspname )== 0 &&
433+ strcmp (rel_arr -> rels [rel_arr -> cache_name_rel + 1 ].relname ,relname )== 0 )
434+ {
435+ rel_arr -> cache_name_rel ++ ;
436+ return & rel_arr -> rels [rel_arr -> cache_name_rel ];
437+ }
438+
442439for (relnum = 0 ;relnum < rel_arr -> nrels ;relnum ++ )
443440{
444441if (strcmp (rel_arr -> rels [relnum ].nspname ,nspname )== 0 &&
445442strcmp (rel_arr -> rels [relnum ].relname ,relname )== 0 )
443+ {
444+ rel_arr -> cache_name_rel = relnum ;
446445return & rel_arr -> rels [relnum ];
446+ }
447447}
448448pg_log (PG_FATAL ,"Could not find %s.%s in %s cluster\n" ,
449449nspname ,relname ,CLUSTERNAME (whichCluster ));
@@ -483,6 +483,7 @@ relarr_free(RelInfoArr *rel_arr)
483483{
484484pg_free (rel_arr -> rels );
485485rel_arr -> nrels = 0 ;
486+ rel_arr -> cache_name_rel = 0 ;
486487}
487488
488489