mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +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:
@ -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.
|
||||
|
||||
@ -7976,6 +7989,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
|
||||
}
|
||||
if (table->s->tmp_table == NO_TMP_TABLE)
|
||||
(void) delete_statistics_for_column(thd, table, field);
|
||||
dropped_sys_vers_fields|= field->flags;
|
||||
drop_it.remove();
|
||||
dropped_fields= &table->tmp_set;
|
||||
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->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;
|
||||
}
|
||||
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 */
|
||||
def= new (thd->mem_root) Create_field(thd, field, field);
|
||||
def->invisible= INVISIBLE_SYSTEM;
|
||||
dropped_sys_vers_fields|= field->flags;
|
||||
alter_info->flags|= Alter_info::ALTER_CHANGE_COLUMN;
|
||||
if (field->flags & VERS_SYS_START_FLAG)
|
||||
create_info->vers_info.as_row.start= def->field_name= Vers_parse_info::default_start;
|
||||
else
|
||||
create_info->vers_info.as_row.end= def->field_name= Vers_parse_info::default_end;
|
||||
new_create_list.push_back(def, thd->mem_root);
|
||||
dropped_sys_vers_fields|= field->flags;
|
||||
drop_it.remove();
|
||||
}
|
||||
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) != VERS_SYSTEM_FIELD))
|
||||
dropped_sys_vers_fields &= 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;
|
||||
tmp.append(STRING_WITH_LEN("DROP COLUMN "));
|
||||
if (dropped_sys_vers_fields & VERS_SYS_START_FLAG)
|
||||
append_identifier(thd, &tmp, &table->vers_end_field()->field_name);
|
||||
else
|
||||
append_identifier(thd, &tmp, &table->vers_start_field()->field_name);
|
||||
StringBuffer<NAME_LEN*3> tmp;
|
||||
append_drop_column(thd, dropped_sys_vers_fields & VERS_SYS_START_FLAG,
|
||||
&tmp, table->vers_start_field());
|
||||
append_drop_column(thd, dropped_sys_vers_fields & VERS_SYS_END_FLAG,
|
||||
&tmp, table->vers_end_field());
|
||||
my_error(ER_MISSING, MYF(0), table->s->table_name.str, tmp.c_ptr());
|
||||
goto err;
|
||||
}
|
||||
alter_info->flags &=
|
||||
~(Alter_info::ALTER_DROP_PERIOD | Alter_info::ALTER_ADD_PERIOD);
|
||||
def_it.rewind();
|
||||
while ((def=def_it++)) // Add new columns
|
||||
{
|
||||
|
Reference in New Issue
Block a user