mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 10:31:54 +01:00
Merge bk-internal:/home/bk/mysql-4.0/
into serg.mylan:/usr/home/serg/Abk/mysql-4.0
This commit is contained in:
commit
5443cba38e
5 changed files with 71 additions and 20 deletions
|
@ -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
|
||||||
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)
|
||||||
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)
|
||||||
| <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;
|
if (ftbe->flags & FTB_FLAG_NO || /* 2 */
|
||||||
ftbw->up->yweaks++;
|
ftbe->up->ythresh - ftbe->up->yweaks >1) /* 1 */
|
||||||
|
{
|
||||||
|
FTB_EXPR *top_ftbe=ftbe->up->up;
|
||||||
|
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;
|
continue;
|
||||||
}
|
/* 3 */
|
||||||
else /* 3 */
|
if (!is_tree_inited(& ftb->no_dupes))
|
||||||
{
|
init_tree(& ftb->no_dupes,0,0,sizeof(my_off_t),
|
||||||
if (!is_tree_inited(& ftb->no_dupes))
|
_ftb_no_dupes_cmp,0,0,0);
|
||||||
init_tree(& ftb->no_dupes,0,0,sizeof(my_off_t),
|
else
|
||||||
_ftb_no_dupes_cmp,0,0,0);
|
reset_tree(& ftb->no_dupes);
|
||||||
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
|
||||||
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
|
||||||
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");
|
||||||
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
|
||||||
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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue