summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2022-10-11 12:56:01 +0200
committerSergei Golubchik <serg@mariadb.org>2022-10-16 01:24:30 +0200
commite0b4db5ba3d1fb14a1ec9e4ab0b346c6a8eebfd6 (patch)
tree3209b9a58cc4c1141103c6a9c33e76940a683156
parent78030b67b9cbc7b2c29f1d7aeaf3b9942bf94bb6 (diff)
downloadmariadb-git-e0b4db5ba3d1fb14a1ec9e4ab0b346c6a8eebfd6.tar.gz
MDEV-29750 triggers can modify history
should be the same behavior as for virtual columns: * a warning on every inserted row * silently ignored in a trigger
-rw-r--r--mysql-test/suite/versioning/r/misc.result27
-rw-r--r--mysql-test/suite/versioning/t/misc.test20
-rw-r--r--sql/item.cc2
3 files changed, 49 insertions, 0 deletions
diff --git a/mysql-test/suite/versioning/r/misc.result b/mysql-test/suite/versioning/r/misc.result
new file mode 100644
index 00000000000..398e3b8be70
--- /dev/null
+++ b/mysql-test/suite/versioning/r/misc.result
@@ -0,0 +1,27 @@
+set time_zone='+00:00';
+#
+# MDEV-29750 triggers can modify history
+#
+set sql_mode='', timestamp=unix_timestamp('2010-10-10 10:10:10');
+create table t (a int, b int as (a+1), s timestamp(6) as row start, e timestamp(6) as row end, period for system_time(s,e)) with system versioning;
+insert into t values (1,1, '2022-01-01','2023-01-01'),(2,2, '2022-02-02','2023-02-02');
+Warnings:
+Warning 1906 The value specified for generated column 'b' in table 't' has been ignored
+Warning 1906 The value specified for generated column 's' in table 't' has been ignored
+Warning 1906 The value specified for generated column 'e' in table 't' has been ignored
+Warning 1906 The value specified for generated column 'b' in table 't' has been ignored
+Warning 1906 The value specified for generated column 's' in table 't' has been ignored
+Warning 1906 The value specified for generated column 'e' in table 't' has been ignored
+create trigger tr before insert on t for each row set new.b=1, new.s = '2022-03-03', new.e = '2023-03-03';
+insert into t (a) values (3),(4);
+select * from t for system_time all;
+a b s e
+1 2 2010-10-10 10:10:10.000000 2038-01-19 03:14:07.999999
+2 3 2010-10-10 10:10:10.000000 2038-01-19 03:14:07.999999
+3 4 2010-10-10 10:10:10.000000 2038-01-19 03:14:07.999999
+4 5 2010-10-10 10:10:10.000000 2038-01-19 03:14:07.999999
+drop table t;
+set sql_mode=default, timestamp=default;
+#
+# End of 10.3 tests
+#
diff --git a/mysql-test/suite/versioning/t/misc.test b/mysql-test/suite/versioning/t/misc.test
new file mode 100644
index 00000000000..dce1e0deced
--- /dev/null
+++ b/mysql-test/suite/versioning/t/misc.test
@@ -0,0 +1,20 @@
+#
+# simple tests that don't need to be run in multiple various combinations
+#
+set time_zone='+00:00';
+
+--echo #
+--echo # MDEV-29750 triggers can modify history
+--echo #
+set sql_mode='', timestamp=unix_timestamp('2010-10-10 10:10:10');
+create table t (a int, b int as (a+1), s timestamp(6) as row start, e timestamp(6) as row end, period for system_time(s,e)) with system versioning;
+insert into t values (1,1, '2022-01-01','2023-01-01'),(2,2, '2022-02-02','2023-02-02');
+create trigger tr before insert on t for each row set new.b=1, new.s = '2022-03-03', new.e = '2023-03-03';
+insert into t (a) values (3),(4);
+select * from t for system_time all;
+drop table t;
+set sql_mode=default, timestamp=default;
+
+--echo #
+--echo # End of 10.3 tests
+--echo #
diff --git a/sql/item.cc b/sql/item.cc
index 6681d5e375d..8b127cf2626 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -9804,6 +9804,8 @@ bool Item_trigger_field::set_value(THD *thd, sp_rcontext * /*ctx*/, Item **it)
if (!item || fix_fields_if_needed(thd, NULL))
return true;
+ if (field->vers_sys_field())
+ return false;
// NOTE: field->table->copy_blobs should be false here, but let's
// remember the value at runtime to avoid subtle bugs.