From 03b54a6b8aa785340c4dd09f290fa609076e1169 Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Wed, 6 Dec 2017 14:45:54 +0300 Subject: [PATCH] SQL: table with duplicate ROW START/END columns [fixes #369] --- mysql-test/suite/versioning/r/create.result | 19 ++++++++++++------- mysql-test/suite/versioning/t/create.test | 16 +++++++++++----- sql/share/errmsg-utf8.txt | 2 ++ sql/sql_yacc.yy | 10 ++++++++++ 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/mysql-test/suite/versioning/r/create.result b/mysql-test/suite/versioning/r/create.result index 4874aeaaf70..f2c173d2828 100644 --- a/mysql-test/suite/versioning/r/create.result +++ b/mysql-test/suite/versioning/r/create.result @@ -37,11 +37,10 @@ t1 CREATE TABLE `t1` ( create or replace table t1 ( x3 int unsigned, Sys_start SYS_TRX_TYPE generated always as row start, -Sys_start2 SYS_TRX_TYPE generated always as row start, Sys_end SYS_TRX_TYPE generated always as row end, -period for system_time (Sys_start, Sys_end) +period for system_time (x, Sys_end) ) with system versioning; -ERROR HY000: PERIOD FOR SYSTEM_TIME must use columns `Sys_start2` and `Sys_end` +ERROR HY000: PERIOD FOR SYSTEM_TIME must use columns `Sys_start` and `Sys_end` create or replace table t1 ( x4 int unsigned, Sys_start SYS_TRX_TYPE generated always as row start, @@ -53,10 +52,9 @@ create or replace table t1 ( x5 int unsigned, Sys_start SYS_TRX_TYPE generated always as row start, Sys_end SYS_TRX_TYPE generated always as row end, -Sys_end2 SYS_TRX_TYPE generated always as row end, -period for system_time (Sys_start, Sys_end) +period for system_time (Sys_start, x) ) with system versioning; -ERROR HY000: PERIOD FOR SYSTEM_TIME must use columns `Sys_start` and `Sys_end2` +ERROR HY000: PERIOD FOR SYSTEM_TIME must use columns `Sys_start` and `Sys_end` create or replace table t1 ( x6 int unsigned, period for system_time (Sys_start, Sys_end) @@ -66,7 +64,6 @@ create or replace table t1 ( x7 int unsigned, Sys_start SYS_TRX_TYPE generated always as row start, Sys_end SYS_TRX_TYPE generated always as row end, -Sys_end2 SYS_TRX_TYPE generated always as row end, period for system_time (Sys_start, Sys_end) ); ERROR HY000: Wrong parameters for `t1`: missing 'WITH SYSTEM VERSIONING' @@ -302,5 +299,13 @@ alter table t with system versioning; ERROR 42S21: Duplicate column name 'sys_trx_end' create or replace temporary table t (x int) with system versioning; ERROR HY000: Incorrect usage of TEMPORARY and WITH SYSTEM VERSIONING +create or replace table t1 ( +x11 int unsigned, +Sys_start0 timestamp(6) generated always as row start, +Sys_start timestamp(6) generated always as row start, +Sys_end timestamp(6) generated always as row end, +period for system_time (Sys_start, Sys_end) +) with system versioning; +ERROR HY000: Duplicate ROW START column `Sys_start` drop database test; create database test; diff --git a/mysql-test/suite/versioning/t/create.test b/mysql-test/suite/versioning/t/create.test index caef5d59d6c..b4d9ec9e1da 100644 --- a/mysql-test/suite/versioning/t/create.test +++ b/mysql-test/suite/versioning/t/create.test @@ -43,9 +43,8 @@ show create table t1; eval create or replace table t1 ( x3 int unsigned, Sys_start $sys_datatype generated always as row start, - Sys_start2 $sys_datatype generated always as row start, Sys_end $sys_datatype generated always as row end, - period for system_time (Sys_start, Sys_end) + period for system_time (x, Sys_end) ) with system versioning; --replace_result "bigint unsigned" SYS_TRX_TYPE timestamp(6) SYS_TRX_TYPE @@ -63,8 +62,7 @@ eval create or replace table t1 ( x5 int unsigned, Sys_start $sys_datatype generated always as row start, Sys_end $sys_datatype generated always as row end, - Sys_end2 $sys_datatype generated always as row end, - period for system_time (Sys_start, Sys_end) + period for system_time (Sys_start, x) ) with system versioning; --error ER_MISSING @@ -79,7 +77,6 @@ eval create or replace table t1 ( x7 int unsigned, Sys_start $sys_datatype generated always as row start, Sys_end $sys_datatype generated always as row end, - Sys_end2 $sys_datatype generated always as row end, period for system_time (Sys_start, Sys_end) ); @@ -289,5 +286,14 @@ alter table t with system versioning; --error ER_WRONG_USAGE create or replace temporary table t (x int) with system versioning; +--error ER_VERS_DUPLICATE_ROW_START_END +create or replace table t1 ( + x11 int unsigned, + Sys_start0 timestamp(6) generated always as row start, + Sys_start timestamp(6) generated always as row start, + Sys_end timestamp(6) generated always as row end, + period for system_time (Sys_start, Sys_end) +) with system versioning; + drop database test; create database test; diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index c94680a0cbe..cf0a673cb20 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -7914,3 +7914,5 @@ ER_VERS_GENERATED_ALWAYS_NOT_EMPTY ER_VERS_TRT_IS_DISABLED eng "Some versioned DML requires `transaction_registry` to be set to ON." +ER_VERS_DUPLICATE_ROW_START_END + eng "Duplicate ROW %s column %`s" diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index bc1faa6f813..551ce4020af 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -6404,10 +6404,20 @@ field_def: { case 1: p= &info.as_row.start; + if (*p) + { + my_yyabort_error((ER_VERS_DUPLICATE_ROW_START_END, MYF(0), + "START", field_name.str)); + } lex->last_field->flags|= VERS_SYS_START_FLAG; break; case 0: p= &info.as_row.end; + if (*p) + { + my_yyabort_error((ER_VERS_DUPLICATE_ROW_START_END, MYF(0), + "END", field_name.str)); + } lex->last_field->flags|= VERS_SYS_END_FLAG; break; default: