From b95bd9f5e2040609e2269772ec4ed043d0036cf4 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Fri, 2 Jul 2010 20:24:39 -0700 Subject: [PATCH] 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. --- mysql-test/suite/vcol/r/vcol_misc.result | 32 ++++++++++++++++++++++++ mysql-test/suite/vcol/t/vcol_misc.test | 21 ++++++++++++++++ sql/sql_delete.cc | 1 + sql/sql_update.cc | 2 ++ 4 files changed, 56 insertions(+) create mode 100644 mysql-test/suite/vcol/r/vcol_misc.result create mode 100644 mysql-test/suite/vcol/t/vcol_misc.test diff --git a/mysql-test/suite/vcol/r/vcol_misc.result b/mysql-test/suite/vcol/r/vcol_misc.result new file mode 100644 index 00000000000..f312527794a --- /dev/null +++ b/mysql-test/suite/vcol/r/vcol_misc.result @@ -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; diff --git a/mysql-test/suite/vcol/t/vcol_misc.test b/mysql-test/suite/vcol/t/vcol_misc.test new file mode 100644 index 00000000000..a0e654daa57 --- /dev/null +++ b/mysql-test/suite/vcol/t/vcol_misc.test @@ -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; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index ddb6af97865..eb05077f17a 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -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) { diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 3c8f537d1d8..e260310206a 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -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())