diff --git a/mysql-test/suite/gcol/r/gcol_purge.result b/mysql-test/suite/gcol/r/gcol_purge.result new file mode 100644 index 00000000000..ea8369ad8e5 --- /dev/null +++ b/mysql-test/suite/gcol/r/gcol_purge.result @@ -0,0 +1,22 @@ +CREATE TABLE t1(f1 INT NOT NULL, f2 int not null, +f3 int generated always as (f2 * 2) VIRTUAL, +primary key(f1), INDEX (f3))ENGINE=InnoDB; +connect con1,localhost,root,,,; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; +INSERT INTO t1(f1, f2) VALUES(1,2); +DELETE from t1 where f1 = 1; +connect con2,localhost,root,,,; +begin; +INSERT INTO t1 (f1, f2) VALUES(1,2); +set global debug_dbug="+d,ib_purge_virtual_index_callback"; +connection con1; +COMMIT; +InnoDB 0 transactions not purged +connection con2; +commit; +disconnect con1; +disconnect con2; +connection default; +set global debug_dbug=default; +DROP TABLE t1; diff --git a/mysql-test/suite/gcol/t/gcol_purge.test b/mysql-test/suite/gcol/t/gcol_purge.test new file mode 100644 index 00000000000..3696b41b3d8 --- /dev/null +++ b/mysql-test/suite/gcol/t/gcol_purge.test @@ -0,0 +1,30 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +CREATE TABLE t1(f1 INT NOT NULL, f2 int not null, + f3 int generated always as (f2 * 2) VIRTUAL, + primary key(f1), INDEX (f3))ENGINE=InnoDB; +connect(con1,localhost,root,,,); +START TRANSACTION WITH CONSISTENT SNAPSHOT; + +connection default; +INSERT INTO t1(f1, f2) VALUES(1,2); +DELETE from t1 where f1 = 1; + +connect(con2,localhost,root,,,); +begin; +INSERT INTO t1 (f1, f2) VALUES(1,2); + +set global debug_dbug="+d,ib_purge_virtual_index_callback"; +connection con1; +COMMIT; + +--source ../innodb/include/wait_all_purged.inc + +connection con2; +commit; + +disconnect con1; +disconnect con2; +connection default; +set global debug_dbug=default; +DROP TABLE t1; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 83ef31dc05b..cee2d644480 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -4716,7 +4716,8 @@ TABLE *open_purge_table(THD *thd, const char *db, size_t dblen, DBUG_ASSERT(thd->open_tables == NULL); DBUG_ASSERT(thd->locked_tables_mode < LTM_PRELOCKED); - Open_table_context ot_ctx(thd, 0); + /* Purge already hold the MDL for the table */ + Open_table_context ot_ctx(thd, MYSQL_OPEN_HAS_MDL_LOCK); TABLE_LIST *tl= (TABLE_LIST*)thd->alloc(sizeof(TABLE_LIST)); LEX_CSTRING db_name= {db, dblen }; LEX_CSTRING table_name= { tb, tblen };