# # DROP-related tests which execution requires debug server. # --source include/have_debug.inc # Valgrind would complain about memory leaks when we crash on purpose. --source include/not_valgrind.inc # Avoid CrashReporter popup on Mac --source include/not_crashrep.inc --echo # --echo # Bug#21625393 : Assert condition (e->usage() == 1) failure in --echo # dd::cache::Shared_multi_map::remove() --echo # --enable_connect_log --echo # --echo # Create MyISAM table, and drop it, but make drop fail --echo # before the object is deleted from the dd tables. Now, --echo # the object exists in the global data dictionary, but --echo # not in the SE. CREATE TABLE t1 (i INT) ENGINE=MyISAM; --connect (con1, localhost, root) SET SESSION DEBUG='+d,fail_while_dropping_dd_object'; --error ER_LOCK_WAIT_TIMEOUT DROP TABLE t1; SET SESSION DEBUG='-d,fail_while_dropping_dd_object'; --connection default --echo # Drop the table for real. Use IF EXISTS clause to ignore --echo # the fact that table does not exist in SE. --echo # Without the fix this statement will fail with assert. DROP TABLE IF EXISTS t1; --connection con1 --disconnect con1 --source include/wait_until_disconnected.inc --connection default --disable_connect_log --echo # --echo # WL#7743 "New data dictionary: changes to DDL-related parts of SE API" --echo # --echo # Systematic test coverage for changes in DROP TABLES and DROP DATABASE --echo # behavior. --echo # --echo # 1) Error handling by DROP TABLES. --echo # --echo # --echo # 1.a) DROP TABLES statement which fails due to missing table --echo # should not have any side-effects. CREATE TABLE t_m (t_m INT) ENGINE=MyISAM; CREATE TABLE t_i (t_i INT) ENGINE=InnoDB; CREATE TEMPORARY TABLE tt_m (tt_m INT) ENGINE=MyISAM; CREATE TEMPORARY TABLE tt_i (tt_i INT) ENGINE=InnoDB; --echo # Notice that all missing tables are reported. --error ER_BAD_TABLE_ERROR DROP TABLES t_m, t_i, tt_m, tt_i, t_no_such_table, t_no_such_table_either; --echo # All tables are still there. SELECT * FROM t_m, t_i, tt_m, tt_i; --echo # Notice that all missing tables are reported. --error ER_BAD_TABLE_ERROR DROP TEMPORARY TABLES tt_m, tt_i, tt_no_such_table, tt_no_such_table_either; --echo # All tables are still there. SELECT * FROM tt_m, tt_i; --echo # --echo # 1.b) DROP TABLES IF EXISTS should ignore missing tables --echo # as expected and drop existing tables. --echo # --echo # Notice that all missing tables are reported in warning. DROP TABLES IF EXISTS t_m, t_i, tt_m, tt_i, t_no_such_table, t_no_such_table_either; --echo # All existing tables are dropped. --error ER_NO_SUCH_TABLE SELECT * FROM t_m; --error ER_NO_SUCH_TABLE SELECT * FROM t_i; CREATE TEMPORARY TABLE tt_m (tt_m INT) ENGINE=MyISAM; CREATE TEMPORARY TABLE tt_i (tt_i INT) ENGINE=InnoDB; --echo # Notice that all missing tables are reported in warning. DROP TEMPORARY TABLES IF EXISTS tt_m, tt_i, tt_no_such_table, tt_no_such_table_either; --echo # All existing tables are dropped. --error ER_NO_SUCH_TABLE SELECT * FROM tt_m; --error ER_NO_SUCH_TABLE SELECT * FROM tt_i; --echo # --echo # 1.c) DROP TABLES which fails due to foreign key error does --echo # not have side effect. CREATE TABLE t_m (t_m INT) ENGINE=MyISAM; CREATE TABLE t_i_1 (t_i_1 INT) ENGINE=InnoDB; CREATE TABLE t_i_2 (t_i_2 INT PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t_i_3 (t_i_3 INT, FOREIGN KEY(t_i_3) REFERENCES t_i_2(t_i_2)) ENGINE=InnoDB; --error ER_FK_CANNOT_DROP_PARENT DROP TABLES t_m, t_i_1, t_i_2; --echo # All tables are still there. SELECT * FROM t_m; SELECT * FROM t_i_1; SELECT * FROM t_i_2; --echo # --echo # 1.d) DROP TABLES which fails due to SE error might have side --echo # effect. Tables in engines which do not support atomic DDL --echo # which we have managed to drop before error stay dropped. --echo # Removal of InnoDB tables should be rolled back. SET SESSION DEBUG='+d,rm_table_no_locks_abort_after_atomic_tables'; --error ER_UNKNOWN_ERROR DROP TABLES t_m, t_i_1; SET SESSION DEBUG='-d,rm_table_no_locks_abort_after_atomic_tables'; --error ER_NO_SUCH_TABLE SELECT * FROM t_m; SELECT * FROM t_i_1; --echo # --echo # 1.e) DROP TABLES which fails due to SE error and involves only --echo # tables in engines supporting atomic DDL should not have --echo # side effects/should be rolled back. SET SESSION DEBUG='+d,rm_table_no_locks_abort_after_atomic_tables'; --error ER_UNKNOWN_ERROR DROP TABLES t_i_1, t_i_3; SET SESSION DEBUG='-d,rm_table_no_locks_abort_after_atomic_tables'; SELECT * FROM t_i_1; SELECT * FROM t_i_3; --echo # Clean-up. DROP TABLES t_i_1, t_i_3, t_i_2; --echo # --echo # 2) Binary logging and GTID handling for DROP TABLES statements. --echo # --echo # 2.a) Binary logging for successfull DROP TABLES statement is --echo # covered by binlog_stm_mix_innodb_myisam, --echo # rpl_mixed_drop_create_temp_table and other similar --echo # tests. --echo # --echo # 2.b) Binary logging for failed DROP TABLES statement are --echo # additionally covered by rpl_binlog_failed_drop_table, --echo # rpl_gtid/no_gtid_split_statements tests. --echo # --echo # 2.c) GTID handling for DROP TABLES statement is covered by --echo # rpl_gtid_split_statements and --echo # no_binlog_gtid_next_partially_failed_stmts tests. --echo # --echo # --echo # 3) DROP TABLES IF EXISTS should be able to delete tables with --echo # entries in the data-dictionary, but absent from SE. --echo # LET $MYSQLD_DATADIR = `SELECT @@datadir`; CREATE TABLE t1 (a INT) ENGINE=MyISAM; --echo # Remove table from SE manually. FLUSH TABLE t1; --remove_file $MYSQLD_DATADIR/test/t1.MYI --remove_file $MYSQLD_DATADIR/test/t1.MYD --echo # Plain DROP TABLES reports an error. --error ER_ENGINE_CANT_DROP_MISSING_TABLE DROP TABLE t1; --echo # DROP TABLES IF EXISTS successfully drops table. DROP TABLE IF EXISTS t1; --echo # --echo # 4) Error handling by DROP DATABASE. --echo # --echo # --echo # 4.a) DROP DATABASE which fails due to foreign key error should --echo # not have side effect. CREATE DATABASE mysqltest; CREATE TABLE mysqltest.t_m (t_m INT) ENGINE=MyISAM; CREATE TABLE mysqltest.t_i_1 (t_i_1 INT) ENGINE= InnoDB; CREATE TABLE mysqltest.t_i_2 (t_i_2 INT PRIMARY KEY) ENGINE= InnoDB; CREATE FUNCTION mysqltest.f1() RETURNS INT RETURN 0; CREATE TABLE t1 (fk INT, FOREIGN KEY (fk) REFERENCES mysqltest.t_i_2(t_i_2)) ENGINE=InnoDB; --error ER_FK_CANNOT_DROP_PARENT DROP DATABASE mysqltest; --echo # Database and all tables are still there. SELECT * FROM mysqltest.t_m; SELECT * FROM mysqltest.t_i_1; SELECT * FROM mysqltest.t_i_2; --echo # Stored function f1() is still there too. SELECT mysqltest.f1(); --echo # --echo # 4.b) DROP DATABASE which fails due to SE error might have side --echo # effect. Tables in engines which do not support atomic DDL --echo # which we have managed to drop before error stay dropped. --echo # Removal of InnoDB tables should be rolled back. DROP TABLE t1; SET SESSION DEBUG='+d,rm_db_fail_after_dropping_tables'; --error ER_UNKNOWN_ERROR DROP DATABASE mysqltest; SET SESSION DEBUG='-d,rm_db_fail_after_dropping_tables'; --error ER_NO_SUCH_TABLE SELECT * FROM mysqltest.t_m; --echo # Database and tables t_i_1, t_i_2 are still there. SELECT * FROM mysqltest.t_i_1; SELECT * FROM mysqltest.t_i_2; --echo # Stored function f1() is still there too. SELECT mysqltest.f1(); --echo # --echo # 4.c) DROP DATABASE which fails due to SE error and involves only --echo # tables in engines supporting atomic DDL should not have side --echo # effects/should be rolled back. SET SESSION DEBUG='+d,rm_db_fail_after_dropping_tables'; --error ER_UNKNOWN_ERROR DROP DATABASE mysqltest; SET SESSION DEBUG='-d,rm_db_fail_after_dropping_tables'; --echo # Database and tables t_i_1, t_i_2 are still there. SELECT * FROM mysqltest.t_i_1; SELECT * FROM mysqltest.t_i_2; --echo # Stored function f1() is still there too. SELECT mysqltest.f1(); --echo # --echo # 4.d) DROP DATABASE which fails due to failure to drop routine --echo # might have side effect. Tables in engines which do not --echo # support atomic DDL stay dropped. Removal of InnoDB tables --echo # should be rolled back. CREATE TABLE mysqltest.t_m (t_m INT) ENGINE=MyISAM; SET SESSION DEBUG='+d,fail_drop_db_routines'; --error ER_SP_DROP_FAILED DROP DATABASE mysqltest; SET SESSION DEBUG='-d,fail_drop_db_routines'; --error ER_NO_SUCH_TABLE SELECT * FROM mysqltest.t_m; --echo # Database and tables t_i_1, t_i_2 are still there. SELECT * FROM mysqltest.t_i_1; SELECT * FROM mysqltest.t_i_2; --echo # Stored function f1() is still there too. SELECT mysqltest.f1(); DROP DATABASE mysqltest; --echo # --echo # 5) Binary logging and GTID handling for DROP DATABASE. --echo # --echo # GTID handling and Binary logging for successfull and --echo # failed DROP DATABASE statement are covered by --echo # rpl_gtid/no_gtid_split_statements_debug tests. --echo # --echo # --echo # Additional coverage for hidden tables handling by DROP DATABASE. --echo # CREATE DATABASE mysqltest; --echo # Create hidden '#sql...' table in mysqltest by starting --echo # non-atomic ALTER TABLE and crashing the server in the --echo # middle of it. CREATE TABLE mysqltest.t1 (i INT) ENGINE=MYISAM; --source include/expect_crash.inc SET DEBUG='+d,crash_copy_before_commit'; --error 2013 ALTER TABLE mysqltest.t1 ADD COLUMN j INT; --source include/start_mysqld.inc --echo # Check that after restart this hidden table is there. let $MYSQLD_DATADIR= `SELECT @@global.datadir`; --replace_regex /#sql.*\./#sqlXXXX./ --list_files $MYSQLD_DATADIR/mysqltest *.MYD --echo # And that DROP DATABASE can remove this table, without problems. DROP DATABASE mysqltest; --echo # --echo # Bug#28923782: DD CRASHES ON ASSERT IF HA_COMMIT_TRANS() RETURNS ERROR --echo # --echo # Check result of ha_commit_trans() before committing changes of the DD --echo # objects. --echo # CREATE TABLE t(i INT); SET debug = '+d,simulate_failure_in_before_commit_hook'; --echo # This test case works only with binlogging, because it depends on the --echo # 2pc coordinated by the binlog. Hence, to avoid failure when running --echo # the test with --skip-log-bin, we temporarily suppress the query- and --echo # result log. --disable_query_log --disable_result_log if (`SELECT @@global.log_bin`) { # Before the patch, this would fail with an assert due to an inconsistency # between the state of the DD cache and the contents of the DD tables. --error ER_RUN_HOOK_ERROR DROP TABLE t; } --enable_result_log --enable_query_log SET debug = '-d,simulate_failure_in_before_commit_hook'; DROP TABLE t;