mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
two bugs in ft_update
This commit is contained in:
@ -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
|
|||||||
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');
|
|||||||
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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user