Skip to content

Commit ec0e9d6

Browse files
temeoJan Lindström
authored andcommitted
MDEV-22681 EXECUTE IMMEDIATE crashes server if wsrep is on.
A wsrep transaction was started for EXECUTE IMMEDIATE, which caused assertion failure when the executed statement was CREATE TABLE which should be executed in TOI mode. As a fix, don't start wsrep transaction for EXECUTE IMMEDIATE to let the wsrep state logic to be handled from inside stored procedure codepath. Reviewed-by: Jan Lindström <jan.lindstrom@mariadb.com>
1 parent 46c2738 commit ec0e9d6

File tree

6 files changed

+240
-2
lines changed

6 files changed

+240
-2
lines changed

mysql-test/suite/galera/r/galera_var_replicate_myisam_on.result

Lines changed: 131 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,135 @@ i
107107
1
108108
DROP TABLE t1;
109109
connection node_1;
110-
SET GLOBAL wsrep_replicate_myisam = 0;
110+
CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM;
111+
INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10);
112+
PREPARE upd from 'update t1 set b = 100 where id = 5';
113+
PREPARE ins from 'insert into t1 values (11,11)';
114+
PREPARE del from 'delete from t1 where id = 4';
115+
PREPARE rep from 'replace into t1 values (12,12),(6,600)';
116+
EXECUTE upd;
117+
EXECUTE ins;
118+
EXECUTE del;
119+
EXECUTE rep;
120+
SELECT * FROM t1 ORDER BY id;
121+
id b
122+
1 1
123+
2 2
124+
3 3
125+
5 100
126+
6 600
127+
7 7
128+
8 8
129+
9 9
130+
10 10
131+
11 11
132+
12 12
133+
connection node_2;
134+
SELECT * FROM t1 ORDER BY id;
135+
id b
136+
1 1
137+
2 2
138+
3 3
139+
5 100
140+
6 600
141+
7 7
142+
8 8
143+
9 9
144+
10 10
145+
11 11
146+
12 12
147+
DROP TABLE t1;
148+
connection node_1;
149+
CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM;
150+
INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10);
151+
CREATE PROCEDURE proc()
152+
BEGIN
153+
UPDATE t1 set b = 100 WHERE id = 5;
154+
INSERT INTO t1 VALUES (11,11);
155+
DELETE FROM t1 WHERE id = 4;
156+
REPLACE INTO t1 VALUES (12,12),(6,600);
157+
COMMIT;
158+
END|
159+
CALL proc();
160+
SELECT * FROM t1 ORDER BY id;
161+
id b
162+
1 1
163+
2 2
164+
3 3
165+
5 100
166+
6 600
167+
7 7
168+
8 8
169+
9 9
170+
10 10
171+
11 11
172+
12 12
173+
connection node_2;
174+
SELECT * FROM t1 ORDER BY id;
175+
id b
176+
1 1
177+
2 2
178+
3 3
179+
5 100
180+
6 600
181+
7 7
182+
8 8
183+
9 9
184+
10 10
185+
11 11
186+
12 12
187+
DROP PROCEDURE proc;
188+
DROP TABLE t1;
189+
connection node_1;
190+
CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM;
191+
CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT) ENGINE=MyISAM;
192+
INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10);
193+
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, NEW.b);
194+
CREATE TRIGGER tr2 BEFORE UPDATE ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, OLD.b),(NULL, NEW.b);
195+
CREATE TRIGGER tr3 BEFORE DELETE ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, OLD.b);
196+
INSERT INTO t1 VALUES (11,11);
197+
UPDATE t1 SET b = 200 WHERE id = 2;
198+
DELETE FROM t1 where id = 5;
199+
SELECT * FROM t1 ORDER BY id;
200+
id b
201+
1 1
202+
2 200
203+
3 3
204+
4 4
205+
6 6
206+
7 7
207+
8 8
208+
9 9
209+
10 10
210+
11 11
211+
SELECT * FROM t2 ORDER BY id;
212+
id b
213+
1 11
214+
2 2
215+
3 200
216+
4 5
217+
connection node_2;
218+
SELECT * FROM t1 ORDER BY id;
219+
id b
220+
1 1
221+
2 200
222+
3 3
223+
4 4
224+
6 6
225+
7 7
226+
8 8
227+
9 9
228+
10 10
229+
11 11
230+
SELECT * FROM t2 ORDER BY id;
231+
id b
232+
1 11
233+
2 2
234+
3 200
235+
4 5
236+
DROP TRIGGER tr1;
237+
DROP TRIGGER tr2;
238+
DROP TRIGGER tr3;
239+
DROP TABLE t1,t2;
240+
connection node_1;
111241
connection node_2;
112-
SET GLOBAL wsrep_replicate_myisam = 0;

mysql-test/suite/galera/t/galera_var_replicate_myisam_on.test

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,88 @@ INSERT INTO t1 VALUES(1);
142142
SELECT * FROM t1;
143143
DROP TABLE t1;
144144

145+
#
146+
# Test prepared staments
147+
#
148+
--connection node_1
149+
CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM;
150+
INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10);
151+
152+
PREPARE upd from 'update t1 set b = 100 where id = 5';
153+
PREPARE ins from 'insert into t1 values (11,11)';
154+
PREPARE del from 'delete from t1 where id = 4';
155+
PREPARE rep from 'replace into t1 values (12,12),(6,600)';
156+
157+
EXECUTE upd;
158+
EXECUTE ins;
159+
EXECUTE del;
160+
EXECUTE rep;
161+
162+
SELECT * FROM t1 ORDER BY id;
163+
164+
--connection node_2
165+
SELECT * FROM t1 ORDER BY id;
166+
167+
DROP TABLE t1;
168+
169+
#
170+
# Test procedure
171+
#
172+
--connection node_1
173+
CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM;
174+
INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10);
175+
176+
DELIMITER |;
177+
CREATE PROCEDURE proc()
178+
BEGIN
179+
UPDATE t1 set b = 100 WHERE id = 5;
180+
INSERT INTO t1 VALUES (11,11);
181+
DELETE FROM t1 WHERE id = 4;
182+
REPLACE INTO t1 VALUES (12,12),(6,600);
183+
COMMIT;
184+
END|
185+
DELIMITER ;|
186+
187+
CALL proc();
188+
SELECT * FROM t1 ORDER BY id;
189+
190+
--connection node_2
191+
SELECT * FROM t1 ORDER BY id;
192+
193+
DROP PROCEDURE proc;
194+
DROP TABLE t1;
195+
196+
#
197+
# Test trigger
198+
#
199+
--connection node_1
200+
CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM;
201+
CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT) ENGINE=MyISAM;
202+
INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10);
203+
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, NEW.b);
204+
CREATE TRIGGER tr2 BEFORE UPDATE ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, OLD.b),(NULL, NEW.b);
205+
CREATE TRIGGER tr3 BEFORE DELETE ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, OLD.b);
206+
207+
INSERT INTO t1 VALUES (11,11);
208+
UPDATE t1 SET b = 200 WHERE id = 2;
209+
DELETE FROM t1 where id = 5;
210+
SELECT * FROM t1 ORDER BY id;
211+
SELECT * FROM t2 ORDER BY id;
212+
213+
--connection node_2
214+
SELECT * FROM t1 ORDER BY id;
215+
SELECT * FROM t2 ORDER BY id;
216+
DROP TRIGGER tr1;
217+
DROP TRIGGER tr2;
218+
DROP TRIGGER tr3;
219+
DROP TABLE t1,t2;
220+
145221
--connection node_1
222+
--disable_query_log
146223
--eval SET GLOBAL wsrep_replicate_myisam = $wsrep_replicate_myisam_orig
224+
--enable_query_log
147225

148226
--connection node_2
227+
--disable_query_log
149228
--eval SET GLOBAL wsrep_replicate_myisam = $wsrep_replicate_myisam_orig
229+
--enable_query_log
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
2+
EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 ENGINE=InnoDB AS SELECT 1 AS b';
3+
DROP TABLE t1;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
!include ../my.cnf
2+
3+
[mysqld.1]
4+
wsrep-on=ON
5+
log-bin
6+
binlog-format=ROW
7+
innodb-flush-log-at-trx-commit=1
8+
wsrep-cluster-address=gcomm://
9+
wsrep-provider=@ENV.WSREP_PROVIDER
10+
innodb-autoinc-lock-mode=2
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#
2+
# MDEV-22681: Server crashes in galera::ReplicatorSMM::CommitOrder::CommitOrder
3+
# or assertion failed in wsrep::transaction::before_prepare.
4+
#
5+
# EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 ENGINE=InnoDB AS SELECT 1 AS b'
6+
# crashes the server if binlog is on (see mdev_22681.cnf for configuration).
7+
#
8+
--source include/have_wsrep.inc
9+
--source include/have_wsrep_provider.inc
10+
--source include/have_innodb.inc
11+
12+
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
13+
EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 ENGINE=InnoDB AS SELECT 1 AS b';
14+
15+
DROP TABLE t1;

sql/sql_parse.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3792,6 +3792,7 @@ mysql_execute_command(THD *thd)
37923792
lex->sql_command != SQLCOM_BEGIN &&
37933793
lex->sql_command != SQLCOM_CALL &&
37943794
lex->sql_command != SQLCOM_EXECUTE &&
3795+
lex->sql_command != SQLCOM_EXECUTE_IMMEDIATE &&
37953796
!(sql_command_flags[lex->sql_command] & CF_AUTO_COMMIT_TRANS))
37963797
{
37973798
wsrep_start_trx_if_not_started(thd);

0 commit comments

Comments
 (0)