summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2013-11-25 10:04:41 -0800
committerIgor Babaev <igor@askmonty.org>2013-11-25 10:04:41 -0800
commit24c1bff3e2939d20adf5637e4bb1583b896fe6fb (patch)
tree325f5c6c4517d5c22bd1e72c115acddb394a0443 /sql
parent7a1f31866c67949dd63bae09521e005aadb8ce82 (diff)
parent3fc77434351b275a9bc4e2a8b08d8d491ba0159c (diff)
downloadmariadb-git-24c1bff3e2939d20adf5637e4bb1583b896fe6fb.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 4562ababca0..3da62e2cc89 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -3836,6 +3836,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 */
@@ -3972,6 +3987,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 */