summaryrefslogtreecommitdiff
path: root/sql/ha_partition.cc
diff options
context:
space:
mode:
authorMattias Jonsson <mattias.jonsson@oracle.com>2012-05-15 12:45:52 +0200
committerMattias Jonsson <mattias.jonsson@oracle.com>2012-05-15 12:45:52 +0200
commitbed97f20ae6e90ca5a1d9f423564fdd95b5bc145 (patch)
treeccf2bc0a4d7a55fb4ed1b01510fc1b18630e1a04 /sql/ha_partition.cc
parent18fec1e9c1eeaf2f598b98aa764c161fee1f91d9 (diff)
downloadmariadb-git-bed97f20ae6e90ca5a1d9f423564fdd95b5bc145.tar.gz
bug#13949735: crash regression from bug#13694811.
There can be cases when the optimizer calls ha_partition::records_in_range when there are no matching partitions. So the DBUG_ASSERT of !tot_used_partitions does assert. Fixed by returning 0 instead when no matching partitions are found. This will avoid the crash. records_in_range will then try to find the biggest used partition, which will not find any partition and records_in_range will then return 0, meaning non rows can be found. Patch contributed by Davi Arnaut at twitter.
Diffstat (limited to 'sql/ha_partition.cc')
-rw-r--r--sql/ha_partition.cc12
1 files changed, 11 insertions, 1 deletions
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index 5b25bd26298..1debc02d7f2 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -6322,7 +6322,17 @@ ha_rows ha_partition::min_rows_for_estimate()
DBUG_ENTER("ha_partition::min_rows_for_estimate");
tot_used_partitions= bitmap_bits_set(&m_part_info->used_partitions);
- DBUG_ASSERT(tot_used_partitions);
+
+ /*
+ All partitions might have been left as unused during partition pruning
+ due to, for example, an impossible WHERE condition. Nonetheless, the
+ optimizer might still attempt to perform (e.g. range) analysis where an
+ estimate of the the number of rows is calculated using records_in_range.
+ Hence, to handle this and other possible cases, use zero as the minimum
+ number of rows to base the estimate on if no partition is being used.
+ */
+ if (!tot_used_partitions)
+ DBUG_RETURN(0);
/*
Allow O(log2(tot_partitions)) increase in number of used partitions.