summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <serg@serg.mysql.com>2000-11-04 15:48:06 +0100
committerunknown <serg@serg.mysql.com>2000-11-04 15:48:06 +0100
commit2122fc26030b3f96e940bb589a93d22d5c126219 (patch)
treed59c95d63a178310fb32651511ae825b9e9a8fb3
parent30cab562293df1c98d23266bd5863773f191309f (diff)
downloadmariadb-git-2122fc26030b3f96e940bb589a93d22d5c126219.tar.gz
fixed bug with FULLTEXT and ORDER BY
include/ft_global.h: fixed bug with ORDER BY sql/ha_myisam.cc: fixed bug with ORDER BY sql/item_func.cc: fixed bug with ORDER BY sql/item_func.h: fixed bug with ORDER BY sql/sql_select.cc: fixed bug with ORDER BY
-rw-r--r--include/ft_global.h5
-rw-r--r--sql/ha_myisam.cc3
-rw-r--r--sql/item_func.cc50
-rw-r--r--sql/item_func.h2
-rw-r--r--sql/sql_select.cc2
5 files changed, 34 insertions, 28 deletions
diff --git a/include/ft_global.h b/include/ft_global.h
index 90641313235..3937bd87c7f 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 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 */