Commit 617e108f authored by Sergei Golubchik's avatar Sergei Golubchik Committed by Aleksey Midenkov

s/TRUNCATE ... TO/DELETE HISTORY FROM ... BEFORE/

parent ee68d019
create table t (a int); create table t (a int);
truncate t to system_time now(); delete history from t before system_time now();
ERROR HY000: System versioning required: t ERROR HY000: System versioning required: t
create or replace table t (a int) with system versioning; create or replace table t (a int) with system versioning;
insert into t values (1); insert into t values (1);
...@@ -7,7 +7,7 @@ update t set a=2; ...@@ -7,7 +7,7 @@ update t set a=2;
set @test = 'correct'; set @test = 'correct';
create trigger trg_before before delete on t for each row set @test = 'incorrect'; create trigger trg_before before delete on t for each row set @test = 'incorrect';
create trigger trg_after after delete on t for each row set @test = 'incorrect'; create trigger trg_after after delete on t for each row set @test = 'incorrect';
truncate t to system_time now(6); delete history from t before system_time now(6);
select @test from t; select @test from t;
@test @test
correct correct
...@@ -23,17 +23,20 @@ a ...@@ -23,17 +23,20 @@ a
22 22
1 1
2 2
truncate t to system_time timestamp @ts1; delete history from t before system_time timestamp @ts1;
select * from t for system_time all; select * from t for system_time all;
a a
11 11
22 22
1
2 2
truncate table t to system_time timestamp now(6); delete history from t before system_time timestamp now(6);
select * from t for system_time all; select * from t for system_time all;
a a
11 11
22 22
1
2
### Issue #399, truncate partitioned table is now unimplemented ### Issue #399, truncate partitioned table is now unimplemented
create or replace table t (a int) create or replace table t (a int)
with system versioning with system versioning
...@@ -41,18 +44,18 @@ engine myisam ...@@ -41,18 +44,18 @@ engine myisam
partition by system_time ( partition by system_time (
partition p0 history, partition p0 history,
partition pn current); partition pn current);
truncate table t to system_time current_timestamp; delete history from t before system_time current_timestamp;
ERROR 42000: The used command is not allowed with this MariaDB version ERROR 42000: The used command is not allowed with this MariaDB version
create or replace table t (i int) with system versioning; create or replace table t (i int) with system versioning;
truncate t to system_time now(); delete history from t before system_time now();
create or replace view v as select * from t; create or replace view v as select * from t;
truncate v to system_time now(); delete history from v before system_time now();
ERROR HY000: TRUNCATE table_name TO doesn't work with VIEWs ERROR HY000: TRUNCATE table_name TO doesn't work with VIEWs
create or replace table t (i int); create or replace table t (i int);
truncate t to system_time now(); delete history from t before system_time now();
ERROR HY000: System versioning required: t ERROR HY000: System versioning required: t
create or replace view v as select * from t; create or replace view v as select * from t;
truncate v to system_time now(); delete history from v before system_time now();
ERROR HY000: TRUNCATE table_name TO doesn't work with VIEWs ERROR HY000: TRUNCATE table_name TO doesn't work with VIEWs
drop table t; drop table t;
drop view v; drop view v;
...@@ -10,7 +10,7 @@ connection user1; ...@@ -10,7 +10,7 @@ connection user1;
show grants; show grants;
Grants for mysqltest_1@localhost Grants for mysqltest_1@localhost
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
truncate mysqltest.t to system_time now(); delete history from mysqltest.t before system_time now();
ERROR 42000: DELETE VERSIONING ROWS command denied to user 'mysqltest_1'@'localhost' for table 't' ERROR 42000: DELETE VERSIONING ROWS command denied to user 'mysqltest_1'@'localhost' for table 't'
connection root; connection root;
grant delete history on mysqltest.* to mysqltest_1@localhost; grant delete history on mysqltest.* to mysqltest_1@localhost;
...@@ -21,7 +21,7 @@ Grants for mysqltest_1@localhost ...@@ -21,7 +21,7 @@ Grants for mysqltest_1@localhost
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
GRANT DELETE VERSIONING ROWS ON `mysqltest`.* TO 'mysqltest_1'@'localhost' GRANT DELETE VERSIONING ROWS ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
GRANT DELETE VERSIONING ROWS ON `mysqltest`.`t` TO 'mysqltest_1'@'localhost' GRANT DELETE VERSIONING ROWS ON `mysqltest`.`t` TO 'mysqltest_1'@'localhost'
truncate mysqltest.t to system_time now(); delete history from mysqltest.t before system_time now();
connection root; connection root;
grant all on *.* to mysqltest_1@localhost; grant all on *.* to mysqltest_1@localhost;
show grants for mysqltest_1@localhost; show grants for mysqltest_1@localhost;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
create table t (a int); create table t (a int);
--error ER_VERSIONING_REQUIRED --error ER_VERSIONING_REQUIRED
truncate t to system_time now(); delete history from t before system_time now();
# TRUNCATE is not DELETE and trigger must not be called. # TRUNCATE is not DELETE and trigger must not be called.
create or replace table t (a int) with system versioning; create or replace table t (a int) with system versioning;
...@@ -11,7 +11,7 @@ update t set a=2; ...@@ -11,7 +11,7 @@ update t set a=2;
set @test = 'correct'; set @test = 'correct';
create trigger trg_before before delete on t for each row set @test = 'incorrect'; create trigger trg_before before delete on t for each row set @test = 'incorrect';
create trigger trg_after after delete on t for each row set @test = 'incorrect'; create trigger trg_after after delete on t for each row set @test = 'incorrect';
truncate t to system_time now(6); delete history from t before system_time now(6);
select @test from t; select @test from t;
drop table t; drop table t;
...@@ -23,9 +23,9 @@ set @ts1=now(6); ...@@ -23,9 +23,9 @@ set @ts1=now(6);
--real_sleep 0.01 --real_sleep 0.01
update t set a=22 where a=2; update t set a=22 where a=2;
select * from t for system_time all; select * from t for system_time all;
truncate t to system_time timestamp @ts1; delete history from t before system_time timestamp @ts1;
select * from t for system_time all; select * from t for system_time all;
truncate table t to system_time timestamp now(6); delete history from t before system_time timestamp now(6);
select * from t for system_time all; select * from t for system_time all;
--echo ### Issue #399, truncate partitioned table is now unimplemented --echo ### Issue #399, truncate partitioned table is now unimplemented
...@@ -38,20 +38,20 @@ partition by system_time ( ...@@ -38,20 +38,20 @@ partition by system_time (
partition pn current); partition pn current);
--error ER_NOT_ALLOWED_COMMAND --error ER_NOT_ALLOWED_COMMAND
truncate table t to system_time current_timestamp; delete history from t before system_time current_timestamp;
create or replace table t (i int) with system versioning; create or replace table t (i int) with system versioning;
truncate t to system_time now(); delete history from t before system_time now();
create or replace view v as select * from t; create or replace view v as select * from t;
--error ER_VERS_TRUNCATE_TO_VIEW --error ER_VERS_TRUNCATE_TO_VIEW
truncate v to system_time now(); delete history from v before system_time now();
create or replace table t (i int); create or replace table t (i int);
--error ER_VERSIONING_REQUIRED --error ER_VERSIONING_REQUIRED
truncate t to system_time now(); delete history from t before system_time now();
create or replace view v as select * from t; create or replace view v as select * from t;
--error ER_VERS_TRUNCATE_TO_VIEW --error ER_VERS_TRUNCATE_TO_VIEW
truncate v to system_time now(); delete history from v before system_time now();
drop table t; drop table t;
drop view v; drop view v;
...@@ -23,7 +23,7 @@ create table mysqltest.t (a int) with system versioning; ...@@ -23,7 +23,7 @@ create table mysqltest.t (a int) with system versioning;
connection user1; connection user1;
show grants; show grants;
--error ER_TABLEACCESS_DENIED_ERROR --error ER_TABLEACCESS_DENIED_ERROR
truncate mysqltest.t to system_time now(); delete history from mysqltest.t before system_time now();
connection root; connection root;
grant delete history on mysqltest.* to mysqltest_1@localhost; grant delete history on mysqltest.* to mysqltest_1@localhost;
...@@ -31,7 +31,7 @@ grant delete history on mysqltest.t to mysqltest_1@localhost; ...@@ -31,7 +31,7 @@ grant delete history on mysqltest.t to mysqltest_1@localhost;
connection user1; connection user1;
show grants; show grants;
truncate mysqltest.t to system_time now(); delete history from mysqltest.t before system_time now();
connection root; connection root;
grant all on *.* to mysqltest_1@localhost; grant all on *.* to mysqltest_1@localhost;
......
...@@ -9409,10 +9409,18 @@ bool update_precheck(THD *thd, TABLE_LIST *tables) ...@@ -9409,10 +9409,18 @@ bool update_precheck(THD *thd, TABLE_LIST *tables)
bool delete_precheck(THD *thd, TABLE_LIST *tables) bool delete_precheck(THD *thd, TABLE_LIST *tables)
{ {
DBUG_ENTER("delete_precheck"); DBUG_ENTER("delete_precheck");
if (check_one_table_access(thd, DELETE_ACL, tables)) if (tables->vers_conditions)
DBUG_RETURN(TRUE); {
/* Set privilege for the WHERE clause */ if (check_one_table_access(thd, DELETE_HISTORY_ACL, tables))
tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege); DBUG_RETURN(TRUE);
}
else
{
if (check_one_table_access(thd, DELETE_ACL, tables))
DBUG_RETURN(TRUE);
/* Set privilege for the WHERE clause */
tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege);
}
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
......
...@@ -496,13 +496,6 @@ bool Sql_cmd_truncate_table::execute(THD *thd) ...@@ -496,13 +496,6 @@ bool Sql_cmd_truncate_table::execute(THD *thd)
TABLE_LIST *table= thd->lex->select_lex.table_list.first; TABLE_LIST *table= thd->lex->select_lex.table_list.first;
DBUG_ENTER("Sql_cmd_truncate_table::execute"); DBUG_ENTER("Sql_cmd_truncate_table::execute");
if (table->vers_conditions)
{
if (check_one_table_access(thd, DELETE_HISTORY_ACL, table))
DBUG_RETURN(res);
DBUG_RETURN(mysql_delete(thd, table, NULL, NULL, -1, 0, NULL));
}
if (check_one_table_access(thd, DROP_ACL, table)) if (check_one_table_access(thd, DROP_ACL, table))
DBUG_RETURN(res); DBUG_RETURN(res);
......
...@@ -892,10 +892,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ...@@ -892,10 +892,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%parse-param { THD *thd } %parse-param { THD *thd }
%lex-param { THD *thd } %lex-param { THD *thd }
/* /*
Currently there are 122 shift/reduce conflicts. Currently there are 123 shift/reduce conflicts.
We should not introduce new conflicts any more. We should not introduce new conflicts any more.
*/ */
%expect 122 %expect 123
/* /*
Comments for TOKENS. Comments for TOKENS.
...@@ -13404,10 +13404,20 @@ delete: ...@@ -13404,10 +13404,20 @@ delete:
lex->ignore= 0; lex->ignore= 0;
lex->select_lex.init_order(); lex->select_lex.init_order();
} }
opt_delete_options single_multi delete_part2
;
delete_part2:
opt_delete_options single_multi {}
| HISTORY_SYM delete_single_table
BEFORE_SYM SYSTEM_TIME_SYM opt_trans_or_timestamp simple_expr
{
Lex->vers_conditions.init(SYSTEM_TIME_BEFORE, $5, $6);
Lex->last_table()->vers_conditions= Lex->vers_conditions;
}
; ;
single_multi: delete_single_table:
FROM table_ident opt_use_partition FROM table_ident opt_use_partition
{ {
if (!Select->add_table_to_list(thd, $2, NULL, TL_OPTION_UPDATING, if (!Select->add_table_to_list(thd, $2, NULL, TL_OPTION_UPDATING,
...@@ -13419,8 +13429,13 @@ single_multi: ...@@ -13419,8 +13429,13 @@ single_multi:
YYPS->m_lock_type= TL_READ_DEFAULT; YYPS->m_lock_type= TL_READ_DEFAULT;
YYPS->m_mdl_type= MDL_SHARED_READ; YYPS->m_mdl_type= MDL_SHARED_READ;
} }
opt_where_clause opt_order_clause ;
delete_limit_clause {}
single_multi:
delete_single_table
opt_where_clause
opt_order_clause
delete_limit_clause
opt_select_expressions {} opt_select_expressions {}
| table_wild_list | table_wild_list
{ {
...@@ -13501,15 +13516,6 @@ opt_delete_option: ...@@ -13501,15 +13516,6 @@ opt_delete_option:
| IGNORE_SYM { Lex->ignore= 1; } | IGNORE_SYM { Lex->ignore= 1; }
; ;
truncate_end:
opt_lock_wait_timeout
| TO_SYM SYSTEM_TIME_SYM opt_trans_or_timestamp simple_expr
{
Lex->vers_conditions.init(SYSTEM_TIME_BEFORE, $3, $4);
Lex->last_table()->vers_conditions= Lex->vers_conditions;
}
;
truncate: truncate:
TRUNCATE_SYM TRUNCATE_SYM
{ {
...@@ -13522,7 +13528,7 @@ truncate: ...@@ -13522,7 +13528,7 @@ truncate:
YYPS->m_lock_type= TL_WRITE; YYPS->m_lock_type= TL_WRITE;
YYPS->m_mdl_type= MDL_EXCLUSIVE; YYPS->m_mdl_type= MDL_EXCLUSIVE;
} }
opt_table_sym table_name truncate_end opt_table_sym table_name opt_lock_wait_timeout
{ {
LEX* lex= thd->lex; LEX* lex= thd->lex;
DBUG_ASSERT(!lex->m_sql_cmd); DBUG_ASSERT(!lex->m_sql_cmd);
......
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