summaryrefslogtreecommitdiff
path: root/sql/ha_partition.cc
diff options
context:
space:
mode:
authorunknown <svoj@mysql.com/june.mysql.com>2007-09-13 18:33:40 +0500
committerunknown <svoj@mysql.com/june.mysql.com>2007-09-13 18:33:40 +0500
commitfc7a9058f1759fbc574ee1eefb4b892da49a1afb (patch)
tree588411682162a9dab59e25c0e876ea160dac1a78 /sql/ha_partition.cc
parent24e7b25695f8d6a403dca389034aff81348ef399 (diff)
downloadmariadb-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).
Diffstat (limited to 'sql/ha_partition.cc')
-rw-r--r--sql/ha_partition.cc16
1 files changed, 16 insertions, 0 deletions
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
{