Commit 3386f34c authored by Bruce Momjian's avatar Bruce Momjian

pg_upgrade: suppress creation of delete script

Suppress creation of the pg_upgrade delete script when the new data
directory is inside the old data directory.

Reported-by: IRC

Backpatch-through: 9.3, where delete script tests were added
parent 48e6c943
...@@ -195,9 +195,10 @@ output_completion_banner(char *analyze_script_file_name, ...@@ -195,9 +195,10 @@ output_completion_banner(char *analyze_script_file_name,
deletion_script_file_name); deletion_script_file_name);
else else
pg_log(PG_REPORT, pg_log(PG_REPORT,
"Could not create a script to delete the old cluster's data\n" "Could not create a script to delete the old cluster's data files\n"
"files because user-defined tablespaces exist in the old cluster\n" "because user-defined tablespaces or the new cluster's data directory\n"
"directory. The old cluster's contents must be deleted manually.\n"); "exist in the old cluster directory. The old cluster's contents must\n"
"be deleted manually.\n");
} }
...@@ -496,18 +497,35 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name) ...@@ -496,18 +497,35 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
{ {
FILE *script = NULL; FILE *script = NULL;
int tblnum; int tblnum;
char old_cluster_pgdata[MAXPGPATH]; char old_cluster_pgdata[MAXPGPATH], new_cluster_pgdata[MAXPGPATH];
*deletion_script_file_name = psprintf("%sdelete_old_cluster.%s", *deletion_script_file_name = psprintf("%sdelete_old_cluster.%s",
SCRIPT_PREFIX, SCRIPT_EXT); SCRIPT_PREFIX, SCRIPT_EXT);
strlcpy(old_cluster_pgdata, old_cluster.pgdata, MAXPGPATH);
canonicalize_path(old_cluster_pgdata);
strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
canonicalize_path(new_cluster_pgdata);
/* Some people put the new data directory inside the old one. */
if (path_is_prefix_of_path(old_cluster_pgdata, new_cluster_pgdata))
{
pg_log(PG_WARNING,
"\nWARNING: new data directory should not be inside the old data directory, e.g. %s\n", old_cluster_pgdata);
/* Unlink file in case it is left over from a previous run. */
unlink(*deletion_script_file_name);
pg_free(*deletion_script_file_name);
*deletion_script_file_name = NULL;
return;
}
/* /*
* Some users (oddly) create tablespaces inside the cluster data * Some users (oddly) create tablespaces inside the cluster data
* directory. We can't create a proper old cluster delete script in that * directory. We can't create a proper old cluster delete script in that
* case. * case.
*/ */
strlcpy(old_cluster_pgdata, old_cluster.pgdata, MAXPGPATH);
canonicalize_path(old_cluster_pgdata);
for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++) for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
{ {
char old_tablespace_dir[MAXPGPATH]; char old_tablespace_dir[MAXPGPATH];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment