summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/my_sys.h1
-rw-r--r--mysql-test/suite/versioning/r/alter.result8
-rw-r--r--mysql-test/suite/versioning/r/create.result36
-rw-r--r--mysql-test/suite/versioning/r/partition.result28
-rw-r--r--mysql-test/suite/versioning/r/select.result4
-rw-r--r--mysql-test/suite/versioning/r/vtmd_show.result6
-rw-r--r--mysql-test/suite/versioning/t/partition.test30
-rw-r--r--mysql-test/suite/versioning/t/select.test4
-rw-r--r--mysql-test/suite/versioning/t/vtmd_show.test6
-rw-r--r--mysys/my_error.c36
-rw-r--r--sql/handler.cc70
-rw-r--r--sql/handler.h24
-rw-r--r--sql/partition_info.cc30
-rw-r--r--sql/share/errmsg-utf8.txt51
-rw-r--r--sql/sql_partition.cc6
-rw-r--r--sql/sql_select.cc4
-rw-r--r--sql/sql_yacc.yy128
17 files changed, 284 insertions, 188 deletions
diff --git a/include/my_sys.h b/include/my_sys.h
index 9cc069d1fd3..b1af4610ef0 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -726,6 +726,7 @@ extern int my_sync_dir(const char *dir_name, myf my_flags);
extern int my_sync_dir_by_file(const char *file_name, myf my_flags);
extern const char *my_get_err_msg(uint nr);
extern void my_error(uint nr,myf MyFlags, ...);
+extern void my_error_as(uint nr1, uint nr2, myf MyFlags, ...);
extern void my_printf_error(uint my_err, const char *format,
myf MyFlags, ...)
ATTRIBUTE_FORMAT(printf, 2, 4);
diff --git a/mysql-test/suite/versioning/r/alter.result b/mysql-test/suite/versioning/r/alter.result
index 4bc96a92b06..71c7fb706af 100644
--- a/mysql-test/suite/versioning/r/alter.result
+++ b/mysql-test/suite/versioning/r/alter.result
@@ -9,7 +9,7 @@ t CREATE TABLE `t` (
alter table t without system versioning;
ERROR HY000: Wrong parameters for `t`: table is not versioned
alter table t with system versioning without system versioning;
-ERROR HY000: Wrong parameters for `t`: Versioning specified more than once for the same table
+ERROR HY000: Wrong parameters for `t`: multiple 'WITH/WITHOUT SYSTEM VERSIONING'
alter table t with system versioning;
show create table t;
Table Create Table
@@ -224,11 +224,11 @@ t CREATE TABLE `t` (
`b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
alter table t modify a int with system versioning;
-ERROR HY000: Wrong parameters for `t`: Can not change fields versioning mode in a non-versioned table
+ERROR HY000: Wrong parameters for `t`: table is not versioned
alter table t modify a int with system versioning with system versioning;
-ERROR HY000: Wrong parameters for `t`: Versioning specified more than once for the same field
+ERROR HY000: Wrong parameters for `t`: multiple 'WITH/WITHOUT SYSTEM VERSIONING' for `a`
alter table t modify a int with system versioning without system versioning;
-ERROR HY000: Wrong parameters for `t`: Versioning specified more than once for the same field
+ERROR HY000: Wrong parameters for `t`: multiple 'WITH/WITHOUT SYSTEM VERSIONING' for `a`
alter table t with system versioning;
alter table t modify a int without system versioning;
show create table t;
diff --git a/mysql-test/suite/versioning/r/create.result b/mysql-test/suite/versioning/r/create.result
index f3ea50192ce..2324adfaa73 100644
--- a/mysql-test/suite/versioning/r/create.result
+++ b/mysql-test/suite/versioning/r/create.result
@@ -103,14 +103,14 @@ 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)
) with system versioning;
-ERROR HY000: Wrong parameters for `t1`: multiple 'GENERATED ALWAYS AS ROW START'
+ERROR HY000: Wrong parameters for `t1`: multiple 'AS ROW START' (`Sys_start2`, `Sys_start`)
create or replace table t1 (
x4 int unsigned,
Sys_start SYS_TRX_TYPE generated always as row start,
Sys_end2 SYS_TRX_TYPE generated always as row end,
period for system_time (Sys_start, Sys_end)
) with system versioning;
-ERROR HY000: Wrong parameters for `t1`: 'PERIOD FOR SYSTEM_TIME' and 'GENERATED AS ROW END' mismatch
+ERROR HY000: Wrong parameters for `t1`: mismatch 'PERIOD FOR SYSTEM_TIME' and 'AS ROW END'
create or replace table t1 (
x5 int unsigned,
Sys_start SYS_TRX_TYPE generated always as row start,
@@ -118,12 +118,12 @@ 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)
) with system versioning;
-ERROR HY000: Wrong parameters for `t1`: multiple 'GENERATED ALWAYS AS ROW END'
+ERROR HY000: Wrong parameters for `t1`: multiple 'AS ROW END' (`Sys_end2`, `Sys_end`)
create or replace table t1 (
x6 int unsigned,
period for system_time (Sys_start, Sys_end)
) with system versioning;
-ERROR HY000: Wrong parameters for `t1`: 'GENERATED AS ROW START' column missing
+ERROR HY000: Wrong parameters for `t1`: missing 'AS ROW START'
create or replace table t1 (
x7 int unsigned,
Sys_start SYS_TRX_TYPE generated always as row start,
@@ -131,28 +131,28 @@ 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`: multiple 'GENERATED ALWAYS AS ROW END'
+ERROR HY000: Wrong parameters for `t1`: multiple 'AS ROW END' (`Sys_end2`, `Sys_end`)
create or replace table t1 (
x8 int unsigned,
Sys_start SYS_TRX_TYPE generated always as row start,
Sys_end SYS_TRX_TYPE generated always as row end,
period for system_time (sys_insert, sys_remove)
) with system versioning;
-ERROR HY000: Wrong parameters for `t1`: 'PERIOD FOR SYSTEM_TIME' and 'GENERATED AS ROW START' mismatch
+ERROR HY000: Wrong parameters for `t1`: mismatch 'PERIOD FOR SYSTEM_TIME' and 'AS ROW START'
create or replace table t1 (
x9 int unsigned,
Sys_start 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)
);
-ERROR HY000: Wrong parameters for `t1`: 'WITH SYSTEM VERSIONING' missing
+ERROR HY000: Wrong parameters for `t1`: missing 'WITH SYSTEM VERSIONING'
create or replace table t1 (
x10 int unsigned,
Sys_start 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_start)
);
-ERROR HY000: Wrong parameters for `t1`: 'PERIOD FOR SYSTEM_TIME' columns must be different
+ERROR HY000: Wrong parameters for `t1`: multiple `Sys_start` for 'PERIOD FOR SYSTEM_TIME'
create or replace table t1 (
x11 int unsigned,
Sys_start bigint unsigned generated always as row start,
@@ -211,7 +211,7 @@ create or replace table t1 (
A3 int,
B int without system versioning
);
-ERROR HY000: Wrong parameters for `t1`: 'WITH SYSTEM VERSIONING' missing
+ERROR HY000: Wrong parameters for `t1`: missing 'WITH SYSTEM VERSIONING'
create or replace table t1 (
A4 int,
B int without system versioning
@@ -254,39 +254,39 @@ t1 CREATE TABLE `t1` (
create or replace table t1 (
A7 int without system versioning
);
-ERROR HY000: Wrong parameters for `t1`: 'WITH SYSTEM VERSIONING' missing
+ERROR HY000: Wrong parameters for `t1`: missing 'WITH SYSTEM VERSIONING'
create or replace table t1 (
A8 int without system versioning
) with system versioning;
-ERROR HY000: Wrong parameters for `t1`: no columns defined with system versioning!
+ERROR HY000: Wrong parameters for `t1`: no columns defined 'WITH SYSTEM VERSIONING'
create or replace table t1 (
A9 int without system versioning with system versioning
);
-ERROR HY000: Wrong parameters for `t1`: Versioning specified more than once for the same field
+ERROR HY000: Wrong parameters for `t1`: multiple 'WITH/WITHOUT SYSTEM VERSIONING' for `A9`
create or replace table t1 (
A10 int with system versioning without system versioning
);
-ERROR HY000: Wrong parameters for `t1`: Versioning specified more than once for the same field
+ERROR HY000: Wrong parameters for `t1`: multiple 'WITH/WITHOUT SYSTEM VERSIONING' for `A10`
create table t(
a11 int
) without system versioning;
-ERROR HY000: Wrong parameters for `t`: 'WITHOUT SYSTEM VERSIONING' is not allowed
+ERROR HY000: Wrong parameters for `t`: not allowed 'WITHOUT SYSTEM VERSIONING'
create or replace table t1 (
A12 int
) without system versioning with system versioning;
-ERROR HY000: Wrong parameters for `t1`: Versioning specified more than once for the same table
+ERROR HY000: Wrong parameters for `t1`: multiple 'WITH/WITHOUT SYSTEM VERSIONING'
create or replace table t1 (
A13 int
) with system versioning without system versioning;
-ERROR HY000: Wrong parameters for `t1`: Versioning specified more than once for the same table
+ERROR HY000: Wrong parameters for `t1`: multiple 'WITH/WITHOUT SYSTEM VERSIONING'
create or replace table t1 (
A14 int
) with system versioning with system versioning;
-ERROR HY000: Wrong parameters for `t1`: Versioning specified more than once for the same table
+ERROR HY000: Wrong parameters for `t1`: multiple 'WITH/WITHOUT SYSTEM VERSIONING'
create or replace table t1 (
A15 int
) without system versioning without system versioning;
-ERROR HY000: Wrong parameters for `t1`: Versioning specified more than once for the same table
+ERROR HY000: Wrong parameters for `t1`: multiple 'WITH/WITHOUT SYSTEM VERSIONING'
create or replace table t1 (a int) with system versioning;
create temporary table tmp with system versioning select * from t1;
create or replace table t1 (a int) with system versioning;
diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result
index b76f01a340e..8daefaeff85 100644
--- a/mysql-test/suite/versioning/r/partition.result
+++ b/mysql-test/suite/versioning/r/partition.result
@@ -104,25 +104,25 @@ create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 as of now);
-ERROR HY000: Wrong parameters for `BY SYSTEM_TIME`: unexpected number of partitions (expected > 1)
+ERROR HY000: Wrong partitions consistency for `t1`: must have at least one 'VERSIONING' and exactly one last 'AS OF NOW'
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 as of now,
partition p1 as of now);
-ERROR HY000: Wrong parameters for `BY SYSTEM_TIME`: multiple `AS OF NOW` partitions
+ERROR HY000: Wrong partitions consistency for `t1`: must have at least one 'VERSIONING' and exactly one last 'AS OF NOW'
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 versioning,
partition p1 versioning);
-ERROR HY000: Wrong parameters for `BY SYSTEM_TIME`: no `AS OF NOW` partition defined
+ERROR HY000: Wrong partitions consistency for `t1`: must have at least one 'VERSIONING' and exactly one last 'AS OF NOW'
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition pn as of now,
partition p0 versioning);
-ERROR HY000: Wrong parameters for `BY SYSTEM_TIME`: AS OF NOW partition is not last
+ERROR HY000: Wrong partitions consistency for `t1`: must have at least one 'VERSIONING' and exactly one last 'AS OF NOW'
create or replace table t1 (x int)
with system versioning
partition by system_time (
@@ -130,7 +130,7 @@ partition p0 versioning,
partition pn as of now);
alter table t1 add partition (
partition p1 as of now);
-ERROR HY000: Wrong parameters for `BY SYSTEM_TIME`: AS OF NOW partition can not be added
+ERROR HY000: Wrong partitions consistency for `t1`: must have at least one 'VERSIONING' and exactly one last 'AS OF NOW'
alter table t1 add partition (
partition p1 versioning);
Warnings:
@@ -148,10 +148,10 @@ t1 CREATE TABLE `t1` (
PARTITION p1 VERSIONING ENGINE = ${INNODB_OR_MYISAM},
PARTITION pn AS OF NOW ENGINE = ${INNODB_OR_MYISAM})
alter table t1 drop partition pn;
-ERROR HY000: Wrong parameters for `BY SYSTEM_TIME`: `AS OF NOW` partition can not be dropped
+ERROR HY000: Wrong partitions consistency for `t1`: must have at least one 'VERSIONING' and exactly one last 'AS OF NOW'
alter table t1 drop partition p1;
alter table t1 drop partition p0;
-ERROR HY000: Wrong parameters for `BY SYSTEM_TIME`: one `AS OF NOW` and at least one `VERSIONING` partition required
+ERROR HY000: Wrong partitions consistency for `t1`: must have at least one 'VERSIONING' and exactly one last 'AS OF NOW'
set @now= now(6);
insert into t1 values (1);
set @ts_start= sys_commit_ts('sys_trx_start');
@@ -226,6 +226,13 @@ select @ts2 = @ts3;
1
create or replace table t1 (x int)
with system versioning
+partition by system_time limit 0 (
+partition p0 versioning,
+partition p1 versioning,
+partition pn as of now);
+ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'LIMIT'
+create or replace table t1 (x int)
+with system versioning
partition by system_time limit 1 (
partition p0 versioning,
partition p1 versioning,
@@ -268,6 +275,13 @@ x
3
create or replace table t1 (x int)
with system versioning
+partition by system_time interval 0 second (
+partition p0 versioning,
+partition p1 versioning,
+partition pn as of now);
+ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'INTERVAL'
+create or replace table t1 (x int)
+with system versioning
partition by system_time interval 1 second (
partition p0 versioning,
partition p1 versioning,
diff --git a/mysql-test/suite/versioning/r/select.result b/mysql-test/suite/versioning/r/select.result
index bc32db7114a..d6a471506ee 100644
--- a/mysql-test/suite/versioning/r/select.result
+++ b/mysql-test/suite/versioning/r/select.result
@@ -337,7 +337,7 @@ ERROR HY000: System Versioning required: `FOR SYSTEM_TIME` query
create or replace table t1 (x int) with system versioning;
insert into t1 values (1);
select * from t1 for system_time all for update;
-ERROR HY000: Wrong parameters for `FOR SYSTEM_TIME query`: write-locking of historic rows
+ERROR HY000: Versioned SELECT write-locking of history rows
create or replace table t1 (a int not null auto_increment primary key) with system versioning;
select * from (t1 as t2 left join t1 as t3 using (a)) natural left join t1;
a
@@ -437,7 +437,7 @@ x y
2 1
3 1
select * from t1 for system_time all, t2 for system_time all query for system_time all;
-ERROR HY000: Wrong versioned query: unused `QUERY FOR SYSTEM_TIME` clause!
+ERROR HY000: Unused clause: 'QUERY FOR SYSTEM_TIME'
drop view v1;
drop table t1, t2;
call innodb_verify_vtq(27);
diff --git a/mysql-test/suite/versioning/r/vtmd_show.result b/mysql-test/suite/versioning/r/vtmd_show.result
index 01d96f9a427..bcece5cba1f 100644
--- a/mysql-test/suite/versioning/r/vtmd_show.result
+++ b/mysql-test/suite/versioning/r/vtmd_show.result
@@ -55,11 +55,11 @@ ERROR 42S02: Table 'test.t_vtmd' doesn't exist
set versioning_ddl_survival=on;
create or replace table t (a int) with system versioning;
show create table t for system_time between timestamp @tm1 and timestamp @tm1;
-ERROR HY000: Wrong parameters for `FOR SYSTEM_TIME`: only AS OF allowed here
+ERROR HY000: SYSTEM_TIME range selector is prohibited
show create table t for system_time from timestamp @tm1 to timestamp @tm1;
-ERROR HY000: Wrong parameters for `FOR SYSTEM_TIME`: only AS OF allowed here
+ERROR HY000: SYSTEM_TIME range selector is prohibited
show create table t for system_time before timestamp @tm1;
-ERROR HY000: Wrong parameters for `FOR SYSTEM_TIME`: only AS OF allowed here
+ERROR HY000: SYSTEM_TIME range selector is prohibited
show create table t for system_time as of timestamp '01-01-1990';
ERROR HY000: VTMD error: failed to query VTMD table
show create table t for system_time as of timestamp '01-01-2020';
diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test
index ca998757515..cbecde0be9b 100644
--- a/mysql-test/suite/versioning/t/partition.test
+++ b/mysql-test/suite/versioning/t/partition.test
@@ -35,27 +35,27 @@ partition by system_time (
partition p0 versioning,
partition pn as of now);
---error ER_VERS_WRONG_PARAMS
+--error ER_VERS_WRONG_PARTS
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 as of now);
---error ER_VERS_WRONG_PARAMS
+--error ER_VERS_WRONG_PARTS
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 as of now,
partition p1 as of now);
---error ER_VERS_WRONG_PARAMS
+--error ER_VERS_WRONG_PARTS
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 versioning,
partition p1 versioning);
---error ER_VERS_WRONG_PARAMS
+--error ER_VERS_WRONG_PARTS
create or replace table t1 (x int)
with system versioning
partition by system_time (
@@ -69,7 +69,7 @@ partition by system_time (
partition pn as of now);
# alter table
---error ER_VERS_WRONG_PARAMS
+--error ER_VERS_WRONG_PARTS
alter table t1 add partition (
partition p1 as of now);
@@ -79,10 +79,10 @@ alter table t1 add partition (
--replace_result InnoDB ${INNODB_OR_MYISAM} MyISAM ${INNODB_OR_MYISAM} "bigint(20) unsigned" ${SYS_TRX_TYPE} timestamp(6) ${SYS_TRX_TYPE}
show create table t1;
---error ER_VERS_WRONG_PARAMS
+--error ER_VERS_WRONG_PARTS
alter table t1 drop partition pn;
alter table t1 drop partition p1;
---error ER_VERS_WRONG_PARAMS
+--error ER_VERS_WRONG_PARTS
alter table t1 drop partition p0;
# insert, delete, update
@@ -138,6 +138,14 @@ select @ts0 = @ts1;
select @ts2 = @ts3;
# rotation by LIMIT
+--error ER_VERS_WRONG_PARAMS
+create or replace table t1 (x int)
+with system versioning
+partition by system_time limit 0 (
+ partition p0 versioning,
+ partition p1 versioning,
+ partition pn as of now);
+
create or replace table t1 (x int)
with system versioning
partition by system_time limit 1 (
@@ -162,6 +170,14 @@ delete from t1;
select * from t1 partition (p1) for system_time all;
# rotation by INTERVAL
+--error ER_VERS_WRONG_PARAMS
+create or replace table t1 (x int)
+with system versioning
+partition by system_time interval 0 second (
+ partition p0 versioning,
+ partition p1 versioning,
+ partition pn as of now);
+
create or replace table t1 (x int)
with system versioning
partition by system_time interval 1 second (
diff --git a/mysql-test/suite/versioning/t/select.test b/mysql-test/suite/versioning/t/select.test
index 37b6b8be89d..ca8b9ccf56a 100644
--- a/mysql-test/suite/versioning/t/select.test
+++ b/mysql-test/suite/versioning/t/select.test
@@ -127,7 +127,7 @@ select * from t1 for system_time all;
create or replace table t1 (x int) with system versioning;
insert into t1 values (1);
---error ER_VERS_WRONG_PARAMS
+--error ER_VERS_HISTORY_LOCK
select * from t1 for system_time all for update;
create or replace table t1 (a int not null auto_increment primary key) with system versioning;
@@ -197,7 +197,7 @@ delete from t1 where x = 3;
insert into t2 values (1);
select * from t1, t2 query for system_time all;
---error ER_VERS_WRONG_QUERY
+--error ER_VERS_UNUSED_CLAUSE
select * from t1 for system_time all, t2 for system_time all query for system_time all;
drop view v1;
diff --git a/mysql-test/suite/versioning/t/vtmd_show.test b/mysql-test/suite/versioning/t/vtmd_show.test
index 7610db179ab..a4d946bbd55 100644
--- a/mysql-test/suite/versioning/t/vtmd_show.test
+++ b/mysql-test/suite/versioning/t/vtmd_show.test
@@ -71,11 +71,11 @@ show create table t for system_time as of now;
set versioning_ddl_survival=on;
create or replace table t (a int) with system versioning;
---error ER_VERS_WRONG_PARAMS
+--error ER_VERS_RANGE_PROHIBITED
show create table t for system_time between timestamp @tm1 and timestamp @tm1;
---error ER_VERS_WRONG_PARAMS
+--error ER_VERS_RANGE_PROHIBITED
show create table t for system_time from timestamp @tm1 to timestamp @tm1;
---error ER_VERS_WRONG_PARAMS
+--error ER_VERS_RANGE_PROHIBITED
show create table t for system_time before timestamp @tm1;
--error ER_VERS_VTMD_ERROR
show create table t for system_time as of timestamp '01-01-1990';
diff --git a/mysys/my_error.c b/mysys/my_error.c
index f9614e07c6a..d57c186b2f3 100644
--- a/mysys/my_error.c
+++ b/mysys/my_error.c
@@ -327,3 +327,39 @@ void my_error_unregister_all(void)
my_errmsgs_list= &my_errmsgs_globerrs;
}
+
+
+/**
+ Format one error and print out as another error code.
+
+ @note
+ Stacks two error messages and prints as single error message.
+ Like my_error(), but error argument is another formatted error
+
+ @param nr1 error number of printed message. nr1 must have exactly one %s
+ parameter which will be formatted message of error nr2.
+ @param nr2 error number of formatted message
+ @param MyFlags Flags
+ @param ... parameters for error nr2
+*/
+
+void my_error_as(uint nr1, uint nr2, myf MyFlags, ...)
+{
+ const char *format;
+ va_list args;
+ char ebuff[ERRMSGSIZE];
+ DBUG_ENTER("my_suberror");
+ DBUG_PRINT("my", ("nr1: %d nr2: %d MyFlags: %lu errno: %d", nr1, nr2, MyFlags, errno));
+
+ if (!(format = my_get_err_msg(nr2)))
+ (void) my_snprintf(ebuff, sizeof(ebuff), "Unknown error %d", nr2);
+ else
+ {
+ va_start(args,MyFlags);
+ (void) my_vsnprintf_ex(&my_charset_utf8_general_ci, ebuff,
+ sizeof(ebuff), format, args);
+ va_end(args);
+ }
+ my_error(nr1, MyFlags, ebuff);
+ DBUG_VOID_RETURN;
+}
diff --git a/sql/handler.cc b/sql/handler.cc
index 9a4485412c2..3589c3aee19 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -6696,24 +6696,24 @@ bool Vers_parse_info::check_and_fix_implicit(
// then created table will be versioned.
if (thd->variables.vers_force || vers_tables > 0)
{
- declared_with_system_versioning= true;
+ with_system_versioning= true;
create_info->options|= HA_VERSIONED_TABLE;
}
if (!need_check())
return false;
- if (declared_without_system_versioning)
+ if (without_system_versioning)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "'WITHOUT SYSTEM VERSIONING' is not allowed");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_NOT_ALLOWED, MYF(0), table_name,
+ "WITHOUT SYSTEM VERSIONING");
return true;
}
- if (!declared_with_system_versioning && !has_versioned_fields)
+ if (!with_system_versioning && !versioned_fields)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "'WITH SYSTEM VERSIONING' missing");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_MISSING, MYF(0), table_name,
+ "WITH SYSTEM VERSIONING");
return true;
}
@@ -6729,8 +6729,7 @@ bool Vers_parse_info::check_and_fix_implicit(
if (orig_table && orig_table != f->field->orig_table)
{
err_different_tables:
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "system fields selected from different tables");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_VERS_DIFFERENT_TABLES, MYF(0), table_name);
return true;
}
orig_table= f->field->orig_table;
@@ -6756,7 +6755,7 @@ bool Vers_parse_info::check_and_fix_implicit(
}
if ((f->versioning == Column_definition::VERSIONING_NOT_SET &&
- !declared_with_system_versioning) ||
+ !with_system_versioning) ||
f->versioning == Column_definition::WITHOUT_VERSIONING)
{
f->flags|= VERS_OPTIMIZED_UPDATE_FLAG;
@@ -6769,14 +6768,14 @@ bool Vers_parse_info::check_and_fix_implicit(
{
if (!generated_as_row.start && !generated_as_row.end)
{
- declared_with_system_versioning= false;
+ with_system_versioning= false;
create_info->options&= ~HA_VERSIONED_TABLE;
return false;
}
if (!generated_as_row.start || !generated_as_row.end)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "both ROW START and ROW END system fields required in SELECT resultset");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_MISSING, MYF(0), table_name,
+ generated_as_row.start ? "AS ROW END" : "AS ROW START");
return true;
}
}
@@ -6807,8 +6806,8 @@ bool Vers_parse_info::check_and_fix_implicit(
vers_cols == 0 &&
(plain_cols == 0 || !table_with_system_versioning))
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "no columns defined with system versioning!");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_VERS_NO_COLS_DEFINED, MYF(0),
+ table_name, "WITH SYSTEM VERSIONING");
return true;
}
@@ -6837,12 +6836,11 @@ bool Vers_parse_info::check_and_fix_alter(THD *thd, Alter_info *alter_info,
if (!need_check() && !share->versioned)
return false;
- if (declared_without_system_versioning)
+ if (without_system_versioning)
{
if (!share->versioned)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "table is not versioned");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_VERS_NOT_VERSIONED, MYF(0), table_name);
return true;
}
@@ -6854,10 +6852,9 @@ bool Vers_parse_info::check_and_fix_alter(THD *thd, Alter_info *alter_info,
return false;
}
- if ((has_versioned_fields || has_unversioned_fields) && !share->versioned)
+ if ((versioned_fields || unversioned_fields) && !share->versioned)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "Can not change fields versioning mode in a non-versioned table");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_VERS_NOT_VERSIONED, MYF(0), table_name);
return true;
}
@@ -6928,7 +6925,7 @@ bool Vers_parse_info::check_and_fix_alter(THD *thd, Alter_info *alter_info,
}
return fix_implicit(thd, alter_info, integer_fields) ||
- (declared_with_system_versioning &&
+ (with_system_versioning &&
(check_with_conditions(table_name) ||
check_generated_type(table_name, alter_info, integer_fields)));
}
@@ -6958,8 +6955,8 @@ bool Vers_parse_info::fix_create_like(THD *thd, Alter_info *alter_info,
if (!f_start || !f_end)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table->table_name,
- "Missed one of system versioning fields from source");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_MISSING, MYF(0), table->table_name,
+ f_start ? "AS ROW END" : "AS ROW START");
return true;
}
@@ -6973,38 +6970,31 @@ bool Vers_parse_info::fix_create_like(THD *thd, Alter_info *alter_info,
bool Vers_parse_info::check_with_conditions(const char *table_name) const
{
- if (!generated_as_row.start)
+ if (!generated_as_row.start || !generated_as_row.end)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "'GENERATED AS ROW START' column missing");
- return true;
- }
-
- if (!generated_as_row.end)
- {
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "'GENERATED AS ROW END' column missing");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_MISSING, MYF(0), table_name,
+ generated_as_row.start ? "AS ROW END" : "AS ROW START");
return true;
}
if (!period_for_system_time.start || !period_for_system_time.end)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "'PERIOD FOR SYSTEM_TIME' missing");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_MISSING, MYF(0), table_name,
+ "PERIOD FOR SYSTEM_TIME");
return true;
}
if (generated_as_row.start != period_for_system_time.start)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "'PERIOD FOR SYSTEM_TIME' and 'GENERATED AS ROW START' mismatch");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_MISMATCH, MYF(0), table_name,
+ "PERIOD FOR SYSTEM_TIME", "AS ROW START");
return true;
}
if (generated_as_row.end != period_for_system_time.end)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "'PERIOD FOR SYSTEM_TIME' and 'GENERATED AS ROW END' mismatch");
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_MISMATCH, MYF(0), table_name,
+ "PERIOD FOR SYSTEM_TIME", "AS ROW END");
return true;
}
diff --git a/sql/handler.h b/sql/handler.h
index 9c2b1bcf209..5462b33a3aa 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -1677,10 +1677,10 @@ class Create_field;
struct Vers_parse_info
{
Vers_parse_info() :
- declared_with_system_versioning(false),
- declared_without_system_versioning(false),
- has_versioned_fields(false),
- has_unversioned_fields(false)
+ with_system_versioning(false),
+ without_system_versioning(false),
+ versioned_fields(false),
+ unversioned_fields(false)
{}
struct start_end_t
@@ -1712,10 +1712,10 @@ private:
bool need_check() const
{
return
- has_versioned_fields ||
- has_unversioned_fields ||
- declared_with_system_versioning ||
- declared_without_system_versioning ||
+ versioned_fields ||
+ unversioned_fields ||
+ with_system_versioning ||
+ without_system_versioning ||
period_for_system_time.start.str ||
period_for_system_time.end.str ||
generated_as_row.start.str ||
@@ -1735,22 +1735,22 @@ public:
HA_CREATE_INFO *create_info, TABLE_LIST *table);
/** User has added 'WITH SYSTEM VERSIONING' to table definition */
- bool declared_with_system_versioning : 1;
+ bool with_system_versioning : 1;
/** Use has added 'WITHOUT SYSTEM VERSIONING' to ALTER TABLE */
- bool declared_without_system_versioning : 1;
+ bool without_system_versioning : 1;
/**
At least one field was specified 'WITH SYSTEM VERSIONING'. Useful for
error handling.
*/
- bool has_versioned_fields : 1;
+ bool versioned_fields : 1;
/**
At least one field was specified 'WITHOUT SYSTEM VERSIONING'. Useful for
error handling.
*/
- bool has_unversioned_fields : 1;
+ bool unversioned_fields : 1;
};
/**
diff --git a/sql/partition_info.cc b/sql/partition_info.cc
index 2b1bc41931d..dd4ec54673a 100644
--- a/sql/partition_info.cc
+++ b/sql/partition_info.cc
@@ -851,16 +851,8 @@ bool partition_info::vers_init_info(THD * thd)
bool partition_info::vers_set_interval(const INTERVAL & i)
{
- if (i.neg)
- {
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "negative INTERVAL");
- return true;
- }
- if (i.second_part)
- {
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "second fractions in INTERVAL");
+ if (i.neg || i.second_part)
return true;
- }
DBUG_ASSERT(vers_info);
@@ -874,20 +866,16 @@ bool partition_info::vers_set_interval(const INTERVAL & i)
i.year * 365 * 30 * 24 * 60 * 60;
if (vers_info->interval == 0)
- {
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "zero INTERVAL");
return true;
- }
+
return false;
}
bool partition_info::vers_set_limit(ulonglong limit)
{
if (limit < 1)
- {
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "non-positive LIMIT");
return true;
- }
+
DBUG_ASSERT(vers_info);
vers_info->limit= limit;
@@ -1978,15 +1966,11 @@ bool partition_info::check_partition_info(THD *thd, handlerton **eng_type,
if (part_type == VERSIONING_PARTITION)
{
- if (num_parts < 2)
- {
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "unexpected number of partitions (expected > 1)");
- goto end;
- }
DBUG_ASSERT(vers_info);
- if (!vers_info->now_part)
+ if (num_parts < 2 || !vers_info->now_part)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "no `AS OF NOW` partition defined");
+ DBUG_ASSERT(info && info->alias);
+ my_error(ER_VERS_WRONG_PARTS, MYF(0), info->alias);
goto end;
}
DBUG_ASSERT(vers_info->initialized(false));
@@ -2135,7 +2119,7 @@ bool partition_info::check_partition_info(THD *thd, handlerton **eng_type,
}
if (now_parts > 1)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "multiple `AS OF NOW` partitions");
+ my_error(ER_VERS_WRONG_PARTS, MYF(0), info->alias);
goto end;
}
result= FALSE;
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index 17bd8a983a7..bbe4e6cff0e 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -7500,7 +7500,7 @@ ER_VERS_FIELD_WRONG_TYPE
eng "%`s must be of type %`s for versioned table %`s"
ER_VERS_WRONG_PARAMS
- eng "Wrong parameters for %`s: %s"
+ eng "Wrong parameters %s"
ER_VERS_ENGINE_UNSUPPORTED
eng "Engine does not support System Versioning for %`s"
@@ -7532,8 +7532,8 @@ WARN_VERS_PART_NON_HISTORICAL
ER_VERS_NOT_ALLOWED
eng "%`s is not allowed for versioned table"
-ER_VERS_WRONG_QUERY_TYPE
- eng "%`s works only with %`s query type"
+ER_VERS_RANGE_PROHIBITED
+ eng "SYSTEM_TIME range selector is prohibited"
ER_VERS_VIEW_PROHIBITED
eng "Creating VIEW %`s is prohibited!"
@@ -7541,14 +7541,53 @@ ER_VERS_VIEW_PROHIBITED
ER_VERS_DERIVED_PROHIBITED
eng "Derived table is prohibited!"
-ER_VERS_WRONG_QUERY
- eng "Wrong versioned query: %s"
+ER_VERS_UNUSED_CLAUSE
+ eng "Unused clause: '%s'"
WARN_VERS_ALIAS_TOO_LONG
- eng "Auto generated alias for `%s.%s` is too long; using `%s`."
+ eng "Auto generated alias for `%s.%s` is too long; using `%s`"
ER_VERS_VTMD_ERROR
eng "VTMD error: %s"
+ER_MULTIPLE_CLAUSE
+ eng "for %`s: multiple '%s'"
+
+ER_MULTIPLE_CLAUSE_FOR
+ eng "for %`s: multiple '%s' for %`s"
+
+ER_MULTIPLE_CLAUSE_2
+ eng "for %`s: multiple '%s' (%`s, %`s)"
+
+ER_MULTIPLE_IDENTIFIER
+ eng "for %`s: multiple %`s for '%s'"
+
+ER_NOT_ALLOWED
+ eng "for %`s: not allowed '%s'"
+
+ER_VERS_DIFFERENT_TABLES
+ eng "for %`s: system fields selected from different tables"
+
+ER_VERS_NO_COLS_DEFINED
+ eng "for %`s: no columns defined '%s'"
+
+ER_VERS_NOT_VERSIONED
+ eng "for %`s: table is not versioned"
+
+ER_MISSING
+ eng "for %`s: missing '%s'"
+
+ER_MISMATCH
+ eng "for %`s: mismatch '%s' and '%s'"
+
+ER_PART_WRONG_VALUE
+ eng "for partitioned %`s: wrong value for '%s'"
+
+ER_VERS_WRONG_PARTS
+ eng "Wrong partitions consistency for %`s: must have at least one 'VERSIONING' and exactly one last 'AS OF NOW'"
+
+ER_VERS_HISTORY_LOCK
+ eng "Versioned SELECT write-locking of history rows"
+
ER_WRONG_TABLESPACE_NAME 42000
eng "Incorrect tablespace name `%-.192s`"
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index caca441e5e4..7278b56a017 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -5368,7 +5368,8 @@ that are reorganised.
{
if (num_parts_dropped >= tab_part_info->num_parts - 1)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "one `AS OF NOW` and at least one `VERSIONING` partition required");
+ DBUG_ASSERT(table && table->s && table->s->table_name.str);
+ my_error(ER_VERS_WRONG_PARTS, MYF(0), table->s->table_name.str);
goto err;
}
}
@@ -5394,7 +5395,8 @@ that are reorganised.
{
if (part_elem->type == partition_element::AS_OF_NOW)
{
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "`AS OF NOW` partition can not be dropped");
+ DBUG_ASSERT(table && table->s && table->s->table_name.str);
+ my_error(ER_VERS_WRONG_PARTS, MYF(0), table->s->table_name.str);
goto err;
}
/*
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 2355552ab77..fef673b8c33 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -824,7 +824,7 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr,
case TL_WRITE_LOW_PRIORITY:
case TL_WRITE:
case TL_WRITE_ONLY:
- my_error(ER_VERS_WRONG_PARAMS, MYF(0), "FOR SYSTEM_TIME query", "write-locking of historic rows");
+ my_error(ER_VERS_HISTORY_LOCK, MYF(0));
DBUG_RETURN(-1);
default:
break;
@@ -1004,7 +1004,7 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr,
if (!slex->vers_conditions.used && slex->vers_conditions)
{
- my_error(ER_VERS_WRONG_QUERY, MYF(0), "unused `QUERY FOR SYSTEM_TIME` clause!");
+ my_error(ER_VERS_UNUSED_CLAUSE, MYF(0), "QUERY FOR SYSTEM_TIME");
DBUG_RETURN(-1);
}
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 73860aadca5..8b3014f301a 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -67,6 +67,7 @@
#include "lex_token.h"
#include "sql_lex.h"
#include "sql_sequence.h"
+#include "vers_utils.h"
/* this is to get the bison compilation windows warnings out */
#ifdef _MSC_VER
@@ -851,6 +852,7 @@ Virtual_column_info *add_virtual_expression(THD *thd, Item *expr)
enum trigger_order_type trigger_action_order_type;
DDL_options_st object_ddl_options;
enum vers_range_unit_t vers_range_unit;
+ enum Column_definition::enum_column_versioning vers_column_versioning;
}
%{
@@ -1973,7 +1975,7 @@ END_OF_INPUT
%type <vers_range_unit> trans_or_timestamp
%type <BOOL> opt_for_system_time_clause
-
+%type <vers_column_versioning> with_or_without_system
%%
@@ -5206,8 +5208,11 @@ opt_part_values:
}
else
{
+ DBUG_ASSERT(Lex->create_last_non_select_table);
+ DBUG_ASSERT(Lex->create_last_non_select_table->table_name);
// FIXME: other ALTER commands?
- my_yyabort_error((ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "AS OF NOW partition can not be added"));
+ my_yyabort_error((ER_VERS_WRONG_PARTS, MYF(0),
+ Lex->create_last_non_select_table->table_name));
}
elem->type= partition_element::AS_OF_NOW;
DBUG_ASSERT(part_info->vers_info);
@@ -5235,7 +5240,11 @@ opt_part_values:
}
DBUG_ASSERT(part_info->vers_info);
if (part_info->vers_info->now_part)
- my_yyabort_error((ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "AS OF NOW partition is not last"));
+ {
+ DBUG_ASSERT(Lex->create_last_non_select_table);
+ DBUG_ASSERT(Lex->create_last_non_select_table->table_name);
+ my_yyabort_error((ER_VERS_WRONG_PARTS, MYF(0), Lex->create_last_non_select_table->table_name));
+ }
elem->type= partition_element::VERSIONING;
if (part_info->init_column_part(thd))
{
@@ -5551,10 +5560,13 @@ opt_versioning_interval:
partition_info *part_info= Lex->part_info;
DBUG_ASSERT(part_info->part_type == VERSIONING_PARTITION);
INTERVAL interval;
- if (get_interval_value($2, $3, &interval))
- my_yyabort_error((ER_VERS_WRONG_PARAMS, MYF(0), "BY SYSTEM_TIME", "wrong INTERVAL value"));
- if (part_info->vers_set_interval(interval))
+ if (get_interval_value($2, $3, &interval) ||
+ part_info->vers_set_interval(interval))
+ {
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_PART_WRONG_VALUE, MYF(0),
+ Lex->create_last_non_select_table->table_name, "INTERVAL");
MYSQL_YYABORT;
+ }
}
;
@@ -5565,7 +5577,11 @@ opt_versioning_limit:
partition_info *part_info= Lex->part_info;
DBUG_ASSERT(part_info->part_type == VERSIONING_PARTITION);
if (part_info->vers_set_limit($2))
+ {
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_PART_WRONG_VALUE, MYF(0),
+ Lex->create_last_non_select_table->table_name, "LIMIT");
MYSQL_YYABORT;
+ }
}
;
@@ -5936,32 +5952,28 @@ create_table_option:
Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE;
Lex->create_info.sequence= $3;
}
- | WITH_SYSTEM_SYM VERSIONING_SYM
+ | WITH_SYSTEM_SYM table_versioning
{
- const char *table_name=
- Lex->create_last_non_select_table->table_name;
- Vers_parse_info &info= Lex->vers_get_info();
- if (info.declared_with_system_versioning ||
- info.declared_without_system_versioning)
- my_yyabort_error(
- (ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "Versioning specified more than once for the same table"));
-
- info.declared_with_system_versioning= true;
+ Lex->vers_get_info().with_system_versioning= true;
Lex->create_info.options|= HA_VERSIONED_TABLE;
}
- | WITHOUT SYSTEM VERSIONING_SYM
+ | WITHOUT SYSTEM table_versioning
{
- const char *table_name=
- Lex->create_last_non_select_table->table_name;
- Vers_parse_info &info= Lex->vers_get_info();
- if (info.declared_with_system_versioning ||
- info.declared_without_system_versioning)
- my_yyabort_error(
- (ER_VERS_WRONG_PARAMS, MYF(0), table_name,
- "Versioning specified more than once for the same table"));
+ Lex->vers_get_info().without_system_versioning= true;
+ }
+ ;
- info.declared_without_system_versioning= true;
+table_versioning:
+ VERSIONING_SYM
+ {
+ Vers_parse_info &info= Lex->vers_get_info();
+ if (info.with_system_versioning || info.without_system_versioning)
+ {
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_MULTIPLE_CLAUSE, MYF(0),
+ Lex->create_last_non_select_table->table_name,
+ "WITH/WITHOUT SYSTEM VERSIONING");
+ MYSQL_YYABORT;
+ }
}
;
@@ -6169,9 +6181,10 @@ period_for_system_time:
Vers_parse_info &info= Lex->vers_get_info();
if (!my_strcasecmp(system_charset_info, $4.str, $6.str))
{
- my_yyabort_error((ER_VERS_WRONG_PARAMS, MYF(0),
- Lex->create_last_non_select_table->table_name,
- "'PERIOD FOR SYSTEM_TIME' columns must be different"));
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_MULTIPLE_IDENTIFIER, MYF(0),
+ Lex->create_last_non_select_table->table_name, $4.str,
+ "PERIOD FOR SYSTEM_TIME");
+ MYSQL_YYABORT;
}
info.set_period_for_system_time($4, $6);
}
@@ -6288,17 +6301,17 @@ field_def:
const char *table_name= lex->create_last_non_select_table->table_name;
LString_i *p;
- const char* err;
+ const char* clause;
switch ($4)
{
case 1:
p= &info.generated_as_row.start;
- err= "multiple 'GENERATED ALWAYS AS ROW START'";
+ clause= "AS ROW START";
lex->last_field->flags|= VERS_SYS_START_FLAG;
break;
case 0:
p= &info.generated_as_row.end;
- err= "multiple 'GENERATED ALWAYS AS ROW END'";
+ clause= "AS ROW END";
lex->last_field->flags|= VERS_SYS_END_FLAG;
break;
default:
@@ -6309,7 +6322,9 @@ field_def:
DBUG_ASSERT(p);
if (*p)
{
- my_yyabort_error((ER_VERS_WRONG_PARAMS, MYF(0), table_name, err));
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_MULTIPLE_CLAUSE_2, MYF(0),
+ table_name, clause, field_name, p->ptr());
+ MYSQL_YYABORT;
}
*p= field_name;
if (lex->last_field->implicit_not_null)
@@ -6805,31 +6820,30 @@ serial_attribute:
new (thd->mem_root)
engine_option_value($1, &Lex->last_field->option_list, &Lex->option_list_last);
}
- | WITH_SYSTEM_SYM VERSIONING_SYM
+ | with_or_without_system VERSIONING_SYM
{
- if (Lex->last_field->versioning !=
- Column_definition::VERSIONING_NOT_SET)
- my_yyabort_error(
- (ER_VERS_WRONG_PARAMS, MYF(0),
+ if (Lex->last_field->versioning != Column_definition::VERSIONING_NOT_SET)
+ {
+ my_error_as(ER_VERS_WRONG_PARAMS, ER_MULTIPLE_CLAUSE_FOR, MYF(0),
Lex->create_last_non_select_table->table_name,
- "Versioning specified more than once for the same field"));
-
- Lex->last_field->versioning = Column_definition::WITH_VERSIONING;
- Lex->create_info.vers_info.has_versioned_fields= true;
+ "WITH/WITHOUT SYSTEM VERSIONING", Lex->last_field->field_name);
+ MYSQL_YYABORT;
+ }
+ Lex->last_field->versioning= $1;
Lex->create_info.options|= HA_VERSIONED_TABLE;
}
- | WITHOUT SYSTEM VERSIONING_SYM
- {
- if (Lex->last_field->versioning !=
- Column_definition::VERSIONING_NOT_SET)
- my_yyabort_error(
- (ER_VERS_WRONG_PARAMS, MYF(0),
- Lex->create_last_non_select_table->table_name,
- "Versioning specified more than once for the same field"));
+ ;
- Lex->last_field->versioning = Column_definition::WITHOUT_VERSIONING;
- Lex->create_info.vers_info.has_unversioned_fields= true;
- Lex->create_info.options|= HA_VERSIONED_TABLE;
+with_or_without_system:
+ WITH_SYSTEM_SYM
+ {
+ Lex->create_info.vers_info.versioned_fields= true;
+ $$= Column_definition::WITH_VERSIONING;
+ }
+ | WITHOUT SYSTEM
+ {
+ Lex->create_info.vers_info.unversioned_fields= true;
+ $$= Column_definition::WITHOUT_VERSIONING;
}
;
@@ -13336,9 +13350,9 @@ show_param:
lex->create_info.storage_media= HA_SM_DEFAULT;
if (lex->vers_conditions.type != FOR_SYSTEM_TIME_UNSPECIFIED &&
- lex->vers_conditions.type != FOR_SYSTEM_TIME_AS_OF) {
- my_yyabort_error((ER_VERS_WRONG_PARAMS, MYF(0), "FOR SYSTEM_TIME",
- "only AS OF allowed here"));
+ lex->vers_conditions.type != FOR_SYSTEM_TIME_AS_OF)
+ {
+ my_yyabort_error((ER_VERS_RANGE_PROHIBITED, MYF(0)));
}
if ($4)
Lex->last_table()->vers_conditions= Lex->vers_conditions;