diff options
author | unknown <svoj@mysql.com/june.mysql.com> | 2007-09-13 18:33:40 +0500 |
---|---|---|
committer | unknown <svoj@mysql.com/june.mysql.com> | 2007-09-13 18:33:40 +0500 |
commit | fc7a9058f1759fbc574ee1eefb4b892da49a1afb (patch) | |
tree | 588411682162a9dab59e25c0e876ea160dac1a78 | |
parent | 24e7b25695f8d6a403dca389034aff81348ef399 (diff) | |
download | mariadb-git-fc7a9058f1759fbc574ee1eefb4b892da49a1afb.tar.gz |
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.
mysql-test/r/partition_innodb.result:
A test case for BUG#30583.
mysql-test/t/partition_innodb.test:
A test case for BUG#30583.
sql/ha_partition.cc:
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).
-rw-r--r-- | mysql-test/r/partition_innodb.result | 7 | ||||
-rw-r--r-- | mysql-test/t/partition_innodb.test | 8 | ||||
-rw-r--r-- | sql/ha_partition.cc | 16 |
3 files changed, 31 insertions, 0 deletions
diff --git a/mysql-test/r/partition_innodb.result b/mysql-test/r/partition_innodb.result index 8282cfc212a..5b755b6bfd5 100644 --- a/mysql-test/r/partition_innodb.result +++ b/mysql-test/r/partition_innodb.result @@ -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'; id time first_name last_name 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; diff --git a/mysql-test/t/partition_innodb.test b/mysql-test/t/partition_innodb.test index f4320c5c56a..4a50332b3df 100644 --- a/mysql-test/t/partition_innodb.test +++ b/mysql-test/t/partition_innodb.test @@ -134,3 +134,11 @@ SELECT * FROM t1 WHERE first_name='Andy' OR last_name='Jake'; 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; diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index d46b3a3bb08..2681498417e 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -3324,6 +3324,22 @@ int ha_partition::index_init(uint inx, bool sorted) */ if (m_lock_type == F_WRLCK) 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; do { |