diff options
author | Michael Widenius <monty@mariadb.org> | 2014-09-08 20:56:56 +0300 |
---|---|---|
committer | Michael Widenius <monty@mariadb.org> | 2014-09-08 20:56:56 +0300 |
commit | 9c79227c961d91da4d1cbd0e96a05291874d6b9c (patch) | |
tree | 260c789b9b5f8097c6dc242a7ee6964b927598ae /mysql-test | |
parent | 0835f574891d0afdfe64229d38460128fedfdd38 (diff) | |
download | mariadb-git-9c79227c961d91da4d1cbd0e96a05291874d6b9c.tar.gz |
Fixed two bugs with CREATE OR REPLACE and LOCK TABLES:
MDEV-6560 Assertion `! is_set() ' failed in Diagnostics_area::set_ok_status on killing CREATE OR REPLACE
MDEV-6525 Assertion `table->pos_in_locked _tables == __null || table->pos_in_locked_tables->table = table' failed in mark_used_tables_as_free_for_reuse, locking problems and binlogging problems on CREATE OR REPLACE under lock.
mysql-test/r/create_or_replace.result:
Added test for MDEV-6560
mysql-test/t/create_or_replace.test:
Added test for MDEV-6560
mysql-test/valgrind.supp:
Added suppression for OpenSuse 12.3
sql/sql_base.cc:
More DBUG
sql/sql_class.cc:
Changed that thd_sqlcom_can_generate_row_events() does not report that CREATE OR REPLACE is generating row events.
This is safe as this function is only used by InnoDB/XtraDB to check if a query is generating row events as part of another transaction. As CREATE is always run as it's own transaction, this isn't a problem.
This fixed MDEV-6525.
sql/sql_table.cc:
Remember if reopen_tables() generates an error (which can only happen in case of KILL).
This fixed MDEV-6560
Diffstat (limited to 'mysql-test')
-rw-r--r-- | mysql-test/r/create_or_replace.result | 12 | ||||
-rw-r--r-- | mysql-test/suite/rpl/r/create_or_replace2.result | 31 | ||||
-rw-r--r-- | mysql-test/suite/rpl/t/create_or_replace2.test | 44 | ||||
-rw-r--r-- | mysql-test/t/create_or_replace.test | 32 | ||||
-rw-r--r-- | mysql-test/valgrind.supp | 11 |
5 files changed, 130 insertions, 0 deletions
diff --git a/mysql-test/r/create_or_replace.result b/mysql-test/r/create_or_replace.result index e6589807c2b..0403e1a0a35 100644 --- a/mysql-test/r/create_or_replace.result +++ b/mysql-test/r/create_or_replace.result @@ -427,4 +427,16 @@ THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME # MDL_SHARED_READ MDL_EXPLICIT Table metadata lock test t2 drop table t1; unlock tables; +# +# MDEV-6560 +# Assertion `! is_set() ' failed in Diagnostics_area::set_ok_status +# +CREATE TABLE t1 (col_int_nokey INT) ENGINE=InnoDB; +CREATE OR REPLACE TEMPORARY TABLE tmp LIKE t1; +LOCK TABLE t1 WRITE; +CREATE OR REPLACE TABLE t1 LIKE tmp;; +KILL QUERY 3; +CREATE OR REPLACE TABLE t1 (a int);; +KILL QUERY 3; +drop table t1; DROP TABLE t2; diff --git a/mysql-test/suite/rpl/r/create_or_replace2.result b/mysql-test/suite/rpl/r/create_or_replace2.result new file mode 100644 index 00000000000..b96a0f8ae13 --- /dev/null +++ b/mysql-test/suite/rpl/r/create_or_replace2.result @@ -0,0 +1,31 @@ +include/master-slave.inc +[connection master] +# +# MDEV-6525 ; Problems with CREATE OR REPLACE under lock +# +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +CREATE FUNCTION f1() RETURNS INT RETURN ( SELECT MAX(a) FROM t1 ); +connect con1,localhost,root,,test; +CREATE TEMPORARY TABLE tmp (b INT) ENGINE=InnoDB; +LOCK TABLE t1 WRITE; +SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; +CREATE OR REPLACE TABLE t1 LIKE tmp; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `b` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +connection default; +set session lock_wait_timeout=1; +SELECT f1(); +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +set session lock_wait_timeout=@@global.lock_wait_timeout; +SELECT f1(); +connection con1; +unlock tables; +connection default; +ERROR 42S22: Unknown column 'a' in 'field list' +disconnect con1; +drop function f1; +drop table t1; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/create_or_replace2.test b/mysql-test/suite/rpl/t/create_or_replace2.test new file mode 100644 index 00000000000..79c92a7ec5b --- /dev/null +++ b/mysql-test/suite/rpl/t/create_or_replace2.test @@ -0,0 +1,44 @@ +--source include/have_innodb.inc +--source include/have_binlog_format_row_or_statement.inc +--source include/have_metadata_lock_info.inc +--source include/master-slave.inc +--enable_connect_log + +--echo # +--echo # MDEV-6525 ; Problems with CREATE OR REPLACE under lock +--echo # + +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +CREATE FUNCTION f1() RETURNS INT RETURN ( SELECT MAX(a) FROM t1 ); + +--connect (con1,localhost,root,,test) + +CREATE TEMPORARY TABLE tmp (b INT) ENGINE=InnoDB; +LOCK TABLE t1 WRITE; + +SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; + +CREATE OR REPLACE TABLE t1 LIKE tmp; +SHOW CREATE TABLE t1; + +--connection default +set session lock_wait_timeout=1; +--error 1205 +SELECT f1(); + +set session lock_wait_timeout=@@global.lock_wait_timeout; +--send SELECT f1() +--connection con1 +# This is here just in case, any timeout should be ok +--sleep 1 +unlock tables; +--connection default +--error 1054 +--reap +--disconnect con1 + +# Cleanup +drop function f1; +drop table t1; +--disable_connect_log +--source include/rpl_end.inc diff --git a/mysql-test/t/create_or_replace.test b/mysql-test/t/create_or_replace.test index 384768a87d5..c7b980f9107 100644 --- a/mysql-test/t/create_or_replace.test +++ b/mysql-test/t/create_or_replace.test @@ -332,6 +332,38 @@ select * from information_schema.metadata_lock_info; drop table t1; unlock tables; +--echo # +--echo # MDEV-6560 +--echo # Assertion `! is_set() ' failed in Diagnostics_area::set_ok_status +--echo # + +CREATE TABLE t1 (col_int_nokey INT) ENGINE=InnoDB; + +--let $con_id = `SELECT CONNECTION_ID()` +CREATE OR REPLACE TEMPORARY TABLE tmp LIKE t1; +LOCK TABLE t1 WRITE; + +--connect (con1,localhost,root,,test) + +--connection default +--send CREATE OR REPLACE TABLE t1 LIKE tmp; +--connection con1 +eval KILL QUERY $con_id; + +--connection default +--error 0,ER_QUERY_INTERRUPTED +--reap +--send CREATE OR REPLACE TABLE t1 (a int); + +--connection con1 +eval KILL QUERY $con_id; + +--connection default +--error 0,ER_QUERY_INTERRUPTED +--reap +--disconnect con1 +drop table t1; + # # Cleanup # diff --git a/mysql-test/valgrind.supp b/mysql-test/valgrind.supp index f1bc19e27eb..ca190104d79 100644 --- a/mysql-test/valgrind.supp +++ b/mysql-test/valgrind.supp @@ -412,6 +412,17 @@ fun:__libc_start_main } +# +# dl_init reports leaked memory in memalign on OpenSuse 12.3 + +{ + memory "loss" from _dl_init + Memcheck:Leak + fun:memalign + ... + fun:call_init + fun:_dl_init +} # # dlclose can allocate memory for error message, the memory will be |