@@ -263,9 +263,10 @@ output_completion_banner(char *analyze_script_file_name,
263
263
deletion_script_file_name );
264
264
else
265
265
pg_log (PG_REPORT ,
266
- "Could not create a script to delete the old cluster's data\n"
267
- "files because user-defined tablespaces exist in the old cluster\n"
268
- "directory. The old cluster's contents must be deleted manually.\n" );
266
+ "Could not create a script to delete the old cluster's data files\n"
267
+ "because user-defined tablespaces or the new cluster's data directory\n"
268
+ "exist in the old cluster directory. The old cluster's contents must\n"
269
+ "be deleted manually.\n" );
269
270
}
270
271
271
272
@@ -656,17 +657,34 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
656
657
{
657
658
FILE * script = NULL ;
658
659
int tblnum ;
659
- char old_cluster_pgdata [MAXPGPATH ];
660
+ char old_cluster_pgdata [MAXPGPATH ], new_cluster_pgdata [ MAXPGPATH ] ;
660
661
661
662
* deletion_script_file_name = psprintf ("delete_old_cluster.%s" , SCRIPT_EXT );
662
663
664
+ strlcpy (old_cluster_pgdata , old_cluster .pgdata , MAXPGPATH );
665
+ canonicalize_path (old_cluster_pgdata );
666
+
667
+ strlcpy (new_cluster_pgdata , new_cluster .pgdata , MAXPGPATH );
668
+ canonicalize_path (new_cluster_pgdata );
669
+
670
+ /* Some people put the new data directory inside the old one. */
671
+ if (path_is_prefix_of_path (old_cluster_pgdata , new_cluster_pgdata ))
672
+ {
673
+ pg_log (PG_WARNING ,
674
+ "\nWARNING: new data directory should not be inside the old data directory, e.g. %s\n" , old_cluster_pgdata );
675
+
676
+ /* Unlink file in case it is left over from a previous run. */
677
+ unlink (* deletion_script_file_name );
678
+ pg_free (* deletion_script_file_name );
679
+ * deletion_script_file_name = NULL ;
680
+ return ;
681
+ }
682
+
663
683
/*
664
684
* Some users (oddly) create tablespaces inside the cluster data
665
685
* directory. We can't create a proper old cluster delete script in that
666
686
* case.
667
687
*/
668
- strlcpy (old_cluster_pgdata , old_cluster .pgdata , MAXPGPATH );
669
- canonicalize_path (old_cluster_pgdata );
670
688
for (tblnum = 0 ; tblnum < os_info .num_old_tablespaces ; tblnum ++ )
671
689
{
672
690
char old_tablespace_dir [MAXPGPATH ];
0 commit comments