summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2012-04-07 02:29:04 -0700
committerIgor Babaev <igor@askmonty.org>2012-04-07 02:29:04 -0700
commitb95ae56b9f47cc19d3498d4be3142b2449a04600 (patch)
tree847bcf8624f1e569ab03db01bf7d596b7d848ac7
parentc1feaf8d8a7ac15554e2db6c4b2222517447fe3d (diff)
downloadmariadb-git-b95ae56b9f47cc19d3498d4be3142b2449a04600.tar.gz
Fixed LP bug #972973.
When the function free_tmp_table deletes the handler object for a temporary table the field TABLE::file for this table should be set to NULL. Otherwise an assertion failure may occur.
-rw-r--r--mysql-test/r/view.result19
-rw-r--r--mysql-test/t/view.test26
-rw-r--r--sql/item_subselect.cc2
-rw-r--r--sql/sql_select.cc1
4 files changed, 47 insertions, 1 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index b4e6f194058..a1b36c323c7 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -4453,6 +4453,25 @@ UPDATE t2 SET d=7;
DROP TRIGGER tr;
DROP VIEW v;
DROP TABLE t1,t2,t3;
+#
+# BUG#972943: Assertion failure with INSERT SELECT within a trigger
+# that uses derived table and materialized view
+#
+CREATE TABLE t1 (a int, b int);
+INSERT INTO t1 VALUES (1,0), (2,8);
+CREATE ALGORITHM=TEMPTABLE VIEW v1
+AS SELECT * FROM t1;
+CREATE TABLE t2 (c int);
+CREATE TABLE t3 (d int, e int);
+CREATE TRIGGER tr BEFORE INSERT ON t2 FOR EACH ROW
+INSERT INTO t3
+SELECT t1.*
+FROM (SELECT * FROM t1 WHERE b IN (SELECT b FROM v1)) AS alias1, t1
+WHERE t1.a = 3 OR t1.a > 5;
+INSERT INTO t2 VALUES (1);
+DROP TRIGGER tr;
+DROP VIEW v1;
+DROP TABLE t1,t2,t3;
# -----------------------------------------------------------------
# -- End of 5.3 tests.
# -----------------------------------------------------------------
diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test
index 4820e0ac173..93e0cce8a5d 100644
--- a/mysql-test/t/view.test
+++ b/mysql-test/t/view.test
@@ -4394,6 +4394,32 @@ DROP TRIGGER tr;
DROP VIEW v;
DROP TABLE t1,t2,t3;
+--echo #
+--echo # BUG#972943: Assertion failure with INSERT SELECT within a trigger
+--echo # that uses derived table and materialized view
+--echo #
+
+CREATE TABLE t1 (a int, b int);
+INSERT INTO t1 VALUES (1,0), (2,8);
+
+CREATE ALGORITHM=TEMPTABLE VIEW v1
+ AS SELECT * FROM t1;
+
+CREATE TABLE t2 (c int);
+CREATE TABLE t3 (d int, e int);
+
+CREATE TRIGGER tr BEFORE INSERT ON t2 FOR EACH ROW
+ INSERT INTO t3
+ SELECT t1.*
+ FROM (SELECT * FROM t1 WHERE b IN (SELECT b FROM v1)) AS alias1, t1
+ WHERE t1.a = 3 OR t1.a > 5;
+
+INSERT INTO t2 VALUES (1);
+
+DROP TRIGGER tr;
+DROP VIEW v1;
+DROP TABLE t1,t2,t3;
+
--echo # -----------------------------------------------------------------
--echo # -- End of 5.3 tests.
--echo # -----------------------------------------------------------------
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index c4055606039..a1059f68097 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -2727,7 +2727,7 @@ void subselect_uniquesubquery_engine::cleanup()
{
DBUG_ENTER("subselect_uniquesubquery_engine::cleanup");
/* Tell handler we don't need the index anymore */
- if (tab->table->file->inited)
+ if (tab->table->file && tab->table->file->inited)
tab->table->file->ha_index_end();
DBUG_VOID_RETURN;
}
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index a29b6f90be0..1049fc93d01 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -15116,6 +15116,7 @@ free_tmp_table(THD *thd, TABLE *entry)
else
entry->file->ha_delete_table(entry->s->table_name.str);
delete entry->file;
+ entry->file= 0;
}
/* free blobs */