diff options
author | Igor Babaev <igor@askmonty.org> | 2013-11-24 22:10:36 -0800 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2013-11-24 22:10:36 -0800 |
commit | 3fc77434351b275a9bc4e2a8b08d8d491ba0159c (patch) | |
tree | 2cc0d7bb4a7edeaa92c25c32f91423ab99934a8f /sql | |
parent | 11eb7333f397c4edd0103db6871b784dc11eae1f (diff) | |
parent | 998ed51497ae46b2478d490e22cccd16295701f8 (diff) | |
download | mariadb-git-3fc77434351b275a9bc4e2a8b08d8d491ba0159c.tar.gz |
Merge
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_select.cc | 28 |
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 */ |