diff options
author | Eugene Kosov <claprix@yandex.ru> | 2018-01-10 16:44:29 +0300 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2018-01-12 21:20:23 +0100 |
commit | f96b1a4e39d1cf633f992fb8838a072ba118c91c (patch) | |
tree | 246699b64bc5c2567fd6a6ead69a1116d397fb47 | |
parent | eedab70c1c14158f918a54ad70a51f57dabdc113 (diff) | |
download | mariadb-git-f96b1a4e39d1cf633f992fb8838a072ba118c91c.tar.gz |
MDEV-14798 Add, drop system versioning semantic and syntax
-rw-r--r-- | mysql-test/suite/versioning/r/alter.result | 31 | ||||
-rw-r--r-- | mysql-test/suite/versioning/t/alter.test | 31 | ||||
-rw-r--r-- | sql/handler.cc | 48 | ||||
-rw-r--r-- | sql/handler.h | 4 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 1 |
5 files changed, 50 insertions, 65 deletions
diff --git a/mysql-test/suite/versioning/r/alter.result b/mysql-test/suite/versioning/r/alter.result index c9a0c81956c..8ebfb96ebc1 100644 --- a/mysql-test/suite/versioning/r/alter.result +++ b/mysql-test/suite/versioning/r/alter.result @@ -125,7 +125,10 @@ with system versioning; select * from t for system_time all; a alter table t drop column row_start; +ERROR HY000: Wrong parameters for `t`: missing 'DROP COLUMN row_end' alter table t drop column row_end; +ERROR HY000: Wrong parameters for `t`: missing 'DROP COLUMN row_start' +alter table t drop column row_start, drop column row_end; select * from t for system_time all; a alter table t drop column row_start; @@ -383,30 +386,6 @@ ERROR HY000: Can not change system versioning field `row_start` insert into t values (1); alter table t modify column row_start bigint unsigned; ERROR HY000: Can not change system versioning field `row_start` -create or replace table t ( -a int, -row_start timestamp(6) as row start invisible, -row_end timestamp(6) as row end invisible, -period for system_time(row_start, row_end) -) with system versioning; -select * from t; -a -alter table t drop system versioning; -ERROR HY000: System versioning field `row_start` exists -alter table t drop column row_start; -select * from t; -a -alter table t drop system versioning; -ERROR HY000: System versioning field `row_end` exists -alter table t drop column row_end; -select * from t; -a -alter table t drop system versioning; -show create table t; -Table Create Table -t CREATE TABLE `t` ( - `a` int(11) DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 set system_versioning_alter_history= SURVIVE; ERROR 42000: Variable 'system_versioning_alter_history' can't be set to the value of 'SURVIVE' set system_versioning_alter_history= DROP; @@ -465,5 +444,9 @@ ERROR 42S21: Duplicate column name 'row_start' set statement system_versioning_alter_history=keep for alter table t1 add column row_start timestamp(6); ERROR 42S21: Duplicate column name 'row_start' +# MDEV-14798 Add, drop system versioning semantic and syntax +create or replace table t (a int) with system versioning; +alter table t add period for system_time(sys_trx_start, sys_trx_end); +ERROR HY000: Table `t` is already system-versioned drop database test; create database test; diff --git a/mysql-test/suite/versioning/t/alter.test b/mysql-test/suite/versioning/t/alter.test index 8fb21dcb1eb..1394c3bc791 100644 --- a/mysql-test/suite/versioning/t/alter.test +++ b/mysql-test/suite/versioning/t/alter.test @@ -78,8 +78,11 @@ create or replace table t ( with system versioning; select * from t for system_time all; +--error ER_MISSING alter table t drop column row_start; +--error ER_MISSING alter table t drop column row_end; +alter table t drop column row_start, drop column row_end; select * from t for system_time all; --error ER_CANT_DROP_FIELD_OR_KEY @@ -263,28 +266,6 @@ insert into t values (1); --error ER_VERS_ALTER_SYSTEM_FIELD alter table t modify column row_start bigint unsigned; -create or replace table t ( - a int, - row_start timestamp(6) as row start invisible, - row_end timestamp(6) as row end invisible, - period for system_time(row_start, row_end) -) with system versioning; -select * from t; - ---error ER_VERS_SYS_FIELD_EXISTS -alter table t drop system versioning; -alter table t drop column row_start; -select * from t; - ---error ER_VERS_SYS_FIELD_EXISTS -alter table t drop system versioning; -alter table t drop column row_end; -select * from t; - -alter table t drop system versioning; -show create table t; - - ## These experimental options are now disabled --error ER_WRONG_VALUE_FOR_VAR @@ -404,5 +385,11 @@ alter table t1 add column row_start int; set statement system_versioning_alter_history=keep for alter table t1 add column row_start timestamp(6); +--echo # MDEV-14798 Add, drop system versioning semantic and syntax +create or replace table t (a int) with system versioning; + +--error ER_VERS_ALREADY_VERSIONED +alter table t add period for system_time(sys_trx_start, sys_trx_end); + drop database test; create database test; diff --git a/sql/handler.cc b/sql/handler.cc index a7530723c79..36d4879e242 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -7133,11 +7133,17 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields( return false; } -static bool add_field_to_drop_list(THD *thd, Alter_info *alter_info, - Field *field) +static bool add_field_to_drop_list_if_not_exists(THD *thd, Alter_info *alter_info, Field *field) { DBUG_ASSERT(field); DBUG_ASSERT(field->field_name.str); + List_iterator_fast<Alter_drop> it(alter_info->drop_list); + while (Alter_drop *drop= it++) + { + if (!my_strcasecmp(system_charset_info, field->field_name.str, drop->name)) + return false; + } + alter_info->flags|= Alter_info::ALTER_DROP_COLUMN; Alter_drop *ad= new (thd->mem_root) Alter_drop(Alter_drop::COLUMN, field->field_name.str, false); @@ -7201,21 +7207,8 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info, return true; } - if (share->vers_start_field()->invisible < INVISIBLE_SYSTEM) - { - my_error(ER_VERS_SYS_FIELD_EXISTS, MYF(0), - share->vers_start_field()->field_name.str); - return true; - } - if (share->vers_end_field()->invisible < INVISIBLE_SYSTEM) - { - my_error(ER_VERS_SYS_FIELD_EXISTS, MYF(0), - share->vers_end_field()->field_name.str); - return true; - } - - if (add_field_to_drop_list(thd, alter_info, share->vers_start_field()) || - add_field_to_drop_list(thd, alter_info, share->vers_end_field())) + if (add_field_to_drop_list_if_not_exists(thd, alter_info, share->vers_start_field()) || + add_field_to_drop_list_if_not_exists(thd, alter_info, share->vers_end_field())) return true; if (share->primary_key != MAX_KEY && !is_adding_primary_key(alter_info) && @@ -7275,6 +7268,15 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info, return true; } + if (add_period) + { + if (share->versioned) + { + my_error(ER_VERS_ALREADY_VERSIONED, MYF(0), table_name); + return true; + } + } + if (share->versioned) { // copy info from existing table @@ -7346,6 +7348,16 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info, if (done_start && done_end) break; } + + if ((done_start || done_end) && done_start != done_end) + { + String tmp; + tmp.append("DROP COLUMN "); + tmp.append(done_start ? table->vers_end_field()->field_name + : table->vers_start_field()->field_name); + my_error(ER_MISSING, MYF(0), table_name, tmp.c_ptr()); + return true; + } } return false; @@ -7426,7 +7438,7 @@ Vers_parse_info::fix_create_like(Alter_info &alter_info, HA_CREATE_INFO &create_ bool Vers_parse_info::need_check(const Alter_info *alter_info) const { - return versioned_fields || unversioned_fields || + return versioned_fields || unversioned_fields || add_period || alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING || alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING || *this; } diff --git a/sql/handler.h b/sql/handler.h index 1a4e83c093d..78e41693ef1 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1725,7 +1725,8 @@ struct Vers_parse_info { Vers_parse_info() : versioned_fields(false), - unversioned_fields(false) + unversioned_fields(false), + add_period(false) {} struct start_end_t @@ -1789,6 +1790,7 @@ public: */ bool versioned_fields : 1; bool unversioned_fields : 1; + bool add_period : 1; // ADD PERIOD FOR SYSTEM_TIME was specified }; /** diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 5dd5493203e..6eb53f70aaf 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -8080,6 +8080,7 @@ alter_list_item: } | ADD period_for_system_time { + Lex->vers_get_info().add_period= true; } | add_column '(' create_field_list ')' { |