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 /sql | |
parent | eedab70c1c14158f918a54ad70a51f57dabdc113 (diff) | |
download | mariadb-git-f96b1a4e39d1cf633f992fb8838a072ba118c91c.tar.gz |
MDEV-14798 Add, drop system versioning semantic and syntax
Diffstat (limited to 'sql')
-rw-r--r-- | sql/handler.cc | 48 | ||||
-rw-r--r-- | sql/handler.h | 4 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 1 |
3 files changed, 34 insertions, 19 deletions
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 ')' { |