From a7cf0db3d866d92ca54d4ba5f15f3cc3f8b48d31 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Mon, 2 Dec 2019 11:48:37 +0300 Subject: [PATCH] MDEV-21011 Table corruption reported for versioned partitioned table after DELETE: "Found a misplaced row" LIMIT history partitions cannot be checked by existing algorithm of check_misplaced_rows() because working history partition is incremented each time another one is filled. The existing algorithm gets record and tries to decide partition id for it by get_partition_id(). For LIMIT history it will just get first non-filled partition. To fix such partitions it is required to do REBUILD instead of REPAIR. --- mysql-test/suite/versioning/r/partition.result | 14 ++++++++++++++ mysql-test/suite/versioning/t/partition.test | 15 +++++++++++++++ sql/ha_partition.cc | 15 +++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result index 315413fbd7d..3fd6c1f55d4 100644 --- a/mysql-test/suite/versioning/r/partition.result +++ b/mysql-test/suite/versioning/r/partition.result @@ -583,3 +583,17 @@ x a 3 bar 4 bar drop table t1; +# +# MDEV-21011 Table corruption reported for versioned partitioned table after DELETE: "Found a misplaced row" +# +create table t1 (a int) with system versioning +partition by system_time limit 3 +(partition p1 history, partition p2 history, partition pn current); +insert into t1 values (1),(2),(3),(4); +delete from t1; +delete from t1; +check table t1; +Table Op Msg_type Msg_text +test.t1 check note Not supported for non-INTERVAL history partitions +test.t1 check note The storage engine for the table doesn't support check +drop table t1; diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test index ce8c2e5ec1a..5b23d893974 100644 --- a/mysql-test/suite/versioning/t/partition.test +++ b/mysql-test/suite/versioning/t/partition.test @@ -531,4 +531,19 @@ update t1 set a= 'bar' limit 4; select * from t1; drop table t1; +--echo # +--echo # MDEV-21011 Table corruption reported for versioned partitioned table after DELETE: "Found a misplaced row" +--echo # +create table t1 (a int) with system versioning +partition by system_time limit 3 +(partition p1 history, partition p2 history, partition pn current); +insert into t1 values (1),(2),(3),(4); +delete from t1; +delete from t1; +check table t1; + +# cleanup +drop table t1; + + --source suite/versioning/common_finish.inc diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 380fc48e915..2dcf2996bf7 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -10697,8 +10697,8 @@ int ha_partition::indexes_are_disabled(void) @param repair If true, move misplaced rows to correct partition. @return Operation status. - @retval 0 Success - @retval != 0 Error + @retval HA_ADMIN_OK Success + @retval != HA_ADMIN_OK Error */ int ha_partition::check_misplaced_rows(uint read_part_id, bool do_repair) @@ -10712,6 +10712,17 @@ int ha_partition::check_misplaced_rows(uint read_part_id, bool do_repair) DBUG_ASSERT(m_file); + if (m_part_info->vers_info && + read_part_id != m_part_info->vers_info->now_part->id && + !m_part_info->vers_info->interval.is_set()) + { + print_admin_msg(ha_thd(), MYSQL_ERRMSG_SIZE, "note", + table_share->db.str, table->alias, + opt_op_name[CHECK_PARTS], + "Not supported for non-INTERVAL history partitions"); + DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED); + } + if (do_repair) { /* We must read the full row, if we need to move it! */