Loading mysql-test/r/multi_update.result +6 −0 Original line number Diff line number Diff line Loading @@ -399,3 +399,9 @@ select * from t2; c2_id c2_p_id c2_note c2_active 1 1 A Note 1 drop table t1, t2; drop table if exists t2, t1; create table t1(aclid bigint not null primary key, status tinyint(1) not null ) type = innodb; create table t2(refid bigint not null primary key, aclid bigint, index idx_acl(aclid) )type = innodb; insert into t2 values(1,null); delete t2, t1 from t2 as a left join t1 as b on (a.aclid=b.aclid) where a.refid='1'; drop table t1, t2; mysql-test/t/multi_update.test +9 −0 Original line number Diff line number Diff line Loading @@ -337,3 +337,12 @@ update t1 left join t2 on p_id = c2_p_id set c2_note = 'asdf-1' where p_id = 2; select * from t1; select * from t2; drop table t1, t2; # Test for BUG#5837 - delete with outer join and const tables drop table if exists t2, t1; create table t1(aclid bigint not null primary key, status tinyint(1) not null ) type = innodb; create table t2(refid bigint not null primary key, aclid bigint, index idx_acl(aclid) )type = innodb; insert into t2 values(1,null); delete t2, t1 from t2 as a left join t1 as b on (a.aclid=b.aclid) where a.refid='1'; drop table t1, t2; sql/sql_select.cc +8 −2 Original line number Diff line number Diff line Loading @@ -4951,7 +4951,10 @@ join_read_system(JOIN_TAB *tab) table->file->print_error(error,MYF(0)); return 1; } table->null_row=1; // This is ok. if (tab->on_expr) mark_as_null_row(tab->table); else table->null_row=1; // Why do this for inner join? empty_record(table); // Make empty record return -1; } Loading Loading @@ -4981,6 +4984,9 @@ join_read_const(JOIN_TAB *tab) } if (error) { if (tab->on_expr) mark_as_null_row(tab->table); else table->null_row=1; empty_record(table); if (error != HA_ERR_KEY_NOT_FOUND) Loading sql/table.h +8 −2 Original line number Diff line number Diff line Loading @@ -89,8 +89,14 @@ struct st_table { int current_lock; /* Type of lock on table */ enum tmp_table_type tmp_table; my_bool copy_blobs; /* copy_blobs when storing */ my_bool null_row; /* All columns are null */ my_bool maybe_null,outer_join; /* Used with OUTER JOIN */ /* Used in outer joins: if true, all columns are considered to have NULL values, including columns declared as "not null". */ my_bool null_row; /* 0 or JOIN_TYPE_{LEFT|RIGHT}, same as TABLE_LIST::outer_join */ my_bool outer_join; my_bool maybe_null; /* true if (outer_join != 0) */ my_bool force_index; my_bool distinct,const_table,no_rows; my_bool key_read, bulk_insert; Loading Loading
mysql-test/r/multi_update.result +6 −0 Original line number Diff line number Diff line Loading @@ -399,3 +399,9 @@ select * from t2; c2_id c2_p_id c2_note c2_active 1 1 A Note 1 drop table t1, t2; drop table if exists t2, t1; create table t1(aclid bigint not null primary key, status tinyint(1) not null ) type = innodb; create table t2(refid bigint not null primary key, aclid bigint, index idx_acl(aclid) )type = innodb; insert into t2 values(1,null); delete t2, t1 from t2 as a left join t1 as b on (a.aclid=b.aclid) where a.refid='1'; drop table t1, t2;
mysql-test/t/multi_update.test +9 −0 Original line number Diff line number Diff line Loading @@ -337,3 +337,12 @@ update t1 left join t2 on p_id = c2_p_id set c2_note = 'asdf-1' where p_id = 2; select * from t1; select * from t2; drop table t1, t2; # Test for BUG#5837 - delete with outer join and const tables drop table if exists t2, t1; create table t1(aclid bigint not null primary key, status tinyint(1) not null ) type = innodb; create table t2(refid bigint not null primary key, aclid bigint, index idx_acl(aclid) )type = innodb; insert into t2 values(1,null); delete t2, t1 from t2 as a left join t1 as b on (a.aclid=b.aclid) where a.refid='1'; drop table t1, t2;
sql/sql_select.cc +8 −2 Original line number Diff line number Diff line Loading @@ -4951,7 +4951,10 @@ join_read_system(JOIN_TAB *tab) table->file->print_error(error,MYF(0)); return 1; } table->null_row=1; // This is ok. if (tab->on_expr) mark_as_null_row(tab->table); else table->null_row=1; // Why do this for inner join? empty_record(table); // Make empty record return -1; } Loading Loading @@ -4981,6 +4984,9 @@ join_read_const(JOIN_TAB *tab) } if (error) { if (tab->on_expr) mark_as_null_row(tab->table); else table->null_row=1; empty_record(table); if (error != HA_ERR_KEY_NOT_FOUND) Loading
sql/table.h +8 −2 Original line number Diff line number Diff line Loading @@ -89,8 +89,14 @@ struct st_table { int current_lock; /* Type of lock on table */ enum tmp_table_type tmp_table; my_bool copy_blobs; /* copy_blobs when storing */ my_bool null_row; /* All columns are null */ my_bool maybe_null,outer_join; /* Used with OUTER JOIN */ /* Used in outer joins: if true, all columns are considered to have NULL values, including columns declared as "not null". */ my_bool null_row; /* 0 or JOIN_TYPE_{LEFT|RIGHT}, same as TABLE_LIST::outer_join */ my_bool outer_join; my_bool maybe_null; /* true if (outer_join != 0) */ my_bool force_index; my_bool distinct,const_table,no_rows; my_bool key_read, bulk_insert; Loading