Commit ec984b8c authored by unknown's avatar unknown
Browse files

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.
parent 9cc49085
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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;
+12 −0
Original line number Diff line number Diff line
@@ -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 <view>
# 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;
+1 −1
Original line number Diff line number Diff line
@@ -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;