Commit c4229a8d authored by serg@serg.mysql.com's avatar serg@serg.mysql.com

two bugs in ft_update

parent ccb7bb48
...@@ -164,41 +164,35 @@ int _mi_ft_update(MI_INFO *info, uint keynr, byte *keybuf, ...@@ -164,41 +164,35 @@ int _mi_ft_update(MI_INFO *info, uint keynr, byte *keybuf,
int error= -1; int error= -1;
FT_WORD *oldlist,*newlist, *old_word, *new_word; FT_WORD *oldlist,*newlist, *old_word, *new_word;
uint key_length; uint key_length;
int cmp; int cmp, cmp2;
if (!(old_word=oldlist=_mi_ft_parserecord(info, keynr, keybuf, oldrec))) if (!(old_word=oldlist=_mi_ft_parserecord(info, keynr, keybuf, oldrec)))
goto err0; goto err0;
if (!(new_word=newlist=_mi_ft_parserecord(info, keynr, keybuf, newrec))) if (!(new_word=newlist=_mi_ft_parserecord(info, keynr, keybuf, newrec)))
goto err1; goto err1;
error=0;
while(old_word->pos && new_word->pos) while(old_word->pos && new_word->pos)
{ {
cmp=_mi_compare_text(default_charset_info, cmp=_mi_compare_text(default_charset_info,
(uchar*) old_word->pos,old_word->len, (uchar*) old_word->pos,old_word->len,
(uchar*) new_word->pos,new_word->len,0); (uchar*) new_word->pos,new_word->len,0);
if (cmp==0) cmp2= cmp ? 0 : (abs(old_word->weight - new_word->weight) > 1.e-5);
cmp=sgn(old_word->weight-new_word->weight);
else
cmp=sgn(cmp);
switch (cmp) { if (cmp < 0 || cmp2)
case -1: {
key_length=_ft_make_key(info,keynr,keybuf,old_word,pos); key_length=_ft_make_key(info,keynr,keybuf,old_word,pos);
if ((error=_mi_ck_delete(info,keynr,(uchar*) keybuf,key_length))) if ((error=_mi_ck_delete(info,keynr,(uchar*) keybuf,key_length)))
goto err2; goto err2;
old_word++; }
break; if (cmp > 0 || cmp2)
case 0: {
old_word++;
new_word++;
break;
case 1:
key_length=_ft_make_key(info,keynr,keybuf,new_word,pos); key_length=_ft_make_key(info,keynr,keybuf,new_word,pos);
if ((error=_mi_ck_write(info,keynr,(uchar*) keybuf,key_length))) if ((error=_mi_ck_write(info,keynr,(uchar*) keybuf,key_length)))
goto err2; goto err2;
new_word++; }
break; if (cmp<=0) old_word++;
} if (cmp>=0) new_word++;
} }
if (old_word->pos) if (old_word->pos)
error=_mi_ft_erase(info,keynr,keybuf,old_word,pos); error=_mi_ft_erase(info,keynr,keybuf,old_word,pos);
......
...@@ -112,3 +112,19 @@ Can't find FULLTEXT index matching the column list ...@@ -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'); select * from t2,t3 where MATCH (t2.inhalt,t3.inhalt) AGAINST ('foobar');
Wrong arguments to MATCH Wrong arguments to MATCH
drop table t1,t2,t3; 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
...@@ -92,3 +92,22 @@ select * from t2 where MATCH ticket AGAINST ('foobar'); ...@@ -92,3 +92,22 @@ select * from t2 where MATCH ticket AGAINST ('foobar');
select * from t2,t3 where MATCH (t2.inhalt,t3.inhalt) AGAINST ('foobar'); select * from t2,t3 where MATCH (t2.inhalt,t3.inhalt) AGAINST ('foobar');
drop table t1,t2,t3; 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;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment