From ec984b8c9d758132a32bfcdea9c6212d3826a191 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 5 Apr 2006 01:09:07 +0400 Subject: [PATCH] Fixed BUG#13683: INSERT DELAYED into a view creates an infinite loop. The bug was caused by wrong behaviour of mysql_insert() which in case of INSERT DELAYED into a view exited with thd->net.report_error == 0. This blocked error reporting to the client which started waiting infinitely for response to the query. mysql-test/r/insert.result: Fixed results for the added test case. mysql-test/t/insert.test: Added test case. sql/sql_insert.cc: Fixed BUG#13683: INSERT DELAYED into a view creates an infinite loop. Changed mysql_insert(): delayed_get_table() applied to a view exits with ER_WRONG_OBJECT error (and with thd->net.report_error == 1) and in this case we must just exit from mysql_insert(). Prior to this change, instead of exiting open_and_lock_tables() was invoked which cleared thd->net.report_error to zero and caused the bug. --- mysql-test/r/insert.result | 6 ++++++ mysql-test/t/insert.test | 12 ++++++++++++ sql/sql_insert.cc | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/insert.result b/mysql-test/r/insert.result index f788576f824..00a987c9254 100644 --- a/mysql-test/r/insert.result +++ b/mysql-test/r/insert.result @@ -299,3 +299,9 @@ select count(*) from t2; count(*) 25500 drop table t1,t2,t3; +create table t1 (n int); +create view v1 as select * from t1; +insert delayed into v1 values (1); +ERROR HY000: 'test.v1' is not BASE TABLE +drop table t1; +drop view v1; diff --git a/mysql-test/t/insert.test b/mysql-test/t/insert.test index ddde6cfa5d3..0c64dd80bec 100644 --- a/mysql-test/t/insert.test +++ b/mysql-test/t/insert.test @@ -175,3 +175,15 @@ select count(*) from t2; insert into t2 select t1.* from t1, t2 t, t3 where t1.id1 = t.id2 and t.id2 = t3.id3; select count(*) from t2; drop table t1,t2,t3; + +# +# Test for INSERT DELAYED INTO a +# BUG#13683: INSERT DELAYED into a view creates an infinite loop +# + +create table t1 (n int); +create view v1 as select * from t1; +--error 1347 +insert delayed into v1 values (1); +drop table t1; +drop view v1; diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index b6ff0ecc216..2907b5bf5ef 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -321,7 +321,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, if (!table_list->derived && !table_list->view) table_list->updatable= 1; // usual table } - else + else if (thd->net.last_errno != ER_WRONG_OBJECT) { /* Too many delayed insert threads; Use a normal insert */ table_list->lock_type= lock_type= TL_WRITE;