diff options
author | serg@serg.mysql.com <> | 2001-10-22 11:57:48 +0200 |
---|---|---|
committer | serg@serg.mysql.com <> | 2001-10-22 11:57:48 +0200 |
commit | abbb522024799ce4a51685949e880c33c052c1d2 (patch) | |
tree | 8b062a08d4895622a57e2a2fa220fa1d6115b5c4 | |
parent | 6a301204ca8ad0e53a168eb489d94159bb71b250 (diff) | |
parent | 392315df0c3c43f45ff016c002ca7971d1ad8fae (diff) | |
download | mariadb-git-abbb522024799ce4a51685949e880c33c052c1d2.tar.gz |
Merge work:/home/bk/mysql-4.0
into serg.mysql.com:/usr/home/serg/Abk/mysql-4.0
-rw-r--r-- | include/ft_global.h | 2 | ||||
-rw-r--r-- | myisam/ft_boolean_search.c | 4 | ||||
-rw-r--r-- | myisam/ft_nlq_search.c | 3 | ||||
-rw-r--r-- | myisam/ft_update.c | 28 | ||||
-rw-r--r-- | myisam/ftdefs.h | 4 | ||||
-rw-r--r-- | mysql-test/mysql-test-run.sh | 10 | ||||
-rw-r--r-- | mysql-test/r/fulltext.result | 16 | ||||
-rw-r--r-- | mysql-test/t/fulltext.test | 19 | ||||
-rw-r--r-- | sql/item_func.cc | 14 | ||||
-rw-r--r-- | sql/item_func.h | 8 |
10 files changed, 73 insertions, 35 deletions
diff --git a/include/ft_global.h b/include/ft_global.h index 8588684907d..0dbef652ce2 100644 --- a/include/ft_global.h +++ b/include/ft_global.h @@ -32,7 +32,7 @@ extern "C" { typedef struct st_ft_info FT_INFO; struct _ft_vft { int (*read_next)(FT_INFO *, char *); - float (*find_relevance)(FT_INFO *, my_off_t); + float (*find_relevance)(FT_INFO *, my_off_t, byte *); void (*close_search)(FT_INFO *); float (*get_relevance)(FT_INFO *); my_off_t (*get_docid)(FT_INFO *); diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index a850827c52e..15a6348336d 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -321,9 +321,9 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) return my_errno=HA_ERR_END_OF_FILE; } -float ft_boolean_find_relevance(FT_INFO *ftb, my_off_t docid) +float ft_boolean_find_relevance(FT_INFO *ftb, + my_off_t docid __attribute__((unused)), byte *record) { - fprintf(stderr, "ft_boolean_find_relevance called!\n"); return -1.0; /* to be done via str scan */ } diff --git a/myisam/ft_nlq_search.c b/myisam/ft_nlq_search.c index f0f878a7f16..93c63369ecc 100644 --- a/myisam/ft_nlq_search.c +++ b/myisam/ft_nlq_search.c @@ -247,7 +247,8 @@ int ft_nlq_read_next(FT_INFO *handler, char *record) return my_errno; } -float ft_nlq_find_relevance(FT_INFO *handler, my_off_t docid) +float ft_nlq_find_relevance(FT_INFO *handler, my_off_t docid, + byte *record __attribute__((unused))) { int a,b,c; FT_DOC *docs=handler->doc; diff --git a/myisam/ft_update.c b/myisam/ft_update.c index 1e00cc5d7a0..1e53b2d7775 100644 --- a/myisam/ft_update.c +++ b/myisam/ft_update.c @@ -164,41 +164,35 @@ int _mi_ft_update(MI_INFO *info, uint keynr, byte *keybuf, int error= -1; FT_WORD *oldlist,*newlist, *old_word, *new_word; uint key_length; - int cmp; + int cmp, cmp2; if (!(old_word=oldlist=_mi_ft_parserecord(info, keynr, keybuf, oldrec))) goto err0; if (!(new_word=newlist=_mi_ft_parserecord(info, keynr, keybuf, newrec))) goto err1; + error=0; while(old_word->pos && new_word->pos) { cmp=_mi_compare_text(default_charset_info, (uchar*) old_word->pos,old_word->len, (uchar*) new_word->pos,new_word->len,0); - if (cmp==0) - cmp=sgn(old_word->weight-new_word->weight); - else - cmp=sgn(cmp); + cmp2= cmp ? 0 : (abs(old_word->weight - new_word->weight) > 1.e-5); - switch (cmp) { - case -1: + if (cmp < 0 || cmp2) + { key_length=_ft_make_key(info,keynr,keybuf,old_word,pos); if ((error=_mi_ck_delete(info,keynr,(uchar*) keybuf,key_length))) goto err2; - old_word++; - break; - case 0: - old_word++; - new_word++; - break; - case 1: + } + if (cmp > 0 || cmp2) + { key_length=_ft_make_key(info,keynr,keybuf,new_word,pos); if ((error=_mi_ck_write(info,keynr,(uchar*) keybuf,key_length))) goto err2; - new_word++; - break; - } + } + if (cmp<=0) old_word++; + if (cmp>=0) new_word++; } if (old_word->pos) error=_mi_ft_erase(info,keynr,keybuf,old_word,pos); diff --git a/myisam/ftdefs.h b/myisam/ftdefs.h index 9eedf57c759..0d5aaf931e3 100644 --- a/myisam/ftdefs.h +++ b/myisam/ftdefs.h @@ -126,7 +126,7 @@ FT_WORD * _mi_ft_parserecord(MI_INFO *, uint , byte *, const byte *); const struct _ft_vft _ft_vft_nlq; FT_INFO *ft_init_nlq_search(MI_INFO *, uint, byte *, uint, my_bool); int ft_nlq_read_next(FT_INFO *, char *); -float ft_nlq_find_relevance(FT_INFO *, my_off_t ); +float ft_nlq_find_relevance(FT_INFO *, my_off_t, byte *); void ft_nlq_close_search(FT_INFO *); float ft_nlq_get_relevance(FT_INFO *); my_off_t ft_nlq_get_docid(FT_INFO *); @@ -135,7 +135,7 @@ void ft_nlq_reinit_search(FT_INFO *); const struct _ft_vft _ft_vft_boolean; FT_INFO *ft_init_boolean_search(MI_INFO *, uint, byte *, uint, my_bool); int ft_boolean_read_next(FT_INFO *, char *); -float ft_boolean_find_relevance(FT_INFO *, my_off_t ); +float ft_boolean_find_relevance(FT_INFO *, my_off_t, byte *); void ft_boolean_close_search(FT_INFO *); float ft_boolean_get_relevance(FT_INFO *); my_off_t ft_boolean_get_docid(FT_INFO *); diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 7428740d380..f99a594f1f1 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -673,9 +673,13 @@ start_master() "gdb -x $GDB_MASTER_INIT" $MYSQLD elif [ x$DO_GDB = x1 ] then - $ECHO "set args $master_args" > $GDB_MASTER_INIT - $ECHO "b mysql_parse" >> $GDB_MASTER_INIT - $ECHO "r" >> $GDB_MASTER_INIT + $CAT <<__GDB_MASTER_INIT__ > $GDB_MASTER_INIT +b mysql_parse +commands 1 +dele 1 +end +r $master_args +__GDB_MASTER_INIT__ manager_launch master $XTERM -display $DISPLAY \ -title "Master" -e gdb -x $GDB_MASTER_INIT $MYSQLD else diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result index 47a823929f4..c2b4de5f439 100644 --- a/mysql-test/r/fulltext.result +++ b/mysql-test/r/fulltext.result @@ -112,3 +112,19 @@ Can't find FULLTEXT index matching the column list select * from t2,t3 where MATCH (t2.inhalt,t3.inhalt) AGAINST ('foobar'); Wrong arguments to MATCH drop table t1,t2,t3; +CREATE TABLE t1 ( +id int(11) auto_increment, +title varchar(100) default '', +PRIMARY KEY (id), +KEY ind5 (title), +FULLTEXT KEY FT1 (title) +) TYPE=MyISAM; +insert into t1 (title) values ('this is a test'); +update t1 set title='this is A test' where id=1; +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +update t1 set title='this test once revealed a bug' where id=1; +select * from t1; +id title +1 this test once revealed a bug diff --git a/mysql-test/t/fulltext.test b/mysql-test/t/fulltext.test index 4f7df2ac0b0..af58c747167 100644 --- a/mysql-test/t/fulltext.test +++ b/mysql-test/t/fulltext.test @@ -92,3 +92,22 @@ select * from t2 where MATCH ticket AGAINST ('foobar'); select * from t2,t3 where MATCH (t2.inhalt,t3.inhalt) AGAINST ('foobar'); drop table t1,t2,t3; + +# +# two more bugtests +# + +CREATE TABLE t1 ( + id int(11) auto_increment, + title varchar(100) default '', + PRIMARY KEY (id), + KEY ind5 (title), + FULLTEXT KEY FT1 (title) +) TYPE=MyISAM; + +insert into t1 (title) values ('this is a test'); +update t1 set title='this is A test' where id=1; +check table t1; +update t1 set title='this test once revealed a bug' where id=1; +select * from t1; + diff --git a/sql/item_func.cc b/sql/item_func.cc index bbe5e5fced9..1ca511be485 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2065,6 +2065,7 @@ bool Item_func_match::fix_fields(THD *thd,struct st_table_list *tlist) } const_item_cache=0; table=((Item_field *)fields.head())->field->table; + record=table->record[0]; return 0; } @@ -2160,7 +2161,6 @@ bool Item_func_match::eq(const Item *item) const return 0; } -#if 0 double Item_func_match::val() { if (ft_handler==NULL) @@ -2182,10 +2182,10 @@ double Item_func_match::val() if ((null_value=(docid==HA_OFFSET_ERROR))) return 0.0; else - return ft_handler->please->find_relevance(ft_handler, docid); + return ft_handler->please->find_relevance(ft_handler, docid, record); } -#endif +#if 0 double Item_func_match_nl::val() { if (ft_handler==NULL) @@ -2207,7 +2207,7 @@ double Item_func_match_nl::val() if ((null_value=(docid==HA_OFFSET_ERROR))) return 0.0; else - return ft_handler->please->find_relevance(ft_handler, docid); + return ft_handler->please->find_relevance(ft_handler, docid, record); } double Item_func_match_bool::val() @@ -2226,9 +2226,11 @@ double Item_func_match_bool::val() join_key=0; } - null_value=1; - return -1.0; + return ft_handler->please->find_relevance(ft_handler, docid, record); + //null_value=1; + //return -1.0; } +#endif /*************************************************************************** System variables diff --git a/sql/item_func.h b/sql/item_func.h index b02d6ccaa8c..182daf9f74e 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -867,9 +867,10 @@ public: bool join_key; Item_func_match *master; FT_INFO * ft_handler; + byte *record; Item_func_match(List<Item> &a, Item *b): Item_real_func(b), - fields(a), table(0), join_key(0), master(0), ft_handler(0) {} + fields(a), table(0), join_key(0), master(0), ft_handler(0) {} ~Item_func_match() { if (!master && ft_handler) @@ -886,6 +887,7 @@ public: bool fix_fields(THD *thd,struct st_table_list *tlist); bool eq(const Item *) const; longlong val_int() { return val()!=0.0; } + double val(); bool fix_index(); void init_search(bool no_order); @@ -896,7 +898,7 @@ class Item_func_match_nl :public Item_func_match public: Item_func_match_nl(List<Item> &a, Item *b): Item_func_match(a,b) {} const char *func_name() const { return "match_nl"; } - double val(); +// double val(); int ft_handler_init(const byte *query, uint querylen, bool presort) { ft_handler=table->file->ft_init_ext(FT_NL,key, query, querylen, presort); @@ -909,7 +911,7 @@ class Item_func_match_bool :public Item_func_match public: Item_func_match_bool(List<Item> &a, Item *b): Item_func_match(a,b) {} const char *func_name() const { return "match_bool"; } - double val(); +// double val(); int ft_handler_init(const byte *query, uint querylen, bool presort) { ft_handler=table->file->ft_init_ext(FT_BOOL,key, query, querylen, presort); |