1
2--source include/have_symlink.inc
3--source include/not_windows.inc
4
5--disable_warnings
6drop table if exists t1,t2,t7,t8,t9;
7drop database if exists mysqltest;
8--enable_warnings
9
10#
11# First create little data to play with
12#
13
14create table t1 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam;
15create table t2 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam;
16insert into t1 (b) values ("test"),("test1"),("test2"),("test3");
17insert into t2 (b) select b from t1;
18insert into t1 (b) select b from t2;
19insert into t2 (b) select b from t1;
20insert into t1 (b) select b from t2;
21insert into t2 (b) select b from t1;
22insert into t1 (b) select b from t2;
23insert into t2 (b) select b from t1;
24insert into t1 (b) select b from t2;
25insert into t2 (b) select b from t1;
26insert into t1 (b) select b from t2;
27insert into t2 (b) select b from t1;
28insert into t1 (b) select b from t2;
29insert into t2 (b) select b from t1;
30insert into t1 (b) select b from t2;
31insert into t2 (b) select b from t1;
32insert into t1 (b) select b from t2;
33insert into t2 (b) select b from t1;
34insert into t1 (b) select b from t2;
35drop table t2;
36
37#
38# Start the test
39# We use t9 here to not crash with tables generated by the backup test
40#
41
42--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
43eval create table t9 (a int not null auto_increment, b char(16) not null, primary key (a))
44engine=myisam data directory="$MYSQLTEST_VARDIR/tmp" index directory="$MYSQLTEST_VARDIR/run";
45
46insert into t9 select * from t1;
47check table t9;
48optimize table t9;
49repair table t9;
50alter table t9 add column c int not null;
51
52--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
53show create table t9;
54
55# Test renames
56alter table t9 rename t8, add column d int not null;
57alter table t8 rename t7;
58rename table t7 to t9;
59# Drop old t1 table, keep t9
60drop table t1;
61
62#
63# Test error handling
64# Note that we are using the above table t9 here!
65#
66
67--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
68SHOW CREATE TABLE t9;
69
70
71# Check that we cannot link over a table from another database.
72
73create database mysqltest;
74
75--error 1,1
76create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a))
77engine=myisam index directory="/this-dir-does-not-exist";
78
79# temporarily disabled as it returns different result in the embedded server
80--error ER_WRONG_TABLE_NAME
81create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a))
82engine=myisam index directory="not-hard-path";
83
84# Should fail becasue the file t9.MYI already exist in 'run'
85--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
86--error 1,1,ER_UNKNOWN_ERROR
87eval create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a))
88engine=myisam index directory="$MYSQLTEST_VARDIR/run";
89
90# Should fail becasue the file t9.MYD already exist in 'tmp'
91--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
92--error 1,1
93eval create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a))
94engine=myisam data directory="$MYSQLTEST_VARDIR/tmp";
95
96# Check moving table t9 from default database to mysqltest;
97# In this case the symlinks should be removed.
98
99alter table t9 rename mysqltest.t9;
100select count(*) from mysqltest.t9;
101--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
102show create table mysqltest.t9;
103drop database mysqltest;
104
105#
106# Test changing data dir (Bug #1662)
107#
108
109create table t1 (a int not null) engine=myisam;
110--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
111eval alter table t1 data directory="$MYSQLTEST_VARDIR/tmp";
112--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
113show create table t1;
114alter table t1 add b int;
115--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
116eval alter table t1 data directory="$MYSQLTEST_VARDIR/log";
117--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
118show create table t1;
119--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
120eval alter table t1 index directory="$MYSQLTEST_VARDIR/log";
121show create table t1;
122drop table t1;
123
124#
125# BUG#32111 - Security Breach via DATA/INDEX DIRECORY and RENAME TABLE
126#
127--write_file $MYSQLTEST_VARDIR/tmp/t1.MYI
128EOF
129
130--replace_result $MYSQLTEST_VARDIR TEST_DIR $MYSQLTEST_VARDIR TEST_DIR
131--error 1,1
132eval CREATE TABLE t1(a INT) ENGINE = MYISAM
133DATA DIRECTORY='$MYSQLTEST_VARDIR/tmp'
134INDEX DIRECTORY='$MYSQLTEST_VARDIR/tmp';
135--replace_result $MYSQLTEST_VARDIR TEST_DIR
136eval CREATE TABLE t2(a INT) ENGINE = MYISAM
137DATA DIRECTORY='$MYSQLTEST_VARDIR/tmp'
138INDEX DIRECTORY='$MYSQLTEST_VARDIR/tmp';
139--replace_result $MYSQLTEST_VARDIR TEST_DIR
140--error 1
141RENAME TABLE t2 TO t1;
142DROP TABLE t2;
143--remove_file $MYSQLTEST_VARDIR/tmp/t1.MYI
144
145#
146# Bug#8706 - temporary table with data directory option fails
147#
148connect (session1,localhost,root,,);
149connect (session2,localhost,root,,);
150
151connection session1;
152--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
153eval create temporary table t1 (a int) engine=myisam data directory="$MYSQLTEST_VARDIR/log" select 9 a;
154# If running test suite with a non standard tmp dir, the "show create table"
155# will print "DATA_DIRECTORY=". Use replace_result to mask it out
156--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
157show create table t1;
158
159connection session2;
160--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
161eval create temporary table t1 (a int) engine=myisam data directory="$MYSQLTEST_VARDIR/log" select 99 a;
162# If running test suite with a non standard tmp dir, the "show create table"
163# will print "DATA_DIRECTORY=". Use replace_result to mask it out
164--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
165show create table t1;
166
167connection default;
168create table t1 (a int) engine=myisam select 42 a;
169
170connection session1;
171select * from t1;
172disconnect session1;
173connection session2;
174select * from t1;
175disconnect session2;
176connection default;
177select * from t1;
178drop table t1;
179
180--echo End of 4.1 tests
181
182#
183# Bug #29325: create table overwrites .MYD file of other table (datadir)
184#
185let $MYSQLD_DATADIR= `select @@datadir`;
186SET SESSION keep_files_on_create = TRUE;
187--write_file $MYSQLD_DATADIR/test/t1.MYD
188EOF
189--disable_abort_on_error
190--error 1,1,ER_TABLE_EXISTS_ERROR
191CREATE TABLE t1 (a INT) ENGINE MYISAM;
192--error 0,1
193--remove_file $MYSQLD_DATADIR/test/t1.MYD;
194--enable_abort_on_error
195SET SESSION keep_files_on_create = FALSE;
196CREATE TABLE t1 (a INT) ENGINE MYISAM;
197DROP TABLE t1;
198
199--echo End of 5.0 tests
200
201#
202# Bug#32167: another privilege bypass with DATA/INDEX DIRECTORY
203#
204# With Bug#41002 (symlink.test fails on symlinked datadir) it was
205# decided that the below statements may also succeed if the data
206# home directory is symlinked, e.g. mysql-test-run --mem.
207# This will be fixed in 6.0 only.
208#
209let $MYSQLD_DATADIR= `select @@datadir`;
210--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
211--error 0,ER_WRONG_ARGUMENTS
212eval CREATE TABLE t1(a INT) ENGINE=MYISAM
213INDEX DIRECTORY='$MYSQLD_DATADIR/mysql';
214--disable_warnings
215DROP TABLE IF EXISTS t1;
216--enable_warnings
217#
218--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
219--error 0,ER_WRONG_ARGUMENTS
220eval CREATE TABLE t1(a INT) ENGINE=MYISAM
221DATA DIRECTORY='$MYSQLD_DATADIR/test';
222--disable_warnings
223DROP TABLE IF EXISTS t1;
224--enable_warnings
225#
226--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
227--error 0,ER_WRONG_ARGUMENTS
228eval CREATE TABLE t1(a INT) ENGINE=MYISAM
229DATA DIRECTORY='$MYSQLD_DATADIR/';
230--disable_warnings
231DROP TABLE IF EXISTS t1;
232--enable_warnings
233#
234--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
235--error 0,ER_WRONG_ARGUMENTS
236eval CREATE TABLE t1(a INT) ENGINE=MYISAM
237INDEX DIRECTORY='$MYSQLD_DATADIR';
238--disable_warnings
239DROP TABLE IF EXISTS t1;
240--enable_warnings
241#
242--replace_result $MYSQLTEST_VARDIR TEST_DIR
243--error 1
244eval CREATE TABLE t1(a INT) ENGINE=MYISAM
245INDEX DIRECTORY='$MYSQLTEST_VARDIR/master-data_var';
246
247#
248# BUG#25677 - With --skip-symbolic-links option on, DATA DIRECTORY clause is
249#             silently ignored
250#
251
252SET @OLD_SQL_MODE=@@SQL_MODE, @@SQL_MODE='NO_DIR_IN_CREATE';
253--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
254eval CREATE TABLE t1(a INT) DATA DIRECTORY='$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY='$MYSQLTEST_VARDIR/tmp';
255DROP TABLE t1;
256SET @@SQL_MODE=@OLD_SQL_MODE;
257
258--echo #
259--echo # BUG#40980 - Drop table can remove another MyISAM table's
260--echo #             data and index files
261--echo #
262--mkdir $MYSQL_TMP_DIR/mysql
263--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
264eval CREATE TABLE user(a INT) ENGINE=MYISAM DATA DIRECTORY='$MYSQL_TMP_DIR/mysql'
265                             INDEX DIRECTORY='$MYSQL_TMP_DIR/mysql';
266FLUSH TABLE user;
267--echo # Symlinking mysql database to tmpdir
268--remove_file $MYSQL_TMP_DIR/mysql/user.MYD
269--remove_file $MYSQL_TMP_DIR/mysql/user.MYI
270--rmdir $MYSQL_TMP_DIR/mysql
271--exec ln -s $MYSQLD_DATADIR/mysql $MYSQL_TMP_DIR/mysql
272FLUSH TABLE mysql.user;
273DROP TABLE user;
274FLUSH TABLE mysql.user;
275--disable_result_log
276SELECT * FROM mysql.user;
277--enable_result_log
278--remove_file $MYSQL_TMP_DIR/mysql
279
280--echo End of 5.1 tests
281
282
283--echo #
284--echo # Test for bug #11759990 - "52354: 'CREATE TABLE .. LIKE ... '
285--echo #                           STATEMENTS FAIL".
286--echo #
287--disable_warnings
288drop table if exists t1, t2;
289--enable_warnings
290--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
291eval create table t1 (a int primary key) engine=myisam
292      data directory="$MYSQLTEST_VARDIR/tmp"
293      index directory="$MYSQLTEST_VARDIR/run";
294--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
295show create table t1;
296--echo # CREATE TABLE LIKE statement on table with INDEX/DATA DIRECTORY
297--echo # options should not fail. Per documentation newly created table
298--echo # should not inherit value of these options from the original table.
299create table t2 like t1;
300show create table t2;
301drop tables t1, t2;
302
303--echo #
304--echo # Test for bug #25514146 DB_NAME IS IGNORED WHEN CREATING TABLE
305--echo # WITH DATA DIRECTORY
306--echo #
307
308--echo # Make sure we have no current database
309CREATE DATABASE x;
310USE x;
311DROP DATABASE x;
312
313--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
314eval CREATE TABLE test.t1(id INT(11)) ENGINE MYISAM
315DATA DIRECTORY "$MYSQLTEST_VARDIR/tmp";
316
317DROP TABLE test.t1;
318