summaryrefslogtreecommitdiff
path: root/myisam/ft_boolean_search.c
diff options
context:
space:
mode:
authorunknown <serg@serg.mylan>2003-11-20 23:15:07 +0100
committerunknown <serg@serg.mylan>2003-11-20 23:15:07 +0100
commit722a4cc5d6d61d25d8c0d24ad237e414b1ac76b1 (patch)
tree0f133763e6072bf2266bc444a4632915a7cab5cf /myisam/ft_boolean_search.c
parentd54e1be66b5bf5968d433076980337ff72942535 (diff)
downloadmariadb-git-722a4cc5d6d61d25d8c0d24ad237e414b1ac76b1.tar.gz
yet another trunc* bug
Diffstat (limited to 'myisam/ft_boolean_search.c')
-rw-r--r--myisam/ft_boolean_search.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c
index 72c54bd0c5b..30b52a20060 100644
--- a/myisam/ft_boolean_search.c
+++ b/myisam/ft_boolean_search.c
@@ -62,11 +62,12 @@ typedef struct st_ftb_expr FTB_EXPR;
struct st_ftb_expr
{
FTB_EXPR *up;
- byte *quot, *qend;
float weight;
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;
+ byte *quot, *qend;
int yesses; /* number of "yes" words matched */
int nos; /* number of "no" words matched */
int ythresh; /* number of "yes" words in expr */
@@ -78,7 +79,8 @@ typedef struct st_ftb_word
FTB_EXPR *up;
float weight;
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;
int len;
/* ... 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)
{
/*
- special treatment for truncation operator :((
- 1. +trunc* and there're other (not +trunc*) words
+ special treatment for truncation operator
+ 1. there are some (besides this) +words
| 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
2. -trunc*
| 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.
| It may cause duplicates, as in the index (sorted by <word,docid>)
| <aaaa,row1>
@@ -231,22 +235,31 @@ static void _ftb_init_index_search(FT_INFO *ftb)
| <aacc,row1>
| Searching for "aa*" will find row1 twice...
*/
- if ( test(ftbw->flags&FTB_FLAG_NO) || /* 2 */
- (test(ftbw->flags&FTB_FLAG_YES) && /* 1 */
- ftbw->up->ythresh - ftbw->up->yweaks >1)) /* 1 */
- {
- ftbw->docid[0]=HA_POS_ERROR;
- ftbw->up->yweaks++;
- continue;
- }
- else /* 3 */
+ FTB_EXPR *ftbe;
+ for (ftbe=(FTB_EXPR*)ftbw;
+ ftbe->up && !(ftbe->up->flags & FTB_FLAG_TRUNC);
+ ftbe->up->flags|= FTB_FLAG_TRUNC, ftbe=ftbe->up)
{
- 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);
+ if (ftbe->flags & FTB_FLAG_NO || /* 2 */
+ 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;
+ /* 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,
SEARCH_FIND | SEARCH_BIGGER, keyroot);