summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <davi@mysql.com/endora.local>2008-02-12 09:44:27 -0200
committerunknown <davi@mysql.com/endora.local>2008-02-12 09:44:27 -0200
commit8d51c6ad68e373551fd848204e1301481c051399 (patch)
tree52da33128696eb509708f62c43543ed1ed3d987b
parenta0d88ebb0b5f77b30c65152f87aa73363ce93d71 (diff)
downloadmariadb-git-8d51c6ad68e373551fd848204e1301481c051399.tar.gz
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). mysql-test/r/trigger.result: Add test case result for Bug#23771 mysql-test/t/trigger.test: Add test case for Bug#23771 sql/sql_update.cc: Move the invocation of the after update trigger so that the trigger will fire even if the records are the same.
-rw-r--r--mysql-test/r/trigger.result38
-rw-r--r--mysql-test/t/trigger.test33
-rw-r--r--sql/sql_update.cc34
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> &not_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)