Skip to content

Commit ff8b3c8

Browse files
committed
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
1 parent 6c08ff3 commit ff8b3c8

File tree

4 files changed

+123
-0
lines changed

4 files changed

+123
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#
2+
# MDEV-15953 Alter InnoDB Partitioned Table Moves Files (which were originally not in the datadir) to the datadir
3+
#
4+
CREATE TABLE t (
5+
a INT NOT NULL
6+
) ENGINE=INNODB
7+
PARTITION BY HASH (a) (
8+
PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB,
9+
PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB
10+
);
11+
INSERT INTO t VALUES (1);
12+
SHOW CREATE TABLE t;
13+
Table Create Table
14+
t CREATE TABLE `t` (
15+
`a` int(11) NOT NULL
16+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
17+
/*!50100 PARTITION BY HASH (a)
18+
(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB,
19+
PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB) */
20+
ALTER TABLE t ADD PRIMARY KEY pk(a), ALGORITHM=INPLACE;
21+
SHOW CREATE TABLE t;
22+
Table Create Table
23+
t CREATE TABLE `t` (
24+
`a` int(11) NOT NULL,
25+
PRIMARY KEY (`a`)
26+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
27+
/*!50100 PARTITION BY HASH (a)
28+
(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB,
29+
PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB) */
30+
ALTER TABLE t DROP PRIMARY KEY, ALGORITHM=COPY;
31+
SHOW CREATE TABLE t;
32+
Table Create Table
33+
t CREATE TABLE `t` (
34+
`a` int(11) NOT NULL
35+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
36+
/*!50100 PARTITION BY HASH (a)
37+
(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB,
38+
PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB) */
39+
SET @TMP = @@GLOBAL.INNODB_FILE_PER_TABLE;
40+
SET GLOBAL INNODB_FILE_PER_TABLE=OFF;
41+
ALTER TABLE t ADD PRIMARY KEY pk(a), ALGORITHM=INPLACE;
42+
SHOW CREATE TABLE t;
43+
Table Create Table
44+
t CREATE TABLE `t` (
45+
`a` int(11) NOT NULL,
46+
PRIMARY KEY (`a`)
47+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
48+
/*!50100 PARTITION BY HASH (a)
49+
(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB,
50+
PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB) */
51+
SET GLOBAL INNODB_FILE_PER_TABLE=@TMP;
52+
ALTER TABLE t REORGANIZE PARTITION p1,p2 INTO (
53+
PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB,
54+
PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB
55+
);
56+
SHOW CREATE TABLE t;
57+
Table Create Table
58+
t CREATE TABLE `t` (
59+
`a` int(11) NOT NULL,
60+
PRIMARY KEY (`a`)
61+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
62+
/*!50100 PARTITION BY HASH (a)
63+
(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB,
64+
PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp/partitions_here' ENGINE = InnoDB) */
65+
DROP TABLE t;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
--source include/have_innodb.inc
2+
--source include/have_partition.inc
3+
4+
--echo #
5+
--echo # MDEV-15953 Alter InnoDB Partitioned Table Moves Files (which were originally not in the datadir) to the datadir
6+
--echo #
7+
8+
mkdir $MYSQLTEST_VARDIR/tmp/partitions_here;
9+
10+
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
11+
eval CREATE TABLE t (
12+
a INT NOT NULL
13+
) ENGINE=INNODB
14+
PARTITION BY HASH (a) (
15+
PARTITION p1 DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB,
16+
PARTITION p2 DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_here/' ENGINE = INNODB
17+
);
18+
INSERT INTO t VALUES (1);
19+
20+
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
21+
SHOW CREATE TABLE t;
22+
ALTER TABLE t ADD PRIMARY KEY pk(a), ALGORITHM=INPLACE;
23+
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
24+
SHOW CREATE TABLE t;
25+
ALTER TABLE t DROP PRIMARY KEY, ALGORITHM=COPY;
26+
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
27+
SHOW CREATE TABLE t;
28+
SET @TMP = @@GLOBAL.INNODB_FILE_PER_TABLE;
29+
SET GLOBAL INNODB_FILE_PER_TABLE=OFF;
30+
ALTER TABLE t ADD PRIMARY KEY pk(a), ALGORITHM=INPLACE;
31+
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
32+
SHOW CREATE TABLE t;
33+
SET GLOBAL INNODB_FILE_PER_TABLE=@TMP;
34+
35+
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
36+
eval ALTER TABLE t REORGANIZE PARTITION p1,p2 INTO (
37+
PARTITION p1 DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB,
38+
PARTITION p2 DATA DIRECTORY = '$MYSQLTEST_VARDIR/tmp/partitions_somewhere_else/' ENGINE = INNODB
39+
);
40+
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
41+
SHOW CREATE TABLE t;
42+
43+
DROP TABLE t;
44+
45+
rmdir $MYSQLTEST_VARDIR/tmp/partitions_here/test;
46+
rmdir $MYSQLTEST_VARDIR/tmp/partitions_here;

storage/innobase/handler/handler0alter.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3572,6 +3572,12 @@ ha_innobase::prepare_inplace_alter_table(
35723572
goto err_exit_no_heap;
35733573
}
35743574

3575+
/* Preserve this flag, because it currenlty can't be changed during
3576+
ALTER TABLE*/
3577+
if (flags2 & DICT_TF2_USE_TABLESPACE) {
3578+
flags |= prebuilt->table->flags & 1U << DICT_TF_POS_DATA_DIR;
3579+
}
3580+
35753581
max_col_len = DICT_MAX_FIELD_LEN_BY_FORMAT_FLAG(flags);
35763582

35773583
/* Check each index's column length to make sure they do not

storage/xtradb/handler/handler0alter.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3586,6 +3586,12 @@ ha_innobase::prepare_inplace_alter_table(
35863586
goto err_exit_no_heap;
35873587
}
35883588

3589+
/* Preserve this flag, because it currenlty can't be changed during
3590+
ALTER TABLE*/
3591+
if (flags2 & DICT_TF2_USE_TABLESPACE) {
3592+
flags |= prebuilt->table->flags & 1U << DICT_TF_POS_DATA_DIR;
3593+
}
3594+
35893595
max_col_len = DICT_MAX_FIELD_LEN_BY_FORMAT_FLAG(flags);
35903596

35913597
/* Check each index's column length to make sure they do not

0 commit comments

Comments
 (0)