author | Ramesh Maddali<ramesh.maddali@oracle.com> |
Wed, 17 Jul 2013 00:17:02 -0700 | |
branch | s11-update |
changeset 2680 | 70e041ba5b04 |
permissions | -rw-r--r-- |
2680
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
1 |
# Fixes Solaris bug #15688738 |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
2 |
# =========================== |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
3 |
|
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
4 |
--- storage/myisam/mi_delete_table.c 2006-12-31 00:32:21 +0000 |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
5 |
+++ storage/myisam/mi_delete_table.c 2010-04-01 14:49:02 +0000 |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
6 |
@@ -19,6 +19,41 @@ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
7 |
|
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
8 |
#include "fulltext.h" |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
9 |
|
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
10 |
+ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
11 |
+/** |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
12 |
+ Remove MyISAM data/index file safely |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
13 |
+ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
14 |
+ @details |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
15 |
+ If name is a symlink and file it is pointing to is not in |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
16 |
+ data directory, file is also removed. |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
17 |
+ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
18 |
+ @param name file to remove |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
19 |
+ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
20 |
+ @returns |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
21 |
+ 0 on success or my_errno on failure |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
22 |
+*/ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
23 |
+ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
24 |
+static int _mi_safe_delete_file(const char *name) |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
25 |
+{ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
26 |
+ DBUG_ENTER("_mi_safe_delete_file"); |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
27 |
+ if (my_is_symlink(name) && (*myisam_test_invalid_symlink)(name)) |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
28 |
+ { |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
29 |
+ /* |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
30 |
+ Symlink is pointing to file in data directory. |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
31 |
+ Remove symlink, keep file. |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
32 |
+ */ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
33 |
+ if (my_delete(name, MYF(MY_WME))) |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
34 |
+ DBUG_RETURN(my_errno); |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
35 |
+ } |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
36 |
+ else |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
37 |
+ { |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
38 |
+ if (my_delete_with_symlink(name, MYF(MY_WME))) |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
39 |
+ DBUG_RETURN(my_errno); |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
40 |
+ } |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
41 |
+ DBUG_RETURN(0); |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
42 |
+} |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
43 |
+ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
44 |
+ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
45 |
int mi_delete_table(const char *name) |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
46 |
{ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
47 |
char from[FN_REFLEN]; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
48 |
@@ -58,12 +93,12 @@ int mi_delete_table(const char *name) |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
49 |
#endif /* USE_RAID */ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
50 |
|
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
51 |
fn_format(from,name,"",MI_NAME_IEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT); |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
52 |
- if (my_delete_with_symlink(from, MYF(MY_WME))) |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
53 |
+ if (_mi_safe_delete_file(from)) |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
54 |
DBUG_RETURN(my_errno); |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
55 |
fn_format(from,name,"",MI_NAME_DEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT); |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
56 |
#ifdef USE_RAID |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
57 |
if (raid_type) |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
58 |
DBUG_RETURN(my_raid_delete(from, raid_chunks, MYF(MY_WME)) ? my_errno : 0); |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
59 |
#endif |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
60 |
- DBUG_RETURN(my_delete_with_symlink(from, MYF(MY_WME)) ? my_errno : 0); |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
61 |
+ DBUG_RETURN(_mi_safe_delete_file(from)); |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
62 |
} |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
63 |
|
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
64 |
--- mysql-test/r/bug40980.result 1970-01-01 01:00:00.000000000 +0100 |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
65 |
+++ mysql-test/r/bug40980.result 2013-06-20 21:42:12.280326900 +0200 |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
66 |
@@ -0,0 +1,14 @@ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
67 |
+drop table if exists t1,t2,t7,t8,t9; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
68 |
+drop database if exists mysqltest; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
69 |
+# |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
70 |
+# BUG#40980 - Drop table can remove another MyISAM table's |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
71 |
+# data and index files |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
72 |
+# |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
73 |
+CREATE TABLE user(a INT) DATA DIRECTORY='MYSQL_TMP_DIR/mysql' |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
74 |
+ INDEX DIRECTORY='MYSQL_TMP_DIR/mysql'; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
75 |
+FLUSH TABLE user; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
76 |
+# Symlinking mysql database to tmpdir |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
77 |
+FLUSH TABLE mysql.user; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
78 |
+DROP TABLE user; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
79 |
+FLUSH TABLE mysql.user; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
80 |
+SELECT * FROM mysql.user; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
81 |
|
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
82 |
--- mysql-test/t/bug40980.test 1970-01-01 01:00:00.000000000 +0100 |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
83 |
+++ mysql-test/t/bug40980.test 2013-06-20 21:41:50.813398500 +0200 |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
84 |
@@ -0,0 +1,29 @@ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
85 |
+--source include/have_symlink.inc |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
86 |
+--source include/not_windows.inc |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
87 |
+ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
88 |
+--disable_warnings |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
89 |
+drop table if exists t1,t2,t7,t8,t9; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
90 |
+drop database if exists mysqltest; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
91 |
+--enable_warnings |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
92 |
+ |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
93 |
+--echo # |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
94 |
+--echo # BUG#40980 - Drop table can remove another MyISAM table's |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
95 |
+--echo # data and index files |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
96 |
+--echo # |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
97 |
+--mkdir $MYSQL_TMP_DIR/mysql |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
98 |
+--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
99 |
+eval CREATE TABLE user(a INT) DATA DIRECTORY='$MYSQL_TMP_DIR/mysql' |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
100 |
+ INDEX DIRECTORY='$MYSQL_TMP_DIR/mysql'; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
101 |
+FLUSH TABLE user; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
102 |
+--echo # Symlinking mysql database to tmpdir |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
103 |
+--remove_file $MYSQL_TMP_DIR/mysql/user.MYD |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
104 |
+--remove_file $MYSQL_TMP_DIR/mysql/user.MYI |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
105 |
+--rmdir $MYSQL_TMP_DIR/mysql |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
106 |
+--exec ln -s $MYSQLD_DATADIR/mysql $MYSQL_TMP_DIR/mysql |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
107 |
+FLUSH TABLE mysql.user; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
108 |
+DROP TABLE user; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
109 |
+FLUSH TABLE mysql.user; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
110 |
+--disable_result_log |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
111 |
+SELECT * FROM mysql.user; |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
112 |
+--enable_result_log |
70e041ba5b04
15688738 problem in database/mysql
Ramesh Maddali<ramesh.maddali@oracle.com>
parents:
diff
changeset
|
113 |
+--remove_file $MYSQL_TMP_DIR/mysql |