diff --git a/include/ft_global.h b/include/ft_global.h
index 906413132359538720c7711775b90b065560091e..3937bd87c7f20d37b18ba8705f6918c5fc39dba3 100644
--- a/include/ft_global.h
+++ b/include/ft_global.h
@@ -47,8 +47,9 @@ void ft_free_stopwords(void);
 
 FT_DOCLIST * ft_init_search(void *, uint, byte *, uint, my_bool);
 int          ft_read_next(FT_DOCLIST *, char *);
-#define      ft_close_search(handler)    my_free(((gptr)(handler)),MYF(0))
-#define      ft_get_relevance(handler)   ((handler)->doc[(handler)->curdoc].weight)
+#define      ft_close_search(handler)   my_free(((gptr)(handler)),MYF(0))
+#define      ft_get_relevance(handler)  ((handler)->doc[(handler)->curdoc].weight)
+#define      ft_reinit_search(handler)  (((FT_DOCLIST *)(handler))->curdoc=-1)
 
 #ifdef  __cplusplus
 }
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc
index 76433a8eae585d0f1fc41af738a55fd22600e0b2..630a672d346f644fa4433120e366c9c578c3f58c 100644
--- a/sql/ha_myisam.cc
+++ b/sql/ha_myisam.cc
@@ -1088,7 +1088,8 @@ int ha_myisam::ft_read(byte * buf)
 
   thread_safe_increment(ha_read_next_count,&LOCK_status); // why ?
 
-  error=ft_read_next((FT_DOCLIST *) ft_handler,(char*) buf);
+  if (error=ft_read_next((FT_DOCLIST *) ft_handler,(char*) buf))
+    ft_handler=NULL; // Magic here ! See Item_func_match::val()
 
   table->status=error ? STATUS_NOT_FOUND: 0;
   return error;
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 39a4bee1366d2302ac34764b1f9bf90901e33035..47bc089b3e0cc55df5762db07dbaaf93a6a80c10 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -1846,43 +1846,46 @@ double Item_func_match::val()
 
   if (join_key)
   {
-    return ft_get_relevance(ft_handler);
+    if (table->file->ft_handler)
+      return ft_get_relevance(ft_handler);
+
+    join_key=0; // Magic here ! See ha_myisam::ft_read()
   }
-  else
-  {
-    /* we'll have to find ft_relevance manually in ft_handler array */
 
-    int a,b,c;
-    FT_DOC  *docs=ft_handler->doc;
-    my_off_t docid=table->file->row_position();
+  /* we'll have to find ft_relevance manually in ft_handler array */
 
-    if ((null_value=(docid==HA_OFFSET_ERROR)))
-      return 0.0;
+  int a,b,c;
+  FT_DOC  *docs=ft_handler->doc;
+  my_off_t docid=table->file->row_position();
 
-    // Assuming docs[] is sorted by dpos...
+  if ((null_value=(docid==HA_OFFSET_ERROR)))
+    return 0.0;
 
-    for (a=0, b=ft_handler->ndocs, c=(a+b)/2; b-a>1; c=(a+b)/2)
-    {
-      if (docs[c].dpos > docid)
-        b=c;
-      else
-        a=c;
-    }
-    if (docs[a].dpos == docid)
-      return docs[a].weight;
+  // Assuming docs[] is sorted by dpos...
+
+  for (a=0, b=ft_handler->ndocs, c=(a+b)/2; b-a>1; c=(a+b)/2)
+  {
+    if (docs[c].dpos > docid)
+      b=c;
     else
-      return 0.0;
+      a=c;
   }
+  if (docs[a].dpos == docid)
+    return docs[a].weight;
+  else
+    return 0.0;
+
 }
 
-void Item_func_match::init_search()
+void Item_func_match::init_search(bool no_order)
 {
   if (ft_handler)
     return;
 
   if (master)
   {
-    master->init_search();
+    join_key=master->join_key=join_key|master->join_key;
+    master->init_search(no_order);
     ft_handler=master->ft_handler;
     join_key=master->join_key;
     return;
@@ -1894,7 +1897,8 @@ void Item_func_match::init_search()
 
   ft_tmp=key_item()->val_str(&tmp2);
   ft_handler=(FT_DOCLIST *)
-     table->file->ft_init_ext(key, (byte*) ft_tmp->ptr(), ft_tmp->length(), join_key);
+     table->file->ft_init_ext(key, (byte*) ft_tmp->ptr(), ft_tmp->length(),
+                              join_key && !no_order);
 
   if (join_key)
   {
diff --git a/sql/item_func.h b/sql/item_func.h
index 9b696f75aa10c20e93a47ebfdc128a260b2412de..bc196dc58a5ec8721aae4ce93bcca793eea0bad0 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -863,5 +863,5 @@ class Item_func_match :public Item_real_func
   longlong val_int() { return val()!=0.0; }
 
   bool fix_index();
-  void init_search();
+  void init_search(bool no_order);
 };
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 7e7fed76877cff8564d1ae6ea1281b2b3d9c2f1d..189b01c9782dde810089900d3254e6c5a47915e7 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -532,7 +532,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
 
     while ((ifm=li++))
     {
-      ifm->init_search();
+      ifm->init_search(test(order));
     }
   }
   /* Create a tmp table if distinct or if the sort is too complicated */