summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorserg@serg.mysql.com <>2001-10-20 16:37:26 +0200
committerserg@serg.mysql.com <>2001-10-20 16:37:26 +0200
commitc4229a8dcdcdac7d69ca37a2bc4ebfa8ebae5a0f (patch)
tree9204318ede8dbfbab0c53a870efc455a248b40cd
parentccb7bb485b050c195cf1416ec1e069e99df31e5d (diff)
downloadmariadb-git-c4229a8dcdcdac7d69ca37a2bc4ebfa8ebae5a0f.tar.gz
two bugs in ft_update
-rw-r--r--myisam/ft_update.c28
-rw-r--r--mysql-test/r/fulltext.result16
-rw-r--r--mysql-test/t/fulltext.test19
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;
+