From 3729ba77065b0d69ca6d4c901d14d517913565ca Mon Sep 17 00:00:00 2001
From: "heikki@hundin.mysql.fi" <>
Date: Tue, 26 Oct 2004 20:29:11 +0300
Subject: [PATCH 1/2] row0mysql.c:   Print more warnings to the .err log if
 ALTER TABLE ... IMPORT TABLESPACE fails for some reason os0file.c:   Do not
 call exit(1) if os_file_delete() fails; remove unused parameter from
 handle_error_no_exit()

fil0fil.c:
  Allow DROP TABLE even if the .ibd file for the table does not exist
---
 innobase/fil/fil0fil.c   |  4 ++++
 innobase/os/os0file.c    | 25 +++++++++++--------------
 innobase/row/row0mysql.c | 25 +++++++++++++++++++++++++
 3 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c
index c4fc055dcde..98dea14f47b 100644
--- a/innobase/fil/fil0fil.c
+++ b/innobase/fil/fil0fil.c
@@ -1868,6 +1868,10 @@ try_again:
 
 	if (success) {
 		success = os_file_delete(path);
+
+		if (!success) {
+			success = os_file_delete_if_exists(path);
+		}
 	}
 
 	if (success) {
diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c
index f70e8c9b587..5c140e4b798 100644
--- a/innobase/os/os0file.c
+++ b/innobase/os/os0file.c
@@ -410,14 +410,11 @@ os_file_handle_error_no_exit(
 /*=========================*/
 				/* out: TRUE if we should retry the
 				operation */
-	os_file_t	file,	/* in: file pointer */
 	const char*	name,	/* in: name of a file or NULL */
 	const char*	operation)/* in: operation */
 {
 	ulint	err;
 
-	UT_NOT_USED(file);
-
 	err = os_file_get_last_error(FALSE);
 	
 	if (err == OS_FILE_DISK_FULL) {
@@ -624,7 +621,7 @@ os_file_closedir(
 	ret = FindClose(dir);
 
 	if (!ret) {
-	        os_file_handle_error_no_exit(NULL, NULL, "closedir");
+	        os_file_handle_error_no_exit(NULL, "closedir");
 		
 		return(-1);
 	}
@@ -636,7 +633,7 @@ os_file_closedir(
 	ret = closedir(dir);
 
 	if (ret) {
-	        os_file_handle_error_no_exit(0, NULL, "closedir");
+	        os_file_handle_error_no_exit(NULL, "closedir");
 	}
 
 	return(ret);
@@ -705,7 +702,7 @@ http://www.mysql.com/doc/en/Windows_symbolic_links.html */
 
 		return(1);
 	} else {
-		os_file_handle_error_no_exit(NULL, dirname,
+		os_file_handle_error_no_exit(dirname,
 						"readdir_next_file");
 		return(-1);
 	}
@@ -737,7 +734,7 @@ next_file:
 	ret = stat(full_path, &statinfo);
 
 	if (ret) {
-		os_file_handle_error_no_exit(0, full_path, "stat");
+		os_file_handle_error_no_exit(full_path, "stat");
 
 		ut_free(full_path);
 
@@ -1326,7 +1323,7 @@ loop:
 	ret = unlink((const char*)name);
 
 	if (ret != 0 && errno != ENOENT) {
-		os_file_handle_error(name, "delete");
+		os_file_handle_error_no_exit(name, "delete");
 
 		return(FALSE);
 	}
@@ -1388,7 +1385,7 @@ loop:
 	ret = unlink((const char*)name);
 
 	if (ret != 0) {
-		os_file_handle_error(name, "delete");
+		os_file_handle_error_no_exit(name, "delete");
 
 		return(FALSE);
 	}
@@ -2117,7 +2114,7 @@ try_again:
 #ifdef __WIN__
 error_handling:
 #endif
-	retry = os_file_handle_error_no_exit(file, NULL, "read"); 
+	retry = os_file_handle_error_no_exit(NULL, "read"); 
 
 	if (retry) {
 		goto try_again;
@@ -2310,7 +2307,7 @@ os_file_status(
 	} else if (ret) {
 		/* file exists, but stat call failed */
 		
-		os_file_handle_error_no_exit(0, path, "stat");
+		os_file_handle_error_no_exit(path, "stat");
 		
 		return(FALSE);
 	}
@@ -2338,7 +2335,7 @@ os_file_status(
 	} else if (ret) {
 		/* file exists, but stat call failed */
 		
-		os_file_handle_error_no_exit(0, path, "stat");
+		os_file_handle_error_no_exit(path, "stat");
 		
 		return(FALSE);
 	}
@@ -2381,7 +2378,7 @@ os_file_get_status(
 	} else if (ret) {
 		/* file exists, but stat call failed */
 		
-		os_file_handle_error_no_exit(0, path, "stat");
+		os_file_handle_error_no_exit(path, "stat");
 		
 		return(FALSE);
 	}
@@ -2412,7 +2409,7 @@ os_file_get_status(
 	} else if (ret) {
 		/* file exists, but stat call failed */
 		
-		os_file_handle_error_no_exit(0, path, "stat");
+		os_file_handle_error_no_exit(path, "stat");
 		
 		return(FALSE);
 	}
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c
index bf4b0f26cbc..241ddc310e8 100644
--- a/innobase/row/row0mysql.c
+++ b/innobase/row/row0mysql.c
@@ -2153,6 +2153,12 @@ row_import_tablespace_for_mysql(
 	success = fil_reset_too_high_lsns(name, current_lsn);
 
 	if (!success) {
+		ut_print_timestamp(stderr);
+		fputs("  InnoDB: Error: cannot reset lsn's in table ", stderr);
+		ut_print_name(stderr, trx, name);
+		fputs("\n"
+		"InnoDB: in ALTER TABLE ... IMPORT TABLESPACE\n", stderr);
+
 		err = DB_ERROR;
 
 		row_mysql_lock_data_dictionary(trx);
@@ -2168,6 +2174,14 @@ row_import_tablespace_for_mysql(
 	table = dict_table_get_low(name);
 
 	if (!table) {
+		ut_print_timestamp(stderr);
+		fputs("  InnoDB: table ", stderr);
+		ut_print_name(stderr, trx, name);
+		fputs("\n"
+"InnoDB: does not exist in the InnoDB data dictionary\n"
+"InnoDB: in ALTER TABLE ... IMPORT TABLESPACE\n",
+		stderr);
+
 		err = DB_TABLE_NOT_FOUND;
 
 		goto funct_exit;
@@ -2209,6 +2223,17 @@ row_import_tablespace_for_mysql(
 		table->ibd_file_missing = FALSE;
 		table->tablespace_discarded = FALSE;
 	} else {
+		if (table->ibd_file_missing) {
+			ut_print_timestamp(stderr);
+			fputs(
+"  InnoDB: cannot find of open in the database directory the .ibd file of\n"
+"InnoDB: table ", stderr);
+			ut_print_name(stderr, trx, name);
+			fputs("\n"
+"InnoDB: in ALTER TABLE ... IMPORT TABLESPACE\n",
+			stderr);
+		}
+
 		err = DB_ERROR;
 	}
 

From a761a901b4efa238d80a5a64c280e81212696c9e Mon Sep 17 00:00:00 2001
From: "heikki@hundin.mysql.fi" <>
Date: Tue, 26 Oct 2004 20:47:23 +0300
Subject: [PATCH 2/2] fil0fil.c:   Print to the .err log a more detailed error
 message if in IMPORT TABLESPACE the .ibd file does not exist

---
 innobase/fil/fil0fil.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c
index 98dea14f47b..7d57468f632 100644
--- a/innobase/fil/fil0fil.c
+++ b/innobase/fil/fil0fil.c
@@ -2370,6 +2370,16 @@ fil_reset_too_high_lsns(
 	file = os_file_create_simple_no_error_handling(filepath, OS_FILE_OPEN,
 						OS_FILE_READ_WRITE, &success);
 	if (!success) {
+		/* The following call prints an error message */
+		os_file_get_last_error(TRUE);
+
+		ut_print_timestamp(stderr);
+
+	        fputs(
+"  InnoDB: Error: trying to open a table, but could not\n"
+"InnoDB: open the tablespace file ", stderr);
+		ut_print_filename(stderr, filepath);
+		fputs("!\n", stderr);
 		mem_free(filepath);
 
 		return(FALSE);