diff options
author | Aleksey Midenkov <midenok@gmail.com> | 2022-08-01 11:13:50 +0300 |
---|---|---|
committer | Aleksey Midenkov <midenok@gmail.com> | 2022-08-01 19:14:46 +0300 |
commit | 231feabd2b7f537c9a216a8767763814a4de268b (patch) | |
tree | 4223eaaab34b3c9127fd2cfca9af62499f7a96e9 /mysql-test/main | |
parent | f0107c90a026b28a40de772c353a9d0cb2b242e3 (diff) | |
download | mariadb-git-231feabd2b7f537c9a216a8767763814a4de268b.tar.gz |
MDEV-21540 Initialization of already inited long unique index on reorganize partition
Handler for existing partition was already index-inited at the
beginning of copy_partitions().
In the case of REORGANIZE PARTITION we fill new partition by calling
its ha_write_row() (handler is storage engine of new partition). From
that we go through the below conditions:
if (this->inited == RND)
table->clone_handler_for_update();
handler *h= table->update_handler ? table->update_handler : table->file;
First, the above misses the meaning of this->inited check. Now it is
new partition and this handler is not inited. So, we assign
table->file which is ha_partition and is really not known to be inited
or not. It is supposed (this == table->file), otherwise we are
out of the logic for using update_handler. This patch adds DBUG_ASSERT
for that.
Second, we call check_duplicate_long_entries() for table->file and
that calls ha_partition::index_init() which calls index_init() for
each partition's handler. But the existing parititions' handlers was
already inited in copy_partitions() and we fail on assertion.
The fix implies that we don't need check_duplicate_long_entries()
per-partition as we've already done check_duplicate_long_entries() for
ha_partition. For REORGANIZE PARTITION that means existing row was
already checked at previous INSERT/UPDATE commands, so no need to
check it again (see NOTE in handler::ha_write_row()).
The fix also optimizes ha_update_row() so
check_duplicate_long_entries_update() is not called per-partition
considering it was already called for ha_partition. Besides,
per-partition duplicate check is not really usable.
Diffstat (limited to 'mysql-test/main')
-rw-r--r-- | mysql-test/main/long_unique_bugs.result | 19 | ||||
-rw-r--r-- | mysql-test/main/long_unique_bugs.test | 27 |
2 files changed, 46 insertions, 0 deletions
diff --git a/mysql-test/main/long_unique_bugs.result b/mysql-test/main/long_unique_bugs.result index db4c8b2f3f3..730f721fcb1 100644 --- a/mysql-test/main/long_unique_bugs.result +++ b/mysql-test/main/long_unique_bugs.result @@ -315,5 +315,24 @@ update t1,t2 set v1 = v2 , v5 = 0; ERROR 23000: Duplicate entry '-128' for key 'v1' drop table t1, t2; # +# MDEV-21540 Initialization of already inited long unique index on reorganize partition +# +create table t1 (x int, a blob) +partition by range (x) ( +partition p1 values less than (50), +partition pn values less than maxvalue); +insert into t1 values (1, 1), (100, 1); +alter table t1 add unique key (a); +ERROR 23000: Duplicate entry '1' for key 'a' +update t1 set a= x; +alter table t1 add unique key (a); +update t1 set a= 1; +ERROR 23000: Duplicate entry '1' for key 'a' +update t1 set a= x + 1; +alter table t1 reorganize partition p1 into ( +partition n0 values less than (10), +partition n1 values less than (50)); +drop table t1; +# # End of 10.4 tests # diff --git a/mysql-test/main/long_unique_bugs.test b/mysql-test/main/long_unique_bugs.test index 02852cf08e5..f62ba2ac61a 100644 --- a/mysql-test/main/long_unique_bugs.test +++ b/mysql-test/main/long_unique_bugs.test @@ -397,5 +397,32 @@ update t1,t2 set v1 = v2 , v5 = 0; drop table t1, t2; --echo # +--echo # MDEV-21540 Initialization of already inited long unique index on reorganize partition +--echo # +create table t1 (x int, a blob) +partition by range (x) ( + partition p1 values less than (50), + partition pn values less than maxvalue); + +insert into t1 values (1, 1), (100, 1); + +# a little bit of additional checks +--error ER_DUP_ENTRY +alter table t1 add unique key (a); + +update t1 set a= x; +alter table t1 add unique key (a); +--error ER_DUP_ENTRY +update t1 set a= 1; +update t1 set a= x + 1; + +# bug failure +alter table t1 reorganize partition p1 into ( + partition n0 values less than (10), + partition n1 values less than (50)); + +drop table t1; + +--echo # --echo # End of 10.4 tests --echo # |