create table t (id int, s date, e date, period for apptime(s,e));
insert into t values(1, '1999-01-01', '2018-12-12');
insert into t values(1, '1999-01-01', '2017-01-01');
insert into t values(1, '2017-01-01', '2019-01-01');
insert into t values(2, '1998-01-01', '2018-12-12');
insert into t values(3, '1997-01-01', '2015-01-01');
insert into t values(4, '2016-01-01', '2020-01-01');
insert into t values(5, '2010-01-01', '2015-01-01');
create orreplace table t1 (id int, s date, e date, period for apptime(s,e));
insert t1 select * from t;
create orreplace table t2 (id int, s date, e date, period for apptime(s,e));
insert t2 select * from t;
create orreplace table t3 (id int, s date, e date, period for apptime(s,e));
insert t3 select * from t;
create orreplace table log_tbl(id int auto_increment primary key, log text) engine=myisam;
create orreplace procedure log(s text)
insert into log_tbl(log) values(s);
create trigger tr1upd_t1 before update on t1
for each row call log(CONCAT('>UPD: ', old.id, ", ", old.s, ", ", old.e, ' -> ', new.id, ", ", new.s, ", ", new.e));
create trigger tr2upd_t1 after update on t1
for each row call log(CONCAT('<UPD: ', old.id, ", ", old.s, ", ", old.e, ' -> ', new.id, ", ", new.s, ", ", new.e));
create trigger tr1del_t1 before delete on t1
for each row call log(CONCAT('>DEL: ', old.id, ", ", old.s, ", ", old.e));
create trigger tr2del_t1 after delete on t1
for each row call log(CONCAT('<DEL: ', old.id, ", ", old.s, ", ", old.e));
create trigger tr1ins_t1 before insert on t1
for each row call log(CONCAT('>INS: ', new.id, ", ", new.s, ", ", new.e));
create trigger tr2ins_t1 after insert on t1
for each row call log(CONCAT('<INS: ', new.id, ", ", new.s, ", ", new.e));
delete from t for portion of apptime from '2000-01-01' to '2018-01-01';
delete from t1 for portion of APPTIME from '2000-01-01' to '2018-01-01';
select * from t;
id s e 11999-01-012000-01-01 11999-01-012000-01-01 12018-01-012018-12-12 12018-01-012019-01-01 21998-01-012000-01-01 22018-01-012018-12-12 31997-01-012000-01-01 42018-01-012020-01-01
select * from t1;
id s e 11999-01-012000-01-01 11999-01-012000-01-01 12018-01-012018-12-12 12018-01-012019-01-01 21998-01-012000-01-01 22018-01-012018-12-12 31997-01-012000-01-01 42018-01-012020-01-01
select * from log_tbl order by id;
id log 1 >DEL: 1, 1999-01-01, 2018-12-12 2 >INS: 1, 1999-01-01, 2000-01-01 3 <INS: 1, 1999-01-01, 2000-01-01 4 >INS: 1, 2018-01-01, 2018-12-12 5 <INS: 1, 2018-01-01, 2018-12-12 6 <DEL: 1, 1999-01-01, 2018-12-12 7 >DEL: 1, 1999-01-01, 2017-01-01 8 >INS: 1, 1999-01-01, 2000-01-01 9 <INS: 1, 1999-01-01, 2000-01-01 10 <DEL: 1, 1999-01-01, 2017-01-01 11 >DEL: 1, 2017-01-01, 2019-01-01 12 >INS: 1, 2018-01-01, 2019-01-01 13 <INS: 1, 2018-01-01, 2019-01-01 14 <DEL: 1, 2017-01-01, 2019-01-01 15 >DEL: 2, 1998-01-01, 2018-12-12 16 >INS: 2, 1998-01-01, 2000-01-01 17 <INS: 2, 1998-01-01, 2000-01-01 18 >INS: 2, 2018-01-01, 2018-12-12 19 <INS: 2, 2018-01-01, 2018-12-12 20 <DEL: 2, 1998-01-01, 2018-12-12 21 >DEL: 3, 1997-01-01, 2015-01-01 22 >INS: 3, 1997-01-01, 2000-01-01 23 <INS: 3, 1997-01-01, 2000-01-01 24 <DEL: 3, 1997-01-01, 2015-01-01 25 >DEL: 4, 2016-01-01, 2020-01-01 26 >INS: 4, 2018-01-01, 2020-01-01 27 <INS: 4, 2018-01-01, 2020-01-01 28 <DEL: 4, 2016-01-01, 2020-01-01 29 >DEL: 5, 2010-01-01, 2015-01-01 30 <DEL: 5, 2010-01-01, 2015-01-01
# INSERT trigger only also works
create orreplace table log_tbl(id int auto_increment primary key, log text) engine=myisam;
create orreplace procedure log(s text)
insert into log_tbl(log) values(s);
create trigger tr1upd_t2 before update on t2
for each row call log(CONCAT('>UPD: ', old.id, ", ", old.s, ", ", old.e, ' -> ', new.id, ", ", new.s, ", ", new.e));
create trigger tr2upd_t2 after update on t2
for each row call log(CONCAT('<UPD: ', old.id, ", ", old.s, ", ", old.e, ' -> ', new.id, ", ", new.s, ", ", new.e));
create trigger tr1del_t2 before delete on t2
for each row call log(CONCAT('>DEL: ', old.id, ", ", old.s, ", ", old.e));
create trigger tr2del_t2 after delete on t2
for each row call log(CONCAT('<DEL: ', old.id, ", ", old.s, ", ", old.e));
create trigger tr1ins_t2 before insert on t2
for each row call log(CONCAT('>INS: ', new.id, ", ", new.s, ", ", new.e));
create trigger tr2ins_t2 after insert on t2
for each row call log(CONCAT('<INS: ', new.id, ", ", new.s, ", ", new.e));
drop trigger tr1del_t2;
drop trigger tr2del_t2;
delete from t2 for portion of APPTIME from '2000-01-01' to '2018-01-01';
select * from log_tbl order by id;
id log 1 >INS: 1, 1999-01-01, 2000-01-01 2 <INS: 1, 1999-01-01, 2000-01-01 3 >INS: 1, 2018-01-01, 2018-12-12 4 <INS: 1, 2018-01-01, 2018-12-12 5 >INS: 1, 1999-01-01, 2000-01-01 6 <INS: 1, 1999-01-01, 2000-01-01 7 >INS: 1, 2018-01-01, 2019-01-01 8 <INS: 1, 2018-01-01, 2019-01-01 9 >INS: 2, 1998-01-01, 2000-01-01 10 <INS: 2, 1998-01-01, 2000-01-01 11 >INS: 2, 2018-01-01, 2018-12-12 12 <INS: 2, 2018-01-01, 2018-12-12 13 >INS: 3, 1997-01-01, 2000-01-01 14 <INS: 3, 1997-01-01, 2000-01-01 15 >INS: 4, 2018-01-01, 2020-01-01 16 <INS: 4, 2018-01-01, 2020-01-01
# removing BEFORE INSERT trigger enables internal substitution
# DELETE+INSERT -> UPDATE, but without any side effects.
# The optimization is disabled for non-transactional engines
create orreplace table log_tbl(id int auto_increment primary key, log text) engine=myisam;
create orreplace procedure log(s text)
insert into log_tbl(log) values(s);
create trigger tr1upd_t3 before update on t3
for each row call log(CONCAT('>UPD: ', old.s, ", ", old.e, ' -> ', new.s, ", ", new.e));
create trigger tr2upd_t3 after update on t3
for each row call log(CONCAT('<UPD: ', old.s, ", ", old.e, ' -> ', new.s, ", ", new.e));
create trigger tr1del_t3 before delete on t3
for each row call log(CONCAT('>DEL: ', old.s, ", ", old.e));
create trigger tr2del_t3 after delete on t3
for each row call log(CONCAT('<DEL: ', old.s, ", ", old.e));
create trigger tr1ins_t3 before insert on t3
for each row call log(CONCAT('>INS: ', new.s, ", ", new.e));
create trigger tr2ins_t3 after insert on t3
for each row call log(CONCAT('<INS: ', new.s, ", ", new.e));
drop trigger tr1ins_t3;
delete from t3 for portion of APPTIME from '2000-01-01' to '2018-01-01';
select * from log_tbl order by id;
id log 1 >DEL: 1999-01-01, 2018-12-12 2 <INS: 1999-01-01, 2000-01-01 3 <INS: 2018-01-01, 2018-12-12 4 <DEL: 1999-01-01, 2018-12-12 5 >DEL: 1999-01-01, 2017-01-01 6 <INS: 1999-01-01, 2000-01-01 7 <DEL: 1999-01-01, 2017-01-01 8 >DEL: 2017-01-01, 2019-01-01 9 <INS: 2018-01-01, 2019-01-01 10 <DEL: 2017-01-01, 2019-01-01 11 >DEL: 1998-01-01, 2018-12-12 12 <INS: 1998-01-01, 2000-01-01 13 <INS: 2018-01-01, 2018-12-12 14 <DEL: 1998-01-01, 2018-12-12 15 >DEL: 1997-01-01, 2015-01-01 16 <INS: 1997-01-01, 2000-01-01 17 <DEL: 1997-01-01, 2015-01-01 18 >DEL: 2016-01-01, 2020-01-01 19 <INS: 2018-01-01, 2020-01-01 20 <DEL: 2016-01-01, 2020-01-01 21 >DEL: 2010-01-01, 2015-01-01 22 <DEL: 2010-01-01, 2015-01-01
# multi-table DELETE is not possible
delete t, t1 from t1, t for portion of apptime from '2000-01-01' to '2018-01-01'; ERROR42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'for portion of apptime from '2000-01-01' to '2018-01-01'' at line 1
delete t for portion of apptime from '2000-01-01' to '2018-01-01', t1 from t, t1; ERROR42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'for portion of apptime from '2000-01-01' to '2018-01-01', t1 from t, t1' at line 1
# Here another check fails before parsing ends
delete t, t1 from t for portion of apptime from '2000-01-01' to '2018-01-01', t1; ERROR42S02: Unknown table 't1' in MULTI DELETE
delete history from t2 for portion of apptime from '2000-01-01' to '2018-01-01'; ERROR42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'for portion of apptime from '2000-01-01' to '2018-01-01'' at line 1
delete from t for portion of othertime from '2000-01-01' to '2018-01-01'; ERROR HY000: Period `othertime` is not found in table
delete from t for portion of system_time from '2000-01-01' to '2018-01-01'; ERROR42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'of system_time from '2000-01-01' to '2018-01-01'' at line 1
# MDEV-22596 DELETE FOR PORTION does not obey
# "Expression in FOR PORTION OF must be constant" limitation, data can be easily lost
delete from t for portion of apptime from s to e; ERROR HY000: Expression in FOR PORTION OF must be constant
create orreplace table t (id int, str text, s date, e date,
period for apptime(s,e));
insert into t values(1, 'data', '1999-01-01', '2018-12-12');
insert into t values(1, 'other data', '1999-01-01', '2018-12-12');
insert into t values(1, 'deleted', '2000-01-01', '2018-01-01');
delete from t for portion of apptime from '2000-01-01' to '2018-01-01';
show warnings;
Level Code Message
select * from t;
id str s e 1 data 1999-01-012000-01-01 1 data 2018-01-012018-12-12 1 other data 1999-01-012000-01-01 1 other data 2018-01-012018-12-12
drop table t1;
# SQL16, Part 2, 15.7 <Effect of deleting rows from base tables>,
# General rules, 8)b)i)
# If the column descriptor that corresponds to the i-th field of BR
# describes an identity column, a generated column, a system-time period
# start column, or a system-time period end column, then let V i be
# DEFAULT.
# auto_increment field is updated
create orreplace table t (id int primary key auto_increment, s date, e date,
period for apptime(s, e));
insert into t values (default, '1999-01-01', '2018-12-12');
select * from t;
id s e 11999-01-012018-12-12
delete from t for portion of apptime from '2000-01-01' to '2018-01-01';
select * from t;
id s e 21999-01-012000-01-01 32018-01-012018-12-12
truncate t;
# same for trigger case
insert into t values (default, '1999-01-01', '2018-12-12');
create orreplace table log_tbl(id int auto_increment primary key, log text) engine=myisam;
create orreplace procedure log(s text)
insert into log_tbl(log) values(s);
create trigger tr1upd_t before update on t
for each row call log(CONCAT('>UPD: ', old.s, ", ", old.e, ' -> ', new.s, ", ", new.e));
create trigger tr2upd_t after update on t
for each row call log(CONCAT('<UPD: ', old.s, ", ", old.e, ' -> ', new.s, ", ", new.e));
create trigger tr1del_t before delete on t
for each row call log(CONCAT('>DEL: ', old.s, ", ", old.e));
create trigger tr2del_t after delete on t
for each row call log(CONCAT('<DEL: ', old.s, ", ", old.e));
create trigger tr1ins_t before insert on t
for each row call log(CONCAT('>INS: ', new.s, ", ", new.e));
create trigger tr2ins_t after insert on t
for each row call log(CONCAT('<INS: ', new.s, ", ", new.e));
delete from t for portion of apptime from '2000-01-01' to '2018-01-01';
select * from t;
id s e 21999-01-012000-01-01 32018-01-012018-12-12
select * from log_tbl order by id;
id log 1 >DEL: 1999-01-01, 2018-12-12 2 >INS: 1999-01-01, 2000-01-01 3 <INS: 1999-01-01, 2000-01-01 4 >INS: 2018-01-01, 2018-12-12 5 <INS: 2018-01-01, 2018-12-12 6 <DEL: 1999-01-01, 2018-12-12
# generated columns are updated
create orreplace table t (s date, e date,
xs date as (s) stored, xe date as (e) stored,
period for apptime(s, e));
insert into t values('1999-01-01', '2018-12-12', default, default);
select * from t;
s e xs xe 1999-01-012018-12-121999-01-012018-12-12
delete from t for portion of apptime from '2000-01-01' to '2018-01-01';
select * from t;
s e xs xe 1999-01-012000-01-011999-01-012000-01-01 2018-01-012018-12-122018-01-012018-12-12
truncate t;
# same for trigger case
insert into t values('1999-01-01', '2018-12-12', default, default);
create orreplace table log_tbl(id int auto_increment primary key, log text) engine=myisam;
create orreplace procedure log(s text)
insert into log_tbl(log) values(s);
create trigger tr1upd_t before update on t
for each row call log(CONCAT('>UPD: ', old.s, ", ", old.e, ' -> ', new.s, ", ", new.e));
create trigger tr2upd_t after update on t
for each row call log(CONCAT('<UPD: ', old.s, ", ", old.e, ' -> ', new.s, ", ", new.e));
create trigger tr1del_t before delete on t
for each row call log(CONCAT('>DEL: ', old.s, ", ", old.e));
create trigger tr2del_t after delete on t
for each row call log(CONCAT('<DEL: ', old.s, ", ", old.e));
create trigger tr1ins_t before insert on t
for each row call log(CONCAT('>INS: ', new.s, ", ", new.e));
create trigger tr2ins_t after insert on t
for each row call log(CONCAT('<INS: ', new.s, ", ", new.e));
delete from t for portion of apptime from '2000-01-01' to '2018-01-01';
select * from t;
s e xs xe 1999-01-012000-01-011999-01-012000-01-01 2018-01-012018-12-122018-01-012018-12-12
select * from log_tbl order by id;
id log 1 >DEL: 1999-01-01, 2018-12-12 2 >INS: 1999-01-01, 2000-01-01 3 <INS: 1999-01-01, 2000-01-01 4 >INS: 2018-01-01, 2018-12-12 5 <INS: 2018-01-01, 2018-12-12 6 <DEL: 1999-01-01, 2018-12-12
# View can't be used
create orreplace view v as select * from t;
delete from v for portion of p from '2000-01-01' to '2018-01-01'; ERROR42S02: 'v' is a view
# View can't be used
create orreplace view v as select t.* from t, t as t1;
delete from v for portion of p from '2000-01-01' to '2018-01-01'; ERROR HY000: Can not delete from join view 'test.v'
# auto_increment field overflow
create orreplace table t (id tinyint auto_increment primary key,
s date, e date, period for apptime(s,e));
insert into t values(127, '1999-01-01', '2018-12-12');
delete from t for portion of apptime from '2000-01-01' to '2018-01-01'; ERROR22003: Out of range value for column 'id' at row 1
select * from t;
id s e 1271999-01-012018-12-12
# same for trigger case
create orreplace table log_tbl(id int auto_increment primary key, log text) engine=myisam;
create orreplace procedure log(s text)
insert into log_tbl(log) values(s);
create trigger tr1upd_t before update on t
for each row call log(CONCAT('>UPD: ', old.s, ", ", old.e, ' -> ', new.s, ", ", new.e));
create trigger tr2upd_t after update on t
for each row call log(CONCAT('<UPD: ', old.s, ", ", old.e, ' -> ', new.s, ", ", new.e));
create trigger tr1del_t before delete on t
for each row call log(CONCAT('>DEL: ', old.s, ", ", old.e));
create trigger tr2del_t after delete on t
for each row call log(CONCAT('<DEL: ', old.s, ", ", old.e));
create trigger tr1ins_t before insert on t
for each row call log(CONCAT('>INS: ', new.s, ", ", new.e));
create trigger tr2ins_t after insert on t
for each row call log(CONCAT('<INS: ', new.s, ", ", new.e));
# negotiate side effects of non-transactional MyISAM engine replace into t values(127, '1999-01-01', '2018-12-12');
select * from t;
id s e 1271999-01-012018-12-12
truncate table log_tbl;
delete from t for portion of apptime from '2000-01-01' to '2018-01-01'; ERROR22003: Out of range value for column 'id' at row 1
select * from t;
id s e 1271999-01-012018-12-12
select * from log_tbl order by id;
id log 1 >DEL: 1999-01-01, 2018-12-12
# custom constraint for period fields
create orreplace table t(id int, s date, e date, period for apptime(s,e),
constraint dist2days check (datediff(e, s) >= 2));
insert into t values(1, '1999-01-01', '2018-12-12'),
(2, '1999-01-01', '1999-12-12');
delete from t for portion of apptime from '1999-01-02' to '2018-12-12'; ERROR23000: CONSTRAINT `dist2days` failed for `test`.`t`
# negotiate side effects of non-transactional MyISAM engine
truncate t;
insert into t values(1, '1999-01-01', '2018-12-12'),
(2, '1999-01-01', '1999-12-12');
delete from t for portion of apptime from '1999-01-01' to '2018-12-11'; ERROR23000: CONSTRAINT `dist2days` failed for `test`.`t`
truncate t;
insert into t values(1, '1999-01-01', '2018-12-12'),
(2, '1999-01-01', '1999-12-12');
delete from t for portion of apptime from '1999-01-03' to '2018-12-10';
select *, datediff(e, s) from t;
id s e datediff(e, s) 11999-01-011999-01-032 12018-12-102018-12-122 21999-01-011999-01-032
#
# MDEV-189292nd execution of SP does not detect ER_VERS_NOT_VERSIONED
#
create orreplace table t1 (id int, s date, e date, period for apptime(s,e));
create orreplace procedure sp()
delete from t1 for portion of othertime from '2000-01-01' to '2018-01-01';
call sp; ERROR HY000: Period `othertime` is not found in table
call sp; ERROR HY000: Period `othertime` is not found in table
drop table t1;
drop procedure sp;
drop table t,t2,t3,log_tbl;
drop view v;
drop procedure log;
# MDEV-19130 Assertion
# `next_insert_id >= auto_inc_interval_for_cur_row.minimum()'
# failed in handler::update_auto_increment after error167
create orreplace table t (f tinyint auto_increment null,
s timestamp, e timestamp,
period for app(s,e), key(f, s));
insert into t (s,e) values
('2021-08-22 10:28:43', '2023-09-17 00:00:00'),
('2019-05-09 21:45:24', '2020-04-22 14:38:49');
insert into t (s,e) select s,e from t;
insert into t (s,e) select s,e from t;
insert into t (s,e) select s,e from t;
insert into t (s,e) values ('2015-07-07 00:00:00','2020-03-11 08:48:52');
insert into t (s,e) select s,e from t;
insert into t (s,e) select s,e from t;
insert into t select * from t; ERROR22003: Out of range value for column 'f' at row ROW
delete ignore from t
for portion of app from '2015-07-07 00:00:00' to '2020-03-11 08:48:52';
drop table t;
create table t1 (pk int, s date, e date, period for se (s,e), primary key (pk,se without overlaps));
insert into t1 values (1,'2020-01-01','2020-02-20');
delete from t1 for portion of se from '2020-01-30' to '2020-01-31';
drop table t1;
# End of 10.5 tests
#
# MDEV-19190 Assertion `part_share->auto_inc_initialized` failed in
# ha_partition::get_auto_increment
#
create table t1 (id int, s date, e date, period for app(s,e))
partition by key(id);
insert into t1 (s,e) values ('2023-07-21','2024-06-07');
alter table t1 modify id int auto_increment key;
delete from t1 for portion of app from '2023-07-20' to '2024-05-23';
select * from t1;
id s e 22024-05-232024-06-07
drop table t1;
create table t1 (id int, s date, e date, period for app(s,e))
partition by key(id);
insert into t1 (s,e) values ('2023-07-21','2024-06-07');
alter table t1 modify id int auto_increment key;
delete from t1 for portion of app from '2023-07-20' to '2024-05-23';
select * from t1;
id s e 22024-05-232024-06-07
drop table t1;
drop table log_tbl;
drop procedure log;
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-10-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.