summaryrefslogtreecommitdiff
path: root/sql/sql_select.cc
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2013-04-27 23:28:48 -0700
committerIgor Babaev <igor@askmonty.org>2013-04-27 23:28:48 -0700
commitcade00e22c824ee4c764dc8b23284b301c9fc859 (patch)
treedf354d86dd1afe2c2182ff6f9d5f595fe9d9dfcf /sql/sql_select.cc
parent36e4014cafd9f71b530b4af5eca7190db8561873 (diff)
downloadmariadb-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.cc11
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);
}
}