Bug#23771 AFTER UPDATE trigger not invoked when there are no changes of the data

The problem is that AFTER UPDATE triggers will fire only if the
new data is different from the old data on the row. The trigger
should fire regardless of whether there are changes to the data.

The solution is to fire the trigger on UPDATE even if there are
no changes to the value (because the value is the same).
parent 301ab0d8
...@@ -2016,4 +2016,42 @@ i j ...@@ -2016,4 +2016,42 @@ i j
10 10 10 10
unlock tables; unlock tables;
drop table t1; 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. End of 5.1 tests.
...@@ -2304,4 +2304,37 @@ unlock tables; ...@@ -2304,4 +2304,37 @@ unlock tables;
drop table t1; 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. --echo End of 5.1 tests.
...@@ -643,14 +643,6 @@ int mysql_update(THD *thd, ...@@ -643,14 +643,6 @@ int mysql_update(THD *thd,
updated++; updated++;
else else
error= 0; error= 0;
if (table->triggers &&
table->triggers->process_triggers(thd, TRG_EVENT_UPDATE,
TRG_ACTION_AFTER, TRUE))
{
error= 1;
break;
}
} }
else if (!ignore || else if (!ignore ||
table->file->is_fatal_error(error, HA_CHECK_DUP_KEY)) table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
...@@ -669,6 +661,14 @@ int mysql_update(THD *thd, ...@@ -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) if (!--limit && using_limit)
{ {
/* /*
...@@ -1644,13 +1644,13 @@ bool multi_update::send_data(List<Item> &not_used_values) ...@@ -1644,13 +1644,13 @@ bool multi_update::send_data(List<Item> &not_used_values)
trans_safe= 0; trans_safe= 0;
thd->transaction.stmt.modified_non_trans_table= TRUE; thd->transaction.stmt.modified_non_trans_table= TRUE;
} }
}
}
if (table->triggers && if (table->triggers &&
table->triggers->process_triggers(thd, TRG_EVENT_UPDATE, table->triggers->process_triggers(thd, TRG_EVENT_UPDATE,
TRG_ACTION_AFTER, TRUE)) TRG_ACTION_AFTER, TRUE))
DBUG_RETURN(1); DBUG_RETURN(1);
} }
}
}
else else
{ {
int error; int error;
...@@ -1881,13 +1881,13 @@ int multi_update::do_updates() ...@@ -1881,13 +1881,13 @@ int multi_update::do_updates()
updated++; updated++;
else else
local_error= 0; local_error= 0;
}
if (table->triggers && if (table->triggers &&
table->triggers->process_triggers(thd, TRG_EVENT_UPDATE, table->triggers->process_triggers(thd, TRG_EVENT_UPDATE,
TRG_ACTION_AFTER, TRUE)) TRG_ACTION_AFTER, TRUE))
goto err2; goto err2;
} }
}
if (updated != org_updated) if (updated != org_updated)
{ {
......
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