summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Osipov <kostja@sun.com>2010-02-05 20:41:00 +0300
committerKonstantin Osipov <kostja@sun.com>2010-02-05 20:41:00 +0300
commit0b2f51664d38ed24f3f8b237877520e45bfe83f6 (patch)
tree56ced26f530c39d6a88fc867bee024e21487fc5b
parent4e95b60b278db939adc3846cc313abed34c463bc (diff)
parent1ca7c51961f3e4840f1f054898eacbe39dfec058 (diff)
downloadmariadb-git-0b2f51664d38ed24f3f8b237877520e45bfe83f6.tar.gz
Merge next-4284 -> next-4284-merge.
-rw-r--r--mysql-test/include/handler.inc22
-rw-r--r--mysql-test/r/handler_innodb.result12
-rw-r--r--mysql-test/r/handler_myisam.result12
-rw-r--r--sql/sql_handler.cc13
4 files changed, 56 insertions, 3 deletions
diff --git a/mysql-test/include/handler.inc b/mysql-test/include/handler.inc
index 715b2c74bf2..a5ab97996bb 100644
--- a/mysql-test/include/handler.inc
+++ b/mysql-test/include/handler.inc
@@ -1500,3 +1500,25 @@ connection default;
handler no_such_table read no_such_index first;
--error ER_UNKNOWN_TABLE
handler no_such_table close;
+
+
+--echo #
+--echo # Bug#50907 Assertion `hash_tables->table->next == __null' on
+--echo # HANDLER OPEN
+--echo #
+
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+--enable_warnings
+
+CREATE TEMPORARY TABLE t1 (i INT);
+CREATE TEMPORARY TABLE t2 (i INT);
+
+# This used to trigger the assert
+HANDLER t2 OPEN;
+
+# This also used to trigger the assert
+HANDLER t2 READ FIRST;
+
+HANDLER t2 CLOSE;
+DROP TABLE t1, t2;
diff --git a/mysql-test/r/handler_innodb.result b/mysql-test/r/handler_innodb.result
index 4def5c82df8..90b0d0bb8fe 100644
--- a/mysql-test/r/handler_innodb.result
+++ b/mysql-test/r/handler_innodb.result
@@ -1464,3 +1464,15 @@ handler no_such_table read no_such_index first;
ERROR 42S02: Unknown table 'no_such_table' in HANDLER
handler no_such_table close;
ERROR 42S02: Unknown table 'no_such_table' in HANDLER
+#
+# Bug#50907 Assertion `hash_tables->table->next == __null' on
+# HANDLER OPEN
+#
+DROP TABLE IF EXISTS t1, t2;
+CREATE TEMPORARY TABLE t1 (i INT);
+CREATE TEMPORARY TABLE t2 (i INT);
+HANDLER t2 OPEN;
+HANDLER t2 READ FIRST;
+i
+HANDLER t2 CLOSE;
+DROP TABLE t1, t2;
diff --git a/mysql-test/r/handler_myisam.result b/mysql-test/r/handler_myisam.result
index 80f728a4dcd..e52d559a197 100644
--- a/mysql-test/r/handler_myisam.result
+++ b/mysql-test/r/handler_myisam.result
@@ -1462,6 +1462,18 @@ ERROR 42S02: Unknown table 'no_such_table' in HANDLER
handler no_such_table close;
ERROR 42S02: Unknown table 'no_such_table' in HANDLER
#
+# Bug#50907 Assertion `hash_tables->table->next == __null' on
+# HANDLER OPEN
+#
+DROP TABLE IF EXISTS t1, t2;
+CREATE TEMPORARY TABLE t1 (i INT);
+CREATE TEMPORARY TABLE t2 (i INT);
+HANDLER t2 OPEN;
+HANDLER t2 READ FIRST;
+i
+HANDLER t2 CLOSE;
+DROP TABLE t1, t2;
+#
# BUG #46456: HANDLER OPEN + TRUNCATE + DROP (temporary) TABLE, crash
#
CREATE TABLE t1 AS SELECT 1 AS f1;
diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc
index 4b22d5e8eec..d9c2a84d03e 100644
--- a/sql/sql_handler.cc
+++ b/sql/sql_handler.cc
@@ -322,8 +322,14 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
thd->mdl_context.set_needs_thr_lock_abort(TRUE);
}
- /* Assert that the above check prevent opening of views and merge tables. */
- DBUG_ASSERT(hash_tables->table->next == NULL);
+ /*
+ Assert that the above check prevents opening of views and merge tables.
+ For temporary tables, TABLE::next can be set even if only one table
+ was opened for HANDLER as it is used to link them together
+ (see thd->temporary_tables).
+ */
+ DBUG_ASSERT(hash_tables->table->next == NULL ||
+ hash_tables->table->s->tmp_table);
/*
If it's a temp table, don't reset table->query_id as the table is
being used by this handler. Otherwise, no meaning at all.
@@ -485,7 +491,8 @@ retry:
/* save open_tables state */
backup_open_tables= thd->open_tables;
/* Always a one-element list, see mysql_ha_open(). */
- DBUG_ASSERT(hash_tables->table->next == NULL);
+ DBUG_ASSERT(hash_tables->table->next == NULL ||
+ hash_tables->table->s->tmp_table);
/*
mysql_lock_tables() needs thd->open_tables to be set correctly to
be able to handle aborts properly.