summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2013-11-24 22:10:36 -0800
committerIgor Babaev <igor@askmonty.org>2013-11-24 22:10:36 -0800
commit3fc77434351b275a9bc4e2a8b08d8d491ba0159c (patch)
tree2cc0d7bb4a7edeaa92c25c32f91423ab99934a8f /sql
parent11eb7333f397c4edd0103db6871b784dc11eae1f (diff)
parent998ed51497ae46b2478d490e22cccd16295701f8 (diff)
downloadmariadb-git-3fc77434351b275a9bc4e2a8b08d8d491ba0159c.tar.gz
Merge
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_select.cc28
1 files changed, 28 insertions, 0 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 3541d87022e..0f570a491fc 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -3618,6 +3618,21 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
conds=new Item_int((longlong) 0,1);
}
join->conds= conds;
+ join->cond_equal= NULL;
+ if (conds)
+ {
+ if (conds->type() == Item::COND_ITEM &&
+ ((Item_cond*) conds)->functype() == Item_func::COND_AND_FUNC)
+ join->cond_equal= (&((Item_cond_and *) conds)->cond_equal);
+ else if (conds->type() == Item::FUNC_ITEM &&
+ ((Item_func*) conds)->functype() == Item_func::MULT_EQUAL_FUNC)
+ {
+ if (!join->cond_equal)
+ join->cond_equal= new COND_EQUAL;
+ join->cond_equal->current_level.empty();
+ join->cond_equal->current_level.push_back((Item_equal*) conds);
+ }
+ }
}
/* Calc how many (possible) matched records in each table */
@@ -3732,6 +3747,19 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
if (join->const_tables != join->table_count)
optimize_keyuse(join, keyuse_array);
+ DBUG_ASSERT(!join->conds || !join->cond_equal ||
+ !join->cond_equal->current_level.elements ||
+ (join->conds->type() == Item::COND_ITEM &&
+ ((Item_cond*) (join->conds))->functype() ==
+ Item_func::COND_AND_FUNC &&
+ join->cond_equal ==
+ &((Item_cond_and *) (join->conds))->cond_equal) ||
+ (join->conds->type() == Item::FUNC_ITEM &&
+ ((Item_func*) (join->conds))->functype() ==
+ Item_func::MULT_EQUAL_FUNC &&
+ join->cond_equal->current_level.elements == 1 &&
+ join->cond_equal->current_level.head() == join->conds));
+
if (optimize_semijoin_nests(join, all_table_map))
DBUG_RETURN(TRUE); /* purecov: inspected */