summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorserg@serg.mysql.com <>2001-10-22 11:57:48 +0200
committerserg@serg.mysql.com <>2001-10-22 11:57:48 +0200
commitabbb522024799ce4a51685949e880c33c052c1d2 (patch)
tree8b062a08d4895622a57e2a2fa220fa1d6115b5c4
parent6a301204ca8ad0e53a168eb489d94159bb71b250 (diff)
parent392315df0c3c43f45ff016c002ca7971d1ad8fae (diff)
downloadmariadb-git-abbb522024799ce4a51685949e880c33c052c1d2.tar.gz
Merge work:/home/bk/mysql-4.0
into serg.mysql.com:/usr/home/serg/Abk/mysql-4.0
-rw-r--r--include/ft_global.h2
-rw-r--r--myisam/ft_boolean_search.c4
-rw-r--r--myisam/ft_nlq_search.c3
-rw-r--r--myisam/ft_update.c28
-rw-r--r--myisam/ftdefs.h4
-rw-r--r--mysql-test/mysql-test-run.sh10
-rw-r--r--mysql-test/r/fulltext.result16
-rw-r--r--mysql-test/t/fulltext.test19
-rw-r--r--sql/item_func.cc14
-rw-r--r--sql/item_func.h8
10 files changed, 73 insertions, 35 deletions
diff --git a/include/ft_global.h b/include/ft_global.h
index 8588684907d..0dbef652ce2 100644
--- a/include/ft_global.h
+++ b/include/ft_global.h
@@ -32,7 +32,7 @@ extern "C" {
typedef struct st_ft_info FT_INFO;
struct _ft_vft {
int (*read_next)(FT_INFO *, char *);
- float (*find_relevance)(FT_INFO *, my_off_t);
+ float (*find_relevance)(FT_INFO *, my_off_t, byte *);
void (*close_search)(FT_INFO *);
float (*get_relevance)(FT_INFO *);
my_off_t (*get_docid)(FT_INFO *);
diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c
index a850827c52e..15a6348336d 100644
--- a/myisam/ft_boolean_search.c
+++ b/myisam/ft_boolean_search.c
@@ -321,9 +321,9 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
return my_errno=HA_ERR_END_OF_FILE;
}
-float ft_boolean_find_relevance(FT_INFO *ftb, my_off_t docid)
+float ft_boolean_find_relevance(FT_INFO *ftb,
+ my_off_t docid __attribute__((unused)), byte *record)
{
- fprintf(stderr, "ft_boolean_find_relevance called!\n");
return -1.0; /* to be done via str scan */
}
diff --git a/myisam/ft_nlq_search.c b/myisam/ft_nlq_search.c
index f0f878a7f16..93c63369ecc 100644
--- a/myisam/ft_nlq_search.c
+++ b/myisam/ft_nlq_search.c
@@ -247,7 +247,8 @@ int ft_nlq_read_next(FT_INFO *handler, char *record)
return my_errno;
}
-float ft_nlq_find_relevance(FT_INFO *handler, my_off_t docid)
+float ft_nlq_find_relevance(FT_INFO *handler, my_off_t docid,
+ byte *record __attribute__((unused)))
{
int a,b,c;
FT_DOC *docs=handler->doc;
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/myisam/ftdefs.h b/myisam/ftdefs.h
index 9eedf57c759..0d5aaf931e3 100644
--- a/myisam/ftdefs.h
+++ b/myisam/ftdefs.h
@@ -126,7 +126,7 @@ FT_WORD * _mi_ft_parserecord(MI_INFO *, uint , byte *, const byte *);
const struct _ft_vft _ft_vft_nlq;
FT_INFO *ft_init_nlq_search(MI_INFO *, uint, byte *, uint, my_bool);
int ft_nlq_read_next(FT_INFO *, char *);
-float ft_nlq_find_relevance(FT_INFO *, my_off_t );
+float ft_nlq_find_relevance(FT_INFO *, my_off_t, byte *);
void ft_nlq_close_search(FT_INFO *);
float ft_nlq_get_relevance(FT_INFO *);
my_off_t ft_nlq_get_docid(FT_INFO *);
@@ -135,7 +135,7 @@ void ft_nlq_reinit_search(FT_INFO *);
const struct _ft_vft _ft_vft_boolean;
FT_INFO *ft_init_boolean_search(MI_INFO *, uint, byte *, uint, my_bool);
int ft_boolean_read_next(FT_INFO *, char *);
-float ft_boolean_find_relevance(FT_INFO *, my_off_t );
+float ft_boolean_find_relevance(FT_INFO *, my_off_t, byte *);
void ft_boolean_close_search(FT_INFO *);
float ft_boolean_get_relevance(FT_INFO *);
my_off_t ft_boolean_get_docid(FT_INFO *);
diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh
index 7428740d380..f99a594f1f1 100644
--- a/mysql-test/mysql-test-run.sh
+++ b/mysql-test/mysql-test-run.sh
@@ -673,9 +673,13 @@ start_master()
"gdb -x $GDB_MASTER_INIT" $MYSQLD
elif [ x$DO_GDB = x1 ]
then
- $ECHO "set args $master_args" > $GDB_MASTER_INIT
- $ECHO "b mysql_parse" >> $GDB_MASTER_INIT
- $ECHO "r" >> $GDB_MASTER_INIT
+ $CAT <<__GDB_MASTER_INIT__ > $GDB_MASTER_INIT
+b mysql_parse
+commands 1
+dele 1
+end
+r $master_args
+__GDB_MASTER_INIT__
manager_launch master $XTERM -display $DISPLAY \
-title "Master" -e gdb -x $GDB_MASTER_INIT $MYSQLD
else
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;
+
diff --git a/sql/item_func.cc b/sql/item_func.cc
index bbe5e5fced9..1ca511be485 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -2065,6 +2065,7 @@ bool Item_func_match::fix_fields(THD *thd,struct st_table_list *tlist)
}
const_item_cache=0;
table=((Item_field *)fields.head())->field->table;
+ record=table->record[0];
return 0;
}
@@ -2160,7 +2161,6 @@ bool Item_func_match::eq(const Item *item) const
return 0;
}
-#if 0
double Item_func_match::val()
{
if (ft_handler==NULL)
@@ -2182,10 +2182,10 @@ double Item_func_match::val()
if ((null_value=(docid==HA_OFFSET_ERROR)))
return 0.0;
else
- return ft_handler->please->find_relevance(ft_handler, docid);
+ return ft_handler->please->find_relevance(ft_handler, docid, record);
}
-#endif
+#if 0
double Item_func_match_nl::val()
{
if (ft_handler==NULL)
@@ -2207,7 +2207,7 @@ double Item_func_match_nl::val()
if ((null_value=(docid==HA_OFFSET_ERROR)))
return 0.0;
else
- return ft_handler->please->find_relevance(ft_handler, docid);
+ return ft_handler->please->find_relevance(ft_handler, docid, record);
}
double Item_func_match_bool::val()
@@ -2226,9 +2226,11 @@ double Item_func_match_bool::val()
join_key=0;
}
- null_value=1;
- return -1.0;
+ return ft_handler->please->find_relevance(ft_handler, docid, record);
+ //null_value=1;
+ //return -1.0;
}
+#endif
/***************************************************************************
System variables
diff --git a/sql/item_func.h b/sql/item_func.h
index b02d6ccaa8c..182daf9f74e 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -867,9 +867,10 @@ public:
bool join_key;
Item_func_match *master;
FT_INFO * ft_handler;
+ byte *record;
Item_func_match(List<Item> &a, Item *b): Item_real_func(b),
- fields(a), table(0), join_key(0), master(0), ft_handler(0) {}
+ fields(a), table(0), join_key(0), master(0), ft_handler(0) {}
~Item_func_match()
{
if (!master && ft_handler)
@@ -886,6 +887,7 @@ public:
bool fix_fields(THD *thd,struct st_table_list *tlist);
bool eq(const Item *) const;
longlong val_int() { return val()!=0.0; }
+ double val();
bool fix_index();
void init_search(bool no_order);
@@ -896,7 +898,7 @@ class Item_func_match_nl :public Item_func_match
public:
Item_func_match_nl(List<Item> &a, Item *b): Item_func_match(a,b) {}
const char *func_name() const { return "match_nl"; }
- double val();
+// double val();
int ft_handler_init(const byte *query, uint querylen, bool presort)
{
ft_handler=table->file->ft_init_ext(FT_NL,key, query, querylen, presort);
@@ -909,7 +911,7 @@ class Item_func_match_bool :public Item_func_match
public:
Item_func_match_bool(List<Item> &a, Item *b): Item_func_match(a,b) {}
const char *func_name() const { return "match_bool"; }
- double val();
+// double val();
int ft_handler_init(const byte *query, uint querylen, bool presort)
{
ft_handler=table->file->ft_init_ext(FT_BOOL,key, query, querylen, presort);