diff options
author | Aleksey Midenkov <midenok@gmail.com> | 2021-10-11 13:36:07 +0300 |
---|---|---|
committer | Aleksey Midenkov <midenok@gmail.com> | 2021-10-11 13:36:07 +0300 |
commit | d31f953789def34f20d29b31add847a3c30a8ecc (patch) | |
tree | ddec3c452cb3af1c9dd83b02a899b5bd31b981f2 | |
parent | 911c803db19de7ffd45c39ff3614abcf19c63536 (diff) | |
download | mariadb-git-d31f953789def34f20d29b31add847a3c30a8ecc.tar.gz |
MDEV-22660 SIGSEGV on adding system versioning and modifying system column
Second alter subcommand correctly removed VERS_ROW_END flag. We throw
ER_VERS_PERIOD_COLUMNS in such case.
-rw-r--r-- | mysql-test/suite/versioning/r/alter.result | 19 | ||||
-rw-r--r-- | mysql-test/suite/versioning/t/alter.test | 22 | ||||
-rw-r--r-- | sql/handler.cc | 6 |
3 files changed, 47 insertions, 0 deletions
diff --git a/mysql-test/suite/versioning/r/alter.result b/mysql-test/suite/versioning/r/alter.result index 5092adc2b11..9af25d2f858 100644 --- a/mysql-test/suite/versioning/r/alter.result +++ b/mysql-test/suite/versioning/r/alter.result @@ -759,3 +759,22 @@ delete from t1; set system_versioning_alter_history= keep; alter ignore table t1 drop pk; drop table t1; +# +# MDEV-22660 SIGSEGV on adding system versioning and modifying system column +# +create or replace table t1 (a int); +alter table t1 +add row_start timestamp(6) as row start, +add row_end timestamp(6) as row end, +add period for system_time(row_start, row_end), +with system versioning, +modify row_end varchar(8); +ERROR HY000: PERIOD FOR SYSTEM_TIME must use columns `row_start` and `row_end` +alter table t1 +add row_start timestamp(6) as row start, +add row_end timestamp(6) as row end, +add period for system_time(row_start, row_end), +with system versioning, +modify row_start varchar(8); +ERROR HY000: PERIOD FOR SYSTEM_TIME must use columns `row_start` and `row_end` +drop table t1; diff --git a/mysql-test/suite/versioning/t/alter.test b/mysql-test/suite/versioning/t/alter.test index 3ce87817e06..0900e424bd0 100644 --- a/mysql-test/suite/versioning/t/alter.test +++ b/mysql-test/suite/versioning/t/alter.test @@ -652,3 +652,25 @@ set system_versioning_alter_history= keep; alter ignore table t1 drop pk; # cleanup drop table t1; + + +--echo # +--echo # MDEV-22660 SIGSEGV on adding system versioning and modifying system column +--echo # +create or replace table t1 (a int); +--error ER_VERS_PERIOD_COLUMNS +alter table t1 + add row_start timestamp(6) as row start, + add row_end timestamp(6) as row end, + add period for system_time(row_start, row_end), + with system versioning, + modify row_end varchar(8); +--error ER_VERS_PERIOD_COLUMNS +alter table t1 + add row_start timestamp(6) as row start, + add row_end timestamp(6) as row end, + add period for system_time(row_start, row_end), + with system versioning, + modify row_start varchar(8); +# cleanup +drop table t1; diff --git a/sql/handler.cc b/sql/handler.cc index f46e51a34ce..bbd0f3bf515 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -7564,6 +7564,12 @@ bool Vers_parse_info::check_sys_fields(const Lex_table_name &table_name, row_end= f; } + if (!row_start || !row_end) + { + my_error(ER_VERS_PERIOD_COLUMNS, MYF(0), as_row.start.str, as_row.end.str); + return true; + } + if (!can_native || !row_start->is_some_bigint() || !row_end->is_some_bigint()) |