Commit 090e5d8b authored by Sergei Petrunia's avatar Sergei Petrunia

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.
parent ef5bb081
#
# 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;
--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);
}
/*
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);
}
......
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