diff options
author | unknown <serg@serg.mysql.com> | 2001-11-22 16:00:11 +0100 |
---|---|---|
committer | unknown <serg@serg.mysql.com> | 2001-11-22 16:00:11 +0100 |
commit | 198df9007eaaf1aacbdff6c3e6b438bfd013a66c (patch) | |
tree | d6f7c3326335cf1432cad86e47e88950fca45ec9 | |
parent | 1bdd19639d583cf182731c82eef08a21d2751f5c (diff) | |
download | mariadb-git-198df9007eaaf1aacbdff6c3e6b438bfd013a66c.tar.gz |
fixes for ft-boolean and range optimizer
-rw-r--r-- | myisam/ft_boolean_search.c | 25 | ||||
-rw-r--r-- | mysql-test/r/fulltext_order_by.result | 32 | ||||
-rw-r--r-- | mysql-test/t/fulltext_order_by.test | 7 | ||||
-rw-r--r-- | sql/opt_ft.h | 2 | ||||
-rw-r--r-- | sql/opt_range.cc | 5 | ||||
-rw-r--r-- | sql/opt_range.h | 2 |
6 files changed, 62 insertions, 11 deletions
diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index de9d16e42c8..355a11bc160 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -339,7 +339,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) /* curdoc matched ! */ info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); /* why is this ? */ - /* info->lastpos=curdoc; */ /* do I need this ? */ + info->lastpos=curdoc; if (!(*info->read_record)(info,curdoc,record)) { info->update|= HA_STATE_AKTIV; /* Record is read */ @@ -348,6 +348,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) return my_errno; } } + ftb->state=INDEX_DONE; return my_errno=HA_ERR_END_OF_FILE; } @@ -359,17 +360,33 @@ float ft_boolean_find_relevance(FT_INFO *ftb, my_off_t docid, byte *record) FTB_EXPR *ftbe; uint i; - if (ftb->state == READY) + if (ftb->state == READY || ftb->state == INDEX_DONE) { + for (i=1; i<=ftb->queue.elements; i++) + { + ftbw=(FTB_WORD *)(ftb->queue.root[i]); + ftbw->docid=HA_POS_ERROR; + for (ftbe=ftbw->up; ftbe; ftbe=ftbe->up) + { + if (ftbe->docid != HA_POS_ERROR) + { + ftbe->cur_weight=ftbe->yesses=ftbe->nos=0; + ftbe->docid=HA_POS_ERROR; + } + else + break; + } + } + queue_fix(& ftb->queue); ftb->state=SCAN; } else if (ftb->state != SCAN) - return -1.0; + return -2.0; bzero(&ptree, sizeof(ptree)); if (_mi_ft_parse(& ptree, ftb->info, ftb->keynr, record)) - return -1.0; + return -3.0; for (i=1; i<=ftb->queue.elements; i++) { diff --git a/mysql-test/r/fulltext_order_by.result b/mysql-test/r/fulltext_order_by.result index e096de2af1b..8d88b8d6ebf 100644 --- a/mysql-test/r/fulltext_order_by.result +++ b/mysql-test/r/fulltext_order_by.result @@ -11,17 +11,40 @@ SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINS a MATCH (message) AGAINST ('steve') 4 0.90587323904037 7 0.89568990468979 +SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve'); +a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) +4 1 +7 1 +SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE); +a MATCH (message) AGAINST ('steve') +4 0.90587323904037 +7 0.89568990468979 +SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE); +a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) +4 1 +7 1 SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve') ORDER BY a; a MATCH (message) AGAINST ('steve') 4 0.90587323904037 7 0.89568990468979 +SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a; +a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) +4 1 +7 1 SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve') ORDER BY a DESC; a MATCH (message) AGAINST ('steve') 7 0.89568990468979 4 0.90587323904037 +SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a DESC; +a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) +7 1 +4 1 SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve') ORDER BY 1; a MATCH (message) AGAINST ('steve') 7 0.89568990468979 +SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY 1; +a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) +7 1 SELECT a, MATCH (message) AGAINST ('steve') as rel FROM t1 ORDER BY rel; a rel 1 0 @@ -31,4 +54,13 @@ a rel 6 0 7 0.89568990468979 4 0.90587323904037 +SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) as rel FROM t1 ORDER BY rel; +a rel +1 0 +2 0 +3 0 +5 0 +6 0 +4 1 +7 1 drop table t1; diff --git a/mysql-test/t/fulltext_order_by.test b/mysql-test/t/fulltext_order_by.test index 9f35d58e699..d5cb99ef0ee 100644 --- a/mysql-test/t/fulltext_order_by.test +++ b/mysql-test/t/fulltext_order_by.test @@ -9,17 +9,24 @@ INSERT INTO t1 (message) VALUES ("Testing"),("table"),("testbug"), ("steve"),("is"),("cool"),("steve is cool"); # basic MATCH SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve'); +SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve'); +SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE); +SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE); # MATCH + ORDER BY (with ft-ranges) SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve') ORDER BY a; +SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a; # MATCH + ORDER BY (with normal ranges) + UNIQUE SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve') ORDER BY a DESC; +SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a DESC; # MATCH + ORDER BY + UNIQUE (const_table) SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve') ORDER BY 1; +SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY 1; # ORDER BY MATCH 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; diff --git a/sql/opt_ft.h b/sql/opt_ft.h index dcbbb8abcec..b055edc107c 100644 --- a/sql/opt_ft.h +++ b/sql/opt_ft.h @@ -29,7 +29,7 @@ public: TABLE_REF *ref; FT_SELECT(TABLE *table, TABLE_REF *tref) : - QUICK_SELECT (table,tref->key,1), ref(tref) {} + QUICK_SELECT (table,tref->key,1), ref(tref) { init(); } int init() { return error=file->ft_init(); } int get_next() { return error=file->ft_read(record); } diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 3849159ca39..4c22dc5b6a2 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -407,11 +407,6 @@ QUICK_SELECT::~QUICK_SELECT() } } -int QUICK_SELECT::init() -{ - return error=file->index_init(index); -} - QUICK_RANGE::QUICK_RANGE() :min_key(0),max_key(0),min_length(0),max_length(0), flag(NO_MIN_RANGE | NO_MAX_RANGE) diff --git a/sql/opt_range.h b/sql/opt_range.h index 50215b94be0..07d1216a42f 100644 --- a/sql/opt_range.h +++ b/sql/opt_range.h @@ -75,7 +75,7 @@ public: QUICK_SELECT(TABLE *table,uint index_arg,bool no_alloc=0); virtual ~QUICK_SELECT(); void reset(void) { next=0; it.rewind(); } - virtual int init(); + int init() { return error=file->index_init(index); } virtual int get_next(); int cmp_next(QUICK_RANGE *range); bool unique_key_range(); |