Commit b95ae56b authored by Igor Babaev's avatar Igor Babaev

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.
parent c1feaf8d
......@@ -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.
# -----------------------------------------------------------------
......
......@@ -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 # -----------------------------------------------------------------
......
......@@ -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;
}
......
......@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment