diff options
author | serg@serg.mysql.com <> | 2001-10-20 16:37:26 +0200 |
---|---|---|
committer | serg@serg.mysql.com <> | 2001-10-20 16:37:26 +0200 |
commit | c4229a8dcdcdac7d69ca37a2bc4ebfa8ebae5a0f (patch) | |
tree | 9204318ede8dbfbab0c53a870efc455a248b40cd | |
parent | ccb7bb485b050c195cf1416ec1e069e99df31e5d (diff) | |
download | mariadb-git-c4229a8dcdcdac7d69ca37a2bc4ebfa8ebae5a0f.tar.gz |
two bugs in ft_update
-rw-r--r-- | myisam/ft_update.c | 28 | ||||
-rw-r--r-- | mysql-test/r/fulltext.result | 16 | ||||
-rw-r--r-- | mysql-test/t/fulltext.test | 19 |
3 files changed, 46 insertions, 17 deletions
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/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; + |