The functions mysql_delete and mysql_update lacked calls of
updated_virtual_fields(). This caused wrong results for
some DELETEs/UPDATEs.
Added test cases for this bug.
This commit is contained in:
Igor Babaev 2010-07-02 20:24:39 -07:00
parent 4ee9e66d87
commit b95bd9f5e2
4 changed files with 56 additions and 0 deletions

View File

@ -0,0 +1,32 @@
drop table if exists t1,t2;
create table t1 (a int, b int, v int as (a+1), index idx(b));
insert into t1(a, b) values
(4, 40), (3, 30), (5, 50), (7, 70), (8, 80), (2, 20), (1, 10);
select * from t1 order by b;
a b v
1 10 2
2 20 3
3 30 4
4 40 5
5 50 6
7 70 8
8 80 9
delete from t1 where v > 6 order by b limit 1;
select * from t1 order by b;
a b v
1 10 2
2 20 3
3 30 4
4 40 5
5 50 6
8 80 9
update t1 set a=v order by b limit 1;
select * from t1 order by b;
a b v
2 10 3
2 20 3
3 30 4
4 40 5
5 50 6
8 80 9
drop table t1;

View File

@ -0,0 +1,21 @@
--disable_warnings
drop table if exists t1,t2;
--enable_warnings
#
# Bug#601164: DELETE/UPDATE with ORDER BY index and LIMIT
#
create table t1 (a int, b int, v int as (a+1), index idx(b));
insert into t1(a, b) values
(4, 40), (3, 30), (5, 50), (7, 70), (8, 80), (2, 20), (1, 10);
select * from t1 order by b;
delete from t1 where v > 6 order by b limit 1;
select * from t1 order by b;
update t1 set a=v order by b limit 1;
select * from t1 order by b;
drop table t1;

View File

@ -304,6 +304,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
while (!(error=info.read_record(&info)) && !thd->killed &&
! thd->is_error())
{
update_virtual_fields(table);
// thd->is_error() is tested to disallow delete row on error
if (!select || select->skip_record(thd) > 0)
{

View File

@ -469,6 +469,7 @@ int mysql_update(THD *thd,
while (!(error=info.read_record(&info)) &&
!thd->killed && !thd->is_error())
{
update_virtual_fields(table);
if (!select || select->skip_record(thd) > 0)
{
if (table->file->was_semi_consistent_read())
@ -575,6 +576,7 @@ int mysql_update(THD *thd,
while (!(error=info.read_record(&info)) && !thd->killed)
{
update_virtual_fields(table);
if (!select || select->skip_record(thd) > 0)
{
if (table->file->was_semi_consistent_read())