mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-14798 Add, drop system versioning semantic and syntax
SQL: DROP PERIOD FOR SYSTEM_TIME syntax and remove ER_VERS_SYS_FIELD_EXISTS originally by: Eugene Kosov
This commit is contained in:
@@ -65,7 +65,7 @@ t CREATE TABLE `t` (
|
|||||||
PERIOD FOR SYSTEM_TIME (`trx_start`, `trx_end`)
|
PERIOD FOR SYSTEM_TIME (`trx_start`, `trx_end`)
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
||||||
alter table t drop system versioning;
|
alter table t drop system versioning;
|
||||||
ERROR HY000: System versioning field `trx_start` exists
|
ERROR HY000: Wrong parameters for `t`: missing 'DROP COLUMN `trx_start`'
|
||||||
alter table t drop column trx_start, drop column trx_end;
|
alter table t drop column trx_start, drop column trx_end;
|
||||||
select row_start from t;
|
select row_start from t;
|
||||||
row_start
|
row_start
|
||||||
@@ -477,7 +477,44 @@ set statement system_versioning_alter_history=keep for
|
|||||||
alter table t1 add column row_start timestamp(6);
|
alter table t1 add column row_start timestamp(6);
|
||||||
ERROR 42S21: Duplicate column name 'row_start'
|
ERROR 42S21: Duplicate column name 'row_start'
|
||||||
# MDEV-14798 Add, drop system versioning semantic and syntax
|
# MDEV-14798 Add, drop system versioning semantic and syntax
|
||||||
create or replace table t (a int) with system versioning;
|
create or replace table t (
|
||||||
|
a int,
|
||||||
|
row_start timestamp(6) generated always as row start,
|
||||||
|
row_end timestamp(6) generated always as row end,
|
||||||
|
period for system_time(row_start, row_end)
|
||||||
|
) with system versioning;
|
||||||
|
show create table t;
|
||||||
|
Table Create Table
|
||||||
|
t CREATE TABLE `t` (
|
||||||
|
`a` int(11) DEFAULT NULL,
|
||||||
|
`row_start` timestamp(6) GENERATED ALWAYS AS ROW START,
|
||||||
|
`row_end` timestamp(6) GENERATED ALWAYS AS ROW END,
|
||||||
|
PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
||||||
|
alter table t
|
||||||
|
drop column row_start,
|
||||||
|
drop column row_end,
|
||||||
|
drop period for system_time,
|
||||||
|
drop system versioning;
|
||||||
|
show create table t;
|
||||||
|
Table Create Table
|
||||||
|
t CREATE TABLE `t` (
|
||||||
|
`a` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
alter table t drop period for system_time;
|
||||||
|
ERROR HY000: Table `t` is not system-versioned
|
||||||
|
create or replace table t (
|
||||||
|
a int,
|
||||||
|
row_start timestamp(6) generated always as row start,
|
||||||
|
row_end timestamp(6) generated always as row end,
|
||||||
|
period for system_time(row_start, row_end)
|
||||||
|
) with system versioning;
|
||||||
|
alter table t drop period for system_time;
|
||||||
|
ERROR HY000: Wrong parameters for `t`: missing 'DROP COLUMN `row_start`, DROP COLUMN `row_end`'
|
||||||
|
alter table t drop column sys_trx_start, drop period for system_time;
|
||||||
|
ERROR HY000: Wrong parameters for `t`: missing 'DROP COLUMN `row_start`, DROP COLUMN `row_end`'
|
||||||
|
alter table t drop column sys_trx_end, drop period for system_time;
|
||||||
|
ERROR HY000: Wrong parameters for `t`: missing 'DROP COLUMN `row_start`, DROP COLUMN `row_end`'
|
||||||
alter table t add period for system_time(sys_trx_start, sys_trx_end);
|
alter table t add period for system_time(sys_trx_start, sys_trx_end);
|
||||||
ERROR HY000: Table `t` is already system-versioned
|
ERROR HY000: Table `t` is already system-versioned
|
||||||
drop database test;
|
drop database test;
|
||||||
|
@@ -53,7 +53,7 @@ alter table t
|
|||||||
add system versioning;
|
add system versioning;
|
||||||
show create table t;
|
show create table t;
|
||||||
|
|
||||||
--error ER_VERS_SYS_FIELD_EXISTS
|
--error ER_MISSING
|
||||||
alter table t drop system versioning;
|
alter table t drop system versioning;
|
||||||
|
|
||||||
alter table t drop column trx_start, drop column trx_end;
|
alter table t drop column trx_start, drop column trx_end;
|
||||||
@@ -405,7 +405,36 @@ set statement system_versioning_alter_history=keep for
|
|||||||
alter table t1 add column row_start timestamp(6);
|
alter table t1 add column row_start timestamp(6);
|
||||||
|
|
||||||
--echo # MDEV-14798 Add, drop system versioning semantic and syntax
|
--echo # MDEV-14798 Add, drop system versioning semantic and syntax
|
||||||
create or replace table t (a int) with system versioning;
|
create or replace table t (
|
||||||
|
a int,
|
||||||
|
row_start timestamp(6) generated always as row start,
|
||||||
|
row_end timestamp(6) generated always as row end,
|
||||||
|
period for system_time(row_start, row_end)
|
||||||
|
) with system versioning;
|
||||||
|
show create table t;
|
||||||
|
|
||||||
|
alter table t
|
||||||
|
drop column row_start,
|
||||||
|
drop column row_end,
|
||||||
|
drop period for system_time,
|
||||||
|
drop system versioning;
|
||||||
|
show create table t;
|
||||||
|
|
||||||
|
--error ER_VERS_NOT_VERSIONED
|
||||||
|
alter table t drop period for system_time;
|
||||||
|
|
||||||
|
create or replace table t (
|
||||||
|
a int,
|
||||||
|
row_start timestamp(6) generated always as row start,
|
||||||
|
row_end timestamp(6) generated always as row end,
|
||||||
|
period for system_time(row_start, row_end)
|
||||||
|
) with system versioning;
|
||||||
|
--error ER_MISSING
|
||||||
|
alter table t drop period for system_time;
|
||||||
|
--error ER_MISSING
|
||||||
|
alter table t drop column sys_trx_start, drop period for system_time;
|
||||||
|
--error ER_MISSING
|
||||||
|
alter table t drop column sys_trx_end, drop period for system_time;
|
||||||
|
|
||||||
--error ER_VERS_ALREADY_VERSIONED
|
--error ER_VERS_ALREADY_VERSIONED
|
||||||
alter table t add period for system_time(sys_trx_start, sys_trx_end);
|
alter table t add period for system_time(sys_trx_start, sys_trx_end);
|
||||||
|
@@ -7183,23 +7183,21 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((versioned_fields || unversioned_fields) && !share->versioned)
|
if ((alter_info->flags & Alter_info::ALTER_DROP_PERIOD ||
|
||||||
|
versioned_fields || unversioned_fields) && !share->versioned)
|
||||||
{
|
{
|
||||||
my_error(ER_VERS_NOT_VERSIONED, MYF(0), table_name);
|
my_error(ER_VERS_NOT_VERSIONED, MYF(0), table_name);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (add_period)
|
|
||||||
{
|
|
||||||
if (share->versioned)
|
if (share->versioned)
|
||||||
|
{
|
||||||
|
if (alter_info->flags & Alter_info::ALTER_ADD_PERIOD)
|
||||||
{
|
{
|
||||||
my_error(ER_VERS_ALREADY_VERSIONED, MYF(0), table_name);
|
my_error(ER_VERS_ALREADY_VERSIONED, MYF(0), table_name);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (share->versioned)
|
|
||||||
{
|
|
||||||
// copy info from existing table
|
// copy info from existing table
|
||||||
create_info->options|= HA_VERSIONED_TABLE;
|
create_info->options|= HA_VERSIONED_TABLE;
|
||||||
|
|
||||||
@@ -7305,7 +7303,9 @@ 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
|
bool Vers_parse_info::need_check(const Alter_info *alter_info) const
|
||||||
{
|
{
|
||||||
return versioned_fields || unversioned_fields || add_period ||
|
return versioned_fields || unversioned_fields ||
|
||||||
|
alter_info->flags & Alter_info::ALTER_ADD_PERIOD ||
|
||||||
|
alter_info->flags & Alter_info::ALTER_DROP_PERIOD ||
|
||||||
alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING ||
|
alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING ||
|
||||||
alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING || *this;
|
alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING || *this;
|
||||||
}
|
}
|
||||||
|
@@ -1726,8 +1726,7 @@ struct Vers_parse_info
|
|||||||
{
|
{
|
||||||
Vers_parse_info() :
|
Vers_parse_info() :
|
||||||
versioned_fields(false),
|
versioned_fields(false),
|
||||||
unversioned_fields(false),
|
unversioned_fields(false)
|
||||||
add_period(false)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
struct start_end_t
|
struct start_end_t
|
||||||
@@ -1791,7 +1790,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool versioned_fields : 1;
|
bool versioned_fields : 1;
|
||||||
bool unversioned_fields : 1;
|
bool unversioned_fields : 1;
|
||||||
bool add_period : 1; // ADD PERIOD FOR SYSTEM_TIME was specified
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -7882,8 +7882,8 @@ ER_VERS_NO_TRX_ID
|
|||||||
ER_VERS_ALTER_SYSTEM_FIELD
|
ER_VERS_ALTER_SYSTEM_FIELD
|
||||||
eng "Can not change system versioning field %`s"
|
eng "Can not change system versioning field %`s"
|
||||||
|
|
||||||
ER_VERS_SYS_FIELD_EXISTS
|
ER_UNUSED_24
|
||||||
eng "System versioning field %`s exists"
|
eng "You should never see it"
|
||||||
|
|
||||||
ER_NOT_LOG_TABLE
|
ER_NOT_LOG_TABLE
|
||||||
eng "Table %`s.%`s is not a log table"
|
eng "Table %`s.%`s is not a log table"
|
||||||
|
@@ -98,6 +98,8 @@ public:
|
|||||||
static const ulonglong ALTER_COLUMN_UNVERSIONED = 1ULL << 30;
|
static const ulonglong ALTER_COLUMN_UNVERSIONED = 1ULL << 30;
|
||||||
static const ulonglong ALTER_ADD_SYSTEM_VERSIONING = 1ULL << 31;
|
static const ulonglong ALTER_ADD_SYSTEM_VERSIONING = 1ULL << 31;
|
||||||
static const ulonglong ALTER_DROP_SYSTEM_VERSIONING= 1ULL << 32;
|
static const ulonglong ALTER_DROP_SYSTEM_VERSIONING= 1ULL << 32;
|
||||||
|
static const ulonglong ALTER_ADD_PERIOD = 1ULL << 33;
|
||||||
|
static const ulonglong ALTER_DROP_PERIOD = 1ULL << 34;
|
||||||
|
|
||||||
enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE };
|
enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE };
|
||||||
|
|
||||||
|
@@ -7806,6 +7806,19 @@ blob_length_by_type(enum_field_types type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void append_drop_column(THD *thd, bool dont, String *str,
|
||||||
|
Field *field)
|
||||||
|
{
|
||||||
|
if (!dont)
|
||||||
|
{
|
||||||
|
if (str->length())
|
||||||
|
str->append(STRING_WITH_LEN(", "));
|
||||||
|
str->append(STRING_WITH_LEN("DROP COLUMN "));
|
||||||
|
append_identifier(thd, str, &field->field_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Prepare column and key definitions for CREATE TABLE in ALTER TABLE.
|
Prepare column and key definitions for CREATE TABLE in ALTER TABLE.
|
||||||
|
|
||||||
@@ -7976,6 +7989,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
|
|||||||
}
|
}
|
||||||
if (table->s->tmp_table == NO_TMP_TABLE)
|
if (table->s->tmp_table == NO_TMP_TABLE)
|
||||||
(void) delete_statistics_for_column(thd, table, field);
|
(void) delete_statistics_for_column(thd, table, field);
|
||||||
|
dropped_sys_vers_fields|= field->flags;
|
||||||
drop_it.remove();
|
drop_it.remove();
|
||||||
dropped_fields= &table->tmp_set;
|
dropped_fields= &table->tmp_set;
|
||||||
bitmap_set_bit(dropped_fields, field->field_index);
|
bitmap_set_bit(dropped_fields, field->field_index);
|
||||||
@@ -8048,7 +8062,9 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
|
|||||||
field->flags & VERS_SYSTEM_FIELD &&
|
field->flags & VERS_SYSTEM_FIELD &&
|
||||||
field->invisible < INVISIBLE_SYSTEM)
|
field->invisible < INVISIBLE_SYSTEM)
|
||||||
{
|
{
|
||||||
my_error(ER_VERS_SYS_FIELD_EXISTS, MYF(0), field->field_name.str);
|
StringBuffer<NAME_LEN*3> tmp;
|
||||||
|
append_drop_column(thd, false, &tmp, field);
|
||||||
|
my_error(ER_MISSING, MYF(0), table->s->table_name.str, tmp.c_ptr());
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
else if (drop && field->invisible < INVISIBLE_SYSTEM &&
|
else if (drop && field->invisible < INVISIBLE_SYSTEM &&
|
||||||
@@ -8058,13 +8074,13 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
|
|||||||
/* "dropping" a versioning field only hides it from the user */
|
/* "dropping" a versioning field only hides it from the user */
|
||||||
def= new (thd->mem_root) Create_field(thd, field, field);
|
def= new (thd->mem_root) Create_field(thd, field, field);
|
||||||
def->invisible= INVISIBLE_SYSTEM;
|
def->invisible= INVISIBLE_SYSTEM;
|
||||||
dropped_sys_vers_fields|= field->flags;
|
|
||||||
alter_info->flags|= Alter_info::ALTER_CHANGE_COLUMN;
|
alter_info->flags|= Alter_info::ALTER_CHANGE_COLUMN;
|
||||||
if (field->flags & VERS_SYS_START_FLAG)
|
if (field->flags & VERS_SYS_START_FLAG)
|
||||||
create_info->vers_info.as_row.start= def->field_name= Vers_parse_info::default_start;
|
create_info->vers_info.as_row.start= def->field_name= Vers_parse_info::default_start;
|
||||||
else
|
else
|
||||||
create_info->vers_info.as_row.end= def->field_name= Vers_parse_info::default_end;
|
create_info->vers_info.as_row.end= def->field_name= Vers_parse_info::default_end;
|
||||||
new_create_list.push_back(def, thd->mem_root);
|
new_create_list.push_back(def, thd->mem_root);
|
||||||
|
dropped_sys_vers_fields|= field->flags;
|
||||||
drop_it.remove();
|
drop_it.remove();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -8093,18 +8109,21 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dropped_sys_vers_fields &&
|
dropped_sys_vers_fields &= VERS_SYSTEM_FIELD;
|
||||||
((dropped_sys_vers_fields & VERS_SYSTEM_FIELD) != VERS_SYSTEM_FIELD))
|
if ((dropped_sys_vers_fields ||
|
||||||
|
alter_info->flags & Alter_info::ALTER_DROP_PERIOD) &&
|
||||||
|
dropped_sys_vers_fields != VERS_SYSTEM_FIELD)
|
||||||
{
|
{
|
||||||
StringBuffer<NAME_LEN*2> tmp;
|
StringBuffer<NAME_LEN*3> tmp;
|
||||||
tmp.append(STRING_WITH_LEN("DROP COLUMN "));
|
append_drop_column(thd, dropped_sys_vers_fields & VERS_SYS_START_FLAG,
|
||||||
if (dropped_sys_vers_fields & VERS_SYS_START_FLAG)
|
&tmp, table->vers_start_field());
|
||||||
append_identifier(thd, &tmp, &table->vers_end_field()->field_name);
|
append_drop_column(thd, dropped_sys_vers_fields & VERS_SYS_END_FLAG,
|
||||||
else
|
&tmp, table->vers_end_field());
|
||||||
append_identifier(thd, &tmp, &table->vers_start_field()->field_name);
|
|
||||||
my_error(ER_MISSING, MYF(0), table->s->table_name.str, tmp.c_ptr());
|
my_error(ER_MISSING, MYF(0), table->s->table_name.str, tmp.c_ptr());
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
alter_info->flags &=
|
||||||
|
~(Alter_info::ALTER_DROP_PERIOD | Alter_info::ALTER_ADD_PERIOD);
|
||||||
def_it.rewind();
|
def_it.rewind();
|
||||||
while ((def=def_it++)) // Add new columns
|
while ((def=def_it++)) // Add new columns
|
||||||
{
|
{
|
||||||
|
@@ -904,10 +904,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
|
|||||||
%parse-param { THD *thd }
|
%parse-param { THD *thd }
|
||||||
%lex-param { THD *thd }
|
%lex-param { THD *thd }
|
||||||
/*
|
/*
|
||||||
Currently there are 123 shift/reduce conflicts.
|
Currently there are 125 shift/reduce conflicts.
|
||||||
We should not introduce new conflicts any more.
|
We should not introduce new conflicts any more.
|
||||||
*/
|
*/
|
||||||
%expect 123
|
%expect 125
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Comments for TOKENS.
|
Comments for TOKENS.
|
||||||
@@ -8121,7 +8121,7 @@ alter_list_item:
|
|||||||
}
|
}
|
||||||
| ADD period_for_system_time
|
| ADD period_for_system_time
|
||||||
{
|
{
|
||||||
Lex->vers_get_info().add_period= true;
|
Lex->alter_info.flags|= Alter_info::ALTER_ADD_PERIOD;
|
||||||
}
|
}
|
||||||
| add_column '(' create_field_list ')'
|
| add_column '(' create_field_list ')'
|
||||||
{
|
{
|
||||||
@@ -8287,6 +8287,10 @@ alter_list_item:
|
|||||||
{
|
{
|
||||||
Lex->alter_info.flags|= Alter_info::ALTER_DROP_SYSTEM_VERSIONING;
|
Lex->alter_info.flags|= Alter_info::ALTER_DROP_SYSTEM_VERSIONING;
|
||||||
}
|
}
|
||||||
|
| DROP PERIOD_SYM FOR_SYSTEM_TIME_SYM
|
||||||
|
{
|
||||||
|
Lex->alter_info.flags|= Alter_info::ALTER_DROP_PERIOD;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
opt_index_lock_algorithm:
|
opt_index_lock_algorithm:
|
||||||
|
Reference in New Issue
Block a user