Skip to content

Commit 0c1f220

Browse files
committed
Merge 10.2 into bb-10.2-ext
2 parents 6d390ba + 0ba6aaf commit 0c1f220

File tree

24 files changed

+637
-356
lines changed

24 files changed

+637
-356
lines changed

include/my_base.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* Copyright (c) 2000, 2012, Oracle and/or its affiliates.
2-
Copyright (c) 1995, 2017, MariaDB Corporation.
2+
Copyright (c) 1995, 2018, MariaDB Corporation.
33
44
This program is free software; you can redistribute it and/or modify
55
it under the terms of the GNU General Public License as published by
@@ -205,6 +205,12 @@ enum ha_extra_function {
205205
HA_EXTRA_PREPARE_FOR_FORCED_CLOSE,
206206
/* Inform handler that we will do an alter table */
207207
HA_EXTRA_PREPARE_FOR_ALTER_TABLE,
208+
/** Start writing rows during ALTER TABLE...ALGORITHM=COPY. */
209+
HA_EXTRA_BEGIN_ALTER_COPY,
210+
/** Finish writing rows during ALTER TABLE...ALGORITHM=COPY. */
211+
HA_EXTRA_END_ALTER_COPY,
212+
/** Fake the start of a statement after wsrep_load_data_splitting hack */
213+
HA_EXTRA_FAKE_START_STMT
208214
};
209215

210216
/* Compatible option, to be deleted in 6.0 */
Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
#
2+
# MDEV-11415 AVOID INTERMEDIATE COMMIT WHILE DOING
3+
# ALTER TABLE...ALGORITHM=COPY
4+
#
5+
CREATE TABLE t(a SERIAL, b INT, c INT, d INT) ENGINE=InnoDB;
6+
CREATE TABLE t1(a INT, b TEXT, c TEXT,
7+
FULLTEXT(b), FULLTEXT(c(3)), FULLTEXT(b,c)) ENGINE=InnoDB;
8+
BEGIN;
9+
COMMIT;
10+
SELECT COUNT(*) FROM t;
11+
COUNT(*)
12+
999
13+
UPDATE t SET b=a%7, c=a%11, d=a%13;
14+
INSERT INTO t1 VALUES(1, 'This is a first b column', 'This is a first c column');
15+
INSERT INTO t1 VALUES(2, 'This is a second b column', 'This is a second c column');
16+
INSERT INTO t1(a) VALUES(3);
17+
INSERT INTO t1 VALUES(4, 'This is a third b column', 'This is a third c column');
18+
DELETE FROM t1 WHERE a = 2;
19+
SELECT * FROM t1 WHERE MATCH(b) AGAINST ('first');
20+
a b c
21+
1 This is a first b column This is a first c column
22+
SELECT * FROM t1 WHERE MATCH(c) AGAINST ('first');
23+
a b c
24+
1 This is a first b column This is a first c column
25+
SELECT * FROM t1 WHERE MATCH(b,c) AGAINST ('column');
26+
a b c
27+
1 This is a first b column This is a first c column
28+
4 This is a third b column This is a third c column
29+
SHOW CREATE TABLE t1;
30+
Table Create Table
31+
t1 CREATE TABLE `t1` (
32+
`a` int(11) DEFAULT NULL,
33+
`b` text DEFAULT NULL,
34+
`c` text DEFAULT NULL,
35+
FULLTEXT KEY `b` (`b`),
36+
FULLTEXT KEY `c` (`c`),
37+
FULLTEXT KEY `b_2` (`b`,`c`)
38+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
39+
ALTER TABLE t1 FORCE, ALGORITHM=COPY;
40+
SET DEBUG_DBUG='+d,crash_commit_before';
41+
ALTER TABLE t ADD INDEX(b,c,d,a),ADD INDEX(b,c,a,d),ADD INDEX(b,a,c,d),ADD INDEX(b,a,d,c),
42+
ADD INDEX(b,d,a,c),ADD INDEX(b,d,c,a),ADD INDEX(a,b,c,d),ADD INDEX(a,b,d,c),
43+
ADD INDEX(a,c,b,d),ADD INDEX(a,c,d,b),ADD INDEX(a,d,b,c),ADD INDEX(a,d,c,b),
44+
ADD INDEX(c,a,b,d),ADD INDEX(c,a,d,b),ADD INDEX(c,b,a,d),ADD INDEX(c,b,d,a),
45+
ADD INDEX(c,d,a,b),ADD INDEX(c,d,b,a),ADD INDEX(d,a,b,c),ADD INDEX(d,a,c,b),
46+
ADD INDEX(d,b,a,c),ADD INDEX(d,b,c,a),ADD INDEX(d,c,a,b),ADD INDEX(d,c,b,a),
47+
ADD INDEX(a,b,c), ADD INDEX(a,c,b), ADD INDEX(a,c,d), ADD INDEX(a,d,c),
48+
ADD INDEX(a,b,d), ADD INDEX(a,d,b), ADD INDEX(b,c,d), ADD INDEX(b,d,c),
49+
ALGORITHM=COPY;
50+
ERROR HY000: Lost connection to MySQL server during query
51+
#sql-temporary.frm
52+
#sql-temporary.ibd
53+
FTS_INDEX_1.ibd
54+
FTS_INDEX_2.ibd
55+
FTS_INDEX_3.ibd
56+
FTS_INDEX_4.ibd
57+
FTS_INDEX_5.ibd
58+
FTS_INDEX_6.ibd
59+
FTS_INDEX_1.ibd
60+
FTS_INDEX_2.ibd
61+
FTS_INDEX_3.ibd
62+
FTS_INDEX_4.ibd
63+
FTS_INDEX_5.ibd
64+
FTS_INDEX_6.ibd
65+
FTS_INDEX_1.ibd
66+
FTS_INDEX_2.ibd
67+
FTS_INDEX_3.ibd
68+
FTS_INDEX_4.ibd
69+
FTS_INDEX_5.ibd
70+
FTS_INDEX_6.ibd
71+
FTSBEING_DELETED.ibd
72+
FTSBEING_DELETED_CACHE.ibd
73+
FTSCONFIG.ibd
74+
FTSDELETED.ibd
75+
FTSDELETED_CACHE.ibd
76+
t.frm
77+
t.ibd
78+
t1.frm
79+
t1.ibd
80+
SHOW CREATE TABLE t;
81+
Table Create Table
82+
t CREATE TABLE `t` (
83+
`a` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
84+
`b` int(11) DEFAULT NULL,
85+
`c` int(11) DEFAULT NULL,
86+
`d` int(11) DEFAULT NULL,
87+
UNIQUE KEY `a` (`a`)
88+
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=latin1
89+
SELECT COUNT(*) FROM t;
90+
COUNT(*)
91+
999
92+
CHECK TABLE t;
93+
Table Op Msg_type Msg_text
94+
test.t check status OK
95+
SELECT * FROM t1 WHERE MATCH(b) AGAINST ('first');
96+
a b c
97+
1 This is a first b column This is a first c column
98+
SELECT * FROM t1 WHERE MATCH(c) AGAINST ('first');
99+
a b c
100+
1 This is a first b column This is a first c column
101+
SELECT * FROM t1 WHERE MATCH(b,c) AGAINST ('column');
102+
a b c
103+
1 This is a first b column This is a first c column
104+
4 This is a third b column This is a third c column
105+
SHOW CREATE TABLE t1;
106+
Table Create Table
107+
t1 CREATE TABLE `t1` (
108+
`a` int(11) DEFAULT NULL,
109+
`b` text DEFAULT NULL,
110+
`c` text DEFAULT NULL,
111+
FULLTEXT KEY `b` (`b`),
112+
FULLTEXT KEY `c` (`c`),
113+
FULLTEXT KEY `b_2` (`b`,`c`)
114+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
115+
CHECK TABLE t1;
116+
Table Op Msg_type Msg_text
117+
test.t1 check status OK
118+
#sql-temporary.frm
119+
#sql-temporary.ibd
120+
FTS_INDEX_1.ibd
121+
FTS_INDEX_2.ibd
122+
FTS_INDEX_3.ibd
123+
FTS_INDEX_4.ibd
124+
FTS_INDEX_5.ibd
125+
FTS_INDEX_6.ibd
126+
FTS_INDEX_1.ibd
127+
FTS_INDEX_2.ibd
128+
FTS_INDEX_3.ibd
129+
FTS_INDEX_4.ibd
130+
FTS_INDEX_5.ibd
131+
FTS_INDEX_6.ibd
132+
FTS_INDEX_1.ibd
133+
FTS_INDEX_2.ibd
134+
FTS_INDEX_3.ibd
135+
FTS_INDEX_4.ibd
136+
FTS_INDEX_5.ibd
137+
FTS_INDEX_6.ibd
138+
FTSBEING_DELETED.ibd
139+
FTSBEING_DELETED_CACHE.ibd
140+
FTSCONFIG.ibd
141+
FTSDELETED.ibd
142+
FTSDELETED_CACHE.ibd
143+
t.frm
144+
t.ibd
145+
t1.frm
146+
t1.ibd
147+
SHOW CREATE TABLE t;
148+
Table Create Table
149+
t CREATE TABLE `t` (
150+
`a` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
151+
`b` int(11) DEFAULT NULL,
152+
`c` int(11) DEFAULT NULL,
153+
`d` int(11) DEFAULT NULL,
154+
UNIQUE KEY `a` (`a`)
155+
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=latin1
156+
SELECT COUNT(*) FROM t;
157+
COUNT(*)
158+
999
159+
CHECK TABLE t;
160+
Table Op Msg_type Msg_text
161+
test.t check status OK
162+
SELECT * FROM t1 WHERE MATCH(b) AGAINST ('first');
163+
a b c
164+
1 This is a first b column This is a first c column
165+
SELECT * FROM t1 WHERE MATCH(c) AGAINST ('first');
166+
a b c
167+
1 This is a first b column This is a first c column
168+
SELECT * FROM t1 WHERE MATCH(b,c) AGAINST ('column');
169+
a b c
170+
1 This is a first b column This is a first c column
171+
4 This is a third b column This is a third c column
172+
SHOW CREATE TABLE t1;
173+
Table Create Table
174+
t1 CREATE TABLE `t1` (
175+
`a` int(11) DEFAULT NULL,
176+
`b` text DEFAULT NULL,
177+
`c` text DEFAULT NULL,
178+
FULLTEXT KEY `b` (`b`),
179+
FULLTEXT KEY `c` (`c`),
180+
FULLTEXT KEY `b_2` (`b`,`c`)
181+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
182+
CHECK TABLE t1;
183+
Table Op Msg_type Msg_text
184+
test.t1 check status OK
185+
#sql-temporary.frm
186+
FTS_INDEX_1.ibd
187+
FTS_INDEX_2.ibd
188+
FTS_INDEX_3.ibd
189+
FTS_INDEX_4.ibd
190+
FTS_INDEX_5.ibd
191+
FTS_INDEX_6.ibd
192+
FTS_INDEX_1.ibd
193+
FTS_INDEX_2.ibd
194+
FTS_INDEX_3.ibd
195+
FTS_INDEX_4.ibd
196+
FTS_INDEX_5.ibd
197+
FTS_INDEX_6.ibd
198+
FTS_INDEX_1.ibd
199+
FTS_INDEX_2.ibd
200+
FTS_INDEX_3.ibd
201+
FTS_INDEX_4.ibd
202+
FTS_INDEX_5.ibd
203+
FTS_INDEX_6.ibd
204+
FTSBEING_DELETED.ibd
205+
FTSBEING_DELETED_CACHE.ibd
206+
FTSCONFIG.ibd
207+
FTSDELETED.ibd
208+
FTSDELETED_CACHE.ibd
209+
t.frm
210+
t.ibd
211+
t1.frm
212+
t1.ibd
213+
DROP TABLE t1,t;
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
--source include/have_innodb.inc
2+
--source include/have_debug.inc
3+
--source include/have_debug_sync.inc
4+
--source include/not_embedded.inc
5+
6+
--echo #
7+
--echo # MDEV-11415 AVOID INTERMEDIATE COMMIT WHILE DOING
8+
--echo # ALTER TABLE...ALGORITHM=COPY
9+
--echo #
10+
11+
CREATE TABLE t(a SERIAL, b INT, c INT, d INT) ENGINE=InnoDB;
12+
CREATE TABLE t1(a INT, b TEXT, c TEXT,
13+
FULLTEXT(b), FULLTEXT(c(3)), FULLTEXT(b,c)) ENGINE=InnoDB;
14+
15+
let $c = 999;
16+
BEGIN;
17+
--disable_query_log
18+
while ($c) {
19+
INSERT INTO t() VALUES();
20+
dec $c;
21+
}
22+
--enable_query_log
23+
COMMIT;
24+
25+
SELECT COUNT(*) FROM t;
26+
# try to make the to-be-created secondary index keys randomly distributed
27+
UPDATE t SET b=a%7, c=a%11, d=a%13;
28+
29+
INSERT INTO t1 VALUES(1, 'This is a first b column', 'This is a first c column');
30+
INSERT INTO t1 VALUES(2, 'This is a second b column', 'This is a second c column');
31+
INSERT INTO t1(a) VALUES(3);
32+
INSERT INTO t1 VALUES(4, 'This is a third b column', 'This is a third c column');
33+
DELETE FROM t1 WHERE a = 2;
34+
SELECT * FROM t1 WHERE MATCH(b) AGAINST ('first');
35+
SELECT * FROM t1 WHERE MATCH(c) AGAINST ('first');
36+
SELECT * FROM t1 WHERE MATCH(b,c) AGAINST ('column');
37+
SHOW CREATE TABLE t1;
38+
ALTER TABLE t1 FORCE, ALGORITHM=COPY;
39+
40+
# crash right after the last write_row(), before the first commit of ALTER TABLE
41+
--source include/expect_crash.inc
42+
43+
SET DEBUG_DBUG='+d,crash_commit_before';
44+
--error 2013
45+
# create 32 secondary indexes
46+
ALTER TABLE t ADD INDEX(b,c,d,a),ADD INDEX(b,c,a,d),ADD INDEX(b,a,c,d),ADD INDEX(b,a,d,c),
47+
ADD INDEX(b,d,a,c),ADD INDEX(b,d,c,a),ADD INDEX(a,b,c,d),ADD INDEX(a,b,d,c),
48+
ADD INDEX(a,c,b,d),ADD INDEX(a,c,d,b),ADD INDEX(a,d,b,c),ADD INDEX(a,d,c,b),
49+
ADD INDEX(c,a,b,d),ADD INDEX(c,a,d,b),ADD INDEX(c,b,a,d),ADD INDEX(c,b,d,a),
50+
ADD INDEX(c,d,a,b),ADD INDEX(c,d,b,a),ADD INDEX(d,a,b,c),ADD INDEX(d,a,c,b),
51+
ADD INDEX(d,b,a,c),ADD INDEX(d,b,c,a),ADD INDEX(d,c,a,b),ADD INDEX(d,c,b,a),
52+
ADD INDEX(a,b,c), ADD INDEX(a,c,b), ADD INDEX(a,c,d), ADD INDEX(a,d,c),
53+
ADD INDEX(a,b,d), ADD INDEX(a,d,b), ADD INDEX(b,c,d), ADD INDEX(b,d,c),
54+
ALGORITHM=COPY;
55+
56+
--let $restart_parameters= --innodb-force-recovery=3
57+
--source include/start_mysqld.inc
58+
let $datadir=`select @@datadir`;
59+
--replace_regex /#sql-[0-9a-f_]*/#sql-temporary/ /FTS_[0-9a-f]*_[0-9a-f]*/FTS/
60+
--list_files $datadir/test
61+
SHOW CREATE TABLE t;
62+
SELECT COUNT(*) FROM t;
63+
CHECK TABLE t;
64+
SELECT * FROM t1 WHERE MATCH(b) AGAINST ('first');
65+
SELECT * FROM t1 WHERE MATCH(c) AGAINST ('first');
66+
SELECT * FROM t1 WHERE MATCH(b,c) AGAINST ('column');
67+
SHOW CREATE TABLE t1;
68+
CHECK TABLE t1;
69+
70+
--let $restart_parameters= --innodb-read-only
71+
--source include/restart_mysqld.inc
72+
--replace_regex /#sql-[0-9a-f_]*/#sql-temporary/ /FTS_[0-9a-f]*_[0-9a-f]*/FTS/
73+
74+
--list_files $datadir/test
75+
SHOW CREATE TABLE t;
76+
SELECT COUNT(*) FROM t;
77+
CHECK TABLE t;
78+
SELECT * FROM t1 WHERE MATCH(b) AGAINST ('first');
79+
SELECT * FROM t1 WHERE MATCH(c) AGAINST ('first');
80+
SELECT * FROM t1 WHERE MATCH(b,c) AGAINST ('column');
81+
SHOW CREATE TABLE t1;
82+
CHECK TABLE t1;
83+
84+
--let $restart_parameters=
85+
--source include/restart_mysqld.inc
86+
--replace_regex /#sql-[0-9a-f_]*/#sql-temporary/ /FTS_[0-9a-f]*_[0-9a-f]*/FTS/
87+
--list_files $datadir/test
88+
DROP TABLE t1,t;
89+
90+
# Work around missing crash recovery at the SQL layer.
91+
--remove_files_wildcard $datadir/test #sql-*.frm

sql/ha_partition.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
Copyright (c) 2005, 2017, Oracle and/or its affiliates.
3-
Copyright (c) 2009, 2017, MariaDB
3+
Copyright (c) 2009, 2018, MariaDB
44
55
This program is free software; you can redistribute it and/or modify
66
it under the terms of the GNU General Public License as published by
@@ -7260,6 +7260,10 @@ int ha_partition::extra(enum ha_extra_function operation)
72607260
*/
72617261
case HA_EXTRA_MARK_AS_LOG_TABLE:
72627262
DBUG_RETURN(ER_UNSUPORTED_LOG_ENGINE);
7263+
case HA_EXTRA_BEGIN_ALTER_COPY:
7264+
case HA_EXTRA_END_ALTER_COPY:
7265+
case HA_EXTRA_FAKE_START_STMT:
7266+
DBUG_RETURN(loop_extra(operation));
72637267
default:
72647268
{
72657269
/* Temporary crash to discover what is wrong */

sql/log.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,6 +1103,7 @@ void make_default_log_name(char **out, const char* log_ext, bool once);
11031103
void binlog_reset_cache(THD *thd);
11041104

11051105
extern MYSQL_PLUGIN_IMPORT MYSQL_BIN_LOG mysql_bin_log;
1106+
extern handlerton *binlog_hton;
11061107
extern LOGGER logger;
11071108

11081109
extern const char *log_bin_index;

0 commit comments

Comments
 (0)