diff options
author | Sergey Petrunya <psergey@askmonty.org> | 2014-10-06 15:29:22 +0400 |
---|---|---|
committer | Sergey Petrunya <psergey@askmonty.org> | 2014-10-06 15:29:22 +0400 |
commit | fd4c9af3987814e0e13f429c900ea0256a435cbe (patch) | |
tree | 49864d7aa239cf0a46a121b0d1415b8f790f747b /sql/sql_statistics.cc | |
parent | 689ffe3559a4b7bacd13503ba93659b2f4560bbb (diff) | |
download | mariadb-git-fd4c9af3987814e0e13f429c900ea0256a435cbe.tar.gz |
MDEV-6442: Assertion `join->best_read < double(...)' failed with optimizer_use_condition_selectivity >=3
- Fix the crash by making get_column_range_cardinality()
to handle the special case where Column_stats objects
is an all-zeros object (the question of what is the point
of having Field::read_stats point to such object remains a
mystery)
- Added a few comments. Learning the code still.
Diffstat (limited to 'sql/sql_statistics.cc')
-rw-r--r-- | sql/sql_statistics.cc | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index bf79747f9a0..e1b197f4a63 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -3502,7 +3502,7 @@ double get_column_range_cardinality(Field *field, !(range_flag & NEAR_MIN); if (col_non_nulls < 1) - res= 0; + res= 0; /* this is likely wrong, see MDEV-6843 */ else if (min_endp && max_endp && min_endp->length == max_endp->length && !memcmp(min_endp->key, max_endp->key, min_endp->length)) { @@ -3515,6 +3515,15 @@ double get_column_range_cardinality(Field *field, { double avg_frequency= col_stats->get_avg_frequency(); res= avg_frequency; + /* + psergey-todo: what does check for min_value, max_value mean? + min/max_value are set to NULL in alloc_statistics_for_table() and + alloc_statistics_for_table_share(). Both functions will immediately + call create_min_max_statistical_fields_for_table and + create_min_max_statistical_fields_for_table_share() respectively, + which will set min/max_value to be valid pointers, unless OOM + occurs. + */ if (avg_frequency > 1.0 + 0.000001 && col_stats->min_value && col_stats->max_value) { @@ -3530,6 +3539,11 @@ double get_column_range_cardinality(Field *field, avg_frequency / col_non_nulls); } } + else if (avg_frequency == 0.0) + { + /* This actually means there is no statistics data */ + res= tab_records; + } } } else |