diff --git a/mysql-test/suite/galera/r/galera_var_replicate_myisam_on.result b/mysql-test/suite/galera/r/galera_var_replicate_myisam_on.result index 716af033e7a..ad28f5a426e 100644 --- a/mysql-test/suite/galera/r/galera_var_replicate_myisam_on.result +++ b/mysql-test/suite/galera/r/galera_var_replicate_myisam_on.result @@ -107,6 +107,135 @@ i 1 DROP TABLE t1; connection node_1; -SET GLOBAL wsrep_replicate_myisam = 0; +CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM; +INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10); +PREPARE upd from 'update t1 set b = 100 where id = 5'; +PREPARE ins from 'insert into t1 values (11,11)'; +PREPARE del from 'delete from t1 where id = 4'; +PREPARE rep from 'replace into t1 values (12,12),(6,600)'; +EXECUTE upd; +EXECUTE ins; +EXECUTE del; +EXECUTE rep; +SELECT * FROM t1 ORDER BY id; +id b +1 1 +2 2 +3 3 +5 100 +6 600 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +connection node_2; +SELECT * FROM t1 ORDER BY id; +id b +1 1 +2 2 +3 3 +5 100 +6 600 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +DROP TABLE t1; +connection node_1; +CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM; +INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10); +CREATE PROCEDURE proc() +BEGIN +UPDATE t1 set b = 100 WHERE id = 5; +INSERT INTO t1 VALUES (11,11); +DELETE FROM t1 WHERE id = 4; +REPLACE INTO t1 VALUES (12,12),(6,600); +COMMIT; +END| +CALL proc(); +SELECT * FROM t1 ORDER BY id; +id b +1 1 +2 2 +3 3 +5 100 +6 600 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +connection node_2; +SELECT * FROM t1 ORDER BY id; +id b +1 1 +2 2 +3 3 +5 100 +6 600 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +DROP PROCEDURE proc; +DROP TABLE t1; +connection node_1; +CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM; +CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT) ENGINE=MyISAM; +INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10); +CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, NEW.b); +CREATE TRIGGER tr2 BEFORE UPDATE ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, OLD.b),(NULL, NEW.b); +CREATE TRIGGER tr3 BEFORE DELETE ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, OLD.b); +INSERT INTO t1 VALUES (11,11); +UPDATE t1 SET b = 200 WHERE id = 2; +DELETE FROM t1 where id = 5; +SELECT * FROM t1 ORDER BY id; +id b +1 1 +2 200 +3 3 +4 4 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +SELECT * FROM t2 ORDER BY id; +id b +1 11 +2 2 +3 200 +4 5 +connection node_2; +SELECT * FROM t1 ORDER BY id; +id b +1 1 +2 200 +3 3 +4 4 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +SELECT * FROM t2 ORDER BY id; +id b +1 11 +2 2 +3 200 +4 5 +DROP TRIGGER tr1; +DROP TRIGGER tr2; +DROP TRIGGER tr3; +DROP TABLE t1,t2; +connection node_1; connection node_2; -SET GLOBAL wsrep_replicate_myisam = 0; diff --git a/mysql-test/suite/galera/t/galera_var_replicate_myisam_on.test b/mysql-test/suite/galera/t/galera_var_replicate_myisam_on.test index 90c786f0af0..adb5cb04273 100644 --- a/mysql-test/suite/galera/t/galera_var_replicate_myisam_on.test +++ b/mysql-test/suite/galera/t/galera_var_replicate_myisam_on.test @@ -142,8 +142,88 @@ INSERT INTO t1 VALUES(1); SELECT * FROM t1; DROP TABLE t1; +# +# Test prepared staments +# --connection node_1 ---eval SET GLOBAL wsrep_replicate_myisam = $wsrep_replicate_myisam_orig +CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM; +INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10); + +PREPARE upd from 'update t1 set b = 100 where id = 5'; +PREPARE ins from 'insert into t1 values (11,11)'; +PREPARE del from 'delete from t1 where id = 4'; +PREPARE rep from 'replace into t1 values (12,12),(6,600)'; + +EXECUTE upd; +EXECUTE ins; +EXECUTE del; +EXECUTE rep; + +SELECT * FROM t1 ORDER BY id; --connection node_2 +SELECT * FROM t1 ORDER BY id; + +DROP TABLE t1; + +# +# Test procedure +# +--connection node_1 +CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM; +INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10); + +DELIMITER |; +CREATE PROCEDURE proc() +BEGIN + UPDATE t1 set b = 100 WHERE id = 5; + INSERT INTO t1 VALUES (11,11); + DELETE FROM t1 WHERE id = 4; + REPLACE INTO t1 VALUES (12,12),(6,600); + COMMIT; +END| +DELIMITER ;| + +CALL proc(); +SELECT * FROM t1 ORDER BY id; + +--connection node_2 +SELECT * FROM t1 ORDER BY id; + +DROP PROCEDURE proc; +DROP TABLE t1; + +# +# Test trigger +# +--connection node_1 +CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM; +CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT) ENGINE=MyISAM; +INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10); +CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, NEW.b); +CREATE TRIGGER tr2 BEFORE UPDATE ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, OLD.b),(NULL, NEW.b); +CREATE TRIGGER tr3 BEFORE DELETE ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, OLD.b); + +INSERT INTO t1 VALUES (11,11); +UPDATE t1 SET b = 200 WHERE id = 2; +DELETE FROM t1 where id = 5; +SELECT * FROM t1 ORDER BY id; +SELECT * FROM t2 ORDER BY id; + +--connection node_2 +SELECT * FROM t1 ORDER BY id; +SELECT * FROM t2 ORDER BY id; +DROP TRIGGER tr1; +DROP TRIGGER tr2; +DROP TRIGGER tr3; +DROP TABLE t1,t2; + +--connection node_1 +--disable_query_log --eval SET GLOBAL wsrep_replicate_myisam = $wsrep_replicate_myisam_orig +--enable_query_log + +--connection node_2 +--disable_query_log +--eval SET GLOBAL wsrep_replicate_myisam = $wsrep_replicate_myisam_orig +--enable_query_log diff --git a/mysql-test/suite/wsrep/r/mdev_22681.result b/mysql-test/suite/wsrep/r/mdev_22681.result new file mode 100644 index 00000000000..ecce324ead6 --- /dev/null +++ b/mysql-test/suite/wsrep/r/mdev_22681.result @@ -0,0 +1,3 @@ +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 ENGINE=InnoDB AS SELECT 1 AS b'; +DROP TABLE t1; diff --git a/mysql-test/suite/wsrep/t/mdev_22681.cnf b/mysql-test/suite/wsrep/t/mdev_22681.cnf new file mode 100644 index 00000000000..2f310476733 --- /dev/null +++ b/mysql-test/suite/wsrep/t/mdev_22681.cnf @@ -0,0 +1,10 @@ +!include ../my.cnf + +[mysqld.1] +wsrep-on=ON +log-bin +binlog-format=ROW +innodb-flush-log-at-trx-commit=1 +wsrep-cluster-address=gcomm:// +wsrep-provider=@ENV.WSREP_PROVIDER +innodb-autoinc-lock-mode=2 diff --git a/mysql-test/suite/wsrep/t/mdev_22681.test b/mysql-test/suite/wsrep/t/mdev_22681.test new file mode 100644 index 00000000000..ce1129c7485 --- /dev/null +++ b/mysql-test/suite/wsrep/t/mdev_22681.test @@ -0,0 +1,15 @@ +# +# MDEV-22681: Server crashes in galera::ReplicatorSMM::CommitOrder::CommitOrder +# or assertion failed in wsrep::transaction::before_prepare. +# +# EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 ENGINE=InnoDB AS SELECT 1 AS b' +# crashes the server if binlog is on (see mdev_22681.cnf for configuration). +# +--source include/have_wsrep.inc +--source include/have_wsrep_provider.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 ENGINE=InnoDB AS SELECT 1 AS b'; + +DROP TABLE t1; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index e8c94c6b363..05a1ee57d63 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3792,6 +3792,7 @@ mysql_execute_command(THD *thd) lex->sql_command != SQLCOM_BEGIN && lex->sql_command != SQLCOM_CALL && lex->sql_command != SQLCOM_EXECUTE && + lex->sql_command != SQLCOM_EXECUTE_IMMEDIATE && !(sql_command_flags[lex->sql_command] & CF_AUTO_COMMIT_TRANS)) { wsrep_start_trx_if_not_started(thd);