diff options
-rw-r--r-- | mysql-test/r/trigger.result | 38 | ||||
-rw-r--r-- | mysql-test/t/trigger.test | 33 | ||||
-rw-r--r-- | sql/sql_update.cc | 34 |
3 files changed, 88 insertions, 17 deletions
diff --git a/mysql-test/r/trigger.result b/mysql-test/r/trigger.result index 8b384dfdc4e..e7f5c41513b 100644 --- a/mysql-test/r/trigger.result +++ b/mysql-test/r/trigger.result @@ -2016,4 +2016,42 @@ i j 10 10 unlock tables; drop table t1; +drop table if exists t1, t2; +drop trigger if exists trg1; +drop trigger if exists trg2; +create table t1 (a int); +create table t2 (b int); +create trigger trg1 after update on t1 for each row set @a= @a+1; +create trigger trg2 after update on t2 for each row set @b= @b+1; +insert into t1 values (1), (2), (3); +insert into t2 values (1), (2), (3); +set @a= 0; +set @b= 0; +update t1, t2 set t1.a= t1.a, t2.b= t2.b; +select @a, @b; +@a @b +3 3 +update t1, t2 set t1.a= t2.b, t2.b= t1.a; +select @a, @b; +@a @b +6 6 +update t1 set a= a; +select @a, @b; +@a @b +9 6 +update t2 set b= b; +select @a, @b; +@a @b +9 9 +update t1 set a= 1; +select @a, @b; +@a @b +12 9 +update t2 set b= 1; +select @a, @b; +@a @b +12 12 +drop trigger trg1; +drop trigger trg2; +drop table t1, t2; End of 5.1 tests. diff --git a/mysql-test/t/trigger.test b/mysql-test/t/trigger.test index 1aeac91e5ad..921c9579bfb 100644 --- a/mysql-test/t/trigger.test +++ b/mysql-test/t/trigger.test @@ -2304,4 +2304,37 @@ unlock tables; drop table t1; +# +# Bug#23771 AFTER UPDATE trigger not invoked when there are no changes of the data +# + +--disable_warnings +drop table if exists t1, t2; +drop trigger if exists trg1; +drop trigger if exists trg2; +--enable_warnings +create table t1 (a int); +create table t2 (b int); +create trigger trg1 after update on t1 for each row set @a= @a+1; +create trigger trg2 after update on t2 for each row set @b= @b+1; +insert into t1 values (1), (2), (3); +insert into t2 values (1), (2), (3); +set @a= 0; +set @b= 0; +update t1, t2 set t1.a= t1.a, t2.b= t2.b; +select @a, @b; +update t1, t2 set t1.a= t2.b, t2.b= t1.a; +select @a, @b; +update t1 set a= a; +select @a, @b; +update t2 set b= b; +select @a, @b; +update t1 set a= 1; +select @a, @b; +update t2 set b= 1; +select @a, @b; +drop trigger trg1; +drop trigger trg2; +drop table t1, t2; + --echo End of 5.1 tests. diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 4d075e3308d..d895d2ee0f2 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -643,14 +643,6 @@ int mysql_update(THD *thd, updated++; else error= 0; - - if (table->triggers && - table->triggers->process_triggers(thd, TRG_EVENT_UPDATE, - TRG_ACTION_AFTER, TRUE)) - { - error= 1; - break; - } } else if (!ignore || table->file->is_fatal_error(error, HA_CHECK_DUP_KEY)) @@ -669,6 +661,14 @@ int mysql_update(THD *thd, } } + if (table->triggers && + table->triggers->process_triggers(thd, TRG_EVENT_UPDATE, + TRG_ACTION_AFTER, TRUE)) + { + error= 1; + break; + } + if (!--limit && using_limit) { /* @@ -1644,12 +1644,12 @@ bool multi_update::send_data(List<Item> ¬_used_values) trans_safe= 0; thd->transaction.stmt.modified_non_trans_table= TRUE; } - if (table->triggers && - table->triggers->process_triggers(thd, TRG_EVENT_UPDATE, - TRG_ACTION_AFTER, TRUE)) - DBUG_RETURN(1); } } + if (table->triggers && + table->triggers->process_triggers(thd, TRG_EVENT_UPDATE, + TRG_ACTION_AFTER, TRUE)) + DBUG_RETURN(1); } else { @@ -1881,12 +1881,12 @@ int multi_update::do_updates() updated++; else local_error= 0; - - if (table->triggers && - table->triggers->process_triggers(thd, TRG_EVENT_UPDATE, - TRG_ACTION_AFTER, TRUE)) - goto err2; } + + if (table->triggers && + table->triggers->process_triggers(thd, TRG_EVENT_UPDATE, + TRG_ACTION_AFTER, TRUE)) + goto err2; } if (updated != org_updated) |