diff options
author | serg@serg.mysql.com <> | 2000-11-04 15:48:06 +0100 |
---|---|---|
committer | serg@serg.mysql.com <> | 2000-11-04 15:48:06 +0100 |
commit | f39734eb07cd0dec06d19bc1d483b3a5e676f3ac (patch) | |
tree | d59c95d63a178310fb32651511ae825b9e9a8fb3 /sql | |
parent | 5d4b91e8cff27d7f933c7c26f9d8e2c0046b4a57 (diff) | |
download | mariadb-git-f39734eb07cd0dec06d19bc1d483b3a5e676f3ac.tar.gz |
fixed bug with FULLTEXT and ORDER BY
Diffstat (limited to 'sql')
-rw-r--r-- | sql/ha_myisam.cc | 3 | ||||
-rw-r--r-- | sql/item_func.cc | 50 | ||||
-rw-r--r-- | sql/item_func.h | 2 | ||||
-rw-r--r-- | sql/sql_select.cc | 2 |
4 files changed, 31 insertions, 26 deletions
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 76433a8eae5..630a672d346 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 39a4bee1366..47bc089b3e0 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 9b696f75aa1..bc196dc58a5 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -863,5 +863,5 @@ public: 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 7e7fed76877..189b01c9782 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 */ |