diff options
-rw-r--r-- | mysql-test/r/multi_update.result | 13 | ||||
-rw-r--r-- | mysql-test/t/multi_update.test | 14 | ||||
-rw-r--r-- | sql/sql_delete.cc | 9 |
3 files changed, 33 insertions, 3 deletions
diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result index 31be96fc0fd..5a18a12507e 100644 --- a/mysql-test/r/multi_update.result +++ b/mysql-test/r/multi_update.result @@ -360,3 +360,16 @@ where 0=1; delete t1, t2 from t2,t1 where t1.id1=t2.id2 and 0=1; drop table t1,t2; +create table `t1` (`id` int( 11 ) not null ,primary key ( `id` )) type = innodb; +insert into `t1`values ( 1 ) ; +create table `t2` (`id` int( 11 ) not null default '0',unique key `id` ( `id` ) ,constraint `t1_id_fk` foreign key ( `id` ) references `t1` (`id` )) type = innodb; +insert into `t2`values ( 1 ) ; +create table `t3` (`id` int( 11 ) not null default '0',key `id` ( `id` ) ,constraint `t2_id_fk` foreign key ( `id` ) references `t2` (`id` )) type = innodb; +insert into `t3`values ( 1 ) ; +delete t3,t2,t1 from t1,t2,t3 where t1.id =1 and t2.id = t1.id and t3.id = t2.id; +Cannot delete or update a parent row: a foreign key constraint fails +update t1,t2,t3 set t3.id=5, t2.id=6, t1.id=7 where t1.id =1 and t2.id = t1.id and t3.id = t2.id; +Cannot delete or update a parent row: a foreign key constraint fails +update t3 set t3.id=7 where t1.id =1 and t2.id = t1.id and t3.id = t2.id; +Unknown table 't1' in where clause +drop table t3,t2,t1; diff --git a/mysql-test/t/multi_update.test b/mysql-test/t/multi_update.test index 56dcf9a03a9..449d58855d9 100644 --- a/mysql-test/t/multi_update.test +++ b/mysql-test/t/multi_update.test @@ -302,4 +302,16 @@ delete t1, t2 from t2,t1 where t1.id1=t2.id2 and 0=1; drop table t1,t2; - +create table `t1` (`id` int( 11 ) not null ,primary key ( `id` )) type = innodb; +insert into `t1`values ( 1 ) ; +create table `t2` (`id` int( 11 ) not null default '0',unique key `id` ( `id` ) ,constraint `t1_id_fk` foreign key ( `id` ) references `t1` (`id` )) type = innodb; +insert into `t2`values ( 1 ) ; +create table `t3` (`id` int( 11 ) not null default '0',key `id` ( `id` ) ,constraint `t2_id_fk` foreign key ( `id` ) references `t2` (`id` )) type = innodb; +insert into `t3`values ( 1 ) ; +--error 1217 +delete t3,t2,t1 from t1,t2,t3 where t1.id =1 and t2.id = t1.id and t3.id = t2.id; +--error 1217 +update t1,t2,t3 set t3.id=5, t2.id=6, t1.id=7 where t1.id =1 and t2.id = t1.id and t3.id = t2.id; +--error 1109 +update t3 set t3.id=7 where t1.id =1 and t2.id = t1.id and t3.id = t2.id; +drop table t3,t2,t1; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 7ca259425aa..ed6607c61dd 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -347,7 +347,7 @@ bool multi_delete::send_data(List<Item> &values) table->status|= STATUS_DELETED; if (!(error=table->file->delete_row(table->record[0]))) deleted++; - else if (!table_being_deleted->next) + else if (!table_being_deleted->next || table_being_deleted->table->file->has_transactions()) { table->file->print_error(error,MYF(0)); DBUG_RETURN(1); @@ -450,7 +450,12 @@ int multi_delete::do_deletes(bool from_send_error) if ((local_error=table->file->delete_row(table->record[0]))) { table->file->print_error(local_error,MYF(0)); - break; + if (transactional_tables) + { + DBUG_RETURN(local_error); + } + else + break; } deleted++; } |