mariadb/mysql-test/suite/galera/t/galera_sequences.test
Daniel Black 7181ea5663 MDEV-33245 SIGSEGV in wsrep_check_sequence
The segfault in wsrep_check_sequence is due to a
null pointer deference on:
  db_type= thd->lex->create_info.db_type->db_type;

Where create_info.db_type is null. This occured under
a used_engine==true condition which is set in the calling
function based on create_info.used_fields==HA_CREATE_USED_ENGINE.

However the create_info.used_fields was a left over
from the parsing of the previous failed CREATE TABLE where
because of its failure, db_type wasn't populated.

This is corrected by cleaning the create_info when we start
to parse ALTER SEQUENCE statements.

Other paths to wsrep_check_sequence is via CREATE SEQUENCE
and CREATE TABLE LIKE which both initialize the create_info
correctly.
2024-12-12 07:27:38 +11:00

358 lines
9 KiB
Text

--source include/galera_cluster.inc
--source include/have_innodb.inc
#
# MDEV-19353 : Alter Sequence do not replicate to another nodes with in Galera Cluster
#
--connection node_1
CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 1000000 increment by 0 cache 1000 nocycle ENGINE=InnoDB;
SHOW CREATE SEQUENCE seq;
--connection node_2
SHOW CREATE SEQUENCE seq;
--connection node_1
ALTER SEQUENCE seq MAXVALUE = 10000 NOCACHE;
SHOW CREATE SEQUENCE seq;
--connection node_2
SHOW CREATE SEQUENCE seq;
--connection node_1
DROP SEQUENCE seq;
--error ER_NO_SUCH_TABLE
SHOW CREATE SEQUENCE seq;
--connection node_2
--error ER_NO_SUCH_TABLE
SHOW CREATE SEQUENCE seq;
#
# MDEV-18848 : Galera: 10.4 node crashed with Assertion `client_state.transaction().active()` after altering SEQUENCE table's engine to myisam and back to innodb
#
--connection node_1
CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE;
select NEXT VALUE FOR Seq1_1;
--error ER_NOT_SUPPORTED_YET
alter table Seq1_1 engine=myisam;
select NEXT VALUE FOR Seq1_1;
alter table Seq1_1 engine=innodb;
select NEXT VALUE FOR Seq1_1;
--connection node_2
SHOW CREATE SEQUENCE Seq1_1;
select NEXT VALUE FOR Seq1_1;
--connection node_1
DROP SEQUENCE Seq1_1;
#
# MDEV-24045 : Assertion client_state_.mode() != wsrep::client_state::m_toi failed in int wsrep::transaction::before_commit()
#
--connection node_1
CREATE TABLE t2 (d CHAR(1)KEY);
SET SESSION autocommit=0;
INSERT INTO t2 VALUES(1);
CREATE TEMPORARY SEQUENCE seq1 NOCACHE ENGINE=INNODB;
CREATE SEQUENCE seq2 NOCACHE ENGINE=INNODB;
COMMIT;
SET SESSION AUTOCOMMIT=1;
SHOW CREATE TABLE seq1;
--connection node_2
--error ER_NO_SUCH_TABLE
SHOW CREATE SEQUENCE seq1;
SHOW CREATE SEQUENCE seq2;
--connection node_1
SET SESSION autocommit=1;
DROP SEQUENCE seq1;
DROP SEQUENCE seq2;
DROP TABLE t2;
#
# Case2
#
--connection node_2
SET SESSION AUTOCOMMIT=0;
SET SESSION wsrep_OSU_method='RSU';
CREATE TABLE t1(c1 VARCHAR(10));
create temporary sequence sq1 NOCACHE engine=innodb;
create sequence sq2 NOCACHE engine=innodb;
COMMIT;
SET SESSION wsrep_OSU_method='TOI';
SHOW CREATE SEQUENCE sq1;
SHOW CREATE SEQUENCE sq2;
--connection node_1
--error ER_NO_SUCH_TABLE
SHOW CREATE SEQUENCE sq1;
--error ER_NO_SUCH_TABLE
SHOW CREATE SEQUENCE sq2;
--connection node_2
SET SESSION AUTOCOMMIT=1;
DROP TABLE t1;
DROP SEQUENCE sq1;
DROP SEQUENCE sq2;
#
# MDEV-30388 Assertion `!wsrep_has_changes(thd) || (thd->lex->sql_command == SQLCOM_CREATE_TABLE
# && !thd->is_current_stmt_binlog_format_row()) ||
# thd->wsrep_cs().transaction().state() == wsrep::transaction::s_aborted' failed
#
--connection node_1
CREATE TABLE t (f INT) engine=innodb;
LOCK TABLE t WRITE;
CREATE OR REPLACE SEQUENCE t MAXVALUE=13 INCREMENT BY 1 NOCACHE engine=innodb;
--error ER_NOT_SUPPORTED_YET
LOCK TABLE t WRITE;
INSERT INTO t VALUES (0,0,1,1,1,0,0,0);
SELECT * from t;
SELECT NEXTVAL(t);
UNLOCK TABLES;
DROP TABLE t;
CREATE SEQUENCE t INCREMENT BY 0 NOCACHE ENGINE=INNODB;
CREATE TABLE t1(a int not null primary key default nextval(t),
b int) engine=innodb;
INSERT INTO t1(b) VALUES (1),(2),(3);
SELECT * FROM t1;
--connection node_2
SELECT * FROM t1;
INSERT INTO t1(b) VALUES (4),(5),(6);
SELECT * FROM t1;
--connection node_1
SELECT * FROM t1;
DROP TABLE t1;
DROP SEQUENCE t;
#
# Test Galera SEQUENCE support
#
#
# No MyISAM SEQUENCES
#
--error ER_NOT_SUPPORTED_YET
CREATE SEQUENCE t ENGINE=MYISAM;
--error ER_NO_SUCH_TABLE
SHOW CREATE SEQUENCE t;
--error ER_NO_SUCH_TABLE
SHOW CREATE TABLE t;
--connection node_2
# Verify that above MyISAM sequence does not replicate
--error ER_NO_SUCH_TABLE
SHOW CREATE SEQUENCE t;
--error ER_NO_SUCH_TABLE
SHOW CREATE TABLE t;
--connection node_1
CREATE SEQUENCE t NOCACHE ENGINE=InnoDB;
--error ER_NOT_SUPPORTED_YET
ALTER TABLE t ENGINE=MyISAM;
SHOW CREATE SEQUENCE t;
SHOW CREATE TABLE t;
--connection node_2
SHOW CREATE SEQUENCE t;
SHOW CREATE TABLE t;
--connection node_1
DROP SEQUENCE t;
CREATE SEQUENCE t INCREMENT BY 1 NOCACHE ENGINE=INNODB;
CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb;
--connection node_2
--echo # Wait DDL to replicate
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't'
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'
--source include/wait_condition.inc
#
# Below we do not care order of INSERTs we care only that values are unique
#
--connection node_1
SELECT @@auto_increment_increment;
SELECT @@auto_increment_offset;
--let $wsrep_sync_wait_orig_1 = `SELECT @@wsrep_sync_wait`
SET SESSION wsrep_sync_wait=0;
--connection node_2
SELECT @@auto_increment_increment;
SELECT @@auto_increment_offset;
--let $wsrep_sync_wait_orig_2 = `SELECT @@wsrep_sync_wait`
SET SESSION wsrep_sync_wait=0;
--let $count = 20
--disable_query_log
while ($count)
{
--connection node_1
--error 0,ER_LOCK_WAIT_TIMEOUT,ER_LOCK_DEADLOCK
INSERT INTO t1(b) values (1);
--connection node_2
--error 0,ER_LOCK_WAIT_TIMEOUT,ER_LOCK_DEADLOCK
INSERT INTO t1(b) values (2);
--error 0,ER_LOCK_WAIT_TIMEOUT,ER_LOCK_DEADLOCK
INSERT INTO t1(b) values (2);
--connection node_1
--error 0,ER_LOCK_WAIT_TIMEOUT,ER_LOCK_DEADLOCK
INSERT INTO t1(b) values (1);
--dec $count
}
--enable_query_log
--connection node_1
--disable_query_log
--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_1
--enable_query_log
--connection node_2
--disable_query_log
--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_2
--enable_query_log
--connection node_1
DROP SEQUENCE t;
DROP TABLE t1;
CREATE SEQUENCE t INCREMENT BY 0 NOCACHE ENGINE=INNODB;
DROP SEQUENCE t;
--error ER_NOT_SUPPORTED_YET
CREATE SEQUENCE t INCREMENT BY 1 CACHE=20 ENGINE=INNODB;
CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB;
CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb;
--connection node_2
--echo # Wait DDL to replicate
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't'
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'
--source include/wait_condition.inc
#
# Below we do not care order of INSERTs we care only that values are unique
#
--connection node_1
--let $wsrep_sync_wait_orig_1 = `SELECT @@wsrep_sync_wait`
SET SESSION wsrep_sync_wait=0;
--connection node_2
--let $wsrep_sync_wait_orig_2 = `SELECT @@wsrep_sync_wait`
SET SESSION wsrep_sync_wait=0;
--let $count = 5
--disable_query_log
while ($count)
{
--connection node_1
--error 0,ER_LOCK_WAIT_TIMEOUT,ER_LOCK_DEADLOCK
INSERT INTO t1(b) values (1),(2),(3),(4),(5),(6),(7),(8),(9);
--connection node_2
--error 0,ER_LOCK_WAIT_TIMEOUT,ER_LOCK_DEADLOCK
INSERT INTO t1(b) values (21),(22),(23),(24),(25),(26),(27),(28),(29);
--error 0,ER_LOCK_WAIT_TIMEOUT,ER_LOCK_DEADLOCK
INSERT INTO t1(b) values (21),(22),(23),(24),(25),(26),(27),(28),(29);
--connection node_1
--error 0,ER_LOCK_WAIT_TIMEOUT,ER_LOCK_DEADLOCK
INSERT INTO t1(b) values (1),(2),(3),(4),(5),(6),(7),(8),(9);
--dec $count
}
--enable_query_log
--connection node_1
--disable_query_log
--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_1
--enable_query_log
--connection node_2
--disable_query_log
--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_2
--enable_query_log
--connection node_1
DROP SEQUENCE t;
DROP TABLE t1;
#
# Test ALTER table to sequence and ALTER SEQUENCE
#
CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB;
--error ER_NOT_SUPPORTED_YET
ALTER TABLE t ENGINE=MYISAM;
--error ER_NOT_SUPPORTED_YET
ALTER SEQUENCE t INCREMENT BY 1 CACHE=10;
ALTER SEQUENCE t INCREMENT BY 1 NOCACHE;
ALTER SEQUENCE t INCREMENT BY 0 NOCACHE;
ALTER SEQUENCE t INCREMENT BY 0 CACHE=10;
DROP SEQUENCE t;
#
# Test transactions
#
CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB;
CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb;
#
# ROLLBACK TRX
#
BEGIN;
INSERT INTO t1(b) VALUES (1);
INSERT INTO t1(b) VALUES (2);
INSERT INTO t1(b) VALUES (3);
INSERT INTO t1(b) VALUES (4);
INSERT INTO t1(a,b) VALUES (2,2);
--error ER_DUP_ENTRY
INSERT INTO t1(a,b) VALUES (3,2);
ROLLBACK;
SELECT * FROM t1;
SELECT NEXTVAL(t);
--connection node_2
SELECT * FROM t1;
SELECT NEXTVAL(t);
--connection node_1
DROP TABLE t1;
DROP SEQUENCE t;
CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB;
CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb;
#
# COMMIT TRX
#
BEGIN;
INSERT INTO t1(b) VALUES (1);
INSERT INTO t1(b) VALUES (2);
INSERT INTO t1(b) VALUES (3);
INSERT INTO t1(b) VALUES (4);
INSERT INTO t1(a,b) VALUES (2,2);
--error ER_DUP_ENTRY
INSERT INTO t1(a,b) VALUES (3,2);
COMMIT;
SELECT * FROM t1;
SELECT NEXTVAL(t);
--connection node_2
SELECT * FROM t1;
SELECT NEXTVAL(t);
--connection node_1
DROP TABLE t1;
DROP SEQUENCE t;
--echo
--echo MDEV-33245 SIGSEGV in wsrep_check_sequence | Sql_cmd_alter_sequence::execute
--echo
CREATE TABLE t (a INT) ENGINE=InnoDB;
INSERT INTO t VALUES (0);
--error ER_PARSE_ERROR
CREATE TABLE t1 (c VARCHAR) ENGINE=InnoDB;
--error ER_NOT_SUPPORTED_YET
ALTER SEQUENCE IF EXISTS t MINVALUE=1;
DROP TABLE t;
--echo End of 10.5 tests