From d70bb5e64e798672eab1eadc70e2940e32a9478e Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Sun, 22 Oct 2017 22:20:43 +0300 Subject: [PATCH] SQL: delete from VIEW [fixes #291] --- mysql-test/suite/versioning/r/delete.result | 53 ++++++++++++++------- mysql-test/suite/versioning/t/delete.test | 20 +++++--- sql/sql_delete.cc | 7 ++- 3 files changed, 57 insertions(+), 23 deletions(-) diff --git a/mysql-test/suite/versioning/r/delete.result b/mysql-test/suite/versioning/r/delete.result index 910d99c8643..0e9989cda4e 100644 --- a/mysql-test/suite/versioning/r/delete.result +++ b/mysql-test/suite/versioning/r/delete.result @@ -104,14 +104,18 @@ fields, " < '2038-01-19 03:14:07' and timestamp '2038-01-19 04:14:07'"); prepare stmt from @str; execute stmt; delete from t1 where XNo = 0; +select "Deleted 0"; execute stmt; delete from t1 where XNo = 1; +select "Deleted 1"; execute stmt; delete from t1 where XNo > 5; +select "Deleted >5"; create view vt1 as select XNo from t1; -select XNo from vt1; +select XNo as XNo_vt1 from vt1; delete from vt1 where XNo = 3; -select XNo from vt1; +select "Deleted from VIEW 3"; +select XNo as XNo_vt1 from vt1; execute stmt; drop prepare stmt; drop view vt1; drop table t1; @@ -180,6 +184,8 @@ XNo sys_end < '2038-01-19 03:14:07' 7 0 8 0 9 0 +Deleted 0 +Deleted 0 XNo sys_end < '2038-01-19 03:14:07' 0 1 1 0 @@ -191,6 +197,8 @@ XNo sys_end < '2038-01-19 03:14:07' 7 0 8 0 9 0 +Deleted 1 +Deleted 1 XNo sys_end < '2038-01-19 03:14:07' 0 1 1 1 @@ -202,12 +210,16 @@ XNo sys_end < '2038-01-19 03:14:07' 7 0 8 0 9 0 -XNo +Deleted >5 +Deleted >5 +XNo_vt1 2 3 4 5 -XNo +Deleted from VIEW 3 +Deleted from VIEW 3 +XNo_vt1 2 4 5 @@ -234,6 +246,8 @@ XNo vtq_commit_ts(sys_end) < '2038-01-19 03:14:07' 7 0 8 0 9 0 +Deleted 0 +Deleted 0 XNo vtq_commit_ts(sys_end) < '2038-01-19 03:14:07' 0 1 1 0 @@ -245,6 +259,8 @@ XNo vtq_commit_ts(sys_end) < '2038-01-19 03:14:07' 7 0 8 0 9 0 +Deleted 1 +Deleted 1 XNo vtq_commit_ts(sys_end) < '2038-01-19 03:14:07' 0 1 1 1 @@ -256,12 +272,16 @@ XNo vtq_commit_ts(sys_end) < '2038-01-19 03:14:07' 7 0 8 0 9 0 -XNo +Deleted >5 +Deleted >5 +XNo_vt1 2 3 4 5 -XNo +Deleted from VIEW 3 +Deleted from VIEW 3 +XNo_vt1 2 4 5 @@ -362,13 +382,14 @@ No A B C D 2 1 1 1 1 3 1 1 1 1 4 1 1 1 1 -drop procedure test_01; -drop procedure test_02; -drop procedure test_03; -drop procedure verify_vtq; -drop procedure innodb_verify_vtq; -drop function default_engine; -drop function sys_commit_ts; -drop function sys_datatype; -drop procedure concat_exec2; -drop procedure concat_exec3; +# Update + delete +create or replace table t1 (x int) with system versioning; +insert into t1 values (1); +update t1 set x= 2; +delete from t1; +select x from t1 for system_time all; +x +2 +1 +drop database test; +create database test; diff --git a/mysql-test/suite/versioning/t/delete.test b/mysql-test/suite/versioning/t/delete.test index 1830f512b88..5af0f4a6913 100644 --- a/mysql-test/suite/versioning/t/delete.test +++ b/mysql-test/suite/versioning/t/delete.test @@ -32,14 +32,18 @@ begin and timestamp '2038-01-19 04:14:07'"); prepare stmt from @str; execute stmt; delete from t1 where XNo = 0; + select "Deleted 0"; execute stmt; delete from t1 where XNo = 1; + select "Deleted 1"; execute stmt; delete from t1 where XNo > 5; + select "Deleted >5"; create view vt1 as select XNo from t1; - select XNo from vt1; + select XNo as XNo_vt1 from vt1; delete from vt1 where XNo = 3; - select XNo from vt1; + select "Deleted from VIEW 3"; + select XNo as XNo_vt1 from vt1; execute stmt; drop prepare stmt; drop view vt1; drop table t1; @@ -114,8 +118,12 @@ call test_03('timestamp(6)', 'myisam', 'sys_end'); call test_03('bigint unsigned', 'innodb', 'vtq_commit_ts(sys_end)'); call verify_vtq; -drop procedure test_01; -drop procedure test_02; -drop procedure test_03; +--echo # Update + delete +create or replace table t1 (x int) with system versioning; +insert into t1 values (1); +update t1 set x= 2; +delete from t1; +select x from t1 for system_time all; --- source suite/versioning/common_finish.inc +drop database test; +create database test; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index ae9322ec256..23928af22cc 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -220,7 +220,12 @@ static bool record_should_be_deleted(THD *thd, TABLE *table, SQL_SELECT *sel, if (table->versioned()) { bool row_is_alive= table->vers_end_field()->is_max(); - if (table->pos_in_table_list->vers_conditions ? row_is_alive : !row_is_alive) + /* If we are doing TRUNCATE TABLE with SYSTEM_TIME condition then historical + record is deleted and current record is kept. Otherwise alive record is + deleted and historical record is kept. */ + if ((thd->lex->sql_command == SQLCOM_TRUNCATE && table->pos_in_table_list->vers_conditions) + ? row_is_alive + : !row_is_alive) return false; }