mirror of
https://github.com/MariaDB/server.git
synced 2026-05-02 13:15:32 +02:00
Fix for a bug #2799.
Multi-table delete's with tables having foreign key constraints did not return the error. Also added tests for multi-table updates.
This commit is contained in:
parent
6c1795ee09
commit
e022b27860
3 changed files with 33 additions and 3 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,6 +450,11 @@ 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));
|
||||
if (transactional_tables)
|
||||
{
|
||||
DBUG_RETURN(local_error);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
deleted++;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue