diff --git a/mysql-test/suite/versioning/r/create.result b/mysql-test/suite/versioning/r/create.result index fe0e6c807c3..8943ea1f1cd 100644 --- a/mysql-test/suite/versioning/r/create.result +++ b/mysql-test/suite/versioning/r/create.result @@ -599,3 +599,28 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`id`) ) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING drop table t1; +# +# MDEV-26928 Column-inclusive WITH SYSTEM VERSIONING doesn't work with explicit system fields +# +create or replace table t1 (x int, y int with system versioning); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `x` int(11) DEFAULT NULL WITHOUT SYSTEM VERSIONING, + `y` int(11) DEFAULT NULL +) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING +create or replace table t1 ( +x int, y int with system versioning, +row_start timestamp(6) as row start, +row_end timestamp(6) as row end, +period for system_time(row_start, row_end)); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `x` int(11) DEFAULT NULL WITHOUT SYSTEM VERSIONING, + `y` int(11) DEFAULT NULL, + `row_start` timestamp(6) GENERATED ALWAYS AS ROW START WITHOUT SYSTEM VERSIONING, + `row_end` timestamp(6) GENERATED ALWAYS AS ROW END WITHOUT SYSTEM VERSIONING, + PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`) +) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING +drop table t1; diff --git a/mysql-test/suite/versioning/t/create.test b/mysql-test/suite/versioning/t/create.test index 1d9f3a1b341..b1f0055f5cc 100644 --- a/mysql-test/suite/versioning/t/create.test +++ b/mysql-test/suite/versioning/t/create.test @@ -451,3 +451,20 @@ show index from t1; --replace_result $default_engine DEFAULT_ENGINE show create table t1; drop table t1; + +--echo # +--echo # MDEV-26928 Column-inclusive WITH SYSTEM VERSIONING doesn't work with explicit system fields +--echo # +create or replace table t1 (x int, y int with system versioning); +--replace_result $default_engine DEFAULT_ENGINE +show create table t1; + +create or replace table t1 ( + x int, y int with system versioning, + row_start timestamp(6) as row start, + row_end timestamp(6) as row end, + period for system_time(row_start, row_end)); +--replace_result $default_engine DEFAULT_ENGINE +show create table t1; + +drop table t1; diff --git a/sql/handler.cc b/sql/handler.cc index bbd0f3bf515..47f78283897 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -7207,15 +7207,16 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields( if (!vers_info.need_check(alter_info)) return false; - if (!vers_info.versioned_fields && vers_info.unversioned_fields && - !(alter_info->flags & ALTER_ADD_SYSTEM_VERSIONING)) + const bool add_versioning= alter_info->flags & ALTER_ADD_SYSTEM_VERSIONING; + + if (!vers_info.versioned_fields && vers_info.unversioned_fields && !add_versioning) { // All is correct but this table is not versioned. options&= ~HA_VERSIONED_TABLE; return false; } - if (!(alter_info->flags & ALTER_ADD_SYSTEM_VERSIONING) && vers_info) + if (!add_versioning && vers_info && !vers_info.versioned_fields) { my_error(ER_MISSING, MYF(0), create_table.table_name.str, "WITH SYSTEM VERSIONING"); @@ -7225,8 +7226,7 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields( List_iterator it(alter_info->create_list); while (Create_field *f= it++) { - if ((f->versioning == Column_definition::VERSIONING_NOT_SET && - !(alter_info->flags & ALTER_ADD_SYSTEM_VERSIONING)) || + if ((f->versioning == Column_definition::VERSIONING_NOT_SET && !add_versioning) || f->versioning == Column_definition::WITHOUT_VERSIONING) { f->flags|= VERS_UPDATE_UNVERSIONED_FLAG;