From 590a0ed3fce8576fa85bb78b1727b2d34782ca8b Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 17 Sep 2002 20:37:26 +0200 Subject: [PATCH 1/2] comment corrected --- mysys/queues.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mysys/queues.c b/mysys/queues.c index c458c96e998..fe642131d74 100644 --- a/mysys/queues.c +++ b/mysys/queues.c @@ -174,10 +174,8 @@ static int queue_fix_cmp(QUEUE *queue, void **a, void **b) } /* - Fix heap when every element was changed - actually, it can be done in linear time, - not in n*log(n), but some code (myisam/ft_boolean_search.c) - requires a strict order here, not just a queue property + Fix heap when every element was changed, + actually, it can be done better, in linear time, not in n*log(n) */ void queue_fix(QUEUE *queue) From 5f6bd7ddb14d5508fc51d032d53454c05cb009aa Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 17 Sep 2002 21:04:10 +0200 Subject: [PATCH 2/2] ft-boolean + ORDER BY (ftb tree reusing) bug --- Docs/manual.texi | 3 +++ myisam/ft_boolean_search.c | 22 ++++++++++++++++++++-- mysql-test/r/fulltext_order_by.result | 15 +++++++++++++++ mysql-test/t/fulltext_order_by.test | 14 ++++++++++++++ 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index fac4a7ed0f2..3de6d9f462f 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -50396,6 +50396,9 @@ each individual 4.0.x release. @itemize @bullet @item +Fixed bug in @code{MATCH ... AGAINST( ... IN BOOLEAN MODE)} +used with @code{ORDER BY}. +@item @code{SELECT @@@@[global|session].var_name} didn't report @code{global | session} in the result column name. @item diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index 13f596cb282..16096b64515 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -93,6 +93,7 @@ typedef struct st_ft_info CHARSET_INFO *charset; enum { UNINITIALIZED, READY, INDEX_SEARCH, INDEX_DONE /*, SCAN*/ } state; uint with_scan; + my_off_t lastpos; FTB_EXPR *root; QUEUE queue; TREE no_dupes; @@ -297,6 +298,7 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query, default_charset_info : info->s->keyinfo[keynr].seg->charset); ftb->with_scan=0; + ftb->lastpos=0; bzero(& ftb->no_dupes, sizeof(TREE)); init_alloc_root(&ftb->mem_root, 1024, 1024); @@ -540,6 +542,21 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length) if (!ftb->queue.elements) return 0; + if (ftb->state != INDEX_SEARCH && docid < ftb->lastpos) + { + FTB_EXPR *x; + uint i; + + for (i=0; i < ftb->queue.elements; i++) + { + ftb->list[i]->docid[1]=HA_POS_ERROR; + for (x=ftb->list[i]->up; x; x=x->up) + x->docid[1]=HA_POS_ERROR; + } + } + + ftb->lastpos=docid; + if (ftb->keynr==NO_SUCH_KEY) _mi_ft_segiterator_dummy_init(record, length, &ftsi); else @@ -557,7 +574,7 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length) int a, b, c; for (a=0, b=ftb->queue.elements, c=(a+b)/2; b-a>1; c=(a+b)/2) { - ftbw=(FTB_WORD *)(ftb->list[c]); + ftbw=ftb->list[c]; if (_mi_compare_text(ftb->charset, word.pos, word.len, (uchar*) ftbw->word+1, ftbw->len-1, (my_bool) (ftbw->flags&FTB_FLAG_TRUNC)) >0) @@ -567,7 +584,7 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length) } for (; c>=0; c--) { - ftbw=(FTB_WORD *)(ftb->list[c]); + ftbw=ftb->list[c]; if (_mi_compare_text(ftb->charset, word.pos,word.len, (uchar*) ftbw->word+1,ftbw->len-1, (my_bool) (ftbw->flags&FTB_FLAG_TRUNC))) @@ -614,3 +631,4 @@ void ft_boolean_reinit_search(FT_INFO *ftb) { _ftb_init_index_search(ftb); } + diff --git a/mysql-test/r/fulltext_order_by.result b/mysql-test/r/fulltext_order_by.result index 8d88b8d6ebf..c0e72ff789f 100644 --- a/mysql-test/r/fulltext_order_by.result +++ b/mysql-test/r/fulltext_order_by.result @@ -64,3 +64,18 @@ a rel 4 1 7 1 drop table t1; +CREATE TABLE t1 ( +a INT AUTO_INCREMENT PRIMARY KEY, +message CHAR(20), +FULLTEXT(message) +); +INSERT INTO t1 (message) VALUES ("testbug"),("testbug foobar"); +SELECT a, MATCH (message) AGAINST ('t* f*' IN BOOLEAN MODE) as rel FROM t1; +a rel +1 1 +2 2 +SELECT a, MATCH (message) AGAINST ('t* f*' IN BOOLEAN MODE) as rel FROM t1 ORDER BY rel,a; +a rel +1 1 +2 2 +drop table t1; diff --git a/mysql-test/t/fulltext_order_by.test b/mysql-test/t/fulltext_order_by.test index d5cb99ef0ee..3b60ee77db2 100644 --- a/mysql-test/t/fulltext_order_by.test +++ b/mysql-test/t/fulltext_order_by.test @@ -30,3 +30,17 @@ SELECT a, MATCH (message) AGAINST ('steve') as rel FROM t1 ORDER BY rel; SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) as rel FROM t1 ORDER BY rel; drop table t1; + +# +# reused boolean scan bug +# +CREATE TABLE t1 ( + a INT AUTO_INCREMENT PRIMARY KEY, + message CHAR(20), + FULLTEXT(message) +); +INSERT INTO t1 (message) VALUES ("testbug"),("testbug foobar"); +SELECT a, MATCH (message) AGAINST ('t* f*' IN BOOLEAN MODE) as rel FROM t1; +SELECT a, MATCH (message) AGAINST ('t* f*' IN BOOLEAN MODE) as rel FROM t1 ORDER BY rel,a; +drop table t1; +