summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorEugene Kosov <claprix@yandex.ru>2018-01-10 16:44:29 +0300
committerSergei Golubchik <serg@mariadb.org>2018-01-12 21:20:23 +0100
commitf96b1a4e39d1cf633f992fb8838a072ba118c91c (patch)
tree246699b64bc5c2567fd6a6ead69a1116d397fb47 /sql
parenteedab70c1c14158f918a54ad70a51f57dabdc113 (diff)
downloadmariadb-git-f96b1a4e39d1cf633f992fb8838a072ba118c91c.tar.gz
MDEV-14798 Add, drop system versioning semantic and syntax
Diffstat (limited to 'sql')
-rw-r--r--sql/handler.cc48
-rw-r--r--sql/handler.h4
-rw-r--r--sql/sql_yacc.yy1
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 ')'
{