Fixed bug #601164.
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:
parent
4ee9e66d87
commit
b95bd9f5e2
32
mysql-test/suite/vcol/r/vcol_misc.result
Normal file
32
mysql-test/suite/vcol/r/vcol_misc.result
Normal 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;
|
21
mysql-test/suite/vcol/t/vcol_misc.test
Normal file
21
mysql-test/suite/vcol/t/vcol_misc.test
Normal 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;
|
@ -304,6 +304,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
|||||||
while (!(error=info.read_record(&info)) && !thd->killed &&
|
while (!(error=info.read_record(&info)) && !thd->killed &&
|
||||||
! thd->is_error())
|
! thd->is_error())
|
||||||
{
|
{
|
||||||
|
update_virtual_fields(table);
|
||||||
// thd->is_error() is tested to disallow delete row on error
|
// thd->is_error() is tested to disallow delete row on error
|
||||||
if (!select || select->skip_record(thd) > 0)
|
if (!select || select->skip_record(thd) > 0)
|
||||||
{
|
{
|
||||||
|
@ -469,6 +469,7 @@ int mysql_update(THD *thd,
|
|||||||
while (!(error=info.read_record(&info)) &&
|
while (!(error=info.read_record(&info)) &&
|
||||||
!thd->killed && !thd->is_error())
|
!thd->killed && !thd->is_error())
|
||||||
{
|
{
|
||||||
|
update_virtual_fields(table);
|
||||||
if (!select || select->skip_record(thd) > 0)
|
if (!select || select->skip_record(thd) > 0)
|
||||||
{
|
{
|
||||||
if (table->file->was_semi_consistent_read())
|
if (table->file->was_semi_consistent_read())
|
||||||
@ -575,6 +576,7 @@ int mysql_update(THD *thd,
|
|||||||
|
|
||||||
while (!(error=info.read_record(&info)) && !thd->killed)
|
while (!(error=info.read_record(&info)) && !thd->killed)
|
||||||
{
|
{
|
||||||
|
update_virtual_fields(table);
|
||||||
if (!select || select->skip_record(thd) > 0)
|
if (!select || select->skip_record(thd) > 0)
|
||||||
{
|
{
|
||||||
if (table->file->was_semi_consistent_read())
|
if (table->file->was_semi_consistent_read())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user