summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2020-02-27 10:28:49 +0100
committerSergei Golubchik <serg@mariadb.org>2020-02-27 10:30:21 +0100
commit98adcffe460447c43a86afdf6588e31379b7f52d (patch)
tree0c0cf97a066b2449f99b3bc8be3cf85c8866fa4e
parent9894751a2a61ef952ac6ac556fd683e53fc150e2 (diff)
downloadmariadb-git-98adcffe460447c43a86afdf6588e31379b7f52d.tar.gz
Revert "MDEV-17554 Auto-create new partition for system versioned tables with history partitioned by INTERVAL/LIMIT"
This reverts commit 9894751a2a61ef952ac6ac556fd683e53fc150e2. This reverts commit f707c83fff4fa3f5291684e6226542fdb75bbdeb.
-rw-r--r--mysql-test/suite/versioning/r/delete_history.result12
-rw-r--r--mysql-test/suite/versioning/r/partition.result135
-rw-r--r--mysql-test/suite/versioning/r/rpl.result19
-rw-r--r--mysql-test/suite/versioning/t/delete_history.test11
-rw-r--r--mysql-test/suite/versioning/t/partition.test86
-rw-r--r--mysql-test/suite/versioning/t/rpl.test24
-rw-r--r--sql/mysqld.cc5
-rw-r--r--sql/mysqld.h2
-rw-r--r--sql/partition_info.cc278
-rw-r--r--sql/partition_info.h41
-rw-r--r--sql/share/errmsg-utf8.txt6
-rw-r--r--sql/sql_partition.cc15
-rw-r--r--sql/sql_yacc.yy38
-rw-r--r--sql/table.h3
14 files changed, 79 insertions, 596 deletions
diff --git a/mysql-test/suite/versioning/r/delete_history.result b/mysql-test/suite/versioning/r/delete_history.result
index b3086c867d1..cb865a835b3 100644
--- a/mysql-test/suite/versioning/r/delete_history.result
+++ b/mysql-test/suite/versioning/r/delete_history.result
@@ -154,15 +154,3 @@ select * from t1;
a
1
drop table t1;
-#
-# MDEV-17554 Auto-create new partition for system versioned tables with history partitioned by INTERVAL/LIMIT
-#
-# Don't auto-create new partition on DELETE HISTORY:
-create or replace table t (a int)
-with system versioning
-partition by system_time limit 1000;
-delete history from t;
-select count(*) - 1 as hist_partitions from information_schema.partitions where table_name = 't' and table_schema = 'test';
-hist_partitions
-1
-drop table t;
diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result
index 87d7c112f3e..038051055e7 100644
--- a/mysql-test/suite/versioning/r/partition.result
+++ b/mysql-test/suite/versioning/r/partition.result
@@ -1,7 +1,4 @@
call mtr.add_suppression("need more HISTORY partitions");
-call mtr.add_suppression("Duplicate partition name");
-call mtr.add_suppression("Wrong partitioning type");
-call mtr.add_suppression("Table 'test.t1' doesn't exist");
set system_versioning_alter_history=keep;
# Check conventional partitioning on temporal tables
create or replace table t1 (
@@ -240,9 +237,7 @@ select @ts0 = @ts1;
select @ts2 = @ts3;
@ts2 = @ts3
1
-#
-# Rotation by LIMIT
-#
+## rotation by LIMIT
create or replace table t1 (x int)
with system versioning
partition by system_time limit 0 partitions 3;
@@ -294,37 +289,7 @@ x
6
7
8
-# Auto-create history partitions
-create or replace table t1 (x int) with system versioning
-partition by system_time limit 1000 auto_increment;
-lock tables t1 write;
-insert into t1 values (1);
-update t1 set x= x + 1;
-select state, info from information_schema.processlist where info like 'ALTER TABLE %';
-state info
-Waiting for table metadata lock ALTER TABLE `test`.`t1` ADD PARTITION (PARTITION `p1` HISTORY)
-unlock tables;
-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 LIMIT 1000 AUTO_INCREMENT
-(PARTITION `p0` HISTORY ENGINE = DEFAULT_ENGINE,
- PARTITION `p1` HISTORY ENGINE = DEFAULT_ENGINE,
- PARTITION `pn` CURRENT ENGINE = DEFAULT_ENGINE)
-### Test ALTER failure
-set @lock_wait_timeout0= @@global.lock_wait_timeout;
-set global lock_wait_timeout= 1;
-create or replace table t1 (x int) with system versioning partition by system_time limit 1000;
-lock tables t1 write;
-insert t1 values (1);
-insert t1 values (1);
-unlock tables;
-set global lock_wait_timeout= @lock_wait_timeout0;
-#
-# Rotation by INTERVAL
-#
+## rotation by INTERVAL
create or replace table t1 (x int)
with system versioning
partition by system_time interval 0 second partitions 3;
@@ -337,7 +302,7 @@ 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 59 minute;
+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;
@@ -351,16 +316,16 @@ 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 00:59:00.000000
-p2 3 SYSTEM_TIME 01:58: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 00:59:00.000000
-p2 2 SYSTEM_TIME 01:58:00.000000
+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'
@@ -368,8 +333,8 @@ 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 00:59:00.000000
-p2 2 SYSTEM_TIME 01:58:00.000000
+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'
@@ -378,7 +343,6 @@ create or replace table t1 (i int) with system versioning
partition by system_time interval 1 day
subpartition by key (i) subpartitions 2
(partition p1 history, partition pn current);
-lock tables t1 write;
set timestamp=unix_timestamp('2001-02-03 10:20:40');
insert t1 values (1);
delete from t1;
@@ -389,51 +353,28 @@ Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out o
delete from t1;
Warnings:
Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out of INTERVAL, need more HISTORY partitions
-select subpartition_name, partition_description from information_schema.partitions where table_schema='test' and table_name='t1';
-subpartition_name partition_description
-p1sp0 2001-02-04 00:00:00
-p1sp1 2001-02-04 00:00:00
-pnsp0 CURRENT
-pnsp1 CURRENT
-select * from t1 partition (p1);
-i
-1
-2
+select subpartition_name,partition_description,table_rows from information_schema.partitions where table_schema='test' and table_name='t1';
+subpartition_name partition_description table_rows
+p1sp0 2001-02-04 00:00:00 1
+p1sp1 2001-02-04 00:00:00 1
+pnsp0 CURRENT 0
+pnsp1 CURRENT 0
set timestamp=unix_timestamp('2001-02-04 10:20:55');
alter table t1 add partition (partition p0 history, partition p2 history);
set timestamp=unix_timestamp('2001-02-04 10:30:00');
insert t1 values (4),(5);
set timestamp=unix_timestamp('2001-02-04 10:30:10');
update t1 set i=6 where i=5;
-select subpartition_name, partition_description from information_schema.partitions where table_schema='test' and table_name='t1';
-subpartition_name partition_description
-p1sp0 2001-02-04 00:00:00
-p1sp1 2001-02-04 00:00:00
-p0sp0 2001-02-05 00:00:00
-p0sp1 2001-02-05 00:00:00
-p2sp0 2001-02-06 00:00:00
-p2sp1 2001-02-06 00:00:00
-pnsp0 CURRENT
-pnsp1 CURRENT
-select * from t1 partition (p1);
-i
-1
-2
-select * from t1 partition (p0);
-i
-5
-select * from t1 partition (p2);
-i
-alter table t1 rebuild partition p0, p1, p2;
-select * from t1 partition (p1);
-i
-1
-select * from t1 partition (p0);
-i
-5
-2
-select * from t1 partition (p2);
-i
+select subpartition_name,partition_description,table_rows from information_schema.partitions where table_schema='test' and table_name='t1';
+subpartition_name partition_description table_rows
+p1sp0 2001-02-04 00:00:00 1
+p1sp1 2001-02-04 00:00:00 0
+p0sp0 2001-02-05 00:00:00 1
+p0sp1 2001-02-05 00:00:00 1
+p2sp0 2001-02-06 00:00:00 0
+p2sp1 2001-02-06 00:00:00 0
+pnsp0 CURRENT 0
+pnsp1 CURRENT 2
## pruning check
set @ts=(select partition_description from information_schema.partitions
where table_schema='test' and table_name='t1' and partition_name='p0' limit 1);
@@ -454,7 +395,6 @@ i
explain partitions select * from t1 for system_time all where row_end = @ts;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p1_p1sp0,p1_p1sp1 # NULL NULL NULL NULL # #
-unlock tables;
## INTERVAL ... STARTS
create or replace table t1 (i int) with system versioning
partition by system_time interval 1 day starts 'a';
@@ -602,9 +542,6 @@ set timestamp= unix_timestamp('2001-01-01 00:00:00');
create or replace table t1 (i int) with system versioning
partition by system_time interval 1 day starts '2000-01-01 00:00:00'
partitions 3;
-lock tables t1 write;
-Warnings:
-Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out of INTERVAL, need more HISTORY partitions
# we are warned when we push to present:
insert into t1 values (0);
Warnings:
@@ -647,13 +584,11 @@ i row_end
select *, row_end from t1 partition (p1);
i row_end
3 2000-01-04 00:00:01.000000
-unlock tables;
-# and this is how it usually goes:
set timestamp= unix_timestamp('2000-01-01 00:00:00');
+# and this is how it usually goes:
create or replace table t1 (i int) with system versioning
partition by system_time interval 1 day
partitions 3;
-lock tables t1 write;
insert into t1 values (0);
set timestamp= unix_timestamp('2000-01-01 00:00:01');
update t1 set i= i + 1;
@@ -674,26 +609,12 @@ i row_end
select *, row_end from t1 partition (p1);
i row_end
1 2000-01-02 00:00:01.000000
-2 2000-01-03 00:00:01.000000
-3 2000-01-04 00:00:01.000000
-select *, row_end from t1 partition (p2);
-i row_end
-select *, row_end from t1 partition (p3);
-i row_end
-alter table t1 rebuild partition p0, p1, p2, p3;
-select *, row_end from t1 partition (p0);
-i row_end
-0 2000-01-01 00:00:01.000000
-select *, row_end from t1 partition (p1);
-i row_end
-1 2000-01-02 00:00:01.000000
select *, row_end from t1 partition (p2);
i row_end
2 2000-01-03 00:00:01.000000
select *, row_end from t1 partition (p3);
i row_end
3 2000-01-04 00:00:01.000000
-unlock tables;
drop tables t1, t2;
## Subpartitions
create or replace table t1 (x int)
@@ -711,9 +632,9 @@ select * from t1 partition (pnsp1);
x
2
4
+### warn about full partition
delete from t1 where x < 3;
delete from t1;
-### warn about full partition
delete from t1;
Warnings:
Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out of LIMIT, need more HISTORY partitions
@@ -924,7 +845,7 @@ ERROR HY000: Can not DROP SYSTEM VERSIONING for table `t` partitioned BY SYSTEM_
create or replace table t1 (i int) with system versioning;
insert into t1 values (1), (2);
update t1 set i= 3;
-alter table t1 partition by system_time interval 59 minute (partition p1 history, partition pn current);
+alter table t1 partition by system_time interval 1 month (partition p1 history, partition pn current);
lock table t1 write;
alter table t1 add partition (partition p2 history);
insert into t1 values (4);
diff --git a/mysql-test/suite/versioning/r/rpl.result b/mysql-test/suite/versioning/r/rpl.result
index a303e8f8e61..627f3991499 100644
--- a/mysql-test/suite/versioning/r/rpl.result
+++ b/mysql-test/suite/versioning/r/rpl.result
@@ -164,23 +164,4 @@ update t1 set i = 0;
connection slave;
connection master;
drop table t1;
-#
-# MDEV-17554 Auto-create new partition for system versioned tables with history partitioned by INTERVAL/LIMIT
-#
-create or replace table t1 (x int) with system versioning
-partition by system_time limit 1000 auto_increment;
-lock tables t1 write;
-insert t1 values ();
-delete from t1;
-unlock tables;
-select count(*) - 1 as hist_partitions from information_schema.partitions where table_name = 't1' and table_schema = 'test';
-hist_partitions
-2
-connection slave;
-select count(*) - 1 as hist_partitions from information_schema.partitions where table_name = 't1' and table_schema = 'test';
-hist_partitions
-2
-connection master;
-drop database test;
-create database test;
include/rpl_end.inc
diff --git a/mysql-test/suite/versioning/t/delete_history.test b/mysql-test/suite/versioning/t/delete_history.test
index be9f6afaec8..fb5c8520bcb 100644
--- a/mysql-test/suite/versioning/t/delete_history.test
+++ b/mysql-test/suite/versioning/t/delete_history.test
@@ -169,15 +169,4 @@ insert into t1 values (1);
select * from t1;
drop table t1;
---echo #
---echo # MDEV-17554 Auto-create new partition for system versioned tables with history partitioned by INTERVAL/LIMIT
---echo #
---echo # Don't auto-create new partition on DELETE HISTORY:
-create or replace table t (a int)
-with system versioning
-partition by system_time limit 1000;
-delete history from t;
-select count(*) - 1 as hist_partitions from information_schema.partitions where table_name = 't' and table_schema = 'test';
-drop table t;
-
--source suite/versioning/common_finish.inc
diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test
index 38755b3daec..f55b43f56da 100644
--- a/mysql-test/suite/versioning/t/partition.test
+++ b/mysql-test/suite/versioning/t/partition.test
@@ -3,11 +3,6 @@
-- source suite/versioning/engines.inc
call mtr.add_suppression("need more HISTORY partitions");
-call mtr.add_suppression("Duplicate partition name");
-call mtr.add_suppression("Wrong partitioning type");
-call mtr.add_suppression("Table 'test.t1' doesn't exist");
-let $wait_no_alter= select count(*) = 0 from information_schema.processlist where info like 'ALTER TABLE %';
-let $wait_alter= select count(*) > 0 from information_schema.processlist where info like 'ALTER TABLE %';
set system_versioning_alter_history=keep;
--echo # Check conventional partitioning on temporal tables
@@ -218,9 +213,7 @@ prepare stmt from @str; execute stmt; drop prepare stmt;
select @ts0 = @ts1;
select @ts2 = @ts3;
---echo #
---echo # Rotation by LIMIT
---echo #
+--echo ## rotation by LIMIT
--error ER_PART_WRONG_VALUE
create or replace table t1 (x int)
with system versioning
@@ -248,37 +241,8 @@ insert into t1 values (7), (8);
delete from t1;
select * from t1 partition (p1) order by x;
---echo # Auto-create history partitions
-create or replace table t1 (x int) with system versioning
-partition by system_time limit 1000 auto_increment;
-lock tables t1 write;
-insert into t1 values (1);
-update t1 set x= x + 1;
---let $wait_condition= $wait_alter
---source include/wait_condition.inc
-select state, info from information_schema.processlist where info like 'ALTER TABLE %';
-unlock tables;
---let $wait_condition= $wait_no_alter
---source include/wait_condition.inc
---replace_result $default_engine DEFAULT_ENGINE
-show create table t1;
---echo ### Test ALTER failure
-set @lock_wait_timeout0= @@global.lock_wait_timeout;
-set global lock_wait_timeout= 1;
-create or replace table t1 (x int) with system versioning partition by system_time limit 1000;
-lock tables t1 write;
-insert t1 values (1);
---real_sleep 1
---let $wait_condition= $wait_no_alter
---source include/wait_condition.inc
-insert t1 values (1);
-unlock tables;
-set global lock_wait_timeout= @lock_wait_timeout0;
-
---echo #
---echo # Rotation by INTERVAL
---echo #
+--echo ## rotation by INTERVAL
--error ER_PART_WRONG_VALUE
create or replace table t1 (x int)
with system versioning
@@ -294,7 +258,7 @@ 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 59 minute;
+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');
@@ -317,15 +281,12 @@ create or replace table t1 (i int) with system versioning
partition by system_time interval 1 day
subpartition by key (i) subpartitions 2
(partition p1 history, partition pn current);
-lock tables t1 write; # prevent partition auto-creation
-
set timestamp=unix_timestamp('2001-02-03 10:20:40');
insert t1 values (1); delete from t1;
set timestamp=unix_timestamp('2001-02-04 10:20:50');
insert t1 values (2); delete from t1;
-select subpartition_name, partition_description from information_schema.partitions where table_schema='test' and table_name='t1';
-select * from t1 partition (p1);
+select subpartition_name,partition_description,table_rows from information_schema.partitions where table_schema='test' and table_name='t1';
set timestamp=unix_timestamp('2001-02-04 10:20:55');
alter table t1 add partition (partition p0 history, partition p2 history);
@@ -334,15 +295,7 @@ insert t1 values (4),(5);
set timestamp=unix_timestamp('2001-02-04 10:30:10');
update t1 set i=6 where i=5;
-select subpartition_name, partition_description from information_schema.partitions where table_schema='test' and table_name='t1';
-select * from t1 partition (p1);
-select * from t1 partition (p0);
-select * from t1 partition (p2);
-
-alter table t1 rebuild partition p0, p1, p2;
-select * from t1 partition (p1);
-select * from t1 partition (p0);
-select * from t1 partition (p2);
+select subpartition_name,partition_description,table_rows from information_schema.partitions where table_schema='test' and table_name='t1';
--echo ## pruning check
set @ts=(select partition_description from information_schema.partitions
@@ -357,9 +310,6 @@ set @ts=(select row_end from t1 for system_time all where i=1);
select * from t1 for system_time all where row_end = @ts;
--replace_column 5 # 10 # 11 #
explain partitions select * from t1 for system_time all where row_end = @ts;
-unlock tables;
---let $wait_condition= $wait_no_alter
---source include/wait_condition.inc
--echo ## INTERVAL ... STARTS
--error ER_PART_WRONG_VALUE
@@ -456,7 +406,6 @@ set timestamp= unix_timestamp('2001-01-01 00:00:00');
create or replace table t1 (i int) with system versioning
partition by system_time interval 1 day starts '2000-01-01 00:00:00'
partitions 3;
-lock tables t1 write; # prevent partition auto-creation
--echo # we are warned when we push to present:
insert into t1 values (0);
@@ -487,16 +436,11 @@ update t1 set i= i + 1;
select *, row_end from t1 partition (p0);
select *, row_end from t1 partition (p1);
-unlock tables;
---let $wait_condition= $wait_no_alter
---source include/wait_condition.inc
-
---echo # and this is how it usually goes:
set timestamp= unix_timestamp('2000-01-01 00:00:00');
+--echo # and this is how it usually goes:
create or replace table t1 (i int) with system versioning
partition by system_time interval 1 day
partitions 3;
-lock tables t1 write; # prevent partition auto-creation
insert into t1 values (0);
set timestamp= unix_timestamp('2000-01-01 00:00:01');
@@ -509,20 +453,12 @@ set timestamp= unix_timestamp('2000-01-04 00:00:01');
update t1 set i= i + 1;
alter table t1 add partition (partition p2 history, partition p3 history);
-select *, row_end from t1 partition (p0);
-select *, row_end from t1 partition (p1);
-select *, row_end from t1 partition (p2);
-select *, row_end from t1 partition (p3);
-alter table t1 rebuild partition p0, p1, p2, p3;
select *, row_end from t1 partition (p0);
select *, row_end from t1 partition (p1);
select *, row_end from t1 partition (p2);
select *, row_end from t1 partition (p3);
-unlock tables;
---let $wait_condition= $wait_no_alter
---source include/wait_condition.inc
drop tables t1, t2;
--echo ## Subpartitions
@@ -536,9 +472,9 @@ insert into t1 (x) values (1), (2), (3), (4), (5);
select * from t1 partition (pnsp0);
select * from t1 partition (pnsp1);
+--echo ### warn about full partition
delete from t1 where x < 3;
delete from t1;
---echo ### warn about full partition
delete from t1;
select * from t1 partition (p0sp0);
select * from t1 partition (p0sp1);
@@ -691,8 +627,6 @@ alter table t1 partition by system_time interval 1 week (
partition p1 history,
partition pn current);
unlock tables;
---let $wait_condition= $wait_no_alter
---source include/wait_condition.inc
--echo #
--echo # MDEV-14748 Assertion in ha_myisammrg::attach_children()
@@ -729,8 +663,6 @@ lock table t1 write;
alter table t1 add partition (partition p0 history);
insert into t1 values (1);
unlock tables;
---let $wait_condition= $wait_no_alter
---source include/wait_condition.inc
--echo #
--echo # MDEV-15103 Assertion in ha_partition::part_records() for updating VIEW
@@ -755,13 +687,11 @@ alter table t drop system versioning;
create or replace table t1 (i int) with system versioning;
insert into t1 values (1), (2);
update t1 set i= 3;
-alter table t1 partition by system_time interval 59 minute (partition p1 history, partition pn current);
+alter table t1 partition by system_time interval 1 month (partition p1 history, partition pn current);
lock table t1 write;
alter table t1 add partition (partition p2 history);
insert into t1 values (4);
unlock tables;
---let $wait_condition= $wait_no_alter
---source include/wait_condition.inc
--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
diff --git a/mysql-test/suite/versioning/t/rpl.test b/mysql-test/suite/versioning/t/rpl.test
index ec612551578..b5be68feece 100644
--- a/mysql-test/suite/versioning/t/rpl.test
+++ b/mysql-test/suite/versioning/t/rpl.test
@@ -133,28 +133,4 @@ sync_slave_with_master;
connection master;
drop table t1;
---echo #
---echo # MDEV-17554 Auto-create new partition for system versioned tables with history partitioned by INTERVAL/LIMIT
---echo #
-let $wait_no_alter= select count(*) = 0 from information_schema.processlist where info like 'ALTER TABLE %';
-let $wait_alter= select count(*) > 0 from information_schema.processlist where info like 'ALTER TABLE %';
-
-create or replace table t1 (x int) with system versioning
-partition by system_time limit 1000 auto_increment;
-lock tables t1 write;
-insert t1 values ();
-delete from t1;
---let $wait_condition= $wait_alter
---source include/wait_condition.inc
-unlock tables;
---let $wait_condition= $wait_no_alter
---source include/wait_condition.inc
-select count(*) - 1 as hist_partitions from information_schema.partitions where table_name = 't1' and table_schema = 'test';
---sync_slave_with_master
-select count(*) - 1 as hist_partitions from information_schema.partitions where table_name = 't1' and table_schema = 'test';
---connection master
-
-drop database test;
-create database test;
-
--source include/rpl_end.inc
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 7fdbb300298..b2f8afca7a6 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1090,7 +1090,7 @@ static PSI_cond_info all_server_conds[]=
PSI_thread_key key_thread_delayed_insert,
key_thread_handle_manager, key_thread_main,
key_thread_one_connection, key_thread_signal_hand,
- key_thread_slave_background, key_rpl_parallel_thread, key_thread_query;
+ key_thread_slave_background, key_rpl_parallel_thread;
PSI_thread_key key_thread_ack_receiver;
static PSI_thread_info all_server_threads[]=
@@ -1102,8 +1102,7 @@ static PSI_thread_info all_server_threads[]=
{ &key_thread_signal_hand, "signal_handler", PSI_FLAG_GLOBAL},
{ &key_thread_slave_background, "slave_background", PSI_FLAG_GLOBAL},
{ &key_thread_ack_receiver, "Ack_receiver", PSI_FLAG_GLOBAL},
- { &key_rpl_parallel_thread, "rpl_parallel_thread", 0},
- { &key_thread_query, "vers_add_hist_part_thread", 0}
+ { &key_rpl_parallel_thread, "rpl_parallel_thread", 0}
};
#ifdef HAVE_MMAP
diff --git a/sql/mysqld.h b/sql/mysqld.h
index d1e13c2fc77..4f4e608e811 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -388,7 +388,7 @@ extern PSI_cond_key key_TABLE_SHARE_COND_rotation;
extern PSI_thread_key key_thread_delayed_insert,
key_thread_handle_manager, key_thread_kill_server, key_thread_main,
key_thread_one_connection, key_thread_signal_hand,
- key_thread_slave_background, key_rpl_parallel_thread, key_thread_query;
+ key_thread_slave_background, key_rpl_parallel_thread;
extern PSI_file_key key_file_binlog, key_file_binlog_index, key_file_casetest,
key_file_dbopt, key_file_des_key_file, key_file_ERRMSG, key_select_to_file,
diff --git a/sql/partition_info.cc b/sql/partition_info.cc
index cb79a28d4df..252744a3a73 100644
--- a/sql/partition_info.cc
+++ b/sql/partition_info.cc
@@ -322,11 +322,13 @@ bool partition_info::set_partition_bitmaps_from_table(TABLE_LIST *table_list)
The external routine needing this code is check_partition_info
*/
+#define MAX_PART_NAME_SIZE 8
+
char *partition_info::create_default_partition_names(THD *thd, uint part_no,
uint num_parts_arg,
uint start_no)
{
- char *ptr= (char*) thd->calloc(num_parts_arg * MAX_PART_NAME_SIZE + 1);
+ char *ptr= (char*) thd->calloc(num_parts_arg * MAX_PART_NAME_SIZE);
char *move_ptr= ptr;
uint i= 0;
DBUG_ENTER("create_default_partition_names");
@@ -335,8 +337,7 @@ char *partition_info::create_default_partition_names(THD *thd, uint part_no,
{
do
{
- if (make_partition_name(move_ptr, (start_no + i)))
- DBUG_RETURN(NULL);
+ sprintf(move_ptr, "p%u", (start_no + i));
move_ptr+= MAX_PART_NAME_SIZE;
} while (++i < num_parts_arg);
}
@@ -807,13 +808,6 @@ bool partition_info::has_unique_name(partition_element *element)
}
-/* Auto-create history partition configuration */
-static const uint VERS_MIN_EMPTY= 1;
-static const uint VERS_MIN_INTERVAL= 3600; // seconds
-static const uint VERS_MIN_LIMIT= 1000;
-static const uint VERS_ERROR_TIMEOUT= 300; // seconds
-
-
/**
@brief Switch history partition according limit or interval
@@ -851,266 +845,29 @@ void partition_info::vers_set_hist_part(THD *thd)
else
vers_info->hist_part= next;
}
- if (vers_info->limit >= VERS_MIN_LIMIT)
- goto add_hist_part;
return;
}
if (vers_info->interval.is_set())
{
- if (vers_info->hist_part->range_value <= thd->query_start())
- {
- partition_element *next= NULL;
- bool error= true;
- List_iterator<partition_element> it(partitions);
- while (next != vers_info->hist_part)
- next= it++;
-
- while ((next= it++) != vers_info->now_part)
- {
- vers_info->hist_part= next;
- if (next->range_value > thd->query_start())
- {
- error= false;
- break;
- }
- }
- if (error)
- my_error(WARN_VERS_PART_FULL, MYF(ME_WARNING|ME_ERROR_LOG),
- table->s->db.str, table->s->table_name.str,
- vers_info->hist_part->partition_name, "INTERVAL");
- }
- if (vers_info->interval.ge(VERS_MIN_INTERVAL))
- goto add_hist_part;
- }
-
- return;
-
-add_hist_part:
- if (!vers_info->auto_inc)
- return;
- switch (thd->lex->sql_command)
- {
- case SQLCOM_DELETE:
- if (thd->lex->last_table()->vers_conditions.type == SYSTEM_TIME_HISTORY)
- break;
- /* fallthrough */
- case SQLCOM_UPDATE:
- case SQLCOM_INSERT:
- case SQLCOM_INSERT_SELECT:
- case SQLCOM_LOAD:
- case SQLCOM_REPLACE:
- case SQLCOM_REPLACE_SELECT:
- case SQLCOM_DELETE_MULTI:
- case SQLCOM_UPDATE_MULTI:
- {
- time_t &timeout= table->s->vers_hist_part_timeout;
- if (!thd->slave_thread &&
- vers_info->hist_part->id + VERS_MIN_EMPTY == vers_info->now_part->id)
- {
- if (!timeout || timeout < thd->query_start())
- vers_add_hist_part(thd);
- else if (table->s->vers_hist_part_error)
- {
- my_error(WARN_VERS_HIST_PART_ERROR, MYF(ME_WARNING),
- table->s->db.str, table->s->table_name.str,
- table->s->vers_hist_part_error);
- }
- }
- }
- default:;
- }
-}
-
-
-struct vers_add_hist_part_data
-{
- LEX_STRING query;
- LEX_CSTRING db;
- LEX_CSTRING table_name;
- LEX_STRING part_name;
- my_time_t start_time;
- ulong start_time_sec_part;
-
- TABLE_SHARE *s;
-
- void assign(THD *thd, String &q, TABLE *table, LEX_CSTRING p)
- {
- start_time= thd->start_time;
- start_time_sec_part= thd->start_time_sec_part;
- s= table->s;
-
- memcpy(query.str, q.c_ptr_quick(), q.length());
- query.str[q.length()]= 0;
- query.length= q.length();
-
- db.length= table->s->db.length;
- memcpy((char *)db.str, table->s->db.str, db.length);
- ((char *)db.str)[db.length]= 0;
-
- table_name.length= table->s->table_name.length;
- memcpy((char *)table_name.str, table->s->table_name.str, table_name.length);
- ((char *)table_name.str)[table_name.length]= 0;
+ if (vers_info->hist_part->range_value > thd->query_start())
+ return;
- memcpy(part_name.str, p.str, p.length + 1);
- part_name.length= p.length;
- }
-};
-
-pthread_handler_t vers_add_hist_part_thread(void *arg)
-{
- Parser_state parser_state;
- uint error;
- DBUG_ASSERT(arg);
- vers_add_hist_part_data &d= *(vers_add_hist_part_data *) arg;
- sql_print_information("Adding history partition `%s` for table `%s`.`%s`",
- d.part_name.str,
- d.db.str,
- d.table_name.str);
- my_thread_init();
- /* Initialize THD */
- THD *thd= new THD(next_thread_id());
- if (unlikely(!thd))
- {
- my_error(ER_OUT_OF_RESOURCES, MYF(ME_ERROR_LOG));
- goto err1;
- }
- thd->thread_stack= (char*) &thd;
- thd->store_globals();
- thd->set_command(COM_DAEMON);
- thd->system_thread= SYSTEM_THREAD_GENERIC;
- thd->security_ctx->host_or_ip= "";
- thd->security_ctx->master_access= ALTER_ACL;
- thd->log_all_errors= true;
- thd->start_time= d.start_time;
- thd->start_time_sec_part= d.start_time_sec_part;
- server_threads.insert(thd);
- thd_proc_info(thd, "Add history partition");
- /* Initialize parser */
- lex_start(thd);
- if (unlikely(parser_state.init(thd, d.query.str, d.query.length)))
- {
- my_error(ER_OUT_OF_RESOURCES, MYF(ME_ERROR_LOG));
- lex_end(thd->lex);
- goto err2;
- }
- if (unlikely(parse_sql(thd, &parser_state, NULL)))
- {
- lex_end(thd->lex);
- goto err2;
- }
- thd->set_query_and_id(d.query.str, (uint32)d.query.length, thd->charset(), next_query_id());
- MYSQL_QUERY_EXEC_START(thd->query(), thd->thread_id, "", "", "", 0);
- error= (uint) mysql_execute_command(thd);
- MYSQL_QUERY_EXEC_DONE(error);
- if (unlikely(error) && thd->is_error())
- {
- error= thd->get_stmt_da()->get_sql_errno();
- thd->clear_error();
- TABLE_LIST table_list;
- table_list.init_one_table(&d.db, &d.table_name, &d.table_name, TL_UNLOCK);
- TABLE_SHARE *s= tdc_acquire_share(thd, &table_list, GTS_TABLE);
- if (s == d.s)
- {
- /* Timeout new ALTER for 5 minutes in case of error */
- s->vers_hist_part_timeout= thd->query_start() + VERS_ERROR_TIMEOUT;
- s->vers_hist_part_error= error;
- s->vers_altering= false;
- }
- if (s)
- tdc_release_share(s);
- }
- /* In case of success ALTER invalidates TABLE_SHARE */
- thd->end_statement();
- thd->cleanup_after_query();
-err2:
- server_threads.erase(thd);
- delete thd;
-err1:
- my_free(arg);
- my_thread_end();
- return NULL;
-}
-
-
-void partition_info::vers_add_hist_part(THD *thd)
-{
- pthread_t hThread;
- int error;
- char part_name[MAX_PART_NAME_SIZE + 1];
-
- /* Prevent spawning multiple instances of same task */
- bool altering;
- mysql_mutex_lock(&table->s->LOCK_share);
- altering= table->s->vers_altering;
- if (!altering)
- table->s->vers_altering= true;
- mysql_mutex_unlock(&table->s->LOCK_share);
- if (altering)
- return;
-
- /* Choose first non-occupied name suffix starting from id + 1 */
- uint32 suffix= vers_info->hist_part->id + 1;
- if (make_partition_name(part_name, suffix))
- {
- sql_print_warning("vers_add_hist_part name generation failed for suffix %d",
- suffix);
- my_error(WARN_VERS_HIST_PART_ERROR, MYF(ME_WARNING),
- table->s->db.str, table->s->table_name.str, 0);
- return;
- }
- List_iterator_fast<partition_element> it(partitions);
- partition_element *el;
+ partition_element *next= NULL;
+ List_iterator<partition_element> it(partitions);
+ while (next != vers_info->hist_part)
+ next= it++;
- while ((el= it++))
- {
- if (0 == my_strcasecmp(&my_charset_latin1, el->partition_name, part_name))
+ while ((next= it++) != vers_info->now_part)
{
- if (make_partition_name(part_name, ++suffix))
- {
- sql_print_warning("vers_add_hist_part name generation failed for suffix %d",
- suffix);
- my_error(WARN_VERS_HIST_PART_ERROR, MYF(ME_WARNING),
- table->s->db.str, table->s->table_name.str, 0);
+ vers_info->hist_part= next;
+ if (next->range_value > thd->query_start())
return;
- }
- it.rewind();
}
+ my_error(WARN_VERS_PART_FULL, MYF(ME_WARNING|ME_ERROR_LOG),
+ table->s->db.str, table->s->table_name.str,
+ vers_info->hist_part->partition_name, "INTERVAL");
}
-
- String q(STRING_WITH_LEN("ALTER TABLE `"), &my_charset_latin1);
- if (q.append(table->s->db) ||
- q.append(STRING_WITH_LEN("`.`")) ||
- q.append(table->s->table_name) ||
- q.append("` ADD PARTITION (PARTITION `") ||
- q.append(part_name) ||
- q.append("` HISTORY)"))
- {
- my_error(ER_OUT_OF_RESOURCES, MYF(ME_ERROR_LOG));
- return;
- }
- vers_add_hist_part_data *data;
- vers_add_hist_part_data bufs;
- LEX_CSTRING part_name2;
- part_name2.str= part_name;
- part_name2.length= strlen(part_name);
- if (!my_multi_malloc(MYF(MY_WME|ME_ERROR_LOG), &data, sizeof(*data),
- &bufs.query.str, q.length() + 1,
- &bufs.db.str, table->s->db.length + 1,
- &bufs.table_name.str, table->s->table_name.length + 1,
- &bufs.part_name.str, part_name2.length + 1,
- NULL))
- return;
- bufs.assign(thd, q, table, part_name2);
- *data= bufs;
-
- if ((error= mysql_thread_create(key_thread_query, &hThread,
- &connection_attrib, vers_add_hist_part_thread, data)))
- {
- sql_print_warning("Can't create vers_add_hist_part thread (errno= %d)",
- error);
- }
- return;
}
@@ -2889,14 +2646,13 @@ bool partition_info::vers_init_info(THD * thd)
bool partition_info::vers_set_interval(THD* thd, Item* interval,
interval_type int_type, Item* starts,
- bool auto_inc, const char *table_name)
+ const char *table_name)
{
DBUG_ASSERT(part_type == VERSIONING_PARTITION);
MYSQL_TIME ltime;
uint err;
vers_info->interval.type= int_type;
- vers_info->auto_inc= auto_inc;
/* 1. assign INTERVAL to interval.step */
if (interval->fix_fields_if_needed_for_scalar(thd, &interval))
diff --git a/sql/partition_info.h b/sql/partition_info.h
index 1534189af2a..eb8e53a381a 100644
--- a/sql/partition_info.h
+++ b/sql/partition_info.h
@@ -38,7 +38,6 @@ struct Vers_part_info : public Sql_alloc
{
Vers_part_info() :
limit(0),
- auto_inc(false),
now_part(NULL),
hist_part(NULL)
{
@@ -47,7 +46,6 @@ struct Vers_part_info : public Sql_alloc
Vers_part_info(Vers_part_info &src) :
interval(src.interval),
limit(src.limit),
- auto_inc(src.auto_inc),
now_part(NULL),
hist_part(NULL)
{
@@ -71,30 +69,9 @@ struct Vers_part_info : public Sql_alloc
my_time_t start;
INTERVAL step;
enum interval_type type;
- bool is_set() const { return type < INTERVAL_LAST; }
- bool lt(size_t seconds) const
- {
- if (step.second)
- return step.second < seconds;
- if (step.minute)
- return step.minute * 60 < seconds;
- if (step.hour)
- return step.hour * 3600 < seconds;
- if (step.day)
- return step.day * 3600 * 24 < seconds;
- // comparison is used in rough estimates, it doesn't need to be calendar-correct
- if (step.month)
- return step.month * 3600 * 24 * 30 < seconds;
- DBUG_ASSERT(step.year);
- return step.year * 86400 * 30 * 365 < seconds;
- }
- bool ge(size_t seconds) const
- {
- return !(this->lt(seconds));
- }
+ bool is_set() { return type < INTERVAL_LAST; }
} interval;
ulonglong limit;
- bool auto_inc;
partition_element *now_part;
partition_element *hist_part;
};
@@ -417,16 +394,14 @@ public:
bool vers_init_info(THD *thd);
bool vers_set_interval(THD *thd, Item *interval,
interval_type int_type, Item *starts,
- bool auto_inc, const char *table_name);
- bool vers_set_limit(ulonglong limit, bool auto_inc)
+ const char *table_name);
+ bool vers_set_limit(ulonglong limit)
{
DBUG_ASSERT(part_type == VERSIONING_PARTITION);
vers_info->limit= limit;
- vers_info->auto_inc= auto_inc;
return !limit;
}
void vers_set_hist_part(THD *thd);
- void vers_add_hist_part(THD *thd);
bool vers_fix_field_list(THD *thd);
void vers_update_el_ids();
partition_element *get_partition(uint part_id)
@@ -525,14 +500,4 @@ void partition_info::vers_update_el_ids()
}
}
-
-#define MAX_PART_NAME_SIZE 8
-
-inline
-bool make_partition_name(char *move_ptr, uint i)
-{
- int res= snprintf(move_ptr, MAX_PART_NAME_SIZE + 1, "p%u", i);
- return res < 0 || res > MAX_PART_NAME_SIZE;
-}
-
#endif /* PARTITION_INFO_INCLUDED */
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index 01cf2745c41..78b6cfa63c8 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -7944,8 +7944,4 @@ ER_WARN_HISTORY_ROW_START_TIME
ER_PART_STARTS_BEYOND_INTERVAL
eng "%`s: STARTS is later than query time, first history partition may exceed INTERVAL value"
ER_GALERA_REPLICATION_NOT_SUPPORTED
- eng "DDL-statement is forbidden as table storage engine does not support Galera replication"
-ER_VERS_MODIFY_HISTORY
- eng "Modifying history is prohibited, set `secure_timestamp` to NO or SUPER"
-WARN_VERS_HIST_PART_ERROR
- eng "Versioned table %`s.%`s: adding HISTORY partition failed with error %u, see error log for details"
+ eng "DDL-statement is forbidden as table storage engine does not support Galera replication" \ No newline at end of file
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index f8ae91114f0..5885e3715bf 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -2584,15 +2584,11 @@ char *generate_partition_syntax(THD *thd, partition_info *part_info,
err+= str.append(ctime, ctime_len);
err+= str.append('\'');
}
- if (vers_info->auto_inc)
- err+= str.append(STRING_WITH_LEN(" AUTO_INCREMENT"));
}
- else if (vers_info->limit)
+ if (vers_info->limit)
{
err+= str.append(STRING_WITH_LEN("LIMIT "));
err+= str.append_ulonglong(vers_info->limit);
- if (vers_info->auto_inc)
- err+= str.append(STRING_WITH_LEN(" AUTO_INCREMENT"));
}
}
else if (part_info->part_expr)
@@ -5317,6 +5313,12 @@ that are reorganised.
now_part= el;
}
}
+ if (*fast_alter_table && tab_part_info->vers_info->interval.is_set())
+ {
+ partition_element *hist_part= tab_part_info->vers_info->hist_part;
+ if (hist_part->range_value <= thd->query_start())
+ hist_part->part_state= PART_CHANGED;
+ }
}
List_iterator<partition_element> alt_it(alt_part_info->partitions);
uint part_count= 0;
@@ -7216,8 +7218,7 @@ uint fast_alter_partition_table(THD *thd, TABLE *table,
}
else if ((alter_info->partition_flags & ALTER_PARTITION_ADD) &&
(part_info->part_type == RANGE_PARTITION ||
- part_info->part_type == LIST_PARTITION ||
- part_info->part_type == VERSIONING_PARTITION))
+ part_info->part_type == LIST_PARTITION))
{
/*
ADD RANGE/LIST PARTITIONS
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 692ed48ab8c..f24da3ed412 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -1464,8 +1464,6 @@ End SQL_MODE_ORACLE_SPECIFIC */
condition_number
opt_versioning_interval_start
-%type <num> opt_vers_auto_inc
-
%type <item_param> param_marker
%type <item_num>
@@ -5308,24 +5306,24 @@ opt_part_option:
opt_versioning_rotation:
/* empty */ {}
- | INTERVAL_SYM expr interval opt_versioning_interval_start opt_vers_auto_inc
+ | INTERVAL_SYM expr interval opt_versioning_interval_start
{
partition_info *part_info= Lex->part_info;
const char *table_name= Lex->create_last_non_select_table->table_name.str;
- if (unlikely(part_info->vers_set_interval(thd, $2, $3, $4, $5, table_name)))
+ if (unlikely(part_info->vers_set_interval(thd, $2, $3, $4, table_name)))
MYSQL_YYABORT;
}
- | LIMIT ulonglong_num opt_vers_auto_inc
+ | LIMIT ulonglong_num
+ {
+ partition_info *part_info= Lex->part_info;
+ if (unlikely(part_info->vers_set_limit($2)))
{
- partition_info *part_info= Lex->part_info;
- if (unlikely(part_info->vers_set_limit($2, $3)))
- {
- my_error(ER_PART_WRONG_VALUE, MYF(0),
- Lex->create_last_non_select_table->table_name.str,
- "LIMIT");
- MYSQL_YYABORT;
- }
+ my_error(ER_PART_WRONG_VALUE, MYF(0),
+ Lex->create_last_non_select_table->table_name.str,
+ "LIMIT");
+ MYSQL_YYABORT;
}
+ }
;
@@ -5340,20 +5338,6 @@ opt_versioning_interval_start:
}
;
-opt_vers_auto_inc:
- /* empty */
- {
- $$= 0;
- }
- | AUTO_INC
- {
- $$= 1;
- }
- | AUTO_SYM
- {
- $$= 1;
- }
- ;
/*
End of partition parser part
*/
diff --git a/sql/table.h b/sql/table.h
index 50ac46fbe39..6ce92ee048e 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -800,9 +800,6 @@ struct TABLE_SHARE
uint partition_info_str_len;
uint partition_info_buffer_size;
plugin_ref default_part_plugin;
- bool vers_altering;
- time_t vers_hist_part_timeout;
- uint vers_hist_part_error;
#endif
/**