From 4e89fdb9d8e88607c0992bc2d049010344c0cb3b Mon Sep 17 00:00:00 2001 From: Stephen Long Date: Sat, 17 Aug 2019 12:59:16 -0400 Subject: [PATCH 1/6] MDEV-19837 and MDEV-19816: Change some comments --- sql/item.h | 2 +- sql/sql_insert.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/item.h b/sql/item.h index 6dc99970914..26bf8b91053 100644 --- a/sql/item.h +++ b/sql/item.h @@ -606,7 +606,7 @@ public: /* Cache of the result of is_expensive(). */ int8 is_expensive_cache; - /* Reuse size, only used by SP local variable assignment, otherwize 0 */ + /* Reuse size, only used by SP local variable assignment, otherwise 0 */ uint rsize; /* diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index ddf9bd155a9..075e37042f4 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1881,7 +1881,7 @@ before_trg_err: /****************************************************************************** - Check that all fields with arn't null_fields are used + Check that there aren't any null_fields ******************************************************************************/ int check_that_all_fields_are_given_values(THD *thd, TABLE *entry, From df61c5849987267f5daac671e0af8550ae613621 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Sun, 1 Sep 2019 12:29:55 +0200 Subject: [PATCH 2/6] MDEV-14383 tokudb_bugs. tests failed in buildbot, lost connection to server don't run tokudb tests under tcmalloc, this is not a supported combination. --- storage/tokudb/mysql-test/rpl/suite.pm | 3 +++ storage/tokudb/mysql-test/tokudb/suite.pm | 3 +++ storage/tokudb/mysql-test/tokudb_add_index/suite.pm | 3 +++ storage/tokudb/mysql-test/tokudb_alter_table/suite.pm | 3 +++ storage/tokudb/mysql-test/tokudb_bugs/suite.pm | 3 +++ storage/tokudb/mysql-test/tokudb_mariadb/suite.pm | 3 +++ 6 files changed, 18 insertions(+) diff --git a/storage/tokudb/mysql-test/rpl/suite.pm b/storage/tokudb/mysql-test/rpl/suite.pm index ba9809a9930..3619ca716bc 100644 --- a/storage/tokudb/mysql-test/rpl/suite.pm +++ b/storage/tokudb/mysql-test/rpl/suite.pm @@ -5,6 +5,9 @@ use File::Basename; # Ensure we can run the TokuDB tests even if hugepages are enabled $ENV{TOKU_HUGE_PAGES_OK}=1; +return "Doesn't work with tcmalloc" if $ENV{LD_PRELOAD} =~ /tcmalloc/ and + $mysql_version_id < 100000; + #return "Not run for embedded server" if $::opt_embedded_server; return "No TokuDB engine" unless $ENV{HA_TOKUDB_SO} or $::mysqld_variables{tokudb}; diff --git a/storage/tokudb/mysql-test/tokudb/suite.pm b/storage/tokudb/mysql-test/tokudb/suite.pm index 6c52d0110fe..891969d6c7f 100644 --- a/storage/tokudb/mysql-test/tokudb/suite.pm +++ b/storage/tokudb/mysql-test/tokudb/suite.pm @@ -5,6 +5,9 @@ use File::Basename; # Ensure we can run the TokuDB tests even if hugepages are enabled $ENV{TOKU_HUGE_PAGES_OK}=1; +return "Doesn't work with tcmalloc" if $ENV{LD_PRELOAD} =~ /tcmalloc/ and + $mysql_version_id < 100000; + #return "Not run for embedded server" if $::opt_embedded_server; return "No TokuDB engine" unless $ENV{HA_TOKUDB_SO} or $::mysqld_variables{tokudb}; diff --git a/storage/tokudb/mysql-test/tokudb_add_index/suite.pm b/storage/tokudb/mysql-test/tokudb_add_index/suite.pm index ee1d1bde06b..587475d96e8 100644 --- a/storage/tokudb/mysql-test/tokudb_add_index/suite.pm +++ b/storage/tokudb/mysql-test/tokudb_add_index/suite.pm @@ -5,6 +5,9 @@ use File::Basename; # Ensure we can run the TokuDB tests even if hugepages are enabled $ENV{TOKU_HUGE_PAGES_OK}=1; +return "Doesn't work with tcmalloc" if $ENV{LD_PRELOAD} =~ /tcmalloc/ and + $mysql_version_id < 100000; + #return "Not run for embedded server" if $::opt_embedded_server; return "No TokuDB engine" unless $ENV{HA_TOKUDB_SO} or $::mysqld_variables{tokudb}; diff --git a/storage/tokudb/mysql-test/tokudb_alter_table/suite.pm b/storage/tokudb/mysql-test/tokudb_alter_table/suite.pm index 7981fad2c62..73b002a79c4 100644 --- a/storage/tokudb/mysql-test/tokudb_alter_table/suite.pm +++ b/storage/tokudb/mysql-test/tokudb_alter_table/suite.pm @@ -5,6 +5,9 @@ use File::Basename; # Ensure we can run the TokuDB tests even if hugepages are enabled $ENV{TOKU_HUGE_PAGES_OK}=1; +return "Doesn't work with tcmalloc" if $ENV{LD_PRELOAD} =~ /tcmalloc/ and + $mysql_version_id < 100000; + #return "Not run for embedded server" if $::opt_embedded_server; return "No TokuDB engine" unless $ENV{HA_TOKUDB_SO} or $::mysqld_variables{tokudb}; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/suite.pm b/storage/tokudb/mysql-test/tokudb_bugs/suite.pm index a6e01cd6dd4..332a88199fc 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/suite.pm +++ b/storage/tokudb/mysql-test/tokudb_bugs/suite.pm @@ -5,6 +5,9 @@ use File::Basename; # Ensure we can run the TokuDB tests even if hugepages are enabled $ENV{TOKU_HUGE_PAGES_OK}=1; +return "Doesn't work with tcmalloc" if $ENV{LD_PRELOAD} =~ /tcmalloc/ and + $mysql_version_id < 100000; + #return "Not run for embedded server" if $::opt_embedded_server; return "No TokuDB engine" unless $ENV{HA_TOKUDB_SO} or $::mysqld_variables{tokudb}; diff --git a/storage/tokudb/mysql-test/tokudb_mariadb/suite.pm b/storage/tokudb/mysql-test/tokudb_mariadb/suite.pm index ab3da8e6b03..5cb69e7bdab 100644 --- a/storage/tokudb/mysql-test/tokudb_mariadb/suite.pm +++ b/storage/tokudb/mysql-test/tokudb_mariadb/suite.pm @@ -5,6 +5,9 @@ use File::Basename; # Ensure we can run the TokuDB tests even if hugepages are enabled $ENV{TOKU_HUGE_PAGES_OK}=1; +return "Doesn't work with tcmalloc" if $ENV{LD_PRELOAD} =~ /tcmalloc/ and + $mysql_version_id < 100000; + #return "Not run for embedded server" if $::opt_embedded_server; return "No TokuDB engine" unless $ENV{HA_TOKUDB_SO} or $::mysqld_variables{tokudb}; From edb6e2b951e168d809d7c0c9a11befdc391760fb Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Tue, 3 Sep 2019 11:23:12 +0200 Subject: [PATCH 3/6] MDEV-17610 - fix result, for the case when test runs with userstat=on --- mysql-test/r/sp.result | 2 +- mysql-test/t/sp.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 1704e7cd214..b5f8b017546 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -7644,7 +7644,7 @@ SELECT 1; 1 1 DROP PROCEDURE sp; -CREATE PROCEDURE sp() SHOW USER_STATISTICS; +CREATE PROCEDURE sp() SET STATEMENT SQL_SELECT_LIMIT=0 FOR SHOW USER_STATISTICS; CALL sp; User Total_connections Concurrent_connections Connected_time Busy_time Cpu_time Bytes_received Bytes_sent Binlog_bytes_written Rows_read Rows_sent Rows_deleted Rows_inserted Rows_updated Select_commands Update_commands Other_commands Commit_transactions Rollback_transactions Denied_connections Lost_connections Access_denied Empty_queries Total_ssl_connections Max_statement_time_exceeded SELECT 1; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index a2a40f87ef0..fa4387a9650 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -9078,7 +9078,7 @@ CREATE PROCEDURE sp() ALTER TABLE non_existing_table OPTIMIZE PARTITION p0; CALL sp; SELECT 1; DROP PROCEDURE sp; -CREATE PROCEDURE sp() SHOW USER_STATISTICS; +CREATE PROCEDURE sp() SET STATEMENT SQL_SELECT_LIMIT=0 FOR SHOW USER_STATISTICS; CALL sp; SELECT 1; DROP PROCEDURE sp; From fe4eacde39fd4527f52624162eba7b636549ef31 Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Tue, 3 Sep 2019 16:02:46 +0400 Subject: [PATCH 4/6] MDEV-17683 sys_vars.delayed_insert_limit_func fails in buildbot with wrong result. Test fixed to be deterministic. --- .../r/delayed_insert_limit_func.result | 20 +++++++--------- .../sys_vars/t/delayed_insert_limit_func.test | 24 +++---------------- 2 files changed, 11 insertions(+), 33 deletions(-) diff --git a/mysql-test/suite/sys_vars/r/delayed_insert_limit_func.result b/mysql-test/suite/sys_vars/r/delayed_insert_limit_func.result index 6076d024d44..6788094ebf9 100644 --- a/mysql-test/suite/sys_vars/r/delayed_insert_limit_func.result +++ b/mysql-test/suite/sys_vars/r/delayed_insert_limit_func.result @@ -51,14 +51,12 @@ INSERT DELAYED INTO t1 VALUES('39','1','1'); INSERT DELAYED INTO t1 VALUES('40','1','1'); INSERT DELAYED INTO t1 VALUES('41','1','1'); INSERT DELAYED INTO t1 VALUES('42','1','1'); -INSERT DELAYED INTO t1 VALUES('43','1','1');| +INSERT DELAYED INTO t1 VALUES('43','1','1'); ** Connection con0 ** SELECT COUNT(*) FROM t1; ** Connection default ** ** Wait till con0 is blocked ** UNLOCK TABLES; -** Connection con1 ** -Asynchronous "reap" result ** Connection con0 ** Asynchronous "reap" result The next result suffers from @@ -84,7 +82,6 @@ INSERT INTO t1 VALUES('5'); INSERT INTO t1 VALUES('6'); LOCK TABLE v1 READ; ** Connection con1 ** -Asynchronous execute INSERT DELAYED INTO t1 VALUES('7'); INSERT DELAYED INTO t1 VALUES('8'); INSERT DELAYED INTO t1 VALUES('9'); @@ -100,23 +97,22 @@ INSERT DELAYED INTO t1 VALUES('18'); INSERT DELAYED INTO t1 VALUES('19'); INSERT DELAYED INTO t1 VALUES('20'); INSERT DELAYED INTO t1 VALUES('21'); -INSERT DELAYED INTO t1 VALUES('22');| +INSERT DELAYED INTO t1 VALUES('22'); ** Connection con0 ** Asynchronous execute -SELECT COUNT(*) BETWEEN 6 AND 22 FROM t1; +SELECT COUNT(*) FROM t1; ** Connection default ** ** Wait till con0 is blocked ** UNLOCK TABLES; -** Connection con1 ** ** Connection con0 ** Asynchronous "reap" result -COUNT(*) BETWEEN 6 AND 22 -1 +COUNT(*) +22 ** Connection default** Checking if the delayed insert gives the same result afterwards -SELECT COUNT(*) BETWEEN 6 AND 22 FROM t1; -COUNT(*) BETWEEN 6 AND 22 -1 +SELECT COUNT(*) FROM t1; +COUNT(*) +22 ** Connection default** DROP TABLE t1; DROP VIEW v1; diff --git a/mysql-test/suite/sys_vars/t/delayed_insert_limit_func.test b/mysql-test/suite/sys_vars/t/delayed_insert_limit_func.test index e83c48b67f1..b151ad7d765 100644 --- a/mysql-test/suite/sys_vars/t/delayed_insert_limit_func.test +++ b/mysql-test/suite/sys_vars/t/delayed_insert_limit_func.test @@ -66,8 +66,6 @@ LOCK TABLE v1 READ; --echo ** Connection con1 ** connection con1; -delimiter |; -send INSERT DELAYED INTO t1 VALUES('7','1','1'); INSERT DELAYED INTO t1 VALUES('8','1','1'); INSERT DELAYED INTO t1 VALUES('9','1','1'); @@ -104,8 +102,7 @@ INSERT DELAYED INTO t1 VALUES('39','1','1'); INSERT DELAYED INTO t1 VALUES('40','1','1'); INSERT DELAYED INTO t1 VALUES('41','1','1'); INSERT DELAYED INTO t1 VALUES('42','1','1'); -INSERT DELAYED INTO t1 VALUES('43','1','1');| -delimiter ;| +INSERT DELAYED INTO t1 VALUES('43','1','1'); --echo ** Connection con0 ** connection con0; @@ -126,11 +123,6 @@ let $wait_condition= --source include/wait_condition.inc UNLOCK TABLES; ---echo ** Connection con1 ** -connection con1; ---echo Asynchronous "reap" result -reap; - --echo ** Connection con0 ** connection con0; --echo Asynchronous "reap" result @@ -170,10 +162,6 @@ LOCK TABLE v1 READ; --echo ** Connection con1 ** connection con1; ---echo Asynchronous execute -delimiter |; - -send INSERT DELAYED INTO t1 VALUES('7'); INSERT DELAYED INTO t1 VALUES('8'); INSERT DELAYED INTO t1 VALUES('9'); @@ -189,9 +177,7 @@ INSERT DELAYED INTO t1 VALUES('18'); INSERT DELAYED INTO t1 VALUES('19'); INSERT DELAYED INTO t1 VALUES('20'); INSERT DELAYED INTO t1 VALUES('21'); -INSERT DELAYED INTO t1 VALUES('22');| - -delimiter ;| +INSERT DELAYED INTO t1 VALUES('22'); --echo ** Connection con0 ** connection con0; @@ -202,7 +188,7 @@ let $wait_condition= --echo Asynchronous execute # Due to performance and server behaveiour the test observes values between 6 and 22. # In any case the value must not be outside of that range. -let $my_select= SELECT COUNT(*) BETWEEN 6 AND 22 FROM t1; +let $my_select= SELECT COUNT(*) FROM t1; send; eval $my_select; @@ -215,10 +201,6 @@ let $wait_condition= --source include/wait_condition.inc UNLOCK TABLES; ---echo ** Connection con1 ** -connection con1; -reap; - --echo ** Connection con0 ** connection con0; --echo Asynchronous "reap" result From 0e38cd37c7be46ac2b57344476d68a6dc59bc3a4 Mon Sep 17 00:00:00 2001 From: Sachin Date: Sat, 27 Jul 2019 19:57:46 +0530 Subject: [PATCH 5/6] MDEV-20137 rpl.mdev_17588 fails in buildbot with "Table doesn't exist" Fix the test case. --- mysql-test/suite/rpl/r/mdev_17588.result | 12 ++++-------- mysql-test/suite/rpl/t/mdev_17588.test | 23 ++++++++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/mysql-test/suite/rpl/r/mdev_17588.result b/mysql-test/suite/rpl/r/mdev_17588.result index fea28a311b4..acffe96c647 100644 --- a/mysql-test/suite/rpl/r/mdev_17588.result +++ b/mysql-test/suite/rpl/r/mdev_17588.result @@ -1,16 +1,12 @@ include/master-slave.inc [connection master] +include/stop_slave.inc +CHANGE MASTER TO master_use_gtid=slave_pos; +include/start_slave.inc create table t1 (a int) engine=innodb; create table t2 (a int); create table t3 (a int) engine=innodb; -include/save_master_gtid.inc -include/wait_for_slave_sql_error.inc [errno=1286] -Last_Error = 'Error 'Unknown storage engine 'innodb'' on query. Default database: 'test'. Query: 'create table t1 (a int) engine=innodb'' -STOP SLAVE IO_THREAD; -include/wait_for_slave_to_stop.inc -SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; -include/start_slave.inc -include/sync_with_master_gtid.inc +include/wait_for_slave_sql_error_and_skip.inc [errno=1286] show tables; Tables_in_test t2 diff --git a/mysql-test/suite/rpl/t/mdev_17588.test b/mysql-test/suite/rpl/t/mdev_17588.test index e9a340cbd25..c3ecde56139 100644 --- a/mysql-test/suite/rpl/t/mdev_17588.test +++ b/mysql-test/suite/rpl/t/mdev_17588.test @@ -1,23 +1,28 @@ --source include/master-slave.inc --source include/have_innodb.inc +--connection slave +--source include/stop_slave.inc +CHANGE MASTER TO master_use_gtid=slave_pos; +--source include/start_slave.inc + --connection master create table t1 (a int) engine=innodb; create table t2 (a int); create table t3 (a int) engine=innodb; ---source include/save_master_gtid.inc +--save_master_pos --connection slave # Using ER_UNKNOWN_STORAGE_ENGINE wont work let $slave_sql_errno= 1286; ---source include/wait_for_slave_sql_error.inc ---let $status_items= Last_Error ---source include/show_slave_status.inc -STOP SLAVE IO_THREAD; -source include/wait_for_slave_to_stop.inc; -SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc +--source include/wait_for_slave_sql_error_and_skip.inc +--sync_with_master + +--let $show_statement= SHOW PROCESSLIST +--let $field= State +--let $condition= 'Slave has read all relay log; waiting for the slave I/O thread to update it'; +--source include/wait_show_condition.inc + show tables; show create table t2; --error ER_NO_SUCH_TABLE From 031c695b8c865e5eb6c4c09ced404ae08f98430f Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Mon, 9 Sep 2019 15:39:12 +0400 Subject: [PATCH 6/6] MDEV-16594 ALTER DATA DIRECTORY in PARTITIONS of InnoDB storage does nothing silently InnoDB intentionally (it's a documented behavior) ignores changing of DATA DIRECTORY and INDEX DIRECTORY for partitions. Though we should issue warning when this happens. --- .../r/alter_data_directory_innodb.result | 3 + .../r/reorganize_partition_innodb.result | 153 ++++++++++++++++++ .../parts/t/reorganize_partition_innodb.test | 100 ++++++++++++ sql/share/errmsg-utf8.txt | 2 + sql/sql_partition.cc | 65 ++++++++ 5 files changed, 323 insertions(+) create mode 100644 mysql-test/suite/parts/r/reorganize_partition_innodb.result create mode 100644 mysql-test/suite/parts/t/reorganize_partition_innodb.test diff --git a/mysql-test/suite/parts/r/alter_data_directory_innodb.result b/mysql-test/suite/parts/r/alter_data_directory_innodb.result index ee0a7b80ebb..5dd73874d04 100644 --- a/mysql-test/suite/parts/r/alter_data_directory_innodb.result +++ b/mysql-test/suite/parts/r/alter_data_directory_innodb.result @@ -53,6 +53,9 @@ ALTER TABLE t REORGANIZE PARTITION p1,p2 INTO ( PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB, PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB ); +Warnings: +Warning 1982 option ignored for InnoDB partition +Warning 1982 option ignored for InnoDB partition SHOW CREATE TABLE t; Table Create Table t CREATE TABLE `t` ( diff --git a/mysql-test/suite/parts/r/reorganize_partition_innodb.result b/mysql-test/suite/parts/r/reorganize_partition_innodb.result new file mode 100644 index 00000000000..29ecd87c16a --- /dev/null +++ b/mysql-test/suite/parts/r/reorganize_partition_innodb.result @@ -0,0 +1,153 @@ +# +# 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 +) 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 +); +INSERT INTO t VALUES (1); +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `a` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 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) */ +ALTER TABLE t ADD PRIMARY KEY pk(a), ALGORITHM=INPLACE; +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 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) */ +ALTER TABLE t DROP PRIMARY KEY, ALGORITHM=COPY; +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `a` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 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) */ +SET @TMP = @@GLOBAL.INNODB_FILE_PER_TABLE; +SET GLOBAL INNODB_FILE_PER_TABLE=OFF; +ALTER TABLE t ADD PRIMARY KEY pk(a), ALGORITHM=INPLACE; +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 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) */ +SET GLOBAL INNODB_FILE_PER_TABLE=@TMP; +ALTER TABLE t REORGANIZE PARTITION p1,p2 INTO ( +PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB, +PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB +); +Warnings: +Warning 1982 option ignored for InnoDB partition +Warning 1982 option ignored for InnoDB partition +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 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) */ +ALTER TABLE t REORGANIZE PARTITION p1,p2 INTO ( +PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/', +PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' +); +Warnings: +Warning 1982 option ignored for InnoDB partition +Warning 1982 option ignored for InnoDB partition +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 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) */ +ALTER TABLE t REORGANIZE PARTITION p1,p2 INTO ( +PARTITION p1 INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB, +PARTITION p2 INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB +); +Warnings: +Warning 1982 option ignored for InnoDB partition +Warning 1982 option ignored for InnoDB partition +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 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) */ +DROP TABLE t; +CREATE TABLE t ( +a INT NOT NULL +) 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/' + ENGINE = INNODB, +PARTITION p2 VALUES LESS THAN MAXVALUE +DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' + INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' + ENGINE = INNODB +); +Warnings: +Warning 1618 option ignored +Warning 1618 option ignored +Warning 1618 option ignored +Warning 1618 option ignored +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/' + 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 +); +Warnings: +Warning 1982 option ignored for InnoDB partition +Warning 1982 option ignored for InnoDB partition +Warning 1982 option ignored for InnoDB partition +Warning 1982 option ignored for InnoDB partition +Warning 1982 option ignored for InnoDB partition +Warning 1982 option ignored for InnoDB partition +Warning 1982 option ignored for InnoDB partition +Warning 1982 option ignored for InnoDB partition +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `a` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 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) */ +DROP TABLE t; diff --git a/mysql-test/suite/parts/t/reorganize_partition_innodb.test b/mysql-test/suite/parts/t/reorganize_partition_innodb.test new file mode 100644 index 00000000000..78e8a1a9f21 --- /dev/null +++ b/mysql-test/suite/parts/t/reorganize_partition_innodb.test @@ -0,0 +1,100 @@ +--source include/have_innodb.inc +--source include/have_partition.inc + +--echo # +--echo # MDEV-15953 Alter InnoDB Partitioned Table Moves Files (which were originally not in the datadir) to the datadir +--echo # + +mkdir $MYSQLTEST_VARDIR/tmp/partitions_here; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE t ( + a INT NOT NULL + ) 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 +); +INSERT INTO t VALUES (1); + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t; +ALTER TABLE t ADD PRIMARY KEY pk(a), ALGORITHM=INPLACE; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t; +ALTER TABLE t DROP PRIMARY KEY, ALGORITHM=COPY; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t; +SET @TMP = @@GLOBAL.INNODB_FILE_PER_TABLE; +SET GLOBAL INNODB_FILE_PER_TABLE=OFF; +ALTER TABLE t ADD PRIMARY KEY pk(a), ALGORITHM=INPLACE; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t; +SET GLOBAL INNODB_FILE_PER_TABLE=@TMP; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval ALTER TABLE t REORGANIZE PARTITION p1,p2 INTO ( + PARTITION p1 DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB, + PARTITION p2 DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB +); +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval ALTER TABLE t REORGANIZE PARTITION p1,p2 INTO ( + PARTITION p1 DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/', + PARTITION p2 DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' +); +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval ALTER TABLE t REORGANIZE PARTITION p1,p2 INTO ( + PARTITION p1 INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB, + PARTITION p2 INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB +); +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t; + +DROP TABLE t; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE t ( + a INT NOT NULL + ) 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/' + ENGINE = INNODB, + PARTITION p2 VALUES LESS THAN MAXVALUE + DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' + INDEX DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' + ENGINE = INNODB + ); + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval 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/' + 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 +); + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t; + +DROP TABLE t; + +rmdir $MYSQLTEST_VARDIR/tmp/partitions_here/test; +rmdir $MYSQLTEST_VARDIR/tmp/partitions_here; + diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index 43d63fd705a..c5e83062f0f 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -7142,3 +7142,5 @@ ER_NO_EIS_FOR_FIELD ER_WARN_AGGFUNC_DEPENDENCE eng "Aggregate function '%-.192s)' of SELECT #%d belongs to SELECT #%d" ukr "Агрегатна функція '%-.192s)' з SELECTу #%d належить до SELECTу #%d" +WARN_INNODB_PARTITION_OPTION_IGNORED + eng "<%-.64s> option ignored for InnoDB partition" diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 6ca181cdbb0..c214c2a13ee 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -4660,6 +4660,69 @@ bool compare_partition_options(HA_CREATE_INFO *table_create_info, } +/** + Check if the ALTER command tries to change DATA DIRECTORY + or INDEX DIRECTORY for its partitions and warn if so. + @param thd THD + @param part_elem partition_element to check + */ +static void warn_if_datadir_altered(THD *thd, + const partition_element *part_elem) +{ + DBUG_ASSERT(part_elem); + + if (part_elem->engine_type && + part_elem->engine_type->db_type != DB_TYPE_INNODB) + return; + + if (part_elem->data_file_name) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + WARN_INNODB_PARTITION_OPTION_IGNORED, + ER(WARN_INNODB_PARTITION_OPTION_IGNORED), + "DATA DIRECTORY"); + } + if (part_elem->index_file_name) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + WARN_INNODB_PARTITION_OPTION_IGNORED, + ER(WARN_INNODB_PARTITION_OPTION_IGNORED), + "INDEX DIRECTORY"); + } +} + + +/** + Currently changing DATA DIRECTORY and INDEX DIRECTORY for InnoDB partitions is + not possible. This function checks it and warns on that case. + @param thd THD + @param tab_part_info old partition info + @param alt_part_info new partition info + */ +static void check_datadir_altered_for_innodb(THD *thd, + partition_info *tab_part_info, + partition_info *alt_part_info) +{ + if (tab_part_info->default_engine_type->db_type != DB_TYPE_INNODB) + return; + + for (List_iterator_fast it(alt_part_info->partitions); + partition_element *part_elem= it++;) + { + if (alt_part_info->is_sub_partitioned()) + { + for (List_iterator_fast it2(part_elem->subpartitions); + const partition_element *sub_part_elem= it2++;) + { + warn_if_datadir_altered(thd, sub_part_elem); + } + } + else + warn_if_datadir_altered(thd, part_elem); + } +} + + /* Prepare for ALTER TABLE of partition structure @@ -5389,6 +5452,8 @@ state of p1. { goto err; } + check_datadir_altered_for_innodb(thd, tab_part_info, alt_part_info); + /* Online handling: REORGANIZE PARTITION: