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())