summaryrefslogtreecommitdiff
path: root/sql/sql_select.cc
diff options
context:
space:
mode:
authorunknown <gkodinov/kgeorge@magare.gmz>2007-11-21 13:19:50 +0200
committerunknown <gkodinov/kgeorge@magare.gmz>2007-11-21 13:19:50 +0200
commit0fdbcc3292a2c6cfe4f03c06075a4dc8d2f80766 (patch)
tree76d5a0abf9cb2f27b05525edf5cf36d5ce0f7b83 /sql/sql_select.cc
parentcf6ba9fcc1cae4537d068bd6b44241eec787679b (diff)
parentf3637af43ebdda58c2cbaa79406792dc6f739c08 (diff)
downloadmariadb-git-0fdbcc3292a2c6cfe4f03c06075a4dc8d2f80766.tar.gz
Merge magare.gmz:/home/kgeorge/mysql/work/B30788-5.0-opt
into magare.gmz:/home/kgeorge/mysql/work/B30788-5.1-opt mysql-test/r/subselect3.result: Auto merged sql/item.h: Auto merged sql/sql_select.cc: Auto merged mysql-test/r/subselect.result: merge of bug 30788 to 5.1-opt mysql-test/t/subselect.test: merge of bug 30788 to 5.1-opt
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r--sql/sql_select.cc26
1 files changed, 15 insertions, 11 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index fbd567c098b..ced38cc4719 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -223,6 +223,7 @@ static void select_describe(JOIN *join, bool need_tmp_table,bool need_order,
bool distinct, const char *message=NullS);
static Item *remove_additional_cond(Item* conds);
static void add_group_and_distinct_keys(JOIN *join, JOIN_TAB *join_tab);
+static bool test_if_ref(Item_field *left_item,Item *right_item);
/*
@@ -680,9 +681,6 @@ err:
without "checking NULL", remove the predicates that were pushed down
into the subquery.
- We can remove the equalities that will be guaranteed to be true by the
- fact that subquery engine will be using index lookup.
-
If the subquery compares scalar values, we can remove the condition that
was wrapped into trig_cond (it will be checked when needed by the subquery
engine)
@@ -692,6 +690,12 @@ err:
and non-NULL values, we'll do a full table scan and will rely on the
equalities corresponding to non-NULL parts of left tuple to filter out
non-matching records.
+
+ TODO: We can remove the equalities that will be guaranteed to be true by the
+ fact that subquery engine will be using index lookup. This must be done only
+ for cases where there are no conversion errors of significance, e.g. 257
+ that is searched in a byte. But this requires homogenization of the return
+ codes of all Field*::store() methods.
*/
void JOIN::remove_subq_pushed_predicates(Item **where)
@@ -699,17 +703,13 @@ void JOIN::remove_subq_pushed_predicates(Item **where)
if (conds->type() == Item::FUNC_ITEM &&
((Item_func *)this->conds)->functype() == Item_func::EQ_FUNC &&
((Item_func *)conds)->arguments()[0]->type() == Item::REF_ITEM &&
- ((Item_func *)conds)->arguments()[1]->type() == Item::FIELD_ITEM)
+ ((Item_func *)conds)->arguments()[1]->type() == Item::FIELD_ITEM &&
+ test_if_ref ((Item_field *)((Item_func *)conds)->arguments()[1],
+ ((Item_func *)conds)->arguments()[0]))
{
*where= 0;
return;
}
- if (conds->type() == Item::COND_ITEM &&
- ((class Item_func *)this->conds)->functype() ==
- Item_func::COND_AND_FUNC)
- {
- *where= remove_additional_cond(conds);
- }
}
@@ -1259,7 +1259,7 @@ JOIN::optimize()
{
if (!having)
{
- Item *where= 0;
+ Item *where= conds;
if (join_tab[0].type == JT_EQ_REF &&
join_tab[0].ref.items[0]->name == in_left_expr_name)
{
@@ -12206,8 +12206,12 @@ static bool test_if_ref(Item_field *left_item,Item *right_item)
Item *ref_item=part_of_refkey(field->table,field);
if (ref_item && ref_item->eq(right_item,1))
{
+ right_item= right_item->real_item();
if (right_item->type() == Item::FIELD_ITEM)
return (field->eq_def(((Item_field *) right_item)->field));
+ /* remove equalities injected by IN->EXISTS transformation */
+ else if (right_item->type() == Item::CACHE_ITEM)
+ return ((Item_cache *)right_item)->eq_def (field);
if (right_item->const_item() && !(right_item->is_null()))
{
/*