summaryrefslogtreecommitdiff
path: root/mysql-test
diff options
context:
space:
mode:
authorMichael Widenius <monty@mariadb.org>2014-09-08 20:56:56 +0300
committerMichael Widenius <monty@mariadb.org>2014-09-08 20:56:56 +0300
commit9c79227c961d91da4d1cbd0e96a05291874d6b9c (patch)
tree260c789b9b5f8097c6dc242a7ee6964b927598ae /mysql-test
parent0835f574891d0afdfe64229d38460128fedfdd38 (diff)
downloadmariadb-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.result12
-rw-r--r--mysql-test/suite/rpl/r/create_or_replace2.result31
-rw-r--r--mysql-test/suite/rpl/t/create_or_replace2.test44
-rw-r--r--mysql-test/t/create_or_replace.test32
-rw-r--r--mysql-test/valgrind.supp11
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