diff options
author | Aleksey Midenkov <midenok@gmail.com> | 2019-12-03 11:53:25 +0300 |
---|---|---|
committer | Aleksey Midenkov <midenok@gmail.com> | 2019-12-03 11:53:25 +0300 |
commit | 9ed8d364cd25207fb3b8c0262982b3c34697ce66 (patch) | |
tree | 1e447baaca102e372d26392c680cfac0e02bf235 | |
parent | 8ed646f0712b8f459439dfcdc3cf4ae45d79ec95 (diff) | |
download | mariadb-git-9ed8d364cd25207fb3b8c0262982b3c34697ce66.tar.gz |
MDEV-17554 history partitioning cleanups
* Fixed missed warning on condition boundary
* REORGANIZE cases
* vers_utils.h removed
* test cases cleanup
-rw-r--r-- | mysql-test/suite/versioning/r/delete_history.result | 12 | ||||
-rw-r--r-- | mysql-test/suite/versioning/r/partition.result | 177 | ||||
-rw-r--r-- | mysql-test/suite/versioning/t/delete_history.test | 11 | ||||
-rw-r--r-- | mysql-test/suite/versioning/t/partition.test | 129 | ||||
-rw-r--r-- | plugin/versioning/versioning.cc | 3 | ||||
-rw-r--r-- | sql/partition_info.cc | 107 | ||||
-rw-r--r-- | sql/partition_info.h | 63 | ||||
-rw-r--r-- | sql/sql_partition.cc | 2 | ||||
-rw-r--r-- | sql/vers_utils.h | 8 | ||||
-rw-r--r-- | storage/innobase/srv/srv0srv.cc | 1 |
10 files changed, 283 insertions, 230 deletions
diff --git a/mysql-test/suite/versioning/r/delete_history.result b/mysql-test/suite/versioning/r/delete_history.result index 46ef271db3d..cb865a835b3 100644 --- a/mysql-test/suite/versioning/r/delete_history.result +++ b/mysql-test/suite/versioning/r/delete_history.result @@ -1,3 +1,4 @@ +call mtr.add_suppression("need more HISTORY partitions"); create table t (a int); delete history from t before system_time now(); ERROR HY000: Table `t` is not system-versioned @@ -56,16 +57,15 @@ select * from t for system_time all; a drop procedure truncate_sp; # Truncate partitioned -create or replace table t (a int) -with system versioning -partition by system_time limit 1 ( -partition p0 history, -partition p1 history, -partition pn current); +create or replace table t (a int) with system versioning +partition by system_time limit 1 partitions 3; insert into t values (1); update t set a= 2; update t set a= 3; delete history from t; +Warnings: +Warning 4114 Versioned table `test`.`t`: last HISTORY partition (`p1`) is out of LIMIT, need more HISTORY partitions +# The above warning is one command late (MDEV-20345) ^^^ select * from t for system_time all; a 3 diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result index 84f31b55775..b028ea13fc5 100644 --- a/mysql-test/suite/versioning/r/partition.result +++ b/mysql-test/suite/versioning/r/partition.result @@ -121,6 +121,28 @@ select x from t1; x 1 2 +# rename works +create or replace table t1 (x int) with system versioning +partition by system_time; +alter table t1 reorganize partition p0 into +(partition custom_name history); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `x` int(11) DEFAULT NULL +) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING + PARTITION BY SYSTEM_TIME +(PARTITION `custom_name` HISTORY ENGINE = DEFAULT_ENGINE, + PARTITION `pn` CURRENT ENGINE = DEFAULT_ENGINE) +# merge and split doesn't (MDEV-19938) +create or replace table t1 (x int) with system versioning +partition by system_time partitions 3; +Warnings: +Warning 4115 Maybe missing parameters: no rotation condition for multiple HISTORY partitions. +alter table t1 reorganize partition p0, p1 into (partition p00 history); +ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers +alter table t1 reorganize partition p1 into (partition p1 history, partition p2 history); +ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers # Bug tempesta-tech/mariadb#260: incorrect IB partitioning warning create or replace table t1 (x int) with system versioning @@ -267,13 +289,6 @@ x 6 7 8 -### Assertion in ALTER on warning from partitioning LIMIT [#446] -create or replace table t1 (x int) with system versioning; -insert into t1 values (1), (2); -delete from t1; -alter table t1 partition by system_time limit 1 ( -partition p1 history, -partition pn current); ## rotation by INTERVAL create or replace table t1 (x int) with system versioning @@ -282,6 +297,47 @@ ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'INTERVAL' create table t1 (i int) with system versioning partition by system_time interval 6 day limit 98; ERROR 42000: 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 'limit 98' at line 2 +create or replace table t1 (pk int) with system versioning +partition by system_time interval 10 year partitions 3; +ERROR 22003: TIMESTAMP value is out of range in 'INTERVAL' +# INTERVAL and ALTER TABLE +create or replace table t1 (i int) with system versioning +partition by system_time interval 1 hour; +set @ts=(select partition_description from information_schema.partitions +where table_schema='test' and table_name='t1' and partition_name='p0'); +alter table t1 add column b int; +select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; +partition_name partition_ordinal_position partition_method timediff(partition_description, @ts) +p0 1 SYSTEM_TIME 00:00:00.000000 +pn 2 SYSTEM_TIME NULL +Warnings: +Warning 1292 Incorrect time value: 'CURRENT' +alter table t1 add partition (partition p1 history, partition p2 history); +select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; +partition_name partition_ordinal_position partition_method timediff(partition_description, @ts) +p0 1 SYSTEM_TIME 00:00:00.000000 +p1 2 SYSTEM_TIME 01:00:00.000000 +p2 3 SYSTEM_TIME 02:00:00.000000 +pn 4 SYSTEM_TIME NULL +Warnings: +Warning 1292 Incorrect time value: 'CURRENT' +alter table t1 drop partition p0; +select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; +partition_name partition_ordinal_position partition_method timediff(partition_description, @ts) +p1 1 SYSTEM_TIME 01:00:00.000000 +p2 2 SYSTEM_TIME 02:00:00.000000 +pn 3 SYSTEM_TIME NULL +Warnings: +Warning 1292 Incorrect time value: 'CURRENT' +alter table t1 drop partition p2; +ERROR HY000: Can only drop oldest partitions when rotating by INTERVAL +select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; +partition_name partition_ordinal_position partition_method timediff(partition_description, @ts) +p1 1 SYSTEM_TIME 01:00:00.000000 +p2 2 SYSTEM_TIME 02:00:00.000000 +pn 3 SYSTEM_TIME NULL +Warnings: +Warning 1292 Incorrect time value: 'CURRENT' ## Subpartitions create or replace table t1 (x int) with system versioning @@ -302,34 +358,34 @@ x delete from t1 where x < 3; delete from t1; delete from t1; +Warnings: +Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out of LIMIT, need more HISTORY partitions select * from t1 partition (p0sp0); x 1 -3 -5 select * from t1 partition (p0sp1); x 2 -4 select * from t1 partition (p1sp0); x +3 +5 select * from t1 partition (p1sp1); x -create or replace table t1 ( -a bigint, -row_start SYS_DATATYPE as row start invisible, -row_end SYS_DATATYPE as row end invisible, -period for system_time(row_start, row_end)) +4 +# check implicit sys fields for implicit engine of partitioned table +create or replace table t1 (a bigint) with system versioning partition by range (a) (partition p0 values less than (20) engine innodb, partition p1 values less than maxvalue engine innodb); insert into t1 values (1); +select * from t1 partition (p0); +a +1 +# check for partition engine create or replace table t1 ( -f_int1 integer default 0, -row_start SYS_DATATYPE as row start invisible, -row_end SYS_DATATYPE as row end invisible, -period for system_time(row_start, row_end) +f_int1 integer default 0 ) with system versioning partition by range(f_int1) subpartition by hash(f_int1) @@ -337,14 +393,27 @@ subpartition by hash(f_int1) (subpartition subpart11 storage engine = 'innodb', subpartition subpart12 storage engine = 'innodb')); insert into t1 values (1); +select * from t1 partition (part1); +f_int1 +1 +# +# Assertion in ALTER on warning from partitioning LIMIT [#446] +# +create or replace table t1 (x int) with system versioning; +insert into t1 values (1), (2); +delete from t1; +alter table t1 partition by system_time limit 1 ( +partition p1 history, +partition pn current); +# +# MDEV-14649 Assertion `t->mysql_col_len == 8' failed in row_insert_for_mysql +# create or replace table t1 (i int) engine=innodb partition by key(i); -alter table t1 -add column row_start SYS_DATATYPE as row start invisible, -add column row_end SYS_DATATYPE as row end invisible, -add period for system_time(row_start, row_end), -add system versioning; +alter table t1 add system versioning; insert into t1 values(); +# # MDEV-14722 Assertion in ha_commit_trans for sub-statement +# create or replace table t1 (i int) with system versioning partition by system_time interval 1 day; create or replace table t2 (f int); @@ -354,7 +423,9 @@ where table_name = 't1' into @a; Warnings: Warning 1287 '<select expression> INTO <destination>;' is deprecated and will be removed in a future release. Please use 'SELECT <select list> INTO <destination> FROM...' instead insert into t2 values (1); +# # MDEV-14740 Locking assertion for system_time partitioning +# create or replace table t1 (i int) with system versioning partition by system_time interval 1 week; create or replace table t2 (f int); @@ -363,14 +434,18 @@ for each row select count(*) from t1 into @a; Warnings: Warning 1287 '<select expression> INTO <destination>;' is deprecated and will be removed in a future release. Please use 'SELECT <select list> INTO <destination> FROM...' instead insert into t2 values (1); +# # MDEV-14747 ALTER PARTITION BY SYSTEM_TIME after LOCK TABLES +# create or replace table t1 (x int) with system versioning; lock table t1 write; alter table t1 partition by system_time interval 1 week ( partition p1 history, partition pn current); unlock tables; +# # MDEV-14748 Assertion in ha_myisammrg::attach_children() +# create or replace table t1 (x int) engine=myisam with system versioning partition by system_time interval 1 month (partition p1 history, partition pn current); create or replace table t2 (x int) engine=myisam; @@ -379,7 +454,9 @@ create or replace table t4 (x int) engine=myisam; create or replace trigger tr after insert on t4 for each row insert into t2 ( select x from t3 ) union ( select x from t1 ); insert into t4 values (1); +# # MDEV-14821 Assertion failure +# create or replace table t1 (x int) with system versioning; insert into t1 values (0), (1); update t1 set x= x + 1; @@ -389,7 +466,11 @@ partition p2 history, partition pn current); delete from t1 where x = 1; delete from t1 where x = 2; +Warnings: +Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p2`) is out of LIMIT, need more HISTORY partitions +# # MDEV-14923 Assertion upon INSERT into locked versioned partitioned table +# create or replace table t1 (x int) with system versioning partition by system_time; lock table t1 write; @@ -397,46 +478,6 @@ alter table t1 add partition (partition p0 history); ERROR HY000: Duplicate partition name p0 insert into t1 values (1); unlock tables; -create or replace table t1 (pk int) with system versioning -partition by system_time interval 10 year partitions 3; -ERROR 22003: TIMESTAMP value is out of range in 'INTERVAL' -create or replace table t1 (i int) with system versioning -partition by system_time interval 1 hour; -set @ts=(select partition_description from information_schema.partitions -where table_schema='test' and table_name='t1' and partition_name='p0'); -alter table t1 add column b int; -select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; -partition_name partition_ordinal_position partition_method timediff(partition_description, @ts) -p0 1 SYSTEM_TIME 00:00:00.000000 -pn 2 SYSTEM_TIME NULL -Warnings: -Warning 1292 Incorrect time value: 'CURRENT' -alter table t1 add partition (partition p1 history, partition p2 history); -select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; -partition_name partition_ordinal_position partition_method timediff(partition_description, @ts) -p0 1 SYSTEM_TIME 00:00:00.000000 -p1 2 SYSTEM_TIME 01:00:00.000000 -p2 3 SYSTEM_TIME 02:00:00.000000 -pn 4 SYSTEM_TIME NULL -Warnings: -Warning 1292 Incorrect time value: 'CURRENT' -alter table t1 drop partition p0; -select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; -partition_name partition_ordinal_position partition_method timediff(partition_description, @ts) -p1 1 SYSTEM_TIME 01:00:00.000000 -p2 2 SYSTEM_TIME 02:00:00.000000 -pn 3 SYSTEM_TIME NULL -Warnings: -Warning 1292 Incorrect time value: 'CURRENT' -alter table t1 drop partition p2; -ERROR HY000: Can only drop oldest partitions when rotating by INTERVAL -select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; -partition_name partition_ordinal_position partition_method timediff(partition_description, @ts) -p1 1 SYSTEM_TIME 01:00:00.000000 -p2 2 SYSTEM_TIME 02:00:00.000000 -pn 3 SYSTEM_TIME NULL -Warnings: -Warning 1292 Incorrect time value: 'CURRENT' # # MDEV-15103 Assertion in ha_partition::part_records() for updating VIEW # @@ -452,7 +493,9 @@ create or replace table t (a int) with system versioning partition by system_time; alter table t drop system versioning; ERROR HY000: Can not DROP SYSTEM VERSIONING for table `t` partitioned BY SYSTEM_TIME +# # MDEV-15191 Assertion `bit < (map)->n_bits' failed in bitmap_is_set upon INSERT +# create or replace table t1 (i int) with system versioning; insert into t1 values (1), (2); update t1 set i= 3; @@ -461,14 +504,18 @@ lock table t1 write; alter table t1 add partition (partition p2 history); insert into t1 values (4); unlock tables; +# # MDEV-15036 Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())' in Diagnostics_area::set_ok_status or unexpected ER_RANGE_NOT_INCREASING_ERROR +# create or replace table t1 (a int) with system versioning partition by system_time limit 2 partitions 4; insert into t1 values (1),(2),(3); update t1 set a = 4; delete from t1; delete from t1 where a is not null; +# # MDEV-14823 Wrong error message upon selecting from a system_time partition +# create or replace table t1 (i int) with system versioning partition by system_time limit 10; select * from t1 partition (p0) for system_time all; ERROR HY000: SYSTEM_TIME partitions in table `t1` does not support historical query @@ -480,7 +527,9 @@ ERROR HY000: SYSTEM_TIME partitions in table `t1` does not support historical qu call sp; ERROR HY000: SYSTEM_TIME partitions in table `t1` does not support historical query drop procedure sp; +# # MDEV-15380 Index for versioned table gets corrupt after partitioning and DELETE +# create or replace table t1 (pk int primary key) engine=myisam with system versioning diff --git a/mysql-test/suite/versioning/t/delete_history.test b/mysql-test/suite/versioning/t/delete_history.test index 07fb4eb187a..fb5c8520bcb 100644 --- a/mysql-test/suite/versioning/t/delete_history.test +++ b/mysql-test/suite/versioning/t/delete_history.test @@ -2,6 +2,8 @@ --source include/have_partition.inc --source suite/versioning/engines.inc +call mtr.add_suppression("need more HISTORY partitions"); + create table t (a int); --error ER_VERS_NOT_VERSIONED delete history from t before system_time now(); @@ -56,16 +58,13 @@ select * from t for system_time all; drop procedure truncate_sp; --echo # Truncate partitioned -create or replace table t (a int) -with system versioning -partition by system_time limit 1 ( - partition p0 history, - partition p1 history, - partition pn current); +create or replace table t (a int) with system versioning +partition by system_time limit 1 partitions 3; insert into t values (1); update t set a= 2; update t set a= 3; delete history from t; +--echo # The above warning is one command late (MDEV-20345) ^^^ select * from t for system_time all; --echo # VIEW diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test index 9fedc4fbf1a..3d8598537d0 100644 --- a/mysql-test/suite/versioning/t/partition.test +++ b/mysql-test/suite/versioning/t/partition.test @@ -123,6 +123,23 @@ alter table t1 drop partition p0; select x from t1; +--echo # rename works +create or replace table t1 (x int) with system versioning +partition by system_time; +alter table t1 reorganize partition p0 into +(partition custom_name history); +--replace_result $default_engine DEFAULT_ENGINE +show create table t1; + +--echo # merge and split doesn't (MDEV-19938) +create or replace table t1 (x int) with system versioning +partition by system_time partitions 3; +--error ER_REORG_HASH_ONLY_ON_SAME_NO +alter table t1 reorganize partition p0, p1 into (partition p00 history); +--error ER_REORG_HASH_ONLY_ON_SAME_NO +alter table t1 reorganize partition p1 into (partition p1 history, partition p2 history); + + --echo # Bug tempesta-tech/mariadb#260: incorrect IB partitioning warning create or replace table t1 (x int) with system versioning @@ -224,13 +241,6 @@ insert into t1 values (7), (8); delete from t1; select * from t1 partition (p1) order by x; ---echo ### Assertion in ALTER on warning from partitioning LIMIT [#446] -create or replace table t1 (x int) with system versioning; -insert into t1 values (1), (2); -delete from t1; -alter table t1 partition by system_time limit 1 ( - partition p1 history, - partition pn current); --echo ## rotation by INTERVAL --error ER_PART_WRONG_VALUE @@ -242,6 +252,28 @@ partition by system_time interval 0 second partitions 3; create table t1 (i int) with system versioning partition by system_time interval 6 day limit 98; +--error ER_DATA_OUT_OF_RANGE +create or replace table t1 (pk int) with system versioning +partition by system_time interval 10 year partitions 3; + +--echo # INTERVAL and ALTER TABLE +create or replace table t1 (i int) with system versioning +partition by system_time interval 1 hour; + +set @ts=(select partition_description from information_schema.partitions + where table_schema='test' and table_name='t1' and partition_name='p0'); + +alter table t1 add column b int; +select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; +alter table t1 add partition (partition p1 history, partition p2 history); +select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; +alter table t1 drop partition p0; +select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; +--error ER_VERS_DROP_PARTITION_INTERVAL +alter table t1 drop partition p2; +select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; + + --echo ## Subpartitions create or replace table t1 (x int) with system versioning @@ -262,24 +294,18 @@ select * from t1 partition (p0sp1); select * from t1 partition (p1sp0); select * from t1 partition (p1sp1); ---replace_result $sys_datatype_expl SYS_DATATYPE -eval create or replace table t1 ( - a bigint, - row_start $sys_datatype_expl as row start invisible, - row_end $sys_datatype_expl as row end invisible, - period for system_time(row_start, row_end)) +--echo # check implicit sys fields for implicit engine of partitioned table +create or replace table t1 (a bigint) with system versioning partition by range (a) (partition p0 values less than (20) engine innodb, partition p1 values less than maxvalue engine innodb); insert into t1 values (1); +select * from t1 partition (p0); ---replace_result $sys_datatype_expl SYS_DATATYPE -eval create or replace table t1 ( - f_int1 integer default 0, - row_start $sys_datatype_expl as row start invisible, - row_end $sys_datatype_expl as row end invisible, - period for system_time(row_start, row_end) +--echo # check for partition engine +create or replace table t1 ( + f_int1 integer default 0 ) with system versioning partition by range(f_int1) subpartition by hash(f_int1) @@ -287,17 +313,28 @@ subpartition by hash(f_int1) (subpartition subpart11 storage engine = 'innodb', subpartition subpart12 storage engine = 'innodb')); insert into t1 values (1); +select * from t1 partition (part1); +--echo # +--echo # Assertion in ALTER on warning from partitioning LIMIT [#446] +--echo # +create or replace table t1 (x int) with system versioning; +insert into t1 values (1), (2); +delete from t1; +alter table t1 partition by system_time limit 1 ( + partition p1 history, + partition pn current); + +--echo # +--echo # MDEV-14649 Assertion `t->mysql_col_len == 8' failed in row_insert_for_mysql +--echo # create or replace table t1 (i int) engine=innodb partition by key(i); ---replace_result $sys_datatype_expl SYS_DATATYPE -eval alter table t1 - add column row_start $sys_datatype_expl as row start invisible, - add column row_end $sys_datatype_expl as row end invisible, - add period for system_time(row_start, row_end), - add system versioning; +alter table t1 add system versioning; insert into t1 values(); +--echo # --echo # MDEV-14722 Assertion in ha_commit_trans for sub-statement +--echo # create or replace table t1 (i int) with system versioning partition by system_time interval 1 day; create or replace table t2 (f int); @@ -306,7 +343,9 @@ for each row select table_rows from information_schema.tables where table_name = 't1' into @a; insert into t2 values (1); +--echo # --echo # MDEV-14740 Locking assertion for system_time partitioning +--echo # create or replace table t1 (i int) with system versioning partition by system_time interval 1 week; create or replace table t2 (f int); @@ -314,7 +353,9 @@ create or replace trigger tr before insert on t2 for each row select count(*) from t1 into @a; insert into t2 values (1); +--echo # --echo # MDEV-14747 ALTER PARTITION BY SYSTEM_TIME after LOCK TABLES +--echo # create or replace table t1 (x int) with system versioning; lock table t1 write; alter table t1 partition by system_time interval 1 week ( @@ -322,7 +363,9 @@ alter table t1 partition by system_time interval 1 week ( partition pn current); unlock tables; +--echo # --echo # MDEV-14748 Assertion in ha_myisammrg::attach_children() +--echo # create or replace table t1 (x int) engine=myisam with system versioning partition by system_time interval 1 month (partition p1 history, partition pn current); create or replace table t2 (x int) engine=myisam; @@ -332,17 +375,22 @@ create or replace trigger tr after insert on t4 for each row insert into t2 ( select x from t3 ) union ( select x from t1 ); insert into t4 values (1); +--echo # --echo # MDEV-14821 Assertion failure +--echo # create or replace table t1 (x int) with system versioning; insert into t1 values (0), (1); update t1 set x= x + 1; alter table t1 partition by system_time limit 1 ( partition p1 history, partition p2 history, - partition pn current);delete from t1 where x = 1; + partition pn current); +delete from t1 where x = 1; delete from t1 where x = 2; +--echo # --echo # MDEV-14923 Assertion upon INSERT into locked versioned partitioned table +--echo # create or replace table t1 (x int) with system versioning partition by system_time; lock table t1 write; @@ -351,27 +399,6 @@ alter table t1 add partition (partition p0 history); insert into t1 values (1); unlock tables; ---error ER_DATA_OUT_OF_RANGE -create or replace table t1 (pk int) with system versioning -partition by system_time interval 10 year partitions 3; - -# INTERVAL and ALTER TABLE -create or replace table t1 (i int) with system versioning -partition by system_time interval 1 hour; - -set @ts=(select partition_description from information_schema.partitions - where table_schema='test' and table_name='t1' and partition_name='p0'); - -alter table t1 add column b int; -select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; -alter table t1 add partition (partition p1 history, partition p2 history); -select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; -alter table t1 drop partition p0; -select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; ---error ER_VERS_DROP_PARTITION_INTERVAL -alter table t1 drop partition p2; -select partition_name,partition_ordinal_position,partition_method,timediff(partition_description, @ts) from information_schema.partitions where table_schema='test' and table_name='t1'; - --echo # --echo # MDEV-15103 Assertion in ha_partition::part_records() for updating VIEW --echo # @@ -389,7 +416,9 @@ partition by system_time; --error ER_DROP_VERSIONING_SYSTEM_TIME_PARTITION alter table t drop system versioning; +--echo # --echo # MDEV-15191 Assertion `bit < (map)->n_bits' failed in bitmap_is_set upon INSERT +--echo # create or replace table t1 (i int) with system versioning; insert into t1 values (1), (2); update t1 set i= 3; @@ -399,7 +428,9 @@ alter table t1 add partition (partition p2 history); insert into t1 values (4); unlock tables; +--echo # --echo # MDEV-15036 Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())' in Diagnostics_area::set_ok_status or unexpected ER_RANGE_NOT_INCREASING_ERROR +--echo # create or replace table t1 (a int) with system versioning partition by system_time limit 2 partitions 4; insert into t1 values (1),(2),(3); @@ -407,7 +438,9 @@ update t1 set a = 4; delete from t1; delete from t1 where a is not null; +--echo # --echo # MDEV-14823 Wrong error message upon selecting from a system_time partition +--echo # create or replace table t1 (i int) with system versioning partition by system_time limit 10; --error ER_VERS_QUERY_IN_PARTITION select * from t1 partition (p0) for system_time all; @@ -420,7 +453,9 @@ call sp; call sp; drop procedure sp; +--echo # --echo # MDEV-15380 Index for versioned table gets corrupt after partitioning and DELETE +--echo # create or replace table t1 (pk int primary key) engine=myisam with system versioning diff --git a/plugin/versioning/versioning.cc b/plugin/versioning/versioning.cc index 7e3c29e1494..a2f39352ab2 100644 --- a/plugin/versioning/versioning.cc +++ b/plugin/versioning/versioning.cc @@ -22,7 +22,8 @@ #include "sql_plugin.h" // st_plugin_int #include "sql_class.h" #include "item.h" -#include "vers_utils.h" +#include "table.h" +#include "vers_string.h" /* System Versioning: TRT_TRX_ID(), TRT_COMMIT_ID(), TRT_BEGIN_TS(), TRT_COMMIT_TS(), TRT_ISO_LEVEL() */ template <TR_table::field_id_t TRT_FIELD> diff --git a/sql/partition_info.cc b/sql/partition_info.cc index c2edd604f0d..252744a3a73 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -32,9 +32,10 @@ #include "sql_parse.h" #include "sql_acl.h" // *_ACL #include "sql_base.h" // fill_record -#include "sql_statistics.h" // vers_stat_end -#include "vers_utils.h" #include "lock.h" +#include "table.h" +#include "sql_class.h" +#include "vers_string.h" #ifdef WITH_PARTITION_STORAGE_ENGINE #include "ha_partition.h" @@ -196,49 +197,6 @@ bool partition_info::set_named_partition_bitmap(const char *part_name, size_t le } - -/** - Prune away partitions not mentioned in the PARTITION () clause, - if used. - - @param table_list Table list pointing to table to prune. - - @return Operation status - @retval false Success - @retval true Failure -*/ -bool partition_info::set_read_partitions(List<char> *partition_names) -{ - DBUG_ENTER("partition_info::set_read_partitions"); - if (!partition_names || !partition_names->elements) - { - DBUG_RETURN(true); - } - - uint num_names= partition_names->elements; - List_iterator<char> partition_names_it(*partition_names); - uint i= 0; - /* - TODO: When adding support for FK in partitioned tables, the referenced - table must probably lock all partitions for read, and also write depending - of ON DELETE/UPDATE. - */ - bitmap_clear_all(&read_partitions); - - /* No check for duplicate names or overlapping partitions/subpartitions. */ - - DBUG_PRINT("info", ("Searching through partition_name_hash")); - do - { - char *part_name= partition_names_it++; - if (add_named_partition(part_name, strlen(part_name))) - DBUG_RETURN(true); - } while (++i < num_names); - DBUG_RETURN(false); -} - - - /** Prune away partitions not mentioned in the PARTITION () clause, if used. @@ -849,6 +807,15 @@ bool partition_info::has_unique_name(partition_element *element) DBUG_RETURN(TRUE); } + +/** + @brief Switch history partition according limit or interval + + @note + vers_info->limit Limit by number of partition records + vers_info->interval Limit by fixed time interval + vers_info->hist_part (out) Working history partition +*/ void partition_info::vers_set_hist_part(THD *thd) { if (vers_info->limit) @@ -867,7 +834,7 @@ void partition_info::vers_set_hist_part(THD *thd) vers_info->hist_part= next; records= next_records; } - if (records > vers_info->limit) + if (records >= vers_info->limit) { if (next == vers_info->now_part) { @@ -904,49 +871,6 @@ void partition_info::vers_set_hist_part(THD *thd) } -bool partition_info::vers_setup_expression(THD * thd, uint32 alter_add) -{ - if (!table->versioned()) - { - // frm must be corrupted, normally CREATE/ALTER TABLE checks for that - my_error(ER_FILE_CORRUPT, MYF(0), table->s->path.str); - return true; - } - - DBUG_ASSERT(part_type == VERSIONING_PARTITION); - DBUG_ASSERT(table->versioned(VERS_TIMESTAMP)); - - if (!alter_add) - { - Field *row_end= table->vers_end_field(); - // needed in handle_list_of_fields() - row_end->flags|= GET_FIXED_FIELDS_FLAG; - Name_resolution_context *context= &thd->lex->current_select->context; - Item *row_end_item= new (thd->mem_root) Item_field(thd, context, row_end); - Item *row_end_ts= new (thd->mem_root) Item_func_unix_timestamp(thd, row_end_item); - set_part_expr(thd, row_end_ts, false); - } - - if (alter_add) - { - List_iterator<partition_element> it(partitions); - partition_element *el; - for(uint32 id= 0; ((el= it++)); id++) - { - DBUG_ASSERT(el->type != partition_element::CONVENTIONAL); - /* Newly added element is inserted before AS_OF_NOW. */ - if (el->id == UINT_MAX32 || el->type == partition_element::CURRENT) - { - el->id= id; - if (el->type == partition_element::CURRENT) - break; - } - } - } - return false; -} - - /* Check that the partition/subpartition is setup to use the correct storage engine @@ -1424,9 +1348,8 @@ bool partition_info::check_partition_info(THD *thd, handlerton **eng_type, if (add_or_reorg_part) { - if (unlikely(part_type == VERSIONING_PARTITION && - vers_setup_expression(thd, add_or_reorg_part->partitions.elements))) - goto end; + if (part_type == VERSIONING_PARTITION && add_or_reorg_part->partitions.elements) + vers_update_el_ids(); if (check_constants(thd, this)) goto end; } diff --git a/sql/partition_info.h b/sql/partition_info.h index 3a34ad88d28..eb8e53a381a 100644 --- a/sql/partition_info.h +++ b/sql/partition_info.h @@ -385,11 +385,9 @@ private: uint start_no); char *create_default_subpartition_name(THD *thd, uint subpart_no, const char *part_name); - // FIXME: prune_partition_bitmaps() is duplicate of set_read_partitions() - bool prune_partition_bitmaps(List<String> *partition_names); + bool prune_partition_bitmaps(List<String> *partition_names); // set_read_partitions() in 8.0 bool add_named_partition(const char *part_name, size_t length); public: - bool set_read_partitions(List<char> *partition_names); bool has_unique_name(partition_element *element); bool field_in_partition_expr(Field *field) const; @@ -404,7 +402,8 @@ public: return !limit; } void vers_set_hist_part(THD *thd); - bool vers_setup_expression(THD *thd, uint32 alter_add= 0); /* Stage 1. */ + bool vers_fix_field_list(THD *thd); + void vers_update_el_ids(); partition_element *get_partition(uint part_id) { List_iterator<partition_element> it(partitions); @@ -445,4 +444,60 @@ void init_all_partitions_iterator(partition_info *part_info, part_iter->get_next= get_next_partition_id_range; } + +/** + @brief Update part_field_list by row_end field name + + @returns true on error; false on success +*/ +inline +bool partition_info::vers_fix_field_list(THD * thd) +{ + if (!table->versioned()) + { + // frm must be corrupted, normally CREATE/ALTER TABLE checks for that + my_error(ER_FILE_CORRUPT, MYF(0), table->s->path.str); + return true; + } + DBUG_ASSERT(part_type == VERSIONING_PARTITION); + DBUG_ASSERT(table->versioned(VERS_TIMESTAMP)); + + Field *row_end= table->vers_end_field(); + // needed in handle_list_of_fields() + row_end->flags|= GET_FIXED_FIELDS_FLAG; + Name_resolution_context *context= &thd->lex->current_select->context; + Item *row_end_item= new (thd->mem_root) Item_field(thd, context, row_end); + Item *row_end_ts= new (thd->mem_root) Item_func_unix_timestamp(thd, row_end_item); + set_part_expr(thd, row_end_ts, false); + + return false; +} + + +/** + @brief Update partition_element's id + + @returns true on error; false on success +*/ +inline +void partition_info::vers_update_el_ids() +{ + DBUG_ASSERT(part_type == VERSIONING_PARTITION); + DBUG_ASSERT(table->versioned(VERS_TIMESTAMP)); + + List_iterator<partition_element> it(partitions); + partition_element *el; + for(uint32 id= 0; ((el= it++)); id++) + { + DBUG_ASSERT(el->type != partition_element::CONVENTIONAL); + /* Newly added element is inserted before AS_OF_NOW. */ + if (el->id == UINT_MAX32 || el->type == partition_element::CURRENT) + { + el->id= id; + if (el->type == partition_element::CURRENT) + break; + } + } +} + #endif /* PARTITION_INFO_INCLUDED */ diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 9e31ce3b31c..ff5c1c6bc58 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -2013,7 +2013,7 @@ bool fix_partition_func(THD *thd, TABLE *table, bool is_create_table_ind) else { if (part_info->part_type == VERSIONING_PARTITION && - part_info->vers_setup_expression(thd)) + part_info->vers_fix_field_list(thd)) goto end; if (unlikely(fix_fields_part_func(thd, part_info->part_expr, table, FALSE, is_create_table_ind))) diff --git a/sql/vers_utils.h b/sql/vers_utils.h deleted file mode 100644 index 2bea191da9e..00000000000 --- a/sql/vers_utils.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef VERS_UTILS_INCLUDED -#define VERS_UTILS_INCLUDED - -#include "table.h" -#include "sql_class.h" -#include "vers_string.h" - -#endif // VERS_UTILS_INCLUDED diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index c7823d2e2d8..3c93e86c967 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -2033,7 +2033,6 @@ static bool srv_task_execute() } - /** Do the actual purge operation. @param[in,out] n_total_purged total number of purged pages @return length of history list before the last purge batch. */ |