summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Kosov <claprix@yandex.ru>2018-06-23 13:49:36 +0300
committerEugene Kosov <claprix@yandex.ru>2018-06-26 11:11:15 +0300
commitff8b3c8df89e973f3b91fa82a5fec65ef0e01c53 (patch)
treed788bc9de56bb450f205650362337590f89f5d9b
parent6c08ff3eb71104cf1e9cfcbe01eca4afe281ccb1 (diff)
downloadmariadb-git-ff8b3c8df89e973f3b91fa82a5fec65ef0e01c53.tar.gz
MDEV-15953 Alter InnoDB Partitioned Table Moves Files (which were originally not in the datadir) to the datadir
ha_innobase::prepare_inplace_alter_table: preserve DATA DICTIONARY for table
-rw-r--r--mysql-test/suite/parts/r/alter_data_directory_innodb.result65
-rw-r--r--mysql-test/suite/parts/t/alter_data_directory_innodb.test46
-rw-r--r--storage/innobase/handler/handler0alter.cc6
-rw-r--r--storage/xtradb/handler/handler0alter.cc6
4 files changed, 123 insertions, 0 deletions
diff --git a/mysql-test/suite/parts/r/alter_data_directory_innodb.result b/mysql-test/suite/parts/r/alter_data_directory_innodb.result
new file mode 100644
index 00000000000..ee0a7b80ebb
--- /dev/null
+++ b/mysql-test/suite/parts/r/alter_data_directory_innodb.result
@@ -0,0 +1,65 @@
+#
+# 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
+);
+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;
diff --git a/mysql-test/suite/parts/t/alter_data_directory_innodb.test b/mysql-test/suite/parts/t/alter_data_directory_innodb.test
new file mode 100644
index 00000000000..ac15e9bec6c
--- /dev/null
+++ b/mysql-test/suite/parts/t/alter_data_directory_innodb.test
@@ -0,0 +1,46 @@
+--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;
+
+DROP TABLE t;
+
+rmdir $MYSQLTEST_VARDIR/tmp/partitions_here/test;
+rmdir $MYSQLTEST_VARDIR/tmp/partitions_here;
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index 86935a4aa34..3de46ed4f80 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -3572,6 +3572,12 @@ check_if_ok_to_rename:
goto err_exit_no_heap;
}
+ /* Preserve this flag, because it currenlty can't be changed during
+ ALTER TABLE*/
+ if (flags2 & DICT_TF2_USE_TABLESPACE) {
+ flags |= prebuilt->table->flags & 1U << DICT_TF_POS_DATA_DIR;
+ }
+
max_col_len = DICT_MAX_FIELD_LEN_BY_FORMAT_FLAG(flags);
/* Check each index's column length to make sure they do not
diff --git a/storage/xtradb/handler/handler0alter.cc b/storage/xtradb/handler/handler0alter.cc
index ff524e6a9be..755c07848e1 100644
--- a/storage/xtradb/handler/handler0alter.cc
+++ b/storage/xtradb/handler/handler0alter.cc
@@ -3586,6 +3586,12 @@ check_if_ok_to_rename:
goto err_exit_no_heap;
}
+ /* Preserve this flag, because it currenlty can't be changed during
+ ALTER TABLE*/
+ if (flags2 & DICT_TF2_USE_TABLESPACE) {
+ flags |= prebuilt->table->flags & 1U << DICT_TF_POS_DATA_DIR;
+ }
+
max_col_len = DICT_MAX_FIELD_LEN_BY_FORMAT_FLAG(flags);
/* Check each index's column length to make sure they do not