From 1a85ae444a72681e34a527128dc83a897dd64ec2 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Sat, 29 Mar 2025 12:13:42 +0100 Subject: [PATCH] MDEV-36050 DATA/INDEX DIRECTORY handling is inconsistent consistently issue a Note 1618 DATA DIRECTORY option ignored Note 1618 INDEX DIRECTORY option ignored in archive/csv/innodb/rocksdb whenever an option is ignored. Note that csv doesn't say "INDEX DIRECTORY option ignored" because it does not create index files at all anywhere. Other engines don't say "INDEX DIRECTORY option ignored" if the table has no indexes. additionally InnoDB doesn't say that if INDEX DIRECTORY is the same as DATA DIRECTORY, because in that case indexes are technically stored in INDEX DIRECTORY. collateral fix: use strmake to zero-terminate the string --- .../suite/archive/archive_no_symlink.result | 4 +- .../suite/archive/archive_symlink.result | 2 +- mysql-test/suite/csv/symlink.result | 5 ++ mysql-test/suite/csv/symlink.test | 8 +++ .../suite/innodb/r/skip_symbolic_links.result | 17 ++++-- .../suite/innodb/t/skip_symbolic_links.test | 18 +++--- .../r/partition_basic_symlink_innodb.result | 38 +++++++------ .../r/reorganize_partition_innodb.result | 56 +++++++++++-------- .../t/partition_basic_symlink_innodb.test | 6 +- .../parts/t/reorganize_partition_innodb.test | 18 +++--- storage/archive/ha_archive.cc | 6 +- storage/csv/ha_tina.cc | 5 ++ storage/innobase/handler/ha_innodb.cc | 20 ++----- storage/rocksdb/ha_rocksdb.cc | 6 +- .../rocksdb/r/tbl_opt_data_index_dir.result | 35 +++++++----- .../rocksdb/t/tbl_opt_data_index_dir.test | 25 ++------- 16 files changed, 137 insertions(+), 132 deletions(-) create mode 100644 mysql-test/suite/csv/symlink.result create mode 100644 mysql-test/suite/csv/symlink.test diff --git a/mysql-test/suite/archive/archive_no_symlink.result b/mysql-test/suite/archive/archive_no_symlink.result index ca86ae1afec..e4c4862693e 100644 --- a/mysql-test/suite/archive/archive_no_symlink.result +++ b/mysql-test/suite/archive/archive_no_symlink.result @@ -10,8 +10,8 @@ PRIMARY KEY (c1)) ENGINE = archive DATA DIRECTORY = 'MYSQL_TMP_DIR/archive' INDEX DIRECTORY = 'MYSQL_TMP_DIR/archive'; Warnings: -Warning 1618 DATA DIRECTORY option ignored -Warning 1618 INDEX DIRECTORY option ignored +Note 1618 DATA DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored INSERT INTO t1 VALUES (NULL, "first", 1); INSERT INTO t1 VALUES (NULL, "second", 2); INSERT INTO t1 VALUES (NULL, "third", 3); diff --git a/mysql-test/suite/archive/archive_symlink.result b/mysql-test/suite/archive/archive_symlink.result index 0c0cdd7c300..0cb6b3e55a0 100644 --- a/mysql-test/suite/archive/archive_symlink.result +++ b/mysql-test/suite/archive/archive_symlink.result @@ -11,7 +11,7 @@ ERROR HY000: Can't create table `test`.`t1` (errno: 2 "No such file or directory CREATE TABLE t1 (a int AUTO_INCREMENT KEY, b char(30)) ENGINE archive DATA DIRECTORY = 'MYSQL_TMP_DIR/archive' INDEX DIRECTORY = 'MYSQL_TMP_DIR/archive'; Warnings: -Warning 1618 INDEX DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored INSERT INTO t1 VALUES (NULL, "blue"); INSERT INTO t1 VALUES (NULL, "red"); INSERT INTO t1 VALUES (NULL, "yellow"); diff --git a/mysql-test/suite/csv/symlink.result b/mysql-test/suite/csv/symlink.result new file mode 100644 index 00000000000..1623cb3d7a3 --- /dev/null +++ b/mysql-test/suite/csv/symlink.result @@ -0,0 +1,5 @@ +create table t1c (a int not null) engine=csv data directory='$MYSQL_TMP_DIR' index directory='$MYSQL_TMP_DIR'; +Warnings: +Note 1618 DATA DIRECTORY option ignored +insert t1c values (1),(2); +drop table t1c; diff --git a/mysql-test/suite/csv/symlink.test b/mysql-test/suite/csv/symlink.test new file mode 100644 index 00000000000..5b89bee7924 --- /dev/null +++ b/mysql-test/suite/csv/symlink.test @@ -0,0 +1,8 @@ +--source include/have_csv.inc + +# not supported +evalp create table t1c (a int not null) engine=csv data directory='$MYSQL_TMP_DIR' index directory='$MYSQL_TMP_DIR'; +insert t1c values (1),(2); +list_files $MYSQL_TMP_DIR t1c*; +drop table t1c; + diff --git a/mysql-test/suite/innodb/r/skip_symbolic_links.result b/mysql-test/suite/innodb/r/skip_symbolic_links.result index 6baac5086ff..9fd7a5796aa 100644 --- a/mysql-test/suite/innodb/r/skip_symbolic_links.result +++ b/mysql-test/suite/innodb/r/skip_symbolic_links.result @@ -1,25 +1,30 @@ SELECT @@have_symlink; @@have_symlink DISABLED -CREATE TABLE t1(a INT) ENGINE=InnoDB DATA DIRECTORY 'MYSQL_TMP_DIR'; +CREATE TABLE t1(a INT, KEY(a)) ENGINE=InnoDB DATA DIRECTORY '$MYSQL_TMP_DIR' INDEX DIRECTORY '$MYSQL_TMP_DIR'; Warnings: Warning 1618 DATA DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored DROP TABLE t1; -CREATE TABLE t1(a INT) ENGINE=InnoDB; -ALTER TABLE t1 DATA DIRECTORY 'MYSQL_TMP_DIR'; +CREATE TABLE t1(a INT, KEY(a)) ENGINE=InnoDB; +ALTER TABLE t1 DATA DIRECTORY '$MYSQL_TMP_DIR' INDEX DIRECTORY '$MYSQL_TMP_DIR'; Warnings: Warning 1618 DATA DIRECTORY option ignored +Warning 1618 INDEX DIRECTORY option ignored SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` int(11) DEFAULT NULL + `a` int(11) DEFAULT NULL, + KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci DROP TABLE t1; # restart: --symbolic-links CREATE TABLE t1(a INT PRIMARY KEY, b INT) ENGINE=InnoDB -DATA DIRECTORY 'MYSQL_TMP_DIR'; +DATA DIRECTORY '$MYSQL_TMP_DIR' INDEX DIRECTORY '$MYSQL_TMP_DIR/other'; +Warnings: +Note 1618 INDEX DIRECTORY option ignored CREATE TABLE t2(a INT PRIMARY KEY, b INT) ENGINE=InnoDB -DATA DIRECTORY 'MYSQL_TMP_DIR'; +DATA DIRECTORY '$MYSQL_TMP_DIR' INDEX DIRECTORY '$MYSQL_TMP_DIR'; TRUNCATE TABLE t1; TRUNCATE TABLE t2; # restart diff --git a/mysql-test/suite/innodb/t/skip_symbolic_links.test b/mysql-test/suite/innodb/t/skip_symbolic_links.test index b5274d220c8..caccac8a50b 100644 --- a/mysql-test/suite/innodb/t/skip_symbolic_links.test +++ b/mysql-test/suite/innodb/t/skip_symbolic_links.test @@ -2,13 +2,11 @@ --source include/not_windows.inc SELECT @@have_symlink; ---replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR -eval CREATE TABLE t1(a INT) ENGINE=InnoDB DATA DIRECTORY '$MYSQL_TMP_DIR'; +evalp CREATE TABLE t1(a INT, KEY(a)) ENGINE=InnoDB DATA DIRECTORY '$MYSQL_TMP_DIR' INDEX DIRECTORY '$MYSQL_TMP_DIR'; DROP TABLE t1; -CREATE TABLE t1(a INT) ENGINE=InnoDB; +CREATE TABLE t1(a INT, KEY(a)) ENGINE=InnoDB; ---replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR -eval ALTER TABLE t1 DATA DIRECTORY '$MYSQL_TMP_DIR'; +evalp ALTER TABLE t1 DATA DIRECTORY '$MYSQL_TMP_DIR' INDEX DIRECTORY '$MYSQL_TMP_DIR'; SHOW CREATE TABLE t1; DROP TABLE t1; @@ -16,12 +14,10 @@ DROP TABLE t1; --let $restart_parameters=--symbolic-links --source include/restart_mysqld.inc ---replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR -eval CREATE TABLE t1(a INT PRIMARY KEY, b INT) ENGINE=InnoDB -DATA DIRECTORY '$MYSQL_TMP_DIR'; ---replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR -eval CREATE TABLE t2(a INT PRIMARY KEY, b INT) ENGINE=InnoDB -DATA DIRECTORY '$MYSQL_TMP_DIR'; +evalp CREATE TABLE t1(a INT PRIMARY KEY, b INT) ENGINE=InnoDB +DATA DIRECTORY '$MYSQL_TMP_DIR' INDEX DIRECTORY '$MYSQL_TMP_DIR/other'; +evalp CREATE TABLE t2(a INT PRIMARY KEY, b INT) ENGINE=InnoDB +DATA DIRECTORY '$MYSQL_TMP_DIR' INDEX DIRECTORY '$MYSQL_TMP_DIR'; TRUNCATE TABLE t1; TRUNCATE TABLE t2; diff --git a/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result b/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result index 97e9bbbe24e..559acf94901 100644 --- a/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result +++ b/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result @@ -10,20 +10,19 @@ SET SESSION innodb_strict_mode = ON; SET GLOBAL innodb_file_per_table = OFF; Warnings: Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a future release -CREATE TABLE t1 (c1 INT) ENGINE = InnoDB +CREATE TABLE t1 (c1 INT, KEY(c1)) ENGINE = InnoDB PARTITION BY HASH (c1) ( PARTITION p0 -DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' - INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir', +DATA DIRECTORY = '$MYSQLTEST_VARDIR/mysql-test-data-dir' + INDEX DIRECTORY = '$MYSQLTEST_VARDIR/mysql-test-idx-dir', PARTITION p1 -DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' - INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' +DATA DIRECTORY = '$MYSQLTEST_VARDIR/mysql-test-data-dir' + INDEX DIRECTORY = '$MYSQLTEST_VARDIR/mysql-test-idx-dir' ); ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options") SHOW WARNINGS; Level Code Message Warning 1478 InnoDB: DATA DIRECTORY requires innodb_file_per_table. -Warning 1478 InnoDB: INDEX DIRECTORY is not supported Error 1005 Can't create table `test`.`t1` (errno: 140 "Wrong create options") Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB Error 6 Error on delete of 'MYSQLD_DATADIR/test/t1.par' (Errcode: 2 "No such file or directory") @@ -40,22 +39,22 @@ SET SESSION innodb_strict_mode = OFF; SET GLOBAL innodb_file_per_table = ON; Warnings: Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a future release -CREATE TABLE t1 (c1 INT) ENGINE = InnoDB +CREATE TABLE t1 (c1 INT, KEY(c1)) ENGINE = InnoDB PARTITION BY HASH (c1) (PARTITION p0 -DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' - INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir', +DATA DIRECTORY = '$MYSQLTEST_VARDIR/mysql-test-data-dir' + INDEX DIRECTORY = '$MYSQLTEST_VARDIR/mysql-test-idx-dir', PARTITION p1 -DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' - INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' +DATA DIRECTORY = '$MYSQLTEST_VARDIR/mysql-test-data-dir' + INDEX DIRECTORY = '$MYSQLTEST_VARDIR/mysql-test-idx-dir' ); Warnings: -Warning 1618 INDEX DIRECTORY option ignored -Warning 1618 INDEX DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored SHOW WARNINGS; Level Code Message -Warning 1618 INDEX DIRECTORY option ignored -Warning 1618 INDEX DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored # Verifying .frm, .par, .isl & .ibd files ---- MYSQLD_DATADIR/test db.opt @@ -74,7 +73,8 @@ FLUSH TABLES; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `c1` int(11) DEFAULT NULL + `c1` int(11) DEFAULT NULL, + KEY `c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PARTITION BY HASH (`c1`) (PARTITION `p0` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, @@ -87,7 +87,8 @@ ALTER TABLE t1 engine=MyISAM; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `c1` int(11) DEFAULT NULL + `c1` int(11) DEFAULT NULL, + KEY `c1` (`c1`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PARTITION BY HASH (`c1`) (PARTITION `p0` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, @@ -114,7 +115,8 @@ ALTER TABLE t1 engine=InnoDB; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `c1` int(11) DEFAULT NULL + `c1` int(11) DEFAULT NULL, + KEY `c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PARTITION BY HASH (`c1`) (PARTITION `p0` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, diff --git a/mysql-test/suite/parts/r/reorganize_partition_innodb.result b/mysql-test/suite/parts/r/reorganize_partition_innodb.result index b06de4c7ceb..1fc50f3ea33 100644 --- a/mysql-test/suite/parts/r/reorganize_partition_innodb.result +++ b/mysql-test/suite/parts/r/reorganize_partition_innodb.result @@ -2,17 +2,18 @@ # MDEV-15953 Alter InnoDB Partitioned Table Moves Files (which were originally not in the datadir) to the datadir # CREATE TABLE t ( -a INT NOT NULL +a INT NOT NULL, KEY(a) ) ENGINE=INNODB PARTITION BY HASH (a) ( -PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB, -PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB +PARTITION p1 DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB, +PARTITION p2 DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB ); INSERT INTO t VALUES (1); SHOW CREATE TABLE t; Table Create Table t CREATE TABLE `t` ( - `a` int(11) NOT NULL + `a` int(11) NOT NULL, + KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PARTITION BY HASH (`a`) (PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB, @@ -24,7 +25,8 @@ SHOW CREATE TABLE t; Table Create Table t CREATE TABLE `t` ( `a` int(11) NOT NULL, - PRIMARY KEY (`a`) + PRIMARY KEY (`a`), + KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PARTITION BY HASH (`a`) (PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB, @@ -33,7 +35,8 @@ ALTER TABLE t DROP PRIMARY KEY, ALGORITHM=COPY; SHOW CREATE TABLE t; Table Create Table t CREATE TABLE `t` ( - `a` int(11) NOT NULL + `a` int(11) NOT NULL, + KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PARTITION BY HASH (`a`) (PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB, @@ -49,7 +52,8 @@ SHOW CREATE TABLE t; Table Create Table t CREATE TABLE `t` ( `a` int(11) NOT NULL, - PRIMARY KEY (`a`) + PRIMARY KEY (`a`), + KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PARTITION BY HASH (`a`) (PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB, @@ -68,7 +72,8 @@ SHOW CREATE TABLE t; Table Create Table t CREATE TABLE `t` ( `a` int(11) NOT NULL, - PRIMARY KEY (`a`) + PRIMARY KEY (`a`), + KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PARTITION BY HASH (`a`) (PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB, @@ -84,7 +89,8 @@ SHOW CREATE TABLE t; Table Create Table t CREATE TABLE `t` ( `a` int(11) NOT NULL, - PRIMARY KEY (`a`) + PRIMARY KEY (`a`), + KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PARTITION BY HASH (`a`) (PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB, @@ -100,7 +106,8 @@ SHOW CREATE TABLE t; Table Create Table t CREATE TABLE `t` ( `a` int(11) NOT NULL, - PRIMARY KEY (`a`) + PRIMARY KEY (`a`), + KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PARTITION BY HASH (`a`) (PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB, @@ -109,37 +116,37 @@ DROP TABLE t; SET @strict = @@innodb_strict_mode; SET innodb_strict_mode=OFF; CREATE TABLE t ( -a INT NOT NULL +a INT NOT NULL, KEY(a) ) ENGINE=INNODB PARTITION BY RANGE (a) SUBPARTITION BY HASH (a) SUBPARTITIONS 2 ( PARTITION p1 VALUES LESS THAN (7) -DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' - INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' +DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' + INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB, PARTITION p2 VALUES LESS THAN MAXVALUE -DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' - INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' +DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' + INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB ); Warnings: -Warning 1618 INDEX DIRECTORY option ignored -Warning 1618 INDEX DIRECTORY option ignored -Warning 1618 INDEX DIRECTORY option ignored -Warning 1618 INDEX DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored SET innodb_strict_mode=@strict; ALTER TABLE t REORGANIZE PARTITION p1,p2 INTO ( PARTITION p1 VALUES LESS THAN (7) DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' - INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' + INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB, PARTITION p2 VALUES LESS THAN MAXVALUE DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' - INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' + INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB ); Warnings: @@ -154,11 +161,12 @@ Warning 1982 INDEX DIRECTORY option ignored for InnoDB partition SHOW CREATE TABLE t; Table Create Table t CREATE TABLE `t` ( - `a` int(11) NOT NULL + `a` int(11) NOT NULL, + KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PARTITION BY RANGE (`a`) SUBPARTITION BY HASH (`a`) SUBPARTITIONS 2 -(PARTITION `p1` VALUES LESS THAN (7) DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = InnoDB, - PARTITION `p2` VALUES LESS THAN MAXVALUE DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = InnoDB) +(PARTITION `p1` VALUES LESS THAN (7) DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = InnoDB, + PARTITION `p2` VALUES LESS THAN MAXVALUE DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = InnoDB) DROP TABLE t; diff --git a/mysql-test/suite/parts/t/partition_basic_symlink_innodb.test b/mysql-test/suite/parts/t/partition_basic_symlink_innodb.test index c0e3c21a12d..b644f421c75 100644 --- a/mysql-test/suite/parts/t/partition_basic_symlink_innodb.test +++ b/mysql-test/suite/parts/t/partition_basic_symlink_innodb.test @@ -54,9 +54,8 @@ SET SESSION innodb_strict_mode = ON; --echo # InnoDB only supports DATA DIRECTORY with innodb_file_per_table=ON --echo # SET GLOBAL innodb_file_per_table = OFF; ---replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --error ER_CANT_CREATE_TABLE -eval CREATE TABLE t1 (c1 INT) ENGINE = InnoDB +evalp CREATE TABLE t1 (c1 INT, KEY(c1)) ENGINE = InnoDB PARTITION BY HASH (c1) ( PARTITION p0 DATA DIRECTORY = '$MYSQLTEST_VARDIR/mysql-test-data-dir' @@ -79,8 +78,7 @@ SHOW WARNINGS; --echo # SET SESSION innodb_strict_mode = OFF; SET GLOBAL innodb_file_per_table = ON; ---replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR -eval CREATE TABLE t1 (c1 INT) ENGINE = InnoDB +evalp CREATE TABLE t1 (c1 INT, KEY(c1)) ENGINE = InnoDB PARTITION BY HASH (c1) (PARTITION p0 DATA DIRECTORY = '$MYSQLTEST_VARDIR/mysql-test-data-dir' diff --git a/mysql-test/suite/parts/t/reorganize_partition_innodb.test b/mysql-test/suite/parts/t/reorganize_partition_innodb.test index 77109c38c96..6d3d8d9bf91 100644 --- a/mysql-test/suite/parts/t/reorganize_partition_innodb.test +++ b/mysql-test/suite/parts/t/reorganize_partition_innodb.test @@ -8,9 +8,8 @@ mkdir $MYSQLTEST_VARDIR/tmp/partitions_here; ---replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR -eval CREATE TABLE t ( - a INT NOT NULL +evalp CREATE TABLE t ( + a INT NOT NULL, KEY(a) ) ENGINE=INNODB PARTITION BY HASH (a) ( PARTITION p1 DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB, @@ -61,9 +60,8 @@ DROP TABLE t; SET @strict = @@innodb_strict_mode; SET innodb_strict_mode=OFF; ---replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR -eval CREATE TABLE t ( - a INT NOT NULL +evalp CREATE TABLE t ( + a INT NOT NULL, KEY(a) ) ENGINE=INNODB PARTITION BY RANGE (a) SUBPARTITION BY HASH (a) @@ -71,11 +69,11 @@ PARTITION BY RANGE (a) ( PARTITION p1 VALUES LESS THAN (7) DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' - INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' + INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB, PARTITION p2 VALUES LESS THAN MAXVALUE DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' - INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' + INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB ); SET innodb_strict_mode=@strict; @@ -86,11 +84,11 @@ REORGANIZE PARTITION p1,p2 INTO ( PARTITION p1 VALUES LESS THAN (7) DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' - INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' + INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB, PARTITION p2 VALUES LESS THAN MAXVALUE DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' - INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' + INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB ); diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc index 3a4d3cc0a59..75d0289d0c1 100644 --- a/storage/archive/ha_archive.cc +++ b/storage/archive/ha_archive.cc @@ -826,7 +826,7 @@ int ha_archive::create(const char *name, TABLE *table_arg, #endif /* HAVE_READLINK */ { if (create_info->data_file_name) - my_error(WARN_OPTION_IGNORED, MYF(ME_WARNING), "DATA DIRECTORY"); + my_error(WARN_OPTION_IGNORED, MYF(ME_NOTE), "DATA DIRECTORY"); fn_format(name_buff, name, "", ARZ, MY_REPLACE_EXT | MY_UNPACK_FILENAME); @@ -834,8 +834,8 @@ int ha_archive::create(const char *name, TABLE *table_arg, } /* Archive engine never uses INDEX DIRECTORY. */ - if (create_info->index_file_name) - my_error(WARN_OPTION_IGNORED, MYF(ME_WARNING), "INDEX DIRECTORY"); + if (create_info->index_file_name && table_arg->s->keys) + my_error(WARN_OPTION_IGNORED, MYF(ME_NOTE), "INDEX DIRECTORY"); /* There is a chance that the file was "discovered". In this case diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc index 4eff11f0c36..98f5a943791 100644 --- a/storage/csv/ha_tina.cc +++ b/storage/csv/ha_tina.cc @@ -1729,6 +1729,11 @@ int ha_tina::create(const char *name, TABLE *table_arg, } } + if (create_info->data_file_name) + my_error(WARN_OPTION_IGNORED, ME_NOTE, "DATA DIRECTORY"); + + if (create_info->index_file_name && table_arg->s->keys) + my_error(WARN_OPTION_IGNORED, ME_NOTE, "INDEX DIRECTORY"); if ((create_file= mysql_file_create(csv_key_file_metadata, fn_format(name_buff, name, "", CSM_EXT, diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 5c04302ef45..d8adc62a445 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -11274,15 +11274,6 @@ create_table_info_t::create_options_are_invalid() ret = "DATA DIRECTORY"; } - /* Do not allow INDEX_DIRECTORY */ - if (m_create_info->index_file_name) { - push_warning_printf( - m_thd, Sql_condition::WARN_LEVEL_WARN, - ER_ILLEGAL_HA_CREATE_OPTION, - "InnoDB: INDEX DIRECTORY is not supported"); - ret = "INDEX DIRECTORY"; - } - /* Don't support compressed table when page size > 16k. */ if ((has_key_block_size || row_format == ROW_TYPE_COMPRESSED) && srv_page_size > UNIV_PAGE_SIZE_DEF) { @@ -11557,15 +11548,16 @@ create_table_info_t::parse_table_name( m_flags &= ~DICT_TF_MASK_DATA_DIR; } else { - strncpy(m_remote_path, + strmake(m_remote_path, m_create_info->data_file_name, - FN_REFLEN - 1); + FN_REFLEN - 2); } } - if (m_create_info->index_file_name) { - my_error(WARN_OPTION_IGNORED, ME_WARNING, - "INDEX DIRECTORY"); + if (m_create_info->index_file_name && m_form->s->keys && + (!(m_flags & DICT_TF_MASK_DATA_DIR) || + strcmp(m_remote_path, m_create_info->index_file_name))) { + my_error(WARN_OPTION_IGNORED, ME_NOTE, "INDEX DIRECTORY"); } DBUG_RETURN(0); diff --git a/storage/rocksdb/ha_rocksdb.cc b/storage/rocksdb/ha_rocksdb.cc index a6d38a700d0..e9d5eb9e02c 100644 --- a/storage/rocksdb/ha_rocksdb.cc +++ b/storage/rocksdb/ha_rocksdb.cc @@ -7839,12 +7839,12 @@ int ha_rocksdb::create(const char *const name, TABLE *const table_arg, // outside the MySQL data directory. We don't support this for MyRocks. // The `rocksdb_datadir` setting should be used to configure RocksDB data // directory. - DBUG_RETURN(HA_ERR_ROCKSDB_TABLE_DATA_DIRECTORY_NOT_SUPPORTED); + my_error(WARN_OPTION_IGNORED, ME_NOTE, "DATA DIRECTORY"); } - if (create_info->index_file_name) { + if (create_info->index_file_name && table_arg->s->keys) { // Similar check for INDEX DIRECTORY as well. - DBUG_RETURN(HA_ERR_ROCKSDB_TABLE_INDEX_DIRECTORY_NOT_SUPPORTED); + my_error(WARN_OPTION_IGNORED, ME_NOTE, "INDEX DIRECTORY"); } int err; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/tbl_opt_data_index_dir.result b/storage/rocksdb/mysql-test/rocksdb/r/tbl_opt_data_index_dir.result index 9691eeeffdf..02479399293 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/tbl_opt_data_index_dir.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/tbl_opt_data_index_dir.result @@ -1,16 +1,17 @@ -DROP TABLE IF EXISTS t1; CREATE TABLE t1 (a INT PRIMARY KEY, b CHAR(8)) ENGINE=rocksdb DATA DIRECTORY = '/foo/bar/data'; -ERROR HY000: Can't create table `test`.`t1` (errno: XXX "Unknown error XXX") +Warnings: +Note 1618 DATA DIRECTORY option ignored show warnings; Level Code Message -Error 1005 Can't create table `test`.`t1` (errno: XXX "Unknown error XXX") -Warning 1296 Got error XXX 'Specifying DATA DIRECTORY for an individual table is not supported.' from ROCKSDB +Note 1618 DATA DIRECTORY option ignored +drop table t1; CREATE TABLE t1 (a INT PRIMARY KEY, b CHAR(8)) ENGINE=rocksdb INDEX DIRECTORY = '/foo/bar/index'; -ERROR HY000: Can't create table `test`.`t1` (errno: XXX "Unknown error XXX") +Warnings: +Note 1618 INDEX DIRECTORY option ignored show warnings; Level Code Message -Error 1005 Can't create table `test`.`t1` (errno: XXX "Unknown error XXX") -Warning 1296 Got error XXX 'Specifying INDEX DIRECTORY for an individual table is not supported.' from ROCKSDB +Note 1618 INDEX DIRECTORY option ignored +drop table t1; CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY) ENGINE=rocksdb PARTITION BY RANGE (id) ( PARTITION P0 VALUES LESS THAN (1000) @@ -19,12 +20,14 @@ PARTITION P1 VALUES LESS THAN (2000) DATA DIRECTORY = '/foo/bar/data/', PARTITION P2 VALUES LESS THAN (MAXVALUE) ); -ERROR HY000: Can't create table `test`.`t1` (errno: XXX "Unknown error XXX") +Warnings: +Note 1618 DATA DIRECTORY option ignored +Note 1618 DATA DIRECTORY option ignored show warnings; Level Code Message -Error 1005 Can't create table `test`.`t1` (errno: XXX "Unknown error XXX") -Warning 1296 Got error XXX 'Specifying DATA DIRECTORY for an individual table is not supported.' from ROCKSDB -Error 6 Error on delete of './test/t1.par' (Errcode: 2 "No such file or directory") +Note 1618 DATA DIRECTORY option ignored +Note 1618 DATA DIRECTORY option ignored +drop table t1; CREATE TABLE t1 (id int not null primary key) ENGINE=rocksdb PARTITION BY RANGE (id) ( PARTITION P0 VALUES LESS THAN (1000) @@ -33,9 +36,11 @@ PARTITION P1 VALUES LESS THAN (2000) INDEX DIRECTORY = '/foo/bar/data/', PARTITION P2 VALUES LESS THAN (MAXVALUE) ); -ERROR HY000: Can't create table `test`.`t1` (errno: XXX "Unknown error XXX") +Warnings: +Note 1618 INDEX DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored show warnings; Level Code Message -Error 1005 Can't create table `test`.`t1` (errno: XXX "Unknown error XXX") -Warning 1296 Got error XXX 'Specifying INDEX DIRECTORY for an individual table is not supported.' from ROCKSDB -Error 6 Error on delete of './test/t1.par' (Errcode: 2 "No such file or directory") +Note 1618 INDEX DIRECTORY option ignored +Note 1618 INDEX DIRECTORY option ignored +drop table t1; diff --git a/storage/rocksdb/mysql-test/rocksdb/t/tbl_opt_data_index_dir.test b/storage/rocksdb/mysql-test/rocksdb/t/tbl_opt_data_index_dir.test index e2595b10fd7..2b94aead28f 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/tbl_opt_data_index_dir.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/tbl_opt_data_index_dir.test @@ -1,5 +1,4 @@ --source include/have_rocksdb.inc - --source include/have_partition.inc --source include/not_windows.inc @@ -9,32 +8,18 @@ # functionality and therefore shouldn't just silently accept the values. # ---disable_warnings -DROP TABLE IF EXISTS t1; ---enable_warnings - -# On a Mac, strerror() prints "Unknown error: nn", as -# opposed to "Unknown error nn" on Linux/etc. -# Replacing 'error:' with 'error' below to make the output uniform. - ---replace_regex /err(no:|or):? \d+/err\1 XXX/ ---error ER_CANT_CREATE_TABLE CREATE TABLE t1 (a INT PRIMARY KEY, b CHAR(8)) ENGINE=rocksdb DATA DIRECTORY = '/foo/bar/data'; ---replace_regex /err(no:|or):? \d+/err\1 XXX/ show warnings; +drop table t1; ---replace_regex /err(no:|or):? \d+/err\1 XXX/ ---error ER_CANT_CREATE_TABLE CREATE TABLE t1 (a INT PRIMARY KEY, b CHAR(8)) ENGINE=rocksdb INDEX DIRECTORY = '/foo/bar/index'; ---replace_regex /err(no:|or):? \d+/err\1 XXX/ show warnings; +drop table t1; # # Verify that we'll get the same error codes when using the partitions. # ---replace_regex /err(no:|or):? \d+/err\1 XXX/ ---error ER_CANT_CREATE_TABLE CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY) ENGINE=rocksdb PARTITION BY RANGE (id) ( PARTITION P0 VALUES LESS THAN (1000) @@ -43,11 +28,9 @@ CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY) ENGINE=rocksdb PARTITION BY RANGE DATA DIRECTORY = '/foo/bar/data/', PARTITION P2 VALUES LESS THAN (MAXVALUE) ); ---replace_regex /err(no:|or):? \d+/err\1 XXX/ show warnings; +drop table t1; ---replace_regex /err(no:|or):? \d+/err\1 XXX/ ---error ER_CANT_CREATE_TABLE CREATE TABLE t1 (id int not null primary key) ENGINE=rocksdb PARTITION BY RANGE (id) ( PARTITION P0 VALUES LESS THAN (1000) @@ -56,5 +39,5 @@ CREATE TABLE t1 (id int not null primary key) ENGINE=rocksdb PARTITION BY RANGE INDEX DIRECTORY = '/foo/bar/data/', PARTITION P2 VALUES LESS THAN (MAXVALUE) ); ---replace_regex /err(no:|or):? \d+/err\1 XXX/ show warnings; +drop table t1;