config root man

Current Path : /usr/opt/mysql57/mysql-test/t/

FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64
Upload File :
Current File : //usr/opt/mysql57/mysql-test/t/innodb_mysql_sync.test

#
# Test file for InnoDB tests that require the debug sync facility
#
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/have_debug_sync.inc
# Save the initial number of concurrent sessions.
--source include/count_sessions.inc


--echo #
--echo # Bug 42074 concurrent optimize table and 
--echo # alter table = Assertion failed: thd->is_error()
--echo #

--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings

--echo # Create InnoDB table
CREATE TABLE t1 (id INT) engine=innodb;
connect (con2, localhost, root);

--echo # Connection 1
--echo # Start optimizing table
connection default;
SET DEBUG_SYNC='ha_admin_try_alter SIGNAL optimize_started WAIT_FOR table_altered';
--send OPTIMIZE TABLE t1

--echo # Connection 2
--echo # Change table to engine=memory
connection con2;
SET DEBUG_SYNC='now WAIT_FOR optimize_started';
ALTER TABLE t1 engine=memory;
SET DEBUG_SYNC='now SIGNAL table_altered';

--echo # Connection 1
--echo # Complete optimization
connection default;
--reap

disconnect con2;
DROP TABLE t1;
SET DEBUG_SYNC='RESET';


--echo #
--echo # Bug#47459 Assertion in Diagnostics_area::set_eof_status on
--echo #           OPTIMIZE TABLE
--echo #

--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings

connect (con1, localhost, root);
connection default;

CREATE TABLE t1(a INT) ENGINE= InnoDB;

--echo # Connection con1
connection con1;
SET DEBUG_SYNC= "ha_admin_open_ltable SIGNAL opening WAIT_FOR dropped";
--echo # Sending:
--send OPTIMIZE TABLE t1

--echo # Connection default
connection default;
SET DEBUG_SYNC= "now WAIT_FOR opening";
DROP TABLE t1;
SET DEBUG_SYNC= "now SIGNAL dropped";

--echo # Connection con1
connection con1;
--echo # Reaping: OPTIMIZE TABLE t1
--reap

--echo # Connection default
connection default;
disconnect con1;
SET DEBUG_SYNC= "RESET";


--echo #
--echo # Bug#53757 assert in mysql_truncate_by_delete
--echo #

--disable_warnings
DROP TABLE IF EXISTS t1, t2;
--enable_warnings

CREATE TABLE t1(a INT) Engine=InnoDB;
CREATE TABLE t2(id INT);
INSERT INTO t1 VALUES (1), (2);

connect (con1, localhost, root);
INSERT INTO t2 VALUES(connection_id());
SET DEBUG_SYNC= "open_and_process_table SIGNAL opening WAIT_FOR killed";
--echo # Sending: (not reaped since connection is killed later)
--send TRUNCATE t1

connection default;
SET DEBUG_SYNC= "now WAIT_FOR opening";
SELECT ((@id := id) - id) FROM t2; 
KILL @id;
SET DEBUG_SYNC= "now SIGNAL killed";
DROP TABLE t1, t2;
disconnect con1;
--source include/wait_until_count_sessions.inc
SET DEBUG_SYNC= "RESET";


--echo #
--echo # Bug#58933 Assertion `thd- >is_error()' fails on shutdown with ongoing
--echo #           OPTIMIZE TABLE
--echo #

--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings

CREATE TABLE t1 (a INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1), (2);

--echo # Connection con1
connect (con1,localhost,root);
let $ID= `SELECT connection_id()`;
SET DEBUG_SYNC= 'ha_admin_open_ltable SIGNAL waiting WAIT_FOR killed';
--echo # Sending:
--send OPTIMIZE TABLE t1

--echo # Connection default
connection default;
SET DEBUG_SYNC= 'now WAIT_FOR waiting';
--replace_result $ID ID
eval KILL QUERY $ID;
SET DEBUG_SYNC= 'now SIGNAL killed';

--echo # Connection con1
connection con1;
--echo # Reaping: OPTIMIZE TABLE t1
--reap

--echo # Connection default
connection default;
DROP TABLE t1;
SET DEBUG_SYNC= 'RESET';
disconnect con1;


--echo #
--echo # Bug#42230 during add index, cannot do queries on storage engines
--echo #           that implement add_index
--echo #

--disable_warnings
DROP DATABASE IF EXISTS db1;
DROP TABLE IF EXISTS t1;
--enable_warnings

connect(con1,localhost,root);
connect(con2,localhost,root);

--echo # Test 1: Secondary index, should not block reads (original test case).

--echo # Connection default
connection default;
CREATE DATABASE db1;
CREATE TABLE db1.t1(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, value INT) engine=innodb;
INSERT INTO db1.t1(value) VALUES (1), (2);
SET DEBUG_SYNC= "alter_table_inplace_after_lock_downgrade SIGNAL manage WAIT_FOR query";
--echo # Sending:
--send ALTER TABLE db1.t1 ADD INDEX(value)

--echo # Connection con1
connection con1;
SET DEBUG_SYNC= "now WAIT_FOR manage";
# Neither of these two statements should be blocked
USE db1;
SELECT * FROM t1;
SET DEBUG_SYNC= "now SIGNAL query";

--echo # Connection default
connection default;
--echo # Reaping: ALTER TABLE db1.t1 ADD INDEX(value)
--reap
DROP DATABASE db1;

--echo # Test 2: Primary index (implicit), should block writes.

CREATE TABLE t1(a INT NOT NULL, b INT NOT NULL) engine=innodb;
SET DEBUG_SYNC= "alter_table_inplace_after_lock_downgrade SIGNAL manage WAIT_FOR query";
--echo # Sending:
--send ALTER TABLE t1 ADD UNIQUE INDEX(a), LOCK=SHARED

--echo # Connection con1
connection con1;
SET DEBUG_SYNC= "now WAIT_FOR manage";
USE test;
SELECT * FROM t1;
--echo # Sending:
--send UPDATE t1 SET a=NULL

--echo # Connection con2
connection con2;
--echo # Waiting for SELECT to be blocked by the metadata lock on t1
let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist
  WHERE state= 'Waiting for table metadata lock'
  AND info='UPDATE t1 SET a=NULL';
--source include/wait_condition.inc
SET DEBUG_SYNC= "now SIGNAL query";

--echo # Connection default
connection default;
--echo # Reaping: ALTER TABLE t1 ADD UNIQUE INDEX(a)
--reap

--echo # Connection con1
connection con1;
--echo # Reaping: UPDATE t1 SET a=NULL
--reap

--echo # Test 3: Primary index (explicit), should block writes.

--echo # Connection default
connection default;
ALTER TABLE t1 DROP INDEX a;
SET DEBUG_SYNC= "alter_table_inplace_after_lock_downgrade SIGNAL manage WAIT_FOR query";
--echo # Sending:
--send ALTER TABLE t1 ADD PRIMARY KEY (a), LOCK=SHARED

--echo # Connection con1
connection con1;
SET DEBUG_SYNC= "now WAIT_FOR manage";
SELECT * FROM t1;
--echo # Sending:
--send UPDATE t1 SET a=NULL

--echo # Connection con2
connection con2;
--echo # Waiting for SELECT to be blocked by the metadata lock on t1
let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist
  WHERE state= 'Waiting for table metadata lock'
  AND info='UPDATE t1 SET a=NULL';
--source include/wait_condition.inc
SET DEBUG_SYNC= "now SIGNAL query";

--echo # Connection default
connection default;
--echo # Reaping: ALTER TABLE t1 ADD PRIMARY KEY (a)
--reap

--echo # Connection con1
connection con1;
--echo # Reaping: UPDATE t1 SET a=NULL
--reap

--echo # Test 4: Secondary unique index, should not block reads.

--echo # Connection default
connection default;
SET DEBUG_SYNC= "alter_table_inplace_after_lock_downgrade SIGNAL manage WAIT_FOR query";
--echo # Sending:
--send ALTER TABLE t1 ADD UNIQUE (b)

--echo # Connection con1
connection con1;
SET DEBUG_SYNC= "now WAIT_FOR manage";
SELECT * FROM t1;
SET DEBUG_SYNC= "now SIGNAL query";

--echo # Connection default
connection default;
--echo # Reaping: ALTER TABLE t1 ADD UNIQUE (b)
--reap

disconnect con1;
disconnect con2;
SET DEBUG_SYNC= "RESET";
DROP TABLE t1;


--echo #
--echo # Bug#11853126 RE-ENABLE CONCURRENT READS WHILE CREATING SECONDARY INDEX
--echo #              IN INNODB
--echo #

--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings

CREATE TABLE t1(a INT NOT NULL, b INT NOT NULL) engine=innodb;
INSERT INTO t1 VALUES (1, 12345), (2, 23456);

--echo # Connection con1
--connect (con1,localhost,root)
SET SESSION debug= "+d,alter_table_rollback_new_index";
--error ER_UNKNOWN_ERROR
ALTER TABLE t1 ADD PRIMARY KEY(a);
SELECT * FROM t1;

--echo # Connection default
--connection default
SELECT * FROM t1;
DROP TABLE t1;
disconnect con1;


--echo #
--echo # Bug#13417754 ASSERT IN ROW_DROP_DATABASE_FOR_MYSQL DURING DROP SCHEMA
--echo #

--disable_warnings
DROP TABLE IF EXISTS t1;
DROP DATABASE IF EXISTS db1;
--enable_warnings

CREATE TABLE t1(a int) engine=InnoDB;
CREATE DATABASE db1;

connect(con1, localhost, root);
connect(con2, localhost, root);

--echo # Connection con1
connection con1;
SET DEBUG_SYNC= 'after_innobase_rename_table SIGNAL locked WAIT_FOR continue';
--echo # Sending:
--send ALTER TABLE t1 RENAME db1.t1

--echo # Connection con2
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR locked';
--echo # DROP DATABASE db1 should now be blocked by ALTER TABLE
--echo # Sending:
--send DROP DATABASE db1

--echo # Connection default
connection default;
--echo # Check that DROP DATABASE is blocked by IX lock on db1
let $wait_condition=
  SELECT COUNT(*) = 1 FROM information_schema.processlist
  WHERE state = "Waiting for schema metadata lock" and
        info = "DROP DATABASE db1";
--source include/wait_condition.inc
--echo # Resume ALTER TABLE
SET DEBUG_SYNC= 'now SIGNAL continue';

--echo # Connection con1
connection con1;
--echo # Reaping: ALTER TABLE t1 RENAME db1.t1;
--reap

--echo # Connection con2
connection con2;
--echo # Reaping: DROP DATABASE db1
--reap

--echo # Connection default;
connection default;
SET DEBUG_SYNC= 'RESET';
disconnect con1;
disconnect con2;


--echo #
--echo # WL#5534 Online ALTER, Phase 1
--echo #

--echo # Multi thread tests.
--echo # See alter_table.test for single thread tests.

--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings

CREATE TABLE t1(a INT PRIMARY KEY, b INT) engine=InnoDB;
INSERT INTO t1 VALUES (1,1), (2,2);
SET DEBUG_SYNC= 'RESET';
connect (con1, localhost, root);
SET SESSION lock_wait_timeout= 1;

--echo #
--echo # 1: In-place + writes blocked.
--echo #

--echo # Connection default
--connection default
SET DEBUG_SYNC= 'alter_opened_table SIGNAL opened WAIT_FOR continue1';
SET DEBUG_SYNC= 'alter_table_inplace_after_lock_upgrade SIGNAL upgraded WAIT_FOR continue2';
SET DEBUG_SYNC= 'alter_table_inplace_before_commit SIGNAL beforecommit WAIT_FOR continue3';
SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL binlog WAIT_FOR continue4';
--echo # Sending:
--send ALTER TABLE t1 ADD INDEX i1(b), ALGORITHM= INPLACE, LOCK= SHARED

--echo # Connection con1;
--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR opened';
--echo # At this point, neither reads nor writes should be blocked.
SELECT * FROM t1;
INSERT INTO t1 VALUES (3,3);

SET DEBUG_SYNC= 'now SIGNAL continue1';
SET DEBUG_SYNC= 'now WAIT_FOR upgraded';
--echo # Now both reads and writes should be blocked
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t1 VALUES (4,4);

SET DEBUG_SYNC= 'now SIGNAL continue2';
SET DEBUG_SYNC= 'now WAIT_FOR beforecommit';
--echo # Still both reads and writes should be blocked.
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t1 VALUES (5,5);

SET DEBUG_SYNC= 'now SIGNAL continue3';
SET DEBUG_SYNC= 'now WAIT_FOR binlog';
--echo # Same here.
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t1 VALUES (6,6);

SET DEBUG_SYNC= 'now SIGNAL continue4';
--echo # Connection default
--connection default
--echo # Reaping ALTER TABLE ...
--reap
SET DEBUG_SYNC= 'RESET';
DELETE FROM t1 WHERE a= 3;

--echo #
--echo # 2: Copy + writes blocked.
--echo #

SET DEBUG_SYNC= 'alter_opened_table SIGNAL opened WAIT_FOR continue1';
SET DEBUG_SYNC= 'alter_table_copy_after_lock_upgrade SIGNAL upgraded WAIT_FOR continue2';
SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL binlog WAIT_FOR continue3';
--echo # Sending:
--send ALTER TABLE t1 ADD INDEX i2(b), ALGORITHM= COPY, LOCK= SHARED

--echo # Connection con1;
--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR opened';
--echo # At this point, neither reads nor writes should be blocked.
SELECT * FROM t1;
INSERT INTO t1 VALUES (3,3);

SET DEBUG_SYNC= 'now SIGNAL continue1';
SET DEBUG_SYNC= 'now WAIT_FOR upgraded';
--echo # Now writes should be blocked, reads still allowed.
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t1 VALUES (4,4);

SET DEBUG_SYNC= 'now SIGNAL continue2';
SET DEBUG_SYNC= 'now WAIT_FOR binlog';
--echo # Now both reads and writes should be blocked.
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1 limit 1;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t1 VALUES (5,5);

SET DEBUG_SYNC= 'now SIGNAL continue3';
--echo # Connection default
--connection default
--echo # Reaping ALTER TABLE ...
--reap
SET DEBUG_SYNC= 'RESET';
DELETE FROM t1 WHERE a= 3;

--echo #
--echo # 3: In-place + writes allowed.
--echo #

--echo # TODO: Enable this test once WL#5526 is pushed
--disable_parsing

--echo # Connection default
--connection default
SET DEBUG_SYNC= 'alter_opened_table SIGNAL opened WAIT_FOR continue1';
SET DEBUG_SYNC= 'alter_table_inplace_after_lock_upgrade SIGNAL upgraded WAIT_FOR continue2';
SET DEBUG_SYNC= 'alter_table_inplace_after_lock_downgrade SIGNAL downgraded WAIT_FOR continue3';
SET DEBUG_SYNC= 'alter_table_inplace_before_commit SIGNAL beforecommit WAIT_FOR continue4';
SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL binlog WAIT_FOR continue5';
--echo # Sending:
--send ALTER TABLE t1 ADD INDEX i3(b), ALGORITHM= INPLACE, LOCK= NONE

--echo # Connection con1;
--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR opened';
--echo # At this point, neither reads nor writes should be blocked.
SELECT * FROM t1;
INSERT INTO t1 VALUES (3,3);

SET DEBUG_SYNC= 'now SIGNAL continue1';
SET DEBUG_SYNC= 'now WAIT_FOR upgraded';
--echo # Now writes should be blocked, reads still allowed.
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t1 VALUES (4,4);

SET DEBUG_SYNC= 'now SIGNAL continue2';
SET DEBUG_SYNC= 'now WAIT_FOR downgraded';
--echo # Now writes should be allowed again.
SELECT * FROM t1;
INSERT INTO t1 VALUES (5,5);

SET DEBUG_SYNC= 'now SIGNAL continue3';
SET DEBUG_SYNC= 'now WAIT_FOR beforecommit';
--echo # Now both reads and writes should be blocked.
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t1 VALUES (6,6);

SET DEBUG_SYNC= 'now SIGNAL continue4';
SET DEBUG_SYNC= 'now WAIT_FOR binlog';
--echo # Same here.
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t1 VALUES (7,7);

SET DEBUG_SYNC= 'now SIGNAL continue5';
--echo # Connection default
--connection default
--echo # Reaping ALTER TABLE ...
--reap
SET DEBUG_SYNC= 'RESET';
DELETE FROM t1 WHERE a= 3 OR a= 4;

--echo # TODO: Enable this test once WL#5526 is pushed
--enable_parsing

--echo #
--echo # 4: In-place + reads and writes blocked.
--echo #

--echo # Connection default
--connection default
SET DEBUG_SYNC= 'alter_opened_table SIGNAL opened WAIT_FOR continue1';
SET DEBUG_SYNC= 'alter_table_inplace_after_lock_upgrade SIGNAL upgraded WAIT_FOR continue2';
SET DEBUG_SYNC= 'alter_table_inplace_before_commit SIGNAL beforecommit WAIT_FOR continue3';
SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL binlog WAIT_FOR continue4';
--echo # Sending:
--send ALTER TABLE t1 ADD INDEX i4(b), ALGORITHM= INPLACE, LOCK= EXCLUSIVE

--echo # Connection con1;
--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR opened';
--echo # At this point, neither reads nor writes should be blocked.
SELECT * FROM t1;
INSERT INTO t1 VALUES (3,3);

SET DEBUG_SYNC= 'now SIGNAL continue1';
SET DEBUG_SYNC= 'now WAIT_FOR upgraded';
--echo # Now both reads and writes should be blocked.
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t1 VALUES (4,4);

SET DEBUG_SYNC= 'now SIGNAL continue2';
SET DEBUG_SYNC= 'now WAIT_FOR beforecommit';
--echo # Same here.
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t1 VALUES (5,5);

SET DEBUG_SYNC= 'now SIGNAL continue3';
SET DEBUG_SYNC= 'now WAIT_FOR binlog';
--echo # Same here.
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t1 VALUES (6,6);

SET DEBUG_SYNC= 'now SIGNAL continue4';
--echo # Connection default
--connection default
--echo # Reaping ALTER TABLE ...
--reap
SET DEBUG_SYNC= 'RESET';

--connection default
--disconnect con1
DROP TABLE t1;
SET DEBUG_SYNC= 'RESET';


--echo #
--echo #BUG#13975225:ONLINE OPTIMIZE TABLE FOR INNODB TABLES
--echo #

SET DEBUG_SYNC= 'alter_table_inplace_after_lock_downgrade SIGNAL downgraded WAIT_FOR continue';
connect(con1,localhost,root,,);

--echo #Setting up INNODB table.
CREATE TABLE t1(fld1 INT, fld2 INT, fld3 INT) ENGINE= INNODB;
INSERT INTO t1 VALUES (155, 45, 55);

--echo #Concurrent INSERT, UPDATE, SELECT and DELETE is supported 
--echo #during OPTIMIZE TABLE operation for INNODB tables.
--enable_connect_log
--connection default
--echo #OPTIMIZE TABLE operation.
--send OPTIMIZE TABLE t1

--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR downgraded';
--echo # With the patch, concurrent DML operation succeeds.
INSERT INTO t1 VALUES (10, 11, 12);
UPDATE t1 SET fld1= 20 WHERE fld1= 155;
DELETE FROM t1 WHERE fld1= 20;
SELECT * from t1;
SET DEBUG_SYNC= 'now SIGNAL continue';

--connection default
--reap
DROP TABLE t1;
SET DEBUG_SYNC= 'RESET';

--echo #Concurrent INSERT, UPDATE, SELECT and DELETE is supported
--echo #during OPTIMIZE TABLE operation for Partitioned table.

SET DEBUG_SYNC= 'alter_table_inplace_after_lock_downgrade SIGNAL downgraded WAIT_FOR continue';
--echo #Setup PARTITIONED table.
CREATE TABLE t1(fld1 INT) ENGINE= INNODB PARTITION BY HASH(fld1) PARTITIONS 4;
INSERT INTO t1 VALUES(10);

--echo #OPTIMIZE TABLE operation.
--send OPTIMIZE TABLE t1

--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR downgraded';
--echo # With the patch, concurrent DML operation succeeds.
INSERT INTO t1 VALUES (30);
UPDATE t1 SET fld1= 20 WHERE fld1= 10;
DELETE FROM t1 WHERE fld1= 20;
SELECT * from t1;
SET DEBUG_SYNC= 'now SIGNAL continue';

--connection default
--reap
DROP TABLE t1;
SET DEBUG_SYNC= 'RESET';

--echo #ALTER TABLE FORCE and ALTER TABLE ENGINE uses online rebuild
--echo #of the table.

CREATE TABLE t1(fld1 INT, fld2 INT);
INSERT INTO t1 VALUES(10, 20);

--enable_info
ALTER TABLE t1 FORCE;
ALTER TABLE t1 ENGINE=INNODB;

--echo #ALTER TABLE FORCE, ALTER TABLE ENGINE and OPTIMIZE TABLE uses
--echo #table copy when the old_alter_table enabled.
SET SESSION old_alter_table= TRUE;
ALTER TABLE t1 FORCE;
ALTER TABLE t1 ENGINE= INNODB;

SET DEBUG_SYNC= 'alter_table_copy_after_lock_upgrade SIGNAL upgraded';
--echo #OPTIMIZE TABLE operation using table copy.
--send OPTIMIZE TABLE t1

--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR upgraded';
INSERT INTO t1 VALUES(10, 20);

--connection default
--reap
SET DEBUG_SYNC= 'RESET';
SET SESSION old_alter_table= FALSE;

--echo #ALTER TABLE FORCE and ALTER TABLE ENGINE uses table copy
--echo #when ALGORITHM COPY is used.
ALTER TABLE t1 FORCE, ALGORITHM= COPY;
ALTER TABLE t1 ENGINE= INNODB, ALGORITHM= COPY;
--disable_info

#cleanup
DROP TABLE t1;

--echo #OPTIMIZE TABLE on a table with FULLTEXT index uses
--echo #ALTER TABLE FORCE using COPY algorithm here. This
--echo #test case ensures the COPY table debug sync point is hit.

SET DEBUG_SYNC= 'alter_table_copy_after_lock_upgrade SIGNAL upgraded';

--echo #Setup a table with FULLTEXT index.
--connection default
CREATE TABLE t1(fld1 CHAR(10), FULLTEXT(fld1)) ENGINE= INNODB;
INSERT INTO t1 VALUES("String1");

--echo #OPTIMIZE TABLE operation.
--send OPTIMIZE TABLE t1

--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR upgraded';
INSERT INTO t1 VALUES("String2");

--connection default
--reap
SET DEBUG_SYNC= 'RESET';
DROP TABLE t1;

--echo #Test which demonstrates that ALTER TABLE, OPTIMIZE PARTITION
--echo #takes OPTIMIZE TABLE code path, hence does an online rebuild
--echo #of the table with the patch. 

--connection default
SET DEBUG_SYNC= 'alter_table_inplace_after_lock_downgrade SIGNAL downgraded WAIT_FOR continue';
--echo #Setup PARTITIONED table.
CREATE TABLE t1(fld1 INT) ENGINE= INNODB PARTITION BY HASH(fld1) PARTITIONS 4;
INSERT INTO t1 VALUES(10);

--echo #OPTIMIZE ALL PARTITIONS operation.
--send ALTER TABLE t1 OPTIMIZE PARTITION ALL

--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR downgraded';
--echo # With the patch, concurrent DML operation succeeds.
INSERT INTO t1 VALUES (30);
UPDATE t1 SET fld1= 20 WHERE fld1= 10;
DELETE FROM t1 WHERE fld1= 20;
SELECT * from t1;
SET DEBUG_SYNC= 'now SIGNAL continue';

--connection default
--reap
SET DEBUG_SYNC= 'RESET';

--echo #OPTIMIZE PER PARTITION operation.
SET DEBUG_SYNC= 'alter_table_inplace_after_lock_downgrade SIGNAL downgraded WAIT_FOR continue';
--send ALTER TABLE t1 OPTIMIZE PARTITION p0

--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR downgraded';
--echo # With the patch, concurrent DML operation succeeds.
INSERT INTO t1 VALUES (30);
UPDATE t1 SET fld1= 20 WHERE fld1= 10;
DELETE FROM t1 WHERE fld1= 20;
SELECT * from t1;
SET DEBUG_SYNC= 'now SIGNAL continue';

--connection default
--reap
SET DEBUG_SYNC= 'RESET';

--echo # Test case for Bug#11938817 (ALTER BEHAVIOR DIFFERENT THEN DOCUMENTED).
--enable_info
--echo # This should not do anything
ALTER TABLE t1;
--disable_info

#Note that sync point is activated in the online rebuild code path.
SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuild';

--echo # Check that we rebuild the table
--send ALTER TABLE t1 engine=innodb

--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR rebuild';

--connection default
--reap

SET DEBUG_SYNC= 'RESET';

SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuild';

--echo # Check that we rebuild the table
--send ALTER TABLE t1 FORCE

--connection con1
SET DEBUG_SYNC= 'now WAIT_FOR rebuild';

--connection default
--reap

--disable_connect_log
--disconnect con1

SET DEBUG_SYNC= 'RESET';
DROP TABLE t1;


--echo #
--echo # BUG#20367116: ALTER TABLE BREAKS ON DELETE CASCADE FOREIGN KEY
--echo #               CONSTRAINT


--echo # Test case to ensure there are no orphaned rows.
--echo # (ALTER TABLE, COPY) Algorithm.

CREATE TABLE t1(f1 INT NOT NULL, PRIMARY KEY(f1)) ENGINE=INNODB;
CREATE TABLE t2(f2 INT NOT NULL, foreign key(f2) REFERENCES t1(f1)
                ON DELETE CASCADE)ENGINE=INNODB;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1);

--enable_connect_log
SET DEBUG_SYNC= 'commit_alter_copy_table SIGNAL delete_parent WAIT_FOR delete_child';
--send ALTER TABLE t2 ADD f3 INT NOT NULL, ALGORITHM=COPY

connect (con1, localhost, root,,);
SET DEBUG_SYNC= 'now WAIT_FOR delete_parent';
--send DELETE FROM t1 WHERE f1 = 1

--echo # Without the patch, there is no table MDL wait, so the below
--echo # times out.
connect (con2, localhost, root,,);
let $wait_condition= SELECT count(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST
                     WHERE INFO='DELETE FROM t1 WHERE f1 = 1' and
                     STATE='Waiting for table metadata lock';
--source include/wait_condition.inc
SET DEBUG_SYNC= 'now SIGNAL delete_child';

connection con1;
--reap

connection default;
--reap

--echo # Without the patch, there will be an orphaned row in table 't2'.
SELECT * FROM t2;
SELECT * FROM t1;
DROP TABLE t2, t1;

--echo # Cleanup
SET DEBUG_SYNC= 'RESET';
disconnect con1;
disconnect con2;

--echo # Test case to ensure there is no deadlock.
--echo # (ALTER TABLE, INPLACE) algorithm.

CREATE TABLE t1(f1 INT NOT NULL, PRIMARY KEY(f1))ENGINE=INNODB;
CREATE TABLE t2(f2 INT NOT NULL, FOREIGN KEY(f2) REFERENCES t1(f1) ON DELETE CASCADE)ENGINE=INNODB;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1);

SET DEBUG_SYNC='innodb_commit_inplace_alter_table_enter SIGNAL delete_parent WAIT_FOR alter_child';
--send ALTER TABLE t2 ADD f3 INT NOT NULL, ALGORITHM=INPLACE

connect (con1, localhost, root,,);
SET DEBUG_SYNC='now WAIT_FOR delete_parent';
--send DELETE FROM t1 WHERE f1 = 1

--echo # Without the patch, there is no table MDL wait, so the below times out.
connect (con2, localhost, root,,);
let $wait_condition= SELECT count(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST
                     WHERE INFO='DELETE FROM t1 WHERE f1 = 1' and
                     STATE='Waiting for table metadata lock';
--source include/wait_condition.inc
SET DEBUG_SYNC='now signal alter_child';

connection con1;
--reap

--echo # Cleanup
connection default;
--reap
DROP TABLE t2, t1;
SET DEBUG_SYNC= 'RESET';
disconnect con1;
disconnect con2;

--echo # Test case to ensure that the parent's parent is also locked.
--echo # (ALTER TABLE, COPY) Algorithm.

CREATE TABLE t1(f1 INT NOT NULL, PRIMARY KEY(f1)) ENGINE=INNODB;
CREATE TABLE t2(f2 INT NOT NULL, f3 INT NOT NULL, FOREIGN KEY(f2)
                REFERENCES t1(f1) ON DELETE CASCADE,
                PRIMARY KEY(f3))ENGINE=INNODB;
CREATE TABLE t3(f4 INT NOT NULL, FOREIGN KEY(f4) REFERENCES t2(f3)
                ON DELETE CASCADE) ENGINE=INNODB;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, 2);
INSERT INTO t3 VALUES(2);

--enable_connect_log
SET DEBUG_SYNC= 'commit_alter_copy_table SIGNAL delete_parent_parent WAIT_FOR delete_child';
--send ALTER TABLE t3 ADD f5 INT NOT NULL, ALGORITHM=COPY

connect (con1, localhost, root,,);
SET DEBUG_SYNC= 'now WAIT_FOR delete_parent_parent';
--send DELETE FROM t1 WHERE f1 = 1

--echo # Without the patch, there is no table MDL wait, so the below
--echo # times out.
connect (con2, localhost, root,,);
let $wait_condition= SELECT count(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST
                     WHERE INFO='DELETE FROM t1 WHERE f1 = 1' and
                     STATE='Waiting for table metadata lock';
--source include/wait_condition.inc
SET DEBUG_SYNC= 'now SIGNAL delete_child';

connection con1;
--reap

connection default;
--reap

--echo # Without the patch, there will be an orphaned row in table 't3'.
SELECT * FROM t1;
SELECT * FROM t2;
SELECT * FROM t3;

DROP TABLE t3, t2, t1;

--echo # Cleanup
SET DEBUG_SYNC= 'RESET';
disconnect con1;
disconnect con2;

--echo # Test case to ensure there is no deadlock by locking parent's parent.
--echo # (ALTER TABLE, INPLACE) algorithm.

CREATE TABLE t1(f1 INT NOT NULL, PRIMARY KEY(f1))ENGINE=INNODB;
CREATE TABLE t2(f2 INT NOT NULL, f3 INT NOT NULL, FOREIGN KEY(f2)
                REFERENCES t1(f1) ON DELETE CASCADE,
                PRIMARY KEY(f3))ENGINE=INNODB;
CREATE TABLE t3(f4 INT NOT NULL, FOREIGN KEY(f4) REFERENCES t2(f3)
                ON DELETE CASCADE) ENGINE=INNODB;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, 2);
INSERT INTO t3 VALUES(2);

SET DEBUG_SYNC='innodb_commit_inplace_alter_table_enter SIGNAL delete_parent_parent WAIT_FOR alter_child';
--send ALTER TABLE t3 ADD f3 INT NOT NULL, ALGORITHM=INPLACE

connect (con1, localhost, root,,);
SET DEBUG_SYNC='now WAIT_FOR delete_parent_parent';
--send DELETE FROM t1 WHERE f1 = 1

--echo # Without the patch, there is no table MDL wait, so the below times out.
connect (con2, localhost, root,,);
let $wait_condition= SELECT count(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST
                     WHERE INFO='DELETE FROM t1 WHERE f1 = 1' and
                     STATE='Waiting for table metadata lock';
--source include/wait_condition.inc
SET DEBUG_SYNC='now signal alter_child';

connection con1;
--reap

--echo # Cleanup
connection default;
--reap
DROP TABLE t3, t2, t1;
SET DEBUG_SYNC= 'RESET';
disconnect con1;
disconnect con2;

--echo # Test case where ALTER is performed under LOCK TABLES.
--echo # (ALTER TABLE, COPY) Algorithm.

CREATE TABLE t1(f1 INT NOT NULL, PRIMARY KEY(f1)) ENGINE=INNODB;
CREATE TABLE t2(f2 INT NOT NULL, FOREIGN KEY(f2) REFERENCES t1(f1)
                ON DELETE CASCADE)ENGINE=INNODB;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1);

--enable_connect_log
SET DEBUG_SYNC= 'commit_alter_copy_table SIGNAL delete_parent_parent WAIT_FOR delete_child';
LOCK TABLES t2 WRITE;
--send ALTER TABLE t2 ADD f5 INT NOT NULL, ALGORITHM=COPY

connect (con1, localhost, root,,);
SET DEBUG_SYNC= 'now WAIT_FOR delete_parent_parent';
--send DELETE FROM t1 WHERE f1 = 1

--echo # Without the patch, there is no table MDL wait, so the below
--echo # times out.
connect (con2, localhost, root,,);
let $wait_condition= SELECT count(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST
                     WHERE INFO='DELETE FROM t1 WHERE f1 = 1' and
                     STATE='Waiting for table metadata lock';
--source include/wait_condition.inc
SET DEBUG_SYNC= 'now SIGNAL delete_child';

connection con1;
--reap

connection default;
--reap

--echo # Without the patch, there will be an orphaned row in table 't2'.
UNLOCK TABLES;
SELECT * FROM t1;
SELECT * FROM t2;

DROP TABLE t2, t1;

--echo # Cleanup
SET DEBUG_SYNC= 'RESET';
disconnect con1;
disconnect con2;

--echo # Test case where ALTER is performed under LOCK TABLES.
--echo # (ALTER TABLE, INPLACE) algorithm.

CREATE TABLE t1(f1 INT NOT NULL, PRIMARY KEY(f1))ENGINE=INNODB;
CREATE TABLE t2(f2 INT NOT NULL, FOREIGN KEY(f2) REFERENCES t1(f1)
                ON DELETE CASCADE)ENGINE=INNODB;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1);

SET DEBUG_SYNC='innodb_commit_inplace_alter_table_enter SIGNAL delete_parent_parent WAIT_FOR alter_child';
LOCK TABLES t2 WRITE;
--send ALTER TABLE t2 ADD f3 INT NOT NULL, ALGORITHM=INPLACE

connect (con1, localhost, root,,);
SET DEBUG_SYNC='now WAIT_FOR delete_parent_parent';
--send DELETE FROM t1 WHERE f1 = 1

--echo # Without the patch, there is no table MDL wait, so the below times out.
connect (con2, localhost, root,,);
let $wait_condition= SELECT count(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST
                     WHERE INFO='DELETE FROM t1 WHERE f1 = 1' and
                     STATE='Waiting for table metadata lock';
--source include/wait_condition.inc
SET DEBUG_SYNC='now signal alter_child';

connection con1;
--reap

--echo # Cleanup
connection default;
--reap
UNLOCK TABLES;
DROP TABLE t2, t1;
SET DEBUG_SYNC= 'RESET';
disconnect con1;
disconnect con2;

--disable_connect_log

--echo #
--echo # BUG#21631284: DROP VIRTUAL COLUMN RESULT IN DROP WRONG INDEX.
--echo #

--echo # Index is not rebuilt, since there is no change in the definition.
CREATE TABLE t1 (fld1 VARCHAR(300), fld2 INT, KEY idx1(fld2, fld1(200)))
ENGINE=InnoDB;
SET debug="+d,innodb_index_drop_count_zero";

--echo #Without the patch, an error is reported.
ALTER TABLE t1 FORCE;

--echo #cleanup
DROP TABLE t1;
SET debug="-d,innodb_index_drop_count_zero";

--echo # Index is rebuilt since the index is changed from prefixed
--echo # to non-prefixed index.
CREATE TABLE t1 (fld1 CHAR(10), KEY idx1(fld1(5))) ENGINE=InnoDB;
SET debug="+d,innodb_index_drop_count_one";

--echo #Without the patch, an error is reported.
ALTER TABLE t1 MODIFY fld1 CHAR(5);

--echo #cleanup
DROP TABLE t1;
SET debug="-d,innodb_index_drop_count_one";

--echo # Coverage test cases.

--echo # Index is rebuilt since the index is changed from non-prefixed
--echo # to prefixed index.
CREATE TABLE t1 (fld1 CHAR(10), KEY idx1(fld1)) ENGINE=InnoDB;
SET debug="+d,innodb_index_drop_count_one";

--echo #In case of incorrect behavior, an error is reported.
ALTER TABLE t1 MODIFY fld1 CHAR(5);

--echo #cleanup
DROP TABLE t1;
SET debug="-d,innodb_index_drop_count_one";

--echo # Index is not rebuilt since the index prefix length is
--echo # the same.
CREATE TABLE t1 (fld1 CHAR(10), KEY idx1(fld1(5))) ENGINE=InnoDB;
SET debug="+d,innodb_index_drop_count_zero";

--echo #In case of incorrect behavior, an error is reported.
ALTER TABLE t1 MODIFY fld1 CHAR(20);

--echo #cleanup
DROP TABLE t1;
SET debug="-d,innodb_index_drop_count_zero";


--echo #
--echo # BUG#26848813: INDEXED COLUMN CAN'T BE CHANGED FROM VARCHAR(15)
--echo #               TO VARCHAR(40) INSTANTANEOUSLY

CREATE TABLE t1(fld1 VARCHAR(5), KEY(fld1)) ENGINE= InnoDB;
SET DEBUG="+d,innodb_index_drop_count_zero";

--echo # Without patch, an error is reported.
ALTER TABLE t1 MODIFY fld1 VARCHAR(7), ALGORITHM= INPLACE;

--echo # Scenario where non-packed keys is converted to packed keys
--echo # before the patch, an error is reported.
ALTER TABLE t1 MODIFY fld1 VARCHAR(9), ALGORITHM= INPLACE;

SET DEBUG="-d,innodb_index_drop_count_zero";

--echo # Tests added for covering cases where rebuild is required.

--echo # Reducing the size of the field.
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
ALTER TABLE t1 MODIFY fld1 VARCHAR(3), ALGORITHM= INPLACE;

--echo # Increasing the size of the field to boundary condition.
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
ALTER TABLE t1 MODIFY fld1 VARCHAR(256), ALGORITHM= INPLACE;

DROP TABLE t1;

# Check that all connections opened by test cases in this file are really
# gone so execution of other tests won't be affected by their presence.
--source include/wait_until_count_sessions.inc

Man Man