Commit 585cb18e authored by Aleksey Midenkov's avatar Aleksey Midenkov

MDEV-27452 TIMESTAMP(0) system field is allowed for certain creation of system-versioned table

First, we do not add VERS_UPDATE_UNVERSIONED_FLAG for system field and
that fixes SHOW CREATE result.

Second, we have to call check_sys_fields() for any CREATE TABLE and
there correct type is checked for system fields.

Third, we update system_time like as_row structures for ALTER TABLE
and that makes check_sys_fields() happy for ALTER TABLE when we make
system fields hidden.
parent 241ac79e
...@@ -619,8 +619,32 @@ Table Create Table ...@@ -619,8 +619,32 @@ Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`x` int(11) DEFAULT NULL WITHOUT SYSTEM VERSIONING, `x` int(11) DEFAULT NULL WITHOUT SYSTEM VERSIONING,
`y` int(11) DEFAULT NULL, `y` int(11) DEFAULT NULL,
`row_start` timestamp(6) GENERATED ALWAYS AS ROW START WITHOUT SYSTEM VERSIONING, `row_start` timestamp(6) GENERATED ALWAYS AS ROW START,
`row_end` timestamp(6) GENERATED ALWAYS AS ROW END WITHOUT SYSTEM VERSIONING, `row_end` timestamp(6) GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`) PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`)
) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING ) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
drop table t1; drop table t1;
#
# MDEV-27452 TIMESTAMP(0) system field is allowed for certain creation of system-versioned table
#
create or replace table t (
a int,
s timestamp as row start,
e timestamp as row end,
period for system_time (s, e))
with system versioning;
ERROR HY000: `s` must be of type TIMESTAMP(6) for system-versioned table `t`
create or replace table t (
a int with system versioning,
s timestamp as row start,
e timestamp as row end,
period for system_time (s, e));
ERROR HY000: `s` must be of type TIMESTAMP(6) for system-versioned table `t`
create or replace table t (
a int with system versioning,
b int with system versioning,
s timestamp(6) as row start,
e timestamp(6) as row end,
period for system_time (s, e));
insert into t () values (),();
drop table t;
...@@ -468,3 +468,32 @@ create or replace table t1 ( ...@@ -468,3 +468,32 @@ create or replace table t1 (
show create table t1; show create table t1;
drop table t1; drop table t1;
--echo #
--echo # MDEV-27452 TIMESTAMP(0) system field is allowed for certain creation of system-versioned table
--echo #
--error ER_VERS_FIELD_WRONG_TYPE
create or replace table t (
a int,
s timestamp as row start,
e timestamp as row end,
period for system_time (s, e))
with system versioning;
--error ER_VERS_FIELD_WRONG_TYPE
create or replace table t (
a int with system versioning,
s timestamp as row start,
e timestamp as row end,
period for system_time (s, e));
create or replace table t (
a int with system versioning,
b int with system versioning,
s timestamp(6) as row start,
e timestamp(6) as row end,
period for system_time (s, e));
insert into t () values (),();
# cleanup
drop table t;
...@@ -7226,6 +7226,8 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields( ...@@ -7226,6 +7226,8 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields(
List_iterator<Create_field> it(alter_info->create_list); List_iterator<Create_field> it(alter_info->create_list);
while (Create_field *f= it++) while (Create_field *f= it++)
{ {
if (f->vers_sys_field())
continue;
if ((f->versioning == Column_definition::VERSIONING_NOT_SET && !add_versioning) || if ((f->versioning == Column_definition::VERSIONING_NOT_SET && !add_versioning) ||
f->versioning == Column_definition::WITHOUT_VERSIONING) f->versioning == Column_definition::WITHOUT_VERSIONING)
{ {
...@@ -7247,9 +7249,10 @@ bool Table_scope_and_contents_source_st::vers_check_system_fields( ...@@ -7247,9 +7249,10 @@ bool Table_scope_and_contents_source_st::vers_check_system_fields(
if (!(options & HA_VERSIONED_TABLE)) if (!(options & HA_VERSIONED_TABLE))
return false; return false;
uint versioned_fields= 0;
if (!(alter_info->flags & ALTER_DROP_SYSTEM_VERSIONING)) if (!(alter_info->flags & ALTER_DROP_SYSTEM_VERSIONING))
{ {
uint versioned_fields= 0;
uint fieldnr= 0; uint fieldnr= 0;
List_iterator<Create_field> field_it(alter_info->create_list); List_iterator<Create_field> field_it(alter_info->create_list);
while (Create_field *f= field_it++) while (Create_field *f= field_it++)
...@@ -7280,7 +7283,7 @@ bool Table_scope_and_contents_source_st::vers_check_system_fields( ...@@ -7280,7 +7283,7 @@ bool Table_scope_and_contents_source_st::vers_check_system_fields(
} }
} }
if (!(alter_info->flags & ALTER_ADD_SYSTEM_VERSIONING)) if (!(alter_info->flags & ALTER_ADD_SYSTEM_VERSIONING) && !versioned_fields)
return false; return false;
bool can_native= ha_check_storage_engine_flag(db_type, bool can_native= ha_check_storage_engine_flag(db_type,
......
...@@ -8230,9 +8230,14 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, ...@@ -8230,9 +8230,14 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
def->invisible= INVISIBLE_SYSTEM; def->invisible= INVISIBLE_SYSTEM;
alter_info->flags|= ALTER_CHANGE_COLUMN; alter_info->flags|= ALTER_CHANGE_COLUMN;
if (field->flags & VERS_ROW_START) if (field->flags & VERS_ROW_START)
create_info->vers_info.as_row.start= def->field_name= Vers_parse_info::default_start; create_info->vers_info.system_time.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.system_time.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; dropped_sys_vers_fields|= field->flags;
drop_it.remove(); drop_it.remove();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment