From f8b625699282df07b4166809c0195760c7abb357 Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Sat, 15 Jul 2017 13:59:15 +0300 Subject: [PATCH] SQL: disallow ALTER CHANGE of system fields [fixes #213] --- mysql-test/suite/versioning/r/alter.result | 16 ++++++++++++++++ mysql-test/suite/versioning/t/alter.test | 18 ++++++++++++++++++ sql/handler.cc | 6 ++++++ sql/share/errmsg-utf8.txt | 3 +++ 4 files changed, 43 insertions(+) diff --git a/mysql-test/suite/versioning/r/alter.result b/mysql-test/suite/versioning/r/alter.result index 5dff4e706cb..a4e51b1a3e2 100644 --- a/mysql-test/suite/versioning/r/alter.result +++ b/mysql-test/suite/versioning/r/alter.result @@ -495,6 +495,22 @@ alter table t without system versioning, algorithm=inplace; select * from t; a b 2 NULL +create or replace table t ( +a int, +sys_trx_start bigint(20) unsigned generated always as row start, +sys_trx_end bigint(20) unsigned generated always as row end, +period for system_time(sys_trx_start, sys_trx_end) +) with system versioning engine innodb; +alter table t change column sys_trx_start asdf bigint unsigned; +ERROR HY000: Can not change system versioning field 'sys_trx_start' +create or replace table t ( +a int, +sys_trx_start timestamp(6) generated always as row start, +sys_trx_end timestamp(6) generated always as row end, +period for system_time(sys_trx_start, sys_trx_end) +) with system versioning engine myisam; +alter table t change column sys_trx_start asdf timestamp(6); +ERROR HY000: Can not change system versioning field 'sys_trx_start' call verify_vtq; No A B C D 1 1 1 1 1 diff --git a/mysql-test/suite/versioning/t/alter.test b/mysql-test/suite/versioning/t/alter.test index 40d65f258a3..edbb107b566 100644 --- a/mysql-test/suite/versioning/t/alter.test +++ b/mysql-test/suite/versioning/t/alter.test @@ -220,6 +220,24 @@ select * from t for system_time all; alter table t without system versioning, algorithm=inplace; select * from t; +create or replace table t ( + a int, + sys_trx_start bigint(20) unsigned generated always as row start, + sys_trx_end bigint(20) unsigned generated always as row end, + period for system_time(sys_trx_start, sys_trx_end) +) with system versioning engine innodb; +--error ER_VERS_ALTER_SYSTEM_FIELD +alter table t change column sys_trx_start asdf bigint unsigned; + +create or replace table t ( + a int, + sys_trx_start timestamp(6) generated always as row start, + sys_trx_end timestamp(6) generated always as row end, + period for system_time(sys_trx_start, sys_trx_end) +) with system versioning engine myisam; +--error ER_VERS_ALTER_SYSTEM_FIELD +alter table t change column sys_trx_start asdf timestamp(6); + call verify_vtq; drop table t; diff --git a/sql/handler.cc b/sql/handler.cc index ae685482219..9f4ab646aaa 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -6869,6 +6869,12 @@ bool Vers_parse_info::check_and_fix_alter(THD *thd, Alter_info *alter_info, { if (f->versioning == Column_definition::WITHOUT_VERSIONING) f->flags|= VERS_OPTIMIZED_UPDATE_FLAG; + + if (f->change && (!strcmp(f->change, start) || !strcmp(f->change, end))) + { + my_error(ER_VERS_ALTER_SYSTEM_FIELD, MYF(0), f->change); + return true; + } } } diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index bbe4e6cff0e..1a386c4f16c 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -7591,3 +7591,6 @@ ER_VERS_HISTORY_LOCK ER_WRONG_TABLESPACE_NAME 42000 eng "Incorrect tablespace name `%-.192s`" + +ER_VERS_ALTER_SYSTEM_FIELD + eng "Can not change system versioning field '%s'"