mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-30442: Assertion `!m_innodb' failed in ha_partition::cmp_ref ...
The failed assertion was about encountering the same rowid value in two different partitions. This wasn't possible with InnoDB previously: InnoDB used a global counter to produce rowid values for hidden PK. After the fix for MDEV-19506, it uses per-table counters so it's easily possible to get the same hidden PK values in different tables.
This commit is contained in:
24
mysql-test/main/partition_innodb2.result
Normal file
24
mysql-test/main/partition_innodb2.result
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#
|
||||||
|
# MDEV-30442: Assertion `!m_innodb' failed in ha_partition::cmp_ref on MULTI-DELETE
|
||||||
|
#
|
||||||
|
create table t1 (a int) engine=innodb;
|
||||||
|
insert into t1 values (1),(2),(1),(2);
|
||||||
|
create table t2 (
|
||||||
|
a int,
|
||||||
|
b int,
|
||||||
|
key(a)
|
||||||
|
) engine=innodb partition by list(a)
|
||||||
|
(
|
||||||
|
partition p0 values in (1),
|
||||||
|
partition p1 values in (2),
|
||||||
|
partition p2 values in (0,3,4,5,6,7,8,9)
|
||||||
|
);
|
||||||
|
insert into t2 select
|
||||||
|
mod(seq, 10), seq from seq_1_to_50;
|
||||||
|
explain
|
||||||
|
delete t1, t2 from t1, t2 where t1.a=t2.a;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
|
||||||
|
1 SIMPLE t2 ref a a 5 test.t1.a 1
|
||||||
|
delete t1, t2 from t1, t2 where t1.a=t2.a;
|
||||||
|
drop table t1,t2;
|
30
mysql-test/main/partition_innodb2.test
Normal file
30
mysql-test/main/partition_innodb2.test
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
--source include/not_embedded.inc
|
||||||
|
--source include/have_partition.inc
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_sequence.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30442: Assertion `!m_innodb' failed in ha_partition::cmp_ref on MULTI-DELETE
|
||||||
|
--echo #
|
||||||
|
create table t1 (a int) engine=innodb;
|
||||||
|
insert into t1 values (1),(2),(1),(2);
|
||||||
|
|
||||||
|
create table t2 (
|
||||||
|
a int,
|
||||||
|
b int,
|
||||||
|
key(a)
|
||||||
|
) engine=innodb partition by list(a)
|
||||||
|
(
|
||||||
|
partition p0 values in (1),
|
||||||
|
partition p1 values in (2),
|
||||||
|
partition p2 values in (0,3,4,5,6,7,8,9)
|
||||||
|
);
|
||||||
|
|
||||||
|
insert into t2 select
|
||||||
|
mod(seq, 10), seq from seq_1_to_50;
|
||||||
|
|
||||||
|
explain
|
||||||
|
delete t1, t2 from t1, t2 where t1.a=t2.a;
|
||||||
|
delete t1, t2 from t1, t2 where t1.a=t2.a;
|
||||||
|
|
||||||
|
drop table t1,t2;
|
@@ -10784,13 +10784,6 @@ int ha_partition::cmp_ref(const uchar *ref1, const uchar *ref2)
|
|||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
In Innodb we compare with either primary key value or global DB_ROW_ID so
|
|
||||||
it is not possible that the two references are equal and are in different
|
|
||||||
partitions, but in myisam it is possible since we are comparing offsets.
|
|
||||||
Remove this assert if DB_ROW_ID is changed to be per partition.
|
|
||||||
*/
|
|
||||||
DBUG_ASSERT(!m_innodb);
|
|
||||||
DBUG_RETURN(diff2 > diff1 ? -1 : 1);
|
DBUG_RETURN(diff2 > diff1 ? -1 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user