@@ -195,9 +195,10 @@ output_completion_banner(char *analyze_script_file_name,
195195 deletion_script_file_name );
196196 else
197197 pg_log (PG_REPORT ,
198- "Could not create a script to delete the old cluster's data\n"
199- "files because user-defined tablespaces exist in the old cluster\n"
200- "directory. The old cluster's contents must be deleted manually.\n" );
198+ "Could not create a script to delete the old cluster's data files\n"
199+ "because user-defined tablespaces or the new cluster's data directory\n"
200+ "exist in the old cluster directory. The old cluster's contents must\n"
201+ "be deleted manually.\n" );
201202}
202203
203204
@@ -496,18 +497,35 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
496497{
497498 FILE * script = NULL ;
498499 int tblnum ;
499- char old_cluster_pgdata [MAXPGPATH ];
500+ char old_cluster_pgdata [MAXPGPATH ], new_cluster_pgdata [ MAXPGPATH ] ;
500501
501502 * deletion_script_file_name = psprintf ("%sdelete_old_cluster.%s" ,
502503 SCRIPT_PREFIX , SCRIPT_EXT );
503504
505+ strlcpy (old_cluster_pgdata , old_cluster .pgdata , MAXPGPATH );
506+ canonicalize_path (old_cluster_pgdata );
507+
508+ strlcpy (new_cluster_pgdata , new_cluster .pgdata , MAXPGPATH );
509+ canonicalize_path (new_cluster_pgdata );
510+
511+ /* Some people put the new data directory inside the old one. */
512+ if (path_is_prefix_of_path (old_cluster_pgdata , new_cluster_pgdata ))
513+ {
514+ pg_log (PG_WARNING ,
515+ "\nWARNING: new data directory should not be inside the old data directory, e.g. %s\n" , old_cluster_pgdata );
516+
517+ /* Unlink file in case it is left over from a previous run. */
518+ unlink (* deletion_script_file_name );
519+ pg_free (* deletion_script_file_name );
520+ * deletion_script_file_name = NULL ;
521+ return ;
522+ }
523+
504524 /*
505525 * Some users (oddly) create tablespaces inside the cluster data
506526 * directory. We can't create a proper old cluster delete script in that
507527 * case.
508528 */
509- strlcpy (old_cluster_pgdata , old_cluster .pgdata , MAXPGPATH );
510- canonicalize_path (old_cluster_pgdata );
511529 for (tblnum = 0 ; tblnum < os_info .num_old_tablespaces ; tblnum ++ )
512530 {
513531 char old_tablespace_dir [MAXPGPATH ];
0 commit comments