@@ -263,9 +263,10 @@ output_completion_banner(char *analyze_script_file_name,
263263 deletion_script_file_name );
264264 else
265265 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" );
269270}
270271
271272
@@ -656,17 +657,34 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
656657{
657658 FILE * script = NULL ;
658659 int tblnum ;
659- char old_cluster_pgdata [MAXPGPATH ];
660+ char old_cluster_pgdata [MAXPGPATH ], new_cluster_pgdata [ MAXPGPATH ] ;
660661
661662 * deletion_script_file_name = psprintf ("delete_old_cluster.%s" , SCRIPT_EXT );
662663
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+
663683 /*
664684 * Some users (oddly) create tablespaces inside the cluster data
665685 * directory. We can't create a proper old cluster delete script in that
666686 * case.
667687 */
668- strlcpy (old_cluster_pgdata , old_cluster .pgdata , MAXPGPATH );
669- canonicalize_path (old_cluster_pgdata );
670688 for (tblnum = 0 ; tblnum < os_info .num_old_tablespaces ; tblnum ++ )
671689 {
672690 char old_tablespace_dir [MAXPGPATH ];
0 commit comments