summaryrefslogtreecommitdiff
path: root/mysql-test/t/rpl_ddl.test
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/t/rpl_ddl.test')
-rw-r--r--mysql-test/t/rpl_ddl.test268
1 files changed, 268 insertions, 0 deletions
diff --git a/mysql-test/t/rpl_ddl.test b/mysql-test/t/rpl_ddl.test
new file mode 100644
index 00000000000..a99a71a841b
--- /dev/null
+++ b/mysql-test/t/rpl_ddl.test
@@ -0,0 +1,268 @@
+######################## rpl-ddl.test ########################
+# #
+# DDL statements (sometimes with implicit COMMIT) executed #
+# by the master and it's propagation into the slave #
+# #
+##############################################################
+
+#
+# NOTE, PLEASE BE CAREFUL, WHEN MODIFYING THE TESTS !!
+#
+# 1. !All! objects to be dropped, renamed, altered ... must be created
+# in AUTOCOMMIT= 1 mode before AUTOCOMMIT is set to 0 and the test
+# sequences start.
+#
+# 2. Never use a test object, which was direct or indirect affected by a
+# preceeding test sequence again.
+# Except table d1.t1 where ONLY DML is allowed.
+#
+# If one preceeding test sequence hits a (sometimes not good visible,
+# because the sql error code of the statement might be 0) bug
+# and these rules are ignored, a following test sequence might earn ugly
+# effects like failing 'sync_slave_with_master', crashes of the slave or
+# abort of the test case etc..
+#
+# 3. The assignment of the DDL command to be tested to $my_stmt can
+# be a bit difficult. "'" must be avoided, because the test
+# routine "include/rpl_stmt_seq.inc" performs a
+# eval SELECT CONCAT('######## ','$my_stmt',' ########') as "";
+#
+
+######## tested DDL commands
+#
+# let $my_stmt= COMMIT;
+# let $my_stmt= ROLLBACK;
+# let $my_stmt= SET AUTOCOMMIT=1;
+# let $my_stmt= START TRANSACTION;
+# let $my_stmt= BEGIN;
+# let $my_stmt= DROP TABLE d1.t2;
+# let $my_stmt= RENAME TABLE d1.t3 to d1.t20; <- wrong syntax !!
+# let $my_stmt= ALTER TABLE d1.t4 ADD column f2 BIGINT;
+# let $my_stmt= CREATE TABLE d1.t21 (f1 BIGINT) ENGINE= "InnoDB";
+# let $my_stmt= TRUNCATE TABLE d1.t7;
+# let $my_stmt= LOCK TABLES d1.t1 WRITE, d1.t8 READ;
+# let $my_stmt= UNLOCK TABLES;
+# let $my_stmt= DROP INDEX my_idx6 ON d1.t6;
+# let $my_stmt= CREATE INDEX my_idx5 ON d1.t5(f1);
+# let $my_stmt= DROP DATABASE d2;
+# let $my_stmt= CREATE DATABASE d3;
+#
+# FIXME: @code{LOAD MASTER DATA} is not tested
+#
+#############################################
+
+--source include/have_innodb.inc
+source include/master-slave.inc;
+
+
+######## some preparations
+#
+SET AUTOCOMMIT = 1;
+#
+# 1. DROP all objects, which probably already exist, but must be created here
+#
+--disable_warnings
+DROP DATABASE IF EXISTS d1;
+DROP DATABASE IF EXISTS d2;
+DROP DATABASE IF EXISTS d3;
+--enable_warnings
+#
+# 2. CREATE all objects needed
+# working database is d1
+# working (transactional!) is d1.t1
+#
+CREATE DATABASE d1;
+CREATE DATABASE d2;
+CREATE TABLE d1.t1 (f1 BIGINT) ENGINE= "InnoDB";
+INSERT INTO d1.t1 SET f1= 0;
+CREATE TABLE d1.t2 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t3 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t4 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t5 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t6 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE INDEX my_idx6 ON d1.t6(f1);
+CREATE TABLE d1.t7 (f1 BIGINT) ENGINE= "InnoDB";
+INSERT INTO d1.t7 SET f1= 0;
+CREATE TABLE d1.t8 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t9 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t10 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t11 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t12 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t13 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t14 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t15 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t16 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t17 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t18 (f1 BIGINT) ENGINE= "InnoDB";
+CREATE TABLE d1.t19 (f1 BIGINT) ENGINE= "InnoDB";
+#
+COMMIT; # Just to be sure
+#
+# 3. master sessions: never do AUTOCOMMIT
+# slave sessions: do AUTOCOMMIT, because we want to see fresh values
+# every time
+# default database is d1
+SET AUTOCOMMIT = 0;
+use d1;
+sync_slave_with_master;
+connection slave;
+--disable_query_log
+SELECT '-------- switch to slave --------' as "";
+--enable_query_log
+SET AUTOCOMMIT = 1;
+use d1;
+connection master;
+--disable_query_log
+SELECT '-------- switch to master -------' as "";
+--enable_query_log
+
+
+# We don't want to abort the whole test if one statement sent
+# to the server gets an error, because the following test
+# sequences are nearly independend of the previous statements.
+--disable_abort_on_error
+
+###### banal case: (explicit) COMMIT and ROLLBACK
+# just for checking if the test sequence is usable
+let $my_stmt= COMMIT;
+--source include/rpl_stmt_seq.inc
+let $my_stmt= ROLLBACK;
+--source include/rpl_stmt_seq.inc
+
+###### cases with commands very similar to COMMIT
+let $my_stmt= SET AUTOCOMMIT=1;
+--source include/rpl_stmt_seq.inc
+SET AUTOCOMMIT=0;
+#
+let $my_stmt= START TRANSACTION;
+--source include/rpl_stmt_seq.inc
+#
+let $my_stmt= BEGIN;
+--source include/rpl_stmt_seq.inc
+
+###### cases with commands, which create or drop objects
+#### (BASE) TABLES and (UPDATABLE) VIEWs
+let $my_stmt= DROP TABLE d1.t2;
+--source include/rpl_stmt_seq.inc
+SHOW TABLES LIKE 't2';
+connection slave;
+--disable_query_log
+SELECT '-------- switch to slave --------' as "";
+--enable_query_log
+SHOW TABLES LIKE 't2';
+connection master;
+--disable_query_log
+SELECT '-------- switch to master -------' as "";
+--enable_query_log
+#
+let $my_stmt= RENAME TABLE d1.t3 to d1.t20;
+--source include/rpl_stmt_seq.inc
+SHOW TABLES LIKE 't20';
+connection slave;
+--disable_query_log
+SELECT '-------- switch to slave --------' as "";
+--enable_query_log
+SHOW TABLES LIKE 't20';
+connection master;
+--disable_query_log
+SELECT '-------- switch to master -------' as "";
+--enable_query_log
+#
+let $my_stmt= ALTER TABLE d1.t4 ADD column f2 BIGINT;
+--source include/rpl_stmt_seq.inc
+describe d1.t4;
+connection slave;
+--disable_query_log
+SELECT '-------- switch to slave --------' as "";
+--enable_query_log
+describe d1.t4;
+connection master;
+--disable_query_log
+SELECT '-------- switch to master -------' as "";
+--enable_query_log
+#
+let $my_stmt= CREATE TABLE d1.t21 (f1 BIGINT) ENGINE= "InnoDB";
+--source include/rpl_stmt_seq.inc
+#
+let $my_stmt= TRUNCATE TABLE d1.t7;
+--source include/rpl_stmt_seq.inc
+SELECT * FROM d1.t7;
+connection slave;
+--disable_query_log
+SELECT '-------- switch to slave --------' as "";
+--enable_query_log
+SELECT * FROM d1.t7;
+connection master;
+--disable_query_log
+SELECT '-------- switch to master -------' as "";
+--enable_query_log
+#
+# MySQL insists in locking d1.t1, because rpl_stmt_seq performs an INSERT into
+# this table.
+let $my_stmt= LOCK TABLES d1.t1 WRITE, d1.t8 READ;
+--source include/rpl_stmt_seq.inc
+UNLOCK TABLES;
+#
+LOCK TABLES d1.t1 WRITE, d1.t8 READ;
+let $my_stmt= UNLOCK TABLES;
+--source include/rpl_stmt_seq.inc
+#
+#### INDEXES
+let $my_stmt= DROP INDEX my_idx6 ON d1.t6;
+--source include/rpl_stmt_seq.inc
+SHOW INDEX FROM d1.t6;
+connection slave;
+--disable_query_log
+SELECT '-------- switch to slave --------' as "";
+--enable_query_log
+SHOW INDEX FROM d1.t6;
+connection master;
+--disable_query_log
+SELECT '-------- switch to master -------' as "";
+--enable_query_log
+#
+let $my_stmt= CREATE INDEX my_idx5 ON d1.t5(f1);
+--source include/rpl_stmt_seq.inc
+SHOW INDEX FROM d1.t5;
+connection slave;
+--disable_query_log
+SELECT '-------- switch to slave --------' as "";
+--enable_query_log
+SHOW INDEX FROM d1.t5;
+connection master;
+--disable_query_log
+SELECT '-------- switch to master -------' as "";
+--enable_query_log
+
+#### DATABASES
+let $my_stmt= DROP DATABASE d2;
+--source include/rpl_stmt_seq.inc
+SHOW DATABASES LIKE "d2";
+connection slave;
+--disable_query_log
+SELECT '-------- switch to slave --------' as "";
+--enable_query_log
+SHOW DATABASES LIKE "d2";
+connection master;
+--disable_query_log
+SELECT '-------- switch to master -------' as "";
+--enable_query_log
+#
+let $my_stmt= CREATE DATABASE d3;
+--source include/rpl_stmt_seq.inc
+SHOW DATABASES LIKE "d3";
+connection slave;
+--disable_query_log
+SELECT '-------- switch to slave --------' as "";
+--enable_query_log
+SHOW DATABASES LIKE "d3";
+connection master;
+--disable_query_log
+SELECT '-------- switch to master -------' as "";
+--enable_query_log
+
+--disable_warnings
+DROP DATABASE IF EXISTS d1;
+DROP DATABASE IF EXISTS d2;
+DROP DATABASE IF EXISTS d3;
+--enable_warnings