Commit a71285a7 authored by unknown's avatar unknown

Merge bk-internal:/home/bk/mysql-4.0/

into serg.mylan:/usr/home/serg/Abk/mysql-4.0

parents 7c6ed734 722a4cc5
...@@ -62,11 +62,12 @@ typedef struct st_ftb_expr FTB_EXPR; ...@@ -62,11 +62,12 @@ typedef struct st_ftb_expr FTB_EXPR;
struct st_ftb_expr struct st_ftb_expr
{ {
FTB_EXPR *up; FTB_EXPR *up;
byte *quot, *qend;
float weight; float weight;
uint flags; uint flags;
my_off_t docid[2]; /* for index search and for scan */ my_off_t docid[2];
/* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */
float cur_weight; float cur_weight;
byte *quot, *qend;
int yesses; /* number of "yes" words matched */ int yesses; /* number of "yes" words matched */
int nos; /* number of "no" words matched */ int nos; /* number of "no" words matched */
int ythresh; /* number of "yes" words in expr */ int ythresh; /* number of "yes" words in expr */
...@@ -78,7 +79,8 @@ typedef struct st_ftb_word ...@@ -78,7 +79,8 @@ typedef struct st_ftb_word
FTB_EXPR *up; FTB_EXPR *up;
float weight; float weight;
uint flags; uint flags;
my_off_t docid[2]; /* for index search and for scan */ my_off_t docid[2];
/* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */
uint ndepth; uint ndepth;
int len; int len;
/* ... docid cache can be added here. SerG */ /* ... docid cache can be added here. SerG */
...@@ -217,13 +219,15 @@ static void _ftb_init_index_search(FT_INFO *ftb) ...@@ -217,13 +219,15 @@ static void _ftb_init_index_search(FT_INFO *ftb)
if (ftbw->flags & FTB_FLAG_TRUNC) if (ftbw->flags & FTB_FLAG_TRUNC)
{ {
/* /*
special treatment for truncation operator :(( special treatment for truncation operator
1. +trunc* and there're other (not +trunc*) words 1. there are some (besides this) +words
| no need to search in the index, it can never ADD new rows | no need to search in the index, it can never ADD new rows
| to the result, and to remove half-matched rows we do scan anyway | to the result, and to remove half-matched rows we do scan anyway
2. -trunc* 2. -trunc*
| same as 1. | same as 1.
3. trunc* 3. in 1 and 2, +/- need not be on the same expr. level,
but can be on any upper level, as in +word +(trunc1* trunc2*)
4. otherwise
| We have to index-search for this prefix. | We have to index-search for this prefix.
| It may cause duplicates, as in the index (sorted by <word,docid>) | It may cause duplicates, as in the index (sorted by <word,docid>)
| <aaaa,row1> | <aaaa,row1>
...@@ -231,22 +235,31 @@ static void _ftb_init_index_search(FT_INFO *ftb) ...@@ -231,22 +235,31 @@ static void _ftb_init_index_search(FT_INFO *ftb)
| <aacc,row1> | <aacc,row1>
| Searching for "aa*" will find row1 twice... | Searching for "aa*" will find row1 twice...
*/ */
if ( test(ftbw->flags&FTB_FLAG_NO) || /* 2 */ FTB_EXPR *ftbe;
(test(ftbw->flags&FTB_FLAG_YES) && /* 1 */ for (ftbe=(FTB_EXPR*)ftbw;
ftbw->up->ythresh - ftbw->up->yweaks >1)) /* 1 */ ftbe->up && !(ftbe->up->flags & FTB_FLAG_TRUNC);
{ ftbe->up->flags|= FTB_FLAG_TRUNC, ftbe=ftbe->up)
ftbw->docid[0]=HA_POS_ERROR;
ftbw->up->yweaks++;
continue;
}
else /* 3 */
{ {
if (!is_tree_inited(& ftb->no_dupes)) if (ftbe->flags & FTB_FLAG_NO || /* 2 */
init_tree(& ftb->no_dupes,0,0,sizeof(my_off_t), ftbe->up->ythresh - ftbe->up->yweaks >1) /* 1 */
_ftb_no_dupes_cmp,0,0,0); {
else FTB_EXPR *top_ftbe=ftbe->up->up;
reset_tree(& ftb->no_dupes); ftbw->docid[0]=HA_POS_ERROR;
for (ftbe=ftbw->up; ftbe != top_ftbe; ftbe=ftbe->up)
if (ftbe->flags & FTB_FLAG_YES)
ftbe->yweaks++;
ftbe=0;
break;
}
} }
if (!ftbe)
continue;
/* 3 */
if (!is_tree_inited(& ftb->no_dupes))
init_tree(& ftb->no_dupes,0,0,sizeof(my_off_t),
_ftb_no_dupes_cmp,0,0,0);
else
reset_tree(& ftb->no_dupes);
} }
r=_mi_search(info, keyinfo, (uchar*) ftbw->word, ftbw->len, r=_mi_search(info, keyinfo, (uchar*) ftbw->word, ftbw->len,
SEARCH_FIND | SEARCH_BIGGER, keyroot); SEARCH_FIND | SEARCH_BIGGER, keyroot);
......
...@@ -134,6 +134,23 @@ Only MyISAM tables support collections ...@@ -134,6 +134,23 @@ Only MyISAM tables support collections
Function MATCH ... AGAINST() is used to do a search Function MATCH ... AGAINST() is used to do a search
some test foobar implements vector space model some test foobar implements vector space model
drop table t1; drop table t1;
create table t1 (a varchar(200) not null, fulltext (a));
insert t1 values ("aaa10 bbb20"), ("aaa20 bbb15"), ("aaa30 bbb10");
select * from t1 where match a against ("+aaa* +bbb*" in boolean mode);
a
aaa10 bbb20
aaa20 bbb15
aaa30 bbb10
select * from t1 where match a against ("+aaa* +bbb1*" in boolean mode);
a
aaa20 bbb15
aaa30 bbb10
select * from t1 where match a against ("+aaa* +ccc*" in boolean mode);
a
select * from t1 where match a against ("+aaa10 +(bbb*)" in boolean mode);
a
aaa10 bbb20
drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
id int(11), id int(11),
ticket int(11), ticket int(11),
......
...@@ -41,4 +41,12 @@ venue_id venue_text dt name entity_id ...@@ -41,4 +41,12 @@ venue_id venue_text dt name entity_id
select * from t1 left join t2 on venue_id = entity_id where match(name) against('aberdeen') and dt = '2003-05-23 19:30:00'; select * from t1 left join t2 on venue_id = entity_id where match(name) against('aberdeen') and dt = '2003-05-23 19:30:00';
venue_id venue_text dt name entity_id venue_id venue_text dt name entity_id
1 a1 2003-05-23 19:30:00 aberdeen town hall 1 1 a1 2003-05-23 19:30:00 aberdeen town hall 1
select * from t1 left join t2 on (venue_id = entity_id and match(name) against('aberdeen' in boolean mode)) where dt = '2003-05-23 19:30:00';
venue_id venue_text dt name entity_id
1 a1 2003-05-23 19:30:00 aberdeen town hall 1
NULL a2 2003-05-23 19:30:00 NULL NULL
select * from t1 left join t2 on (venue_id = entity_id and match(name) against('aberdeen')) where dt = '2003-05-23 19:30:00';
venue_id venue_text dt name entity_id
1 a1 2003-05-23 19:30:00 aberdeen town hall 1
NULL a2 2003-05-23 19:30:00 NULL NULL
drop table t1,t2; drop table t1,t2;
...@@ -70,6 +70,17 @@ delete from t1 where MATCH(a,b) AGAINST ("indexes"); ...@@ -70,6 +70,17 @@ delete from t1 where MATCH(a,b) AGAINST ("indexes");
select * from t1; select * from t1;
drop table t1; drop table t1;
#
# why to scan strings for trunc*
#
create table t1 (a varchar(200) not null, fulltext (a));
insert t1 values ("aaa10 bbb20"), ("aaa20 bbb15"), ("aaa30 bbb10");
select * from t1 where match a against ("+aaa* +bbb*" in boolean mode);
select * from t1 where match a against ("+aaa* +bbb1*" in boolean mode);
select * from t1 where match a against ("+aaa* +ccc*" in boolean mode);
select * from t1 where match a against ("+aaa10 +(bbb*)" in boolean mode);
drop table t1;
# #
# Check bug reported by Matthias Urlichs # Check bug reported by Matthias Urlichs
# #
......
...@@ -38,5 +38,7 @@ create table t2 (name varchar(255) not null default '', entity_id int(11) not nu ...@@ -38,5 +38,7 @@ create table t2 (name varchar(255) not null default '', entity_id int(11) not nu
insert into t2 (name, entity_id) values ('aberdeen town hall', 1), ('glasgow royal concert hall', 2), ('queen\'s hall, edinburgh', 3); insert into t2 (name, entity_id) values ('aberdeen town hall', 1), ('glasgow royal concert hall', 2), ('queen\'s hall, edinburgh', 3);
select * from t1 left join t2 on venue_id = entity_id where match(name) against('aberdeen' in boolean mode) and dt = '2003-05-23 19:30:00'; select * from t1 left join t2 on venue_id = entity_id where match(name) against('aberdeen' in boolean mode) and dt = '2003-05-23 19:30:00';
select * from t1 left join t2 on venue_id = entity_id where match(name) against('aberdeen') and dt = '2003-05-23 19:30:00'; select * from t1 left join t2 on venue_id = entity_id where match(name) against('aberdeen') and dt = '2003-05-23 19:30:00';
select * from t1 left join t2 on (venue_id = entity_id and match(name) against('aberdeen' in boolean mode)) where dt = '2003-05-23 19:30:00';
select * from t1 left join t2 on (venue_id = entity_id and match(name) against('aberdeen')) where dt = '2003-05-23 19:30:00';
drop table t1,t2; drop table t1,t2;
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