Commit 136c8173 authored by unknown's avatar unknown

Fix bug#15028 Multitable update returns different numbers of matched rows

depending on table order

multi_update::send_data() was counting updates, not updated rows. Thus if one 
record have several updates it will be counted several times in 'rows matched'
but updated only once.

multi_update::send_data() now counts only unique rows.


sql/sql_update.cc:
  Fix bug#15028  Multitable update returns different numbers of matched rows
  depending on table order
  multi_update::send_data() now counts only unique rows.
mysql-test/t/update.test:
  Test case for bug#15028 Multitable update returns different numbers of matched rows depending on table order
mysql-test/r/update.result:
  Test case for bug#15028 Multitable update returns different numbers of matched rows depending on table order
parent 2a1ae3a5
...@@ -345,3 +345,16 @@ f1 ...@@ -345,3 +345,16 @@ f1
2000-01-01 2000-01-01
2002-02-02 2002-02-02
drop table t1; drop table t1;
create table t1 (f1 int);
create table t2 (f2 int);
insert into t1 values(1),(2);
insert into t2 values(1),(1);
update t1,t2 set f1=3,f2=3 where f1=f2 and f1=1;
affected rows: 3
info: Rows matched: 3 Changed: 3 Warnings: 0
update t2 set f2=1;
update t1 set f1=1 where f1=3;
update t2,t1 set f1=3,f2=3 where f1=f2 and f1=1;
affected rows: 3
info: Rows matched: 3 Changed: 3 Warnings: 0
drop table t1,t2;
...@@ -270,4 +270,21 @@ insert into t1 values('2000-01-01'),('0000-00-00'); ...@@ -270,4 +270,21 @@ insert into t1 values('2000-01-01'),('0000-00-00');
update t1 set f1='2002-02-02' where f1 is null; update t1 set f1='2002-02-02' where f1 is null;
select * from t1; select * from t1;
drop table t1; drop table t1;
#
# Bug#15028 Multitable update returns different numbers of matched rows
# depending on table order
create table t1 (f1 int);
create table t2 (f2 int);
insert into t1 values(1),(2);
insert into t2 values(1),(1);
--enable_info
update t1,t2 set f1=3,f2=3 where f1=f2 and f1=1;
--disable_info
update t2 set f2=1;
update t1 set f1=1 where f1=3;
--enable_info
update t2,t1 set f1=3,f2=3 where f1=f2 and f1=1;
--disable_info
drop table t1,t2;
# End of 4.1 tests # End of 4.1 tests
...@@ -1082,22 +1082,23 @@ bool multi_update::send_data(List<Item> &not_used_values) ...@@ -1082,22 +1082,23 @@ bool multi_update::send_data(List<Item> &not_used_values)
int error; int error;
TABLE *tmp_table= tmp_tables[offset]; TABLE *tmp_table= tmp_tables[offset];
fill_record(tmp_table->field+1, *values_for_table[offset], 1); fill_record(tmp_table->field+1, *values_for_table[offset], 1);
found++;
/* Store pointer to row */ /* Store pointer to row */
memcpy((char*) tmp_table->field[0]->ptr, memcpy((char*) tmp_table->field[0]->ptr,
(char*) table->file->ref, table->file->ref_length); (char*) table->file->ref, table->file->ref_length);
/* Write row, ignoring duplicated updates to a row */ /* Write row, ignoring duplicated updates to a row */
if ((error= tmp_table->file->write_row(tmp_table->record[0])) && if (error= tmp_table->file->write_row(tmp_table->record[0]))
(error != HA_ERR_FOUND_DUPP_KEY &&
error != HA_ERR_FOUND_DUPP_UNIQUE))
{ {
if (create_myisam_from_heap(thd, tmp_table, tmp_table_param + offset, if (error != HA_ERR_FOUND_DUPP_KEY &&
error, 1)) error != HA_ERR_FOUND_DUPP_UNIQUE &&
create_myisam_from_heap(thd, tmp_table,
tmp_table_param + offset, error, 1))
{ {
do_update=0; do_update=0;
DBUG_RETURN(1); // Not a table_is_full error DBUG_RETURN(1); // Not a table_is_full error
} }
} }
else
found++;
} }
} }
DBUG_RETURN(0); DBUG_RETURN(0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment