diff --git a/contrib/pg_upgrade/info.c b/contrib/pg_upgrade/info.c new file mode 100644 index 2250442..5cb9b61 *** a/contrib/pg_upgrade/info.c --- b/contrib/pg_upgrade/info.c *************** static void get_db_infos(ClusterInfo *cl *** 23,29 **** static void get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo); static void free_rel_infos(RelInfoArr *rel_arr); static void print_db_infos(DbInfoArr *dbinfo); ! static void print_rel_infos(RelInfoArr *arr); /* --- 23,29 ---- static void get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo); static void free_rel_infos(RelInfoArr *rel_arr); static void print_db_infos(DbInfoArr *dbinfo); ! static void print_rel_infos(RelInfoArr *rel_arr); /* *************** create_rel_filename_map(const char *old_ *** 127,134 **** map->new_relfilenode = new_rel->relfilenode; /* used only for logging and error reporing, old/new are identical */ ! snprintf(map->nspname, sizeof(map->nspname), "%s", old_rel->nspname); ! snprintf(map->relname, sizeof(map->relname), "%s", old_rel->relname); } --- 127,134 ---- map->new_relfilenode = new_rel->relfilenode; /* used only for logging and error reporing, old/new are identical */ ! map->nspname = old_rel->nspname; ! map->relname = old_rel->relname; } *************** get_db_infos(ClusterInfo *cluster) *** 220,227 **** for (tupnum = 0; tupnum < ntups; tupnum++) { dbinfos[tupnum].db_oid = atooid(PQgetvalue(res, tupnum, i_oid)); ! snprintf(dbinfos[tupnum].db_name, sizeof(dbinfos[tupnum].db_name), "%s", ! PQgetvalue(res, tupnum, i_datname)); snprintf(dbinfos[tupnum].db_tblspace, sizeof(dbinfos[tupnum].db_tblspace), "%s", PQgetvalue(res, tupnum, i_spclocation)); } --- 220,226 ---- for (tupnum = 0; tupnum < ntups; tupnum++) { dbinfos[tupnum].db_oid = atooid(PQgetvalue(res, tupnum, i_oid)); ! dbinfos[tupnum].db_name = pg_strdup(PQgetvalue(res, tupnum, i_datname)); snprintf(dbinfos[tupnum].db_tblspace, sizeof(dbinfos[tupnum].db_tblspace), "%s", PQgetvalue(res, tupnum, i_spclocation)); } *************** get_rel_infos(ClusterInfo *cluster, DbIn *** 346,355 **** curr->reloid = atooid(PQgetvalue(res, relnum, i_oid)); nspname = PQgetvalue(res, relnum, i_nspname); ! strlcpy(curr->nspname, nspname, sizeof(curr->nspname)); relname = PQgetvalue(res, relnum, i_relname); ! strlcpy(curr->relname, relname, sizeof(curr->relname)); curr->relfilenode = atooid(PQgetvalue(res, relnum, i_relfilenode)); --- 345,354 ---- curr->reloid = atooid(PQgetvalue(res, relnum, i_oid)); nspname = PQgetvalue(res, relnum, i_nspname); ! curr->nspname = pg_strdup(nspname); relname = PQgetvalue(res, relnum, i_relname); ! curr->relname = pg_strdup(relname); curr->relfilenode = atooid(PQgetvalue(res, relnum, i_relfilenode)); *************** free_db_and_rel_infos(DbInfoArr *db_arr) *** 377,383 **** --- 376,385 ---- int dbnum; for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++) + { free_rel_infos(&db_arr->dbs[dbnum].rel_arr); + pg_free(db_arr->dbs[dbnum].db_name); + } pg_free(db_arr->dbs); db_arr->dbs = NULL; db_arr->ndbs = 0; *************** free_db_and_rel_infos(DbInfoArr *db_arr) *** 387,392 **** --- 389,401 ---- static void free_rel_infos(RelInfoArr *rel_arr) { + int relnum; + + for (relnum = 0; relnum < rel_arr->nrels; relnum++) + { + pg_free(rel_arr->rels[relnum].nspname); + pg_free(rel_arr->rels[relnum].relname); + } pg_free(rel_arr->rels); rel_arr->nrels = 0; } *************** print_db_infos(DbInfoArr *db_arr) *** 407,418 **** static void ! print_rel_infos(RelInfoArr *arr) { int relnum; ! for (relnum = 0; relnum < arr->nrels; relnum++) pg_log(PG_VERBOSE, "relname: %s.%s: reloid: %u reltblspace: %s\n", ! arr->rels[relnum].nspname, arr->rels[relnum].relname, ! arr->rels[relnum].reloid, arr->rels[relnum].tablespace); } --- 416,427 ---- static void ! print_rel_infos(RelInfoArr *rel_arr) { int relnum; ! for (relnum = 0; relnum < rel_arr->nrels; relnum++) pg_log(PG_VERBOSE, "relname: %s.%s: reloid: %u reltblspace: %s\n", ! rel_arr->rels[relnum].nspname, rel_arr->rels[relnum].relname, ! rel_arr->rels[relnum].reloid, rel_arr->rels[relnum].tablespace); } diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h new file mode 100644 index 972e8e9..cae1e46 *** a/contrib/pg_upgrade/pg_upgrade.h --- b/contrib/pg_upgrade/pg_upgrade.h *************** extern char *output_files[]; *** 114,121 **** */ typedef struct { ! char nspname[NAMEDATALEN]; /* namespace name */ ! char relname[NAMEDATALEN]; /* relation name */ Oid reloid; /* relation oid */ Oid relfilenode; /* relation relfile node */ /* relation tablespace path, or "" for the cluster default */ --- 114,122 ---- */ typedef struct { ! /* Can't use NAMEDATALEN; not guaranteed to fit on client */ ! char *nspname; /* namespace name */ ! char *relname; /* relation name */ Oid reloid; /* relation oid */ Oid relfilenode; /* relation relfile node */ /* relation tablespace path, or "" for the cluster default */ *************** typedef struct *** 143,150 **** Oid old_relfilenode; Oid new_relfilenode; /* the rest are used only for logging and error reporting */ ! char nspname[NAMEDATALEN]; /* namespaces */ ! char relname[NAMEDATALEN]; } FileNameMap; /* --- 144,151 ---- Oid old_relfilenode; Oid new_relfilenode; /* the rest are used only for logging and error reporting */ ! char *nspname; /* namespaces */ ! char *relname; } FileNameMap; /* *************** typedef struct *** 153,159 **** typedef struct { Oid db_oid; /* oid of the database */ ! char db_name[NAMEDATALEN]; /* database name */ char db_tblspace[MAXPGPATH]; /* database default tablespace path */ RelInfoArr rel_arr; /* array of all user relinfos */ } DbInfo; --- 154,160 ---- typedef struct { Oid db_oid; /* oid of the database */ ! char *db_name; /* database name */ char db_tblspace[MAXPGPATH]; /* database default tablespace path */ RelInfoArr rel_arr; /* array of all user relinfos */ } DbInfo; diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c new file mode 100644 index 40740dc..3e05ac3 *** a/src/bin/initdb/initdb.c --- b/src/bin/initdb/initdb.c *************** setup_collation(void) *** 1836,1842 **** #if defined(HAVE_LOCALE_T) && !defined(WIN32) int i; FILE *locale_a_handle; ! char localebuf[NAMEDATALEN]; int count = 0; PG_CMD_DECL; --- 1836,1842 ---- #if defined(HAVE_LOCALE_T) && !defined(WIN32) int i; FILE *locale_a_handle; ! char localebuf[NAMEDATALEN]; /* we assume ASCII so this is fine */ int count = 0; PG_CMD_DECL;