# Test that must have symlink. eg. using DATA/INDEX DIR # (DATA/INDEX DIR requires symlinks) # This test is only useful for MyISAM, since no other engine supports DATA DIR -- source include/have_partition.inc -- source include/have_symlink.inc # remove the not_windows line after fixing bug#33687 # symlinks must also work for files, not only directories # as in --skip-symbolic-links -- source include/not_windows.inc -- disable_warnings DROP TABLE IF EXISTS t1; DROP DATABASE IF EXISTS mysqltest2; -- enable_warnings --echo # --echo # Test for WL#4445: EXCHANGE PARTITION --echo # --disable_service_connection --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR eval CREATE TABLE t1 (a INT) ENGINE = MyISAM PARTITION BY LIST (a) (PARTITION p0 VALUES IN (0) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp', PARTITION p1 VALUES IN (1) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp', PARTITION p2 VALUES IN (2)); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR eval CREATE TABLE t2 (a INT) ENGINE = MyISAM DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp'; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR SHOW CREATE TABLE t1; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR SHOW CREATE TABLE t2; INSERT INTO t1 VALUES (0), (1), (2); ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2; --error ER_TABLES_DIFFERENT_METADATA ALTER TABLE t1 EXCHANGE PARTITION p2 WITH TABLE t2; SELECT * FROM t1; SELECT * FROM t2; DROP TABLE t1, t2; --enable_service_connection # skipped because of bug#52354 #CREATE TABLE t1 LIKE t2; #ALTER TABLE t1 PARTITION BY LIST (a) #(PARTITION p0 VALUES in (0)); #--error ER_TABLES_DIFFERENT_METADATA #ALTER TABLE t1 EXCHANGE PARTITION p2 WITH TABLE t2; #SELECT * FROM t2; #DROP TABLE t1, t2; # # Bug 32091: Security breach via directory changes # # The below test shows that a pre-existing table mysqltest2.t1 cannot be # replaced by a user with no rights in 'mysqltest2'. The altered table # test.t1 will be altered (remove partitioning) into the test directory # and having its partitions removed from the mysqltest2 directory. # (the partitions data files are named #P#.MYD # and will not collide with a non partitioned table's data files.) # NOTE: the privileges on files and directories are the same for all # database users in mysqld, though mysqld enforces privileges on # the database and table levels which in turn maps to directories and # files, but not the other way around (any db-user can use any # directory or file that the mysqld-process can use, via DATA/INDEX DIR) # this is the security flaw that was used in bug#32091 and bug#32111 -- echo # Creating two non colliding tables mysqltest2.t1 and test.t1 -- echo # test.t1 have partitions in mysqltest2-directory! -- echo # user root: --disable_service_connection CREATE USER mysqltest_1@localhost; CREATE DATABASE mysqltest2; USE mysqltest2; CREATE TABLE t1 (a INT) ENGINE = MyISAM; INSERT INTO t1 VALUES (0); connect(con1,localhost,mysqltest_1,,); -- echo # user mysqltest_1: USE test; -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR eval CREATE TABLE t1 (a INT) ENGINE = MyISAM PARTITION BY LIST (a) ( PARTITION p0 VALUES IN (0) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp', PARTITION p1 VALUES IN (1) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp', PARTITION p2 VALUES IN (2) ); -- echo # without the patch for bug#32091 this would create -- echo # files mysqltest2/t1.MYD + .MYI and possible overwrite -- echo # the mysqltest2.t1 table (depending on bug#32111) -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR ALTER TABLE t1 REMOVE PARTITIONING; INSERT INTO t1 VALUES (1); SELECT * FROM t1; connection default; -- echo # user root: USE mysqltest2; FLUSH TABLES; -- echo # if the patch works, this should be different -- echo # and before the patch they were the same! SELECT * FROM t1; USE test; SELECT * FROM t1; DROP TABLE t1; DROP DATABASE mysqltest2; --enable_service_connection # The below test shows that a pre-existing partition can not be # destroyed by a new partition from another table. # (Remember that a table or partition that uses the DATA/INDEX DIR # is symlinked and thus has # 1. the real file in the DATA/INDEX DIR and # 2. a symlink in its default database directory pointing to # the real file. # So it is using/blocking 2 files in (in 2 different directories -- echo # test that symlinks can not overwrite files when CREATE TABLE -- echo # user root: CREATE DATABASE mysqltest2; USE mysqltest2; -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR eval CREATE TABLE t1 (a INT) ENGINE = MyISAM PARTITION BY LIST (a) ( PARTITION p0 VALUES IN (0) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp', PARTITION p1 VALUES IN (1) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp' ); connection con1; -- echo # user mysqltest_1: USE test; -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR -- error 1,1 eval CREATE TABLE t1 (a INT) ENGINE = MyISAM PARTITION BY LIST (a) ( PARTITION p0 VALUES IN (0) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp', PARTITION p1 VALUES IN (1) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp' ); -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR -- error 1,1 eval CREATE TABLE t1 (a INT) ENGINE = MyISAM PARTITION BY LIST (a) ( PARTITION p0 VALUES IN (0) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp', PARTITION p1 VALUES IN (1) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp' ); connection default; -- echo # user root (cleanup): DROP DATABASE mysqltest2; USE test; DROP USER mysqltest_1@localhost; disconnect con1; # # Bug #24633 SQL MODE "NO_DIR_IN_CREATE" does not work with partitioned tables # --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR eval create table t2 (i int ) ENGINE = MyISAM partition by range (i) ( partition p01 values less than (1000) data directory="$MYSQLTEST_VARDIR/tmp" index directory="$MYSQLTEST_VARDIR/tmp" ); set @org_mode=@@sql_mode; set @@sql_mode='NO_DIR_IN_CREATE'; select @@sql_mode; create table t1 (i int ) ENGINE = MyISAM partition by range (i) ( partition p01 values less than (1000) data directory='/not/existing' index directory='/not/existing' ); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR show create table t2; DROP TABLE t1, t2; set @@sql_mode=@org_mode; # # Bug 21350: Data Directory problems # # Added ER_WRONG_TABLE_NAME and reported bug#39045 -- error ER_WRONG_ARGUMENTS, ER_WRONG_TABLE_NAME create table t1 (a int) ENGINE = MyISAM partition by key (a) (partition p0 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data'); # # Insert a test that manages to create the first partition and fails with # the second, ensure that we clean up afterwards in a proper manner. # # Added ER_WRONG_TABLE_NAME and reported bug#39045 --error ER_WRONG_ARGUMENTS, ER_WRONG_TABLE_NAME create table t1 (a int) ENGINE = MyISAM partition by key (a) (partition p0, partition p1 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data'); --echo # --echo # MDEV-25917 create table like fails if source table is partitioned and engine is myisam or aria with data directory. --echo # --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR eval CREATE TABLE t1 (a INT) ENGINE = MyISAM PARTITION BY LIST (a) (PARTITION p0 VALUES IN (0) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp', PARTITION p1 VALUES IN (1) DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp', PARTITION p2 VALUES IN (2)); CREATE TABLE t2 LIKE t1; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR SHOW CREATE TABLE t1; SHOW CREATE TABLE t2; DROP TABLE t1, t2; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR eval CREATE TABLE t1 ( ID int(11) NOT NULL, type int(11)) Engine=MyISAM PARTITION BY RANGE(ID) SUBPARTITION BY HASH(type) ( PARTITION p01 VALUES LESS THAN(100) (SUBPARTITION s11 DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp', SUBPARTITION s12 DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp' ), PARTITION p11 VALUES LESS THAN(200) (SUBPARTITION s21, SUBPARTITION s22), PARTITION p21 VALUES LESS THAN MAXVALUE (SUBPARTITION s31 DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp', SUBPARTITION s32 DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp' ) ); CREATE TABLE t2 LIKE t1; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR SHOW CREATE TABLE t1; SHOW CREATE TABLE t2; DROP TABLE t1, t2;