Skip to content

Commit

Permalink
MDEV-18794 Assertion `!m_innodb' failed in ha_partition::cmp_ref upon…
Browse files Browse the repository at this point in the history
… SELECT from partitioned table

System versioning assertion fix. Since DROP SYSTEM VERSIONING does not
change list of dropped keys we should handle a special case.

Caused by MDEV-19751. This fix deprecates MDEV-17091.
  • Loading branch information
midenok committed May 28, 2020
1 parent dad7a8e commit dac1280
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 29 deletions.
12 changes: 12 additions & 0 deletions mysql-test/suite/versioning/r/partition_innodb.result
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,15 @@ partition by range columns (a, row_start) (
partition p1 values less than (100, 100)
);
ERROR HY000: Transaction-precise system versioned tables do not support partitioning by ROW START or ROW END
#
# MDEV-18794 Assertion `!m_innodb' failed in ha_partition::cmp_ref upon SELECT from partitioned table
#
create or replace table t1 (pk int auto_increment, i int, c char(1), primary key (pk), key(i))
engine=innodb with system versioning partition by key() partitions 2;
insert into t1 (i, c) values (1, 'a'), (2, 'b'), (null, 'c'), (null, 'b');
alter table t1 drop system versioning;
replace into t1 select * from t1;
select * from t1 where i > 0 or pk = 1000 limit 1;
pk i c
1 1 a
drop table t1;
11 changes: 11 additions & 0 deletions mysql-test/suite/versioning/t/partition_innodb.test
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,15 @@ partition by range columns (a, row_start) (
partition p1 values less than (100, 100)
);

--echo #
--echo # MDEV-18794 Assertion `!m_innodb' failed in ha_partition::cmp_ref upon SELECT from partitioned table
--echo #
create or replace table t1 (pk int auto_increment, i int, c char(1), primary key (pk), key(i))
engine=innodb with system versioning partition by key() partitions 2;
insert into t1 (i, c) values (1, 'a'), (2, 'b'), (null, 'c'), (null, 'b');
alter table t1 drop system versioning;
replace into t1 select * from t1;
select * from t1 where i > 0 or pk = 1000 limit 1;
drop table t1;

--source suite/versioning/common_finish.inc
50 changes: 21 additions & 29 deletions sql/sql_partition.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5986,26 +5986,35 @@ the generated partition syntax in a correct manner.
}
}
/*
Prohibit inplace when partitioned by primary key and the primary key is dropped.
Prohibit inplace when partitioned by primary key and the primary key is changed.
*/
if (!*partition_changed &&
tab_part_info->part_field_array &&
!tab_part_info->part_field_list.elements &&
table->s->primary_key != MAX_KEY)
{
KEY *primary_key= table->key_info + table->s->primary_key;
List_iterator_fast<Alter_drop> drop_it(alter_info->drop_list);
const char *primary_name= primary_key->name.str;
const Alter_drop *drop;
drop_it.rewind();
while ((drop= drop_it++))

if (alter_info->flags & (ALTER_DROP_SYSTEM_VERSIONING |
ALTER_ADD_SYSTEM_VERSIONING))
{
if (drop->type == Alter_drop::KEY &&
0 == my_strcasecmp(system_charset_info, primary_name, drop->name))
break;
*partition_changed= true;
}
else
{
KEY *primary_key= table->key_info + table->s->primary_key;
List_iterator_fast<Alter_drop> drop_it(alter_info->drop_list);
const char *primary_name= primary_key->name.str;
const Alter_drop *drop;
drop_it.rewind();
while ((drop= drop_it++))
{
if (drop->type == Alter_drop::KEY &&
0 == my_strcasecmp(system_charset_info, primary_name, drop->name))
break;
}
if (drop)
*partition_changed= TRUE;
}
if (drop)
*partition_changed= TRUE;
}
}
if (thd->work_part_info)
Expand Down Expand Up @@ -6039,23 +6048,6 @@ the generated partition syntax in a correct manner.
}
}

// In case of PARTITION BY KEY(), check if primary key has changed
// System versioning also implicitly adds/removes primary key parts
if (alter_info->partition_flags == 0 && part_info->list_of_part_fields
&& part_info->part_field_list.elements == 0)
{
if (alter_info->flags & (ALTER_DROP_SYSTEM_VERSIONING |
ALTER_ADD_SYSTEM_VERSIONING))
*partition_changed= true;

List_iterator<Key> it(alter_info->key_list);
Key *key;
while((key= it++) && !*partition_changed)
{
if (key->type == Key::PRIMARY)
*partition_changed= true;
}
}
/*
Set up partition default_engine_type either from the create_info
or from the previus table
Expand Down

0 comments on commit dac1280

Please sign in to comment.