mirror of
https://github.com/postgres/postgres.git
synced 2025-06-08 22:02:03 +03:00
Clarify pg_upgrade's creation of the map file structure. Also clean
up pg_dump's calling of pg_upgrade_support functions.
This commit is contained in:
parent
66a8a0428d
commit
5cff5b5779
@ -33,8 +33,6 @@ static RelInfo *relarr_lookup_rel_oid(ClusterInfo *cluster, RelInfoArr *rel_arr,
|
|||||||
* generates database mappings for "old_db" and "new_db". Returns a malloc'ed
|
* generates database mappings for "old_db" and "new_db". Returns a malloc'ed
|
||||||
* array of mappings. nmaps is a return parameter which refers to the number
|
* array of mappings. nmaps is a return parameter which refers to the number
|
||||||
* mappings.
|
* mappings.
|
||||||
*
|
|
||||||
* NOTE: Its the Caller's responsibility to free the returned array.
|
|
||||||
*/
|
*/
|
||||||
FileNameMap *
|
FileNameMap *
|
||||||
gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
|
gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
|
||||||
@ -45,19 +43,19 @@ gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
|
|||||||
int num_maps = 0;
|
int num_maps = 0;
|
||||||
|
|
||||||
maps = (FileNameMap *) pg_malloc(sizeof(FileNameMap) *
|
maps = (FileNameMap *) pg_malloc(sizeof(FileNameMap) *
|
||||||
new_db->rel_arr.nrels);
|
old_db->rel_arr.nrels);
|
||||||
|
|
||||||
for (relnum = 0; relnum < new_db->rel_arr.nrels; relnum++)
|
for (relnum = 0; relnum < old_db->rel_arr.nrels; relnum++)
|
||||||
{
|
{
|
||||||
RelInfo *newrel = &new_db->rel_arr.rels[relnum];
|
RelInfo *oldrel = &old_db->rel_arr.rels[relnum];
|
||||||
RelInfo *oldrel;
|
RelInfo *newrel;
|
||||||
|
|
||||||
/* toast tables are handled by their parent */
|
/* toast tables are handled by their parents */
|
||||||
if (strcmp(newrel->nspname, "pg_toast") == 0)
|
if (strcmp(oldrel->nspname, "pg_toast") == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
oldrel = relarr_lookup_rel_name(&old_cluster, &old_db->rel_arr,
|
newrel = relarr_lookup_rel_name(&old_cluster, &old_db->rel_arr,
|
||||||
newrel->nspname, newrel->relname);
|
oldrel->nspname, oldrel->relname);
|
||||||
|
|
||||||
create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
|
create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
|
||||||
oldrel, newrel, maps + num_maps);
|
oldrel, newrel, maps + num_maps);
|
||||||
@ -65,52 +63,36 @@ gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* So much for mapping this relation; now we need a mapping
|
* So much for mapping this relation; now we need a mapping
|
||||||
* for its corresponding toast relation, if any.
|
* for its corresponding toast relation and toast index, if any.
|
||||||
*/
|
*/
|
||||||
if (oldrel->toastrelid > 0)
|
if (oldrel->toastrelid > 0)
|
||||||
{
|
{
|
||||||
RelInfo *new_toast;
|
char old_name[MAXPGPATH], new_name[MAXPGPATH];
|
||||||
RelInfo *old_toast;
|
RelInfo *old_toast, *new_toast;
|
||||||
char new_name[MAXPGPATH];
|
|
||||||
char old_name[MAXPGPATH];
|
|
||||||
|
|
||||||
/* construct the new and old relnames for the toast relation */
|
|
||||||
snprintf(old_name, sizeof(old_name), "pg_toast_%u", oldrel->reloid);
|
|
||||||
snprintf(new_name, sizeof(new_name), "pg_toast_%u", newrel->reloid);
|
|
||||||
|
|
||||||
/* look them up in their respective arrays */
|
|
||||||
old_toast = relarr_lookup_rel_oid(&old_cluster, &old_db->rel_arr,
|
old_toast = relarr_lookup_rel_oid(&old_cluster, &old_db->rel_arr,
|
||||||
oldrel->toastrelid);
|
oldrel->toastrelid);
|
||||||
new_toast = relarr_lookup_rel_name(&new_cluster, &new_db->rel_arr,
|
new_toast = relarr_lookup_rel_oid(&new_cluster, &new_db->rel_arr,
|
||||||
"pg_toast", new_name);
|
newrel->toastrelid);
|
||||||
|
|
||||||
/* finally create a mapping for them */
|
|
||||||
create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
|
create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
|
||||||
old_toast, new_toast, maps + num_maps);
|
old_toast, new_toast, maps + num_maps);
|
||||||
num_maps++;
|
num_maps++;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* also need to provide a mapping for the index of this toast
|
* We also need to provide a mapping for the index of this toast
|
||||||
* relation. The procedure is similar to what we did above for
|
* relation. The procedure is similar to what we did above for
|
||||||
* toast relation itself, the only difference being that the
|
* toast relation itself, the only difference being that the
|
||||||
* relnames need to be appended with _index.
|
* relnames need to be appended with _index.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* construct the new and old relnames for the toast index
|
|
||||||
* relations
|
|
||||||
*/
|
|
||||||
snprintf(old_name, sizeof(old_name), "%s_index", old_toast->relname);
|
snprintf(old_name, sizeof(old_name), "%s_index", old_toast->relname);
|
||||||
snprintf(new_name, sizeof(new_name), "pg_toast_%u_index",
|
snprintf(new_name, sizeof(new_name), "%s_index", new_toast->relname);
|
||||||
newrel->reloid);
|
|
||||||
|
|
||||||
/* look them up in their respective arrays */
|
|
||||||
old_toast = relarr_lookup_rel_name(&old_cluster, &old_db->rel_arr,
|
old_toast = relarr_lookup_rel_name(&old_cluster, &old_db->rel_arr,
|
||||||
"pg_toast", old_name);
|
"pg_toast", old_name);
|
||||||
new_toast = relarr_lookup_rel_name(&new_cluster, &new_db->rel_arr,
|
new_toast = relarr_lookup_rel_name(&new_cluster, &new_db->rel_arr,
|
||||||
"pg_toast", new_name);
|
"pg_toast", new_name);
|
||||||
|
|
||||||
/* finally create a mapping for them */
|
|
||||||
create_rel_filename_map(old_pgdata, new_pgdata, old_db,
|
create_rel_filename_map(old_pgdata, new_pgdata, old_db,
|
||||||
new_db, old_toast, new_toast, maps + num_maps);
|
new_db, old_toast, new_toast, maps + num_maps);
|
||||||
num_maps++;
|
num_maps++;
|
||||||
@ -133,15 +115,6 @@ create_rel_filename_map(const char *old_data, const char *new_data,
|
|||||||
const RelInfo *old_rel, const RelInfo *new_rel,
|
const RelInfo *old_rel, const RelInfo *new_rel,
|
||||||
FileNameMap *map)
|
FileNameMap *map)
|
||||||
{
|
{
|
||||||
map->old_relfilenode = old_rel->relfilenode;
|
|
||||||
map->new_relfilenode = new_rel->relfilenode;
|
|
||||||
|
|
||||||
snprintf(map->old_nspname, sizeof(map->old_nspname), "%s", old_rel->nspname);
|
|
||||||
snprintf(map->new_nspname, sizeof(map->new_nspname), "%s", new_rel->nspname);
|
|
||||||
|
|
||||||
snprintf(map->old_relname, sizeof(map->old_relname), "%s", old_rel->relname);
|
|
||||||
snprintf(map->new_relname, sizeof(map->new_relname), "%s", new_rel->relname);
|
|
||||||
|
|
||||||
if (strlen(old_rel->tablespace) == 0)
|
if (strlen(old_rel->tablespace) == 0)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -155,14 +128,21 @@ create_rel_filename_map(const char *old_data, const char *new_data,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
/* relation belongs to a tablespace, so use the tablespace location */
|
||||||
* relation belongs to some tablespace, so use the tablespace location
|
|
||||||
*/
|
|
||||||
snprintf(map->old_dir, sizeof(map->old_dir), "%s%s/%u", old_rel->tablespace,
|
snprintf(map->old_dir, sizeof(map->old_dir), "%s%s/%u", old_rel->tablespace,
|
||||||
old_cluster.tablespace_suffix, old_db->db_oid);
|
old_cluster.tablespace_suffix, old_db->db_oid);
|
||||||
snprintf(map->new_dir, sizeof(map->new_dir), "%s%s/%u", new_rel->tablespace,
|
snprintf(map->new_dir, sizeof(map->new_dir), "%s%s/%u", new_rel->tablespace,
|
||||||
new_cluster.tablespace_suffix, new_db->db_oid);
|
new_cluster.tablespace_suffix, new_db->db_oid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
map->old_relfilenode = old_rel->relfilenode;
|
||||||
|
map->new_relfilenode = new_rel->relfilenode;
|
||||||
|
|
||||||
|
/* used only for logging and error reporing */
|
||||||
|
snprintf(map->old_nspname, sizeof(map->old_nspname), "%s", old_rel->nspname);
|
||||||
|
snprintf(map->new_nspname, sizeof(map->new_nspname), "%s", new_rel->nspname);
|
||||||
|
snprintf(map->old_relname, sizeof(map->old_relname), "%s", old_rel->relname);
|
||||||
|
snprintf(map->new_relname, sizeof(map->new_relname), "%s", new_rel->relname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,12 +87,18 @@ typedef struct
|
|||||||
{
|
{
|
||||||
char old_dir[MAXPGPATH];
|
char old_dir[MAXPGPATH];
|
||||||
char new_dir[MAXPGPATH];
|
char new_dir[MAXPGPATH];
|
||||||
Oid old_relfilenode; /* Relfilenode of the old relation */
|
/*
|
||||||
Oid new_relfilenode; /* Relfilenode of the new relation */
|
* old/new relfilenodes might differ for pg_largeobject(_metadata) indexes
|
||||||
char old_nspname[NAMEDATALEN]; /* old name of the namespace */
|
* due to VACUUM FULL or REINDEX. Other relfilenodes are preserved.
|
||||||
char old_relname[NAMEDATALEN]; /* old name of the relation */
|
*/
|
||||||
char new_nspname[NAMEDATALEN]; /* new name of the namespace */
|
Oid old_relfilenode;
|
||||||
char new_relname[NAMEDATALEN]; /* new name of the relation */
|
Oid new_relfilenode;
|
||||||
|
/* the rest are used only for logging and error reporting */
|
||||||
|
char old_nspname[NAMEDATALEN]; /* namespaces */
|
||||||
|
char new_nspname[NAMEDATALEN];
|
||||||
|
/* old/new relnames differ for toast tables and toast indexes */
|
||||||
|
char old_relname[NAMEDATALEN];
|
||||||
|
char new_relname[NAMEDATALEN];
|
||||||
} FileNameMap;
|
} FileNameMap;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -222,8 +222,8 @@ old_8_3_rebuild_tsvector_tables(ClusterInfo *cluster, bool check_mode)
|
|||||||
{
|
{
|
||||||
PGresult *res;
|
PGresult *res;
|
||||||
bool db_used = false;
|
bool db_used = false;
|
||||||
char old_nspname[NAMEDATALEN] = "",
|
char nspname[NAMEDATALEN] = "",
|
||||||
old_relname[NAMEDATALEN] = "";
|
relname[NAMEDATALEN] = "";
|
||||||
int ntups;
|
int ntups;
|
||||||
int rowno;
|
int rowno;
|
||||||
int i_nspname,
|
int i_nspname,
|
||||||
@ -283,10 +283,10 @@ old_8_3_rebuild_tsvector_tables(ClusterInfo *cluster, bool check_mode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Rebuild all tsvector collumns with one ALTER TABLE command */
|
/* Rebuild all tsvector collumns with one ALTER TABLE command */
|
||||||
if (strcmp(PQgetvalue(res, rowno, i_nspname), old_nspname) != 0 ||
|
if (strcmp(PQgetvalue(res, rowno, i_nspname), nspname) != 0 ||
|
||||||
strcmp(PQgetvalue(res, rowno, i_relname), old_relname) != 0)
|
strcmp(PQgetvalue(res, rowno, i_relname), relname) != 0)
|
||||||
{
|
{
|
||||||
if (strlen(old_nspname) != 0 || strlen(old_relname) != 0)
|
if (strlen(nspname) != 0 || strlen(relname) != 0)
|
||||||
fprintf(script, ";\n\n");
|
fprintf(script, ";\n\n");
|
||||||
fprintf(script, "ALTER TABLE %s.%s\n",
|
fprintf(script, "ALTER TABLE %s.%s\n",
|
||||||
quote_identifier(PQgetvalue(res, rowno, i_nspname)),
|
quote_identifier(PQgetvalue(res, rowno, i_nspname)),
|
||||||
@ -294,8 +294,8 @@ old_8_3_rebuild_tsvector_tables(ClusterInfo *cluster, bool check_mode)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
fprintf(script, ",\n");
|
fprintf(script, ",\n");
|
||||||
strlcpy(old_nspname, PQgetvalue(res, rowno, i_nspname), sizeof(old_nspname));
|
strlcpy(nspname, PQgetvalue(res, rowno, i_nspname), sizeof(nspname));
|
||||||
strlcpy(old_relname, PQgetvalue(res, rowno, i_relname), sizeof(old_relname));
|
strlcpy(relname, PQgetvalue(res, rowno, i_relname), sizeof(relname));
|
||||||
|
|
||||||
fprintf(script, "ALTER COLUMN %s "
|
fprintf(script, "ALTER COLUMN %s "
|
||||||
/* This could have been a custom conversion function call. */
|
/* This could have been a custom conversion function call. */
|
||||||
@ -304,7 +304,7 @@ old_8_3_rebuild_tsvector_tables(ClusterInfo *cluster, bool check_mode)
|
|||||||
quote_identifier(PQgetvalue(res, rowno, i_attname)));
|
quote_identifier(PQgetvalue(res, rowno, i_attname)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strlen(old_nspname) != 0 || strlen(old_relname) != 0)
|
if (strlen(nspname) != 0 || strlen(relname) != 0)
|
||||||
fprintf(script, ";\n\n");
|
fprintf(script, ";\n\n");
|
||||||
|
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
|
@ -2354,14 +2354,11 @@ binary_upgrade_set_relfilenodes(PQExpBuffer upgrade_buffer, Oid pg_class_oid,
|
|||||||
"\n-- For binary upgrade, must preserve relfilenodes\n");
|
"\n-- For binary upgrade, must preserve relfilenodes\n");
|
||||||
|
|
||||||
if (!is_index)
|
if (!is_index)
|
||||||
|
{
|
||||||
appendPQExpBuffer(upgrade_buffer,
|
appendPQExpBuffer(upgrade_buffer,
|
||||||
"SELECT binary_upgrade.set_next_heap_relfilenode('%u'::pg_catalog.oid);\n",
|
"SELECT binary_upgrade.set_next_heap_relfilenode('%u'::pg_catalog.oid);\n",
|
||||||
pg_class_relfilenode);
|
pg_class_relfilenode);
|
||||||
else
|
/* only tables have toast tables, not indexes */
|
||||||
appendPQExpBuffer(upgrade_buffer,
|
|
||||||
"SELECT binary_upgrade.set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
|
|
||||||
pg_class_relfilenode);
|
|
||||||
|
|
||||||
if (OidIsValid(pg_class_reltoastrelid))
|
if (OidIsValid(pg_class_reltoastrelid))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -2382,6 +2379,12 @@ binary_upgrade_set_relfilenodes(PQExpBuffer upgrade_buffer, Oid pg_class_oid,
|
|||||||
"SELECT binary_upgrade.set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
|
"SELECT binary_upgrade.set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
|
||||||
pg_class_reltoastidxid);
|
pg_class_reltoastidxid);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
appendPQExpBuffer(upgrade_buffer,
|
||||||
|
"SELECT binary_upgrade.set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
|
||||||
|
pg_class_relfilenode);
|
||||||
|
|
||||||
appendPQExpBuffer(upgrade_buffer, "\n");
|
appendPQExpBuffer(upgrade_buffer, "\n");
|
||||||
|
|
||||||
PQclear(upgrade_res);
|
PQclear(upgrade_res);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user