Skip to content

Commit

Permalink
MDEV-30442: Assertion `!m_innodb' failed in ha_partition::cmp_ref ...
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
spetrunia committed Mar 16, 2023
1 parent ef5bb08 commit 090e5d8
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 7 deletions.
24 changes: 24 additions & 0 deletions mysql-test/main/partition_innodb2.result
Original file line number Diff line number Diff line change
@@ -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 changes: 30 additions & 0 deletions mysql-test/main/partition_innodb2.test
Original file line number Diff line number Diff line change
@@ -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;
7 changes: 0 additions & 7 deletions sql/ha_partition.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down

0 comments on commit 090e5d8

Please sign in to comment.