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

two bugs in ft_update

parent ccb7bb48
Loading
Loading
Loading
Loading
+11 −17
Original line number Diff line number Diff line
@@ -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);
+16 −0
Original line number Diff line number Diff line
@@ -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
+19 −0
Original line number Diff line number Diff line
@@ -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;