diff options
author | Igor Babaev <igor@askmonty.org> | 2013-04-27 23:28:48 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2013-04-27 23:28:48 -0700 |
commit | cade00e22c824ee4c764dc8b23284b301c9fc859 (patch) | |
tree | df354d86dd1afe2c2182ff6f9d5f595fe9d9dfcf /sql/sql_select.cc | |
parent | 36e4014cafd9f71b530b4af5eca7190db8561873 (diff) | |
download | mariadb-git-cade00e22c824ee4c764dc8b23284b301c9fc859.tar.gz |
Fixed bug mdev-4340.
The function make_join_statistics checks whether eq_ref access uses only
constant expressions, and, if this is the case the function performs
constant row substitution. The code of this check must take into account
hidden components of extended secondary keys.
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r-- | sql/sql_select.cc | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a1d8d3c62e2..6d80ea8d212 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3523,9 +3523,16 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list, !table->fulltext_searched && (!embedding || (embedding->sj_on_expr && !embedding->embedding))) { + key_map base_part, base_const_ref, base_eq_part; + base_part.set_prefix(keyinfo->key_parts); + base_const_ref= const_ref; + base_const_ref.intersect(base_part); + base_eq_part= eq_part; + base_eq_part.intersect(base_part); if (table->actual_key_flags(keyinfo) & HA_NOSAME) { - if (const_ref == eq_part && + + if (base_const_ref == base_eq_part && !has_expensive_keyparts && !((outer_join & table->map) && (*s->on_expr_ref)->is_expensive())) @@ -3551,7 +3558,7 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list, else found_ref|= refs; // Table is const if all refs are const } - else if (const_ref == eq_part) + else if (base_const_ref == base_eq_part) s->const_keys.set_bit(key); } } |