Commit ea2f0997 authored by Aleksey Midenkov's avatar Aleksey Midenkov

MDEV-28271 Assertion on TRUNCATE PARTITION for PARTITION BY SYSTEM_TIME

Like in MDEV-27217 vers_set_hist_part() for LIMIT depends on all
partitions selected in read_partitions. That bugfix just disabled
partition selection for DELETE with this check:

  if (table->pos_in_table_list &&
      table->pos_in_table_list->partition_names)
  {
    return HA_ERR_PARTITION_LIST;
  }

ALTER TABLE TRUNCATE PARTITION is a different story. First, it doesn't
update pos_in_table_list->partition_names, but
thd->lex->alter_info.partition_names. But we cannot depend on that
since alter_info will be stale for DML. Second, we should not disable
TRUNCATE PARTITION for that to be consistent with TRUNCATE TABLE
behavior.

Now we don't do vers_set_hist_part() for ALTER TABLE as this command
is not DML, so it does not produce history.
parent add5137d
......@@ -839,5 +839,77 @@ p0 10
p1 0
pn 90
drop table t1;
#
# MDEV-28271 Assertion on TRUNCATE PARTITION for PARTITION BY SYSTEM_TIME
#
create table t1 (x int) with system versioning
partition by system_time limit 1 (
partition p0 history,
partition p1 history,
partition pn current);
insert into t1 values (0);
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
select * from t1 partition (p0);
x
0
1
select * from t1 partition (p1);
x
2
3
select * from t1 partition (pn);
x
4
# TRUNCATE TABLE deletes history and current data
truncate table t1;
select * from t1 partition (p0);
x
select * from t1 partition (p1);
x
select * from t1 partition (pn);
x
insert into t1 values (0);
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
# TRUNCATE PARTITION ALL does the same
alter table t1 truncate partition all;
select * from t1 partition (p0);
x
select * from t1 partition (p1);
x
select * from t1 partition (pn);
x
insert into t1 values (0);
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
# TRUNCATE PARTITION deletes data from HISTORY partition
alter table t1 truncate partition p1;
select * from t1 partition (p0);
x
0
1
select * from t1 partition (p1);
x
select * from t1 partition (pn);
x
4
# or from CURRENT partition
alter table t1 truncate partition pn;
select * from t1 partition (p0);
x
0
1
select * from t1 partition (p1);
x
select * from t1 partition (pn);
x
drop table t1;
# End of 10.3 tests
set global innodb_stats_persistent= @save_persistent;
......@@ -822,6 +822,66 @@ from information_schema.partitions
where table_name = 't1';
# Cleanup
drop table t1;
--echo #
--echo # MDEV-28271 Assertion on TRUNCATE PARTITION for PARTITION BY SYSTEM_TIME
--echo #
create table t1 (x int) with system versioning
partition by system_time limit 1 (
partition p0 history,
partition p1 history,
partition pn current);
insert into t1 values (0);
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
select * from t1 partition (p0);
select * from t1 partition (p1);
select * from t1 partition (pn);
--echo # TRUNCATE TABLE deletes history and current data
--disable_warnings
truncate table t1;
--enable_warnings
select * from t1 partition (p0);
select * from t1 partition (p1);
select * from t1 partition (pn);
insert into t1 values (0);
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
--echo # TRUNCATE PARTITION ALL does the same
alter table t1 truncate partition all;
select * from t1 partition (p0);
select * from t1 partition (p1);
select * from t1 partition (pn);
insert into t1 values (0);
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
update t1 set x= x + 1;
--echo # TRUNCATE PARTITION deletes data from HISTORY partition
alter table t1 truncate partition p1;
select * from t1 partition (p0);
select * from t1 partition (p1);
select * from t1 partition (pn);
--echo # or from CURRENT partition
alter table t1 truncate partition pn;
select * from t1 partition (p0);
select * from t1 partition (p1);
select * from t1 partition (pn);
drop table t1;
--echo # End of 10.3 tests
set global innodb_stats_persistent= @save_persistent;
......
......@@ -4034,6 +4034,7 @@ int ha_partition::external_lock(THD *thd, int lock_type)
only for versioned DML. */
thd->lex->sql_command != SQLCOM_SELECT &&
thd->lex->sql_command != SQLCOM_INSERT_SELECT &&
thd->lex->sql_command != SQLCOM_ALTER_TABLE &&
(error= m_part_info->vers_set_hist_part(thd)))
goto err_handler;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment