diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a25fdb4e8f7c4db30ee1aca899799603007e1a68..f2cb6946b324393d91a306238de45db8ae1b691b 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1958,7 +1958,10 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, case Item_func::OPTIMIZE_NONE: break; case Item_func::OPTIMIZE_KEY: - if (cond_func->key_item()->real_item()->type() == Item::FIELD_ITEM) + if (cond_func->key_item()->real_item()->type() == Item::FIELD_ITEM && + // field from outer query can't be used as key + !((Item_field*) (cond_func->key_item()->real_item())) + ->depended_from) add_key_field(key_fields,*and_level, ((Item_field*) (cond_func->key_item()->real_item())) ->field, @@ -1969,7 +1972,10 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, bool equal_func=(cond_func->functype() == Item_func::EQ_FUNC || cond_func->functype() == Item_func::EQUAL_FUNC); - if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM) + if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM && + // field from outer query can't be used as key + !((Item_field*) (cond_func->arguments()[0]->real_item())) + ->depended_from) { add_key_field(key_fields,*and_level, ((Item_field*) (cond_func->arguments()[0])->real_item()) @@ -1978,7 +1984,10 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, (cond_func->arguments()[1]),usable_tables); } if (cond_func->arguments()[1]->real_item()->type() == Item::FIELD_ITEM && - cond_func->functype() != Item_func::LIKE_FUNC) + cond_func->functype() != Item_func::LIKE_FUNC && + // field from outer query can't be used as key + !((Item_field*) (cond_func->arguments()[1]->real_item())) + ->depended_from) { add_key_field(key_fields,*and_level, ((Item_field*) (cond_func->arguments()[1])->real_item()) @@ -1990,7 +1999,10 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, } case Item_func::OPTIMIZE_NULL: /* column_name IS [NOT] NULL */ - if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM) + if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM && + // field from outer query can't be used as key + !((Item_field*) (cond_func->arguments()[0]->real_item())) + ->depended_from) { add_key_field(key_fields,*and_level, ((Item_field*) (cond_func->arguments()[0])->real_item())