BUG#30583 - Partition on DOUBLE key + INNODB + count(*) == crash

Issuing SELECT COUNT(*) against partitioned InnoDB table may cause
server crash.

Fixed that not all required fields were included into read_set.
parent fe4f440a
...@@ -129,3 +129,10 @@ insert into t1 (time, first_name, last_name) values ('2007-02-07', 'Q', 'Robert' ...@@ -129,3 +129,10 @@ insert into t1 (time, first_name, last_name) values ('2007-02-07', 'Q', 'Robert'
SELECT * FROM t1 WHERE first_name='Andy' OR last_name='Jake'; SELECT * FROM t1 WHERE first_name='Andy' OR last_name='Jake';
id time first_name last_name id time first_name last_name
drop table t1; drop table t1;
CREATE TABLE t1 (a DOUBLE NOT NULL, KEY(a)) ENGINE=InnoDB
PARTITION BY KEY(a) PARTITIONS 10;
INSERT INTO t1 VALUES(1),(2);
SELECT COUNT(*) FROM t1;
COUNT(*)
2
DROP TABLE t1;
...@@ -134,3 +134,11 @@ SELECT * FROM t1 WHERE first_name='Andy' OR last_name='Jake'; ...@@ -134,3 +134,11 @@ SELECT * FROM t1 WHERE first_name='Andy' OR last_name='Jake';
drop table t1; drop table t1;
#
# BUG#30583 - Partition on DOUBLE key + INNODB + count(*) == crash
#
CREATE TABLE t1 (a DOUBLE NOT NULL, KEY(a)) ENGINE=InnoDB
PARTITION BY KEY(a) PARTITIONS 10;
INSERT INTO t1 VALUES(1),(2);
SELECT COUNT(*) FROM t1;
DROP TABLE t1;
...@@ -3324,6 +3324,22 @@ int ha_partition::index_init(uint inx, bool sorted) ...@@ -3324,6 +3324,22 @@ int ha_partition::index_init(uint inx, bool sorted)
*/ */
if (m_lock_type == F_WRLCK) if (m_lock_type == F_WRLCK)
bitmap_union(table->read_set, &m_part_info->full_part_field_set); bitmap_union(table->read_set, &m_part_info->full_part_field_set);
else if (sorted && m_table_flags & HA_PARTIAL_COLUMN_READ)
{
/*
An ordered scan is requested and necessary fields aren't in read_set.
This may happen e.g. with SELECT COUNT(*) FROM t1. We must ensure
that all fields of current key are included into read_set, as
partitioning requires them for sorting
(see ha_partition::handle_ordered_index_scan).
TODO: handle COUNT(*) queries via unordered scan.
*/
uint i;
for (i= 0; i < m_curr_key_info->key_parts; i++)
bitmap_set_bit(table->read_set,
m_curr_key_info->key_part[i].field->field_index);
}
file= m_file; file= m_file;
do do
{ {
......
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