Skip to content

Commit b96c309

Browse files
author
serg@serg.mysql.com
committed
Merge work:/home/bk/mysql-4.0
into serg.mysql.com:/usr/home/serg/Abk/mysql-4.0
2 parents 7f5f58d + 59f3a95 commit b96c309

File tree

13 files changed

+111
-57
lines changed

13 files changed

+111
-57
lines changed

include/ft_global.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ extern const char *ft_precompiled_stopwords[];
4949
extern ulong ft_min_word_len;
5050
extern ulong ft_max_word_len;
5151
extern ulong ft_max_word_len_for_sort;
52+
extern char *ft_boolean_syntax;
5253

5354
int ft_init_stopwords(const char **);
5455
void ft_free_stopwords(void);

myisam/ft_boolean_search.c

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static double _wghts[11]={
3636
3.375000000000000,
3737
5.062500000000000,
3838
7.593750000000000};
39-
static double *wghts=_wghts+5; // wghts[i] = 1.5**i
39+
static double *wghts=_wghts+5; /* wghts[i] = 1.5**i */
4040

4141
static double _nwghts[11]={
4242
-0.065843621399177,
@@ -50,7 +50,7 @@ static double _nwghts[11]={
5050
-1.687500000000000,
5151
-2.531250000000000,
5252
-3.796875000000000};
53-
static double *nwghts=_nwghts+5; // nwghts[i] = -0.5*1.5**i
53+
static double *nwghts=_nwghts+5; /* nwghts[i] = -0.5*1.5**i */
5454

5555
typedef struct st_ftb_expr FTB_EXPR;
5656
struct st_ftb_expr {
@@ -114,20 +114,7 @@ void _ftb_parse_query(FTB *ftb, byte **start, byte *end,
114114
byte r=param.plusminus;
115115
float weight=(param.pmsign ? nwghts : wghts)[(r>5)?5:((r<-5)?-5:r)];
116116
switch (res) {
117-
case FTB_LBR:
118-
ftbe=(FTB_EXPR *)alloc_root(&ftb->mem_root, sizeof(FTB_EXPR));
119-
ftbe->yesno=param.yesno;
120-
ftbe->weight=weight;
121-
ftbe->up=up;
122-
ftbe->ythresh=0;
123-
ftbe->docid=HA_POS_ERROR;
124-
if (ftbe->yesno > 0) up->ythresh++;
125-
_ftb_parse_query(ftb, start, end, ftbe, depth+1,
126-
(param.yesno<0 ? depth+1 : ndepth));
127-
break;
128-
case FTB_RBR:
129-
return;
130-
case 1:
117+
case 1: /* word found */
131118
ftbw=(FTB_WORD *)alloc_root(&ftb->mem_root,
132119
sizeof(FTB_WORD) + (param.trunc ? MI_MAX_KEY_BUFF : w.len+extra));
133120
ftbw->len=w.len+1;
@@ -142,6 +129,19 @@ void _ftb_parse_query(FTB *ftb, byte **start, byte *end,
142129
if (ftbw->yesno > 0) up->ythresh++;
143130
queue_insert(& ftb->queue, (byte *)ftbw);
144131
break;
132+
case 2: /* left bracket */
133+
ftbe=(FTB_EXPR *)alloc_root(&ftb->mem_root, sizeof(FTB_EXPR));
134+
ftbe->yesno=param.yesno;
135+
ftbe->weight=weight;
136+
ftbe->up=up;
137+
ftbe->ythresh=0;
138+
ftbe->docid=HA_POS_ERROR;
139+
if (ftbe->yesno > 0) up->ythresh++;
140+
_ftb_parse_query(ftb, start, end, ftbe, depth+1,
141+
(param.yesno<0 ? depth+1 : ndepth));
142+
break;
143+
case 3: /* right bracket */
144+
return;
145145
}
146146
}
147147
return;
@@ -339,7 +339,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
339339
/* curdoc matched ! */
340340
info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); /* why is this ? */
341341

342-
/* info->lastpos=curdoc; */ /* do I need this ? */
342+
info->lastpos=curdoc;
343343
if (!(*info->read_record)(info,curdoc,record))
344344
{
345345
info->update|= HA_STATE_AKTIV; /* Record is read */
@@ -348,6 +348,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
348348
return my_errno;
349349
}
350350
}
351+
ftb->state=INDEX_DONE;
351352
return my_errno=HA_ERR_END_OF_FILE;
352353
}
353354

@@ -359,17 +360,33 @@ float ft_boolean_find_relevance(FT_INFO *ftb, my_off_t docid, byte *record)
359360
FTB_EXPR *ftbe;
360361
uint i;
361362

362-
if (ftb->state == READY)
363+
if (ftb->state == READY || ftb->state == INDEX_DONE)
363364
{
365+
for (i=1; i<=ftb->queue.elements; i++)
366+
{
367+
ftbw=(FTB_WORD *)(ftb->queue.root[i]);
368+
ftbw->docid=HA_POS_ERROR;
369+
for (ftbe=ftbw->up; ftbe; ftbe=ftbe->up)
370+
{
371+
if (ftbe->docid != HA_POS_ERROR)
372+
{
373+
ftbe->cur_weight=ftbe->yesses=ftbe->nos=0;
374+
ftbe->docid=HA_POS_ERROR;
375+
}
376+
else
377+
break;
378+
}
379+
}
380+
364381
queue_fix(& ftb->queue);
365382
ftb->state=SCAN;
366383
}
367384
else if (ftb->state != SCAN)
368-
return -1.0;
385+
return -2.0;
369386

370387
bzero(&ptree, sizeof(ptree));
371388
if (_mi_ft_parse(& ptree, ftb->info, ftb->keynr, record))
372-
return -1.0;
389+
return -3.0;
373390

374391
for (i=1; i<=ftb->queue.elements; i++)
375392
{

myisam/ft_nlq_search.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ float ft_nlq_find_relevance(FT_INFO *handler, my_off_t docid,
253253
int a,b,c;
254254
FT_DOC *docs=handler->doc;
255255

256-
// Assuming docs[] is sorted by dpos...
256+
/* Assuming docs[] is sorted by dpos... */
257257

258258
for (a=0, b=handler->ndocs, c=(a+b)/2; b-a>1; c=(a+b)/2)
259259
{

myisam/ft_parser.c

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@ typedef struct st_ft_docstat {
3333
double max, nsum, nsum2;
3434
#endif /* EVAL_RUN */
3535

36-
// MI_INFO *info;
37-
// uint keynr;
38-
// byte *keybuf;
3936
} FT_DOCSTAT;
4037

4138
static int FT_WORD_cmp(void* cmp_arg, FT_WORD *w1, FT_WORD *w2)
@@ -63,9 +60,7 @@ static int walk_and_copy(FT_WORD *word,uint32 count,FT_DOCSTAT *docstat)
6360

6461
/* transforms tree of words into the array, applying normalization */
6562

66-
FT_WORD * ft_linearize(//MI_INFO *info, uint keynr,
67-
//byte *keybuf,
68-
TREE *wtree)
63+
FT_WORD * ft_linearize(TREE *wtree)
6964
{
7065
FT_WORD *wlist,*p;
7166
FT_DOCSTAT docstat;
@@ -74,9 +69,6 @@ FT_WORD * ft_linearize(//MI_INFO *info, uint keynr,
7469
if ((wlist=(FT_WORD *) my_malloc(sizeof(FT_WORD)*
7570
(1+wtree->elements_in_tree),MYF(0))))
7671
{
77-
// docstat.info=info;
78-
// docstat.keynr=keynr;
79-
// docstat.keybuf=keybuf;
8072
docstat.list=wlist;
8173
docstat.uniq=wtree->elements_in_tree;
8274
#ifdef EVAL_RUN
@@ -122,12 +114,20 @@ FT_WORD * ft_linearize(//MI_INFO *info, uint keynr,
122114
#endif
123115
#define word_char(X) (true_word_char(X) || misc_word_char(X))
124116

117+
118+
/* returns:
119+
* 0 - eof
120+
* 1 - word found
121+
* 2 - left bracket
122+
* 3 - right bracket
123+
*/
125124
byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param)
126125
{
127126
byte *doc=*start;
128127
int mwc;
129128

130-
param->yesno=param->plusminus=param->pmsign=0;
129+
param->yesno=(FTB_YES==' ')?1:0;
130+
param->plusminus=param->pmsign=0;
131131

132132
while (doc<end)
133133
{
@@ -138,18 +138,16 @@ byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param)
138138
{
139139
/* param->prev=' '; */
140140
*start=doc+1;
141-
return *doc;
141+
return (*doc == FTB_RBR)+2;
142142
}
143143
if (param->prev == ' ')
144144
{
145-
switch (*doc) {
146-
case FTB_YES: param->yesno=+1; continue;
147-
case FTB_NO: param->yesno=-1; continue;
148-
case FTB_INC: param->plusminus++; continue;
149-
case FTB_DEC: param->plusminus--; continue;
150-
case FTB_NEG: param->pmsign=!param->pmsign; continue;
151-
default: break;
152-
}
145+
if (*doc == FTB_YES ) { param->yesno=+1; continue; } else
146+
if (*doc == FTB_EGAL) { param->yesno= 0; continue; } else
147+
if (*doc == FTB_NO ) { param->yesno=-1; continue; } else
148+
if (*doc == FTB_INC ) { param->plusminus++; continue; } else
149+
if (*doc == FTB_DEC ) { param->plusminus--; continue; } else
150+
if (*doc == FTB_NEG ) { param->pmsign=!param->pmsign; continue; }
153151
}
154152
param->prev=*doc;
155153
param->yesno=param->plusminus=param->pmsign=0;
@@ -162,7 +160,7 @@ byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param)
162160
else if (!misc_word_char(*doc) || mwc++)
163161
break;
164162

165-
param->prev='A'; // be sure *prev is true_word_char
163+
param->prev='A'; /* be sure *prev is true_word_char */
166164
word->len= (uint)(doc-word->pos) - mwc;
167165
if ((param->trunc=(doc<end && *doc == FTB_TRUNC)))
168166
doc++;

myisam/ft_static.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
ulong ft_min_word_len=4;
2222
ulong ft_max_word_len=HA_FT_MAXLEN;
2323
ulong ft_max_word_len_for_sort=20;
24+
char *ft_boolean_syntax="+ -><()~*";
2425

2526
const MI_KEYSEG ft_keysegs[FT_SEGS]={
2627
{

myisam/ftdefs.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,15 @@ extern ulong collstat;
8686
/*=================================================================*/
8787

8888
/* Boolean search operators */
89-
#define FTB_YES '+'
90-
#define FTB_NO '-'
91-
#define FTB_INC '>'
92-
#define FTB_DEC '<'
93-
#define FTB_LBR '('
94-
#define FTB_RBR ')'
95-
#define FTB_NEG '~'
96-
#define FTB_TRUNC '*'
89+
#define FTB_YES (ft_boolean_syntax[0])
90+
#define FTB_EGAL (ft_boolean_syntax[1])
91+
#define FTB_NO (ft_boolean_syntax[2])
92+
#define FTB_INC (ft_boolean_syntax[3])
93+
#define FTB_DEC (ft_boolean_syntax[4])
94+
#define FTB_LBR (ft_boolean_syntax[5])
95+
#define FTB_RBR (ft_boolean_syntax[6])
96+
#define FTB_NEG (ft_boolean_syntax[7])
97+
#define FTB_TRUNC (ft_boolean_syntax[8])
9798

9899
typedef struct st_ft_word {
99100
byte * pos;

mysql-test/r/fulltext_order_by.result

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,40 @@ SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINS
1111
a MATCH (message) AGAINST ('steve')
1212
4 0.90587323904037
1313
7 0.89568990468979
14+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve');
15+
a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE)
16+
4 1
17+
7 1
18+
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE);
19+
a MATCH (message) AGAINST ('steve')
20+
4 0.90587323904037
21+
7 0.89568990468979
22+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE);
23+
a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE)
24+
4 1
25+
7 1
1426
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve') ORDER BY a;
1527
a MATCH (message) AGAINST ('steve')
1628
4 0.90587323904037
1729
7 0.89568990468979
30+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a;
31+
a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE)
32+
4 1
33+
7 1
1834
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve') ORDER BY a DESC;
1935
a MATCH (message) AGAINST ('steve')
2036
7 0.89568990468979
2137
4 0.90587323904037
38+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a DESC;
39+
a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE)
40+
7 1
41+
4 1
2242
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve') ORDER BY 1;
2343
a MATCH (message) AGAINST ('steve')
2444
7 0.89568990468979
45+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY 1;
46+
a MATCH (message) AGAINST ('steve' IN BOOLEAN MODE)
47+
7 1
2548
SELECT a, MATCH (message) AGAINST ('steve') as rel FROM t1 ORDER BY rel;
2649
a rel
2750
1 0
@@ -31,4 +54,13 @@ a rel
3154
6 0
3255
7 0.89568990468979
3356
4 0.90587323904037
57+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) as rel FROM t1 ORDER BY rel;
58+
a rel
59+
1 0
60+
2 0
61+
3 0
62+
5 0
63+
6 0
64+
4 1
65+
7 1
3466
drop table t1;

mysql-test/r/fulltext_var.result

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ Variable_name Value
33
ft_min_word_len 4
44
ft_max_word_len 254
55
ft_max_word_len_for_sort 20
6+
ft_boolean_syntax + -><()~*

mysql-test/t/fulltext_order_by.test

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,24 @@ INSERT INTO t1 (message) VALUES ("Testing"),("table"),("testbug"),
99
("steve"),("is"),("cool"),("steve is cool");
1010
# basic MATCH
1111
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve');
12+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve');
13+
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE);
14+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE);
1215

1316
# MATCH + ORDER BY (with ft-ranges)
1417
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE MATCH (message) AGAINST ('steve') ORDER BY a;
18+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a;
1519

1620
# MATCH + ORDER BY (with normal ranges) + UNIQUE
1721
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve') ORDER BY a DESC;
22+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a in (2,7,4) and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY a DESC;
1823

1924
# MATCH + ORDER BY + UNIQUE (const_table)
2025
SELECT a, MATCH (message) AGAINST ('steve') FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve') ORDER BY 1;
26+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) FROM t1 WHERE a=7 and MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) ORDER BY 1;
2127

2228
# ORDER BY MATCH
2329
SELECT a, MATCH (message) AGAINST ('steve') as rel FROM t1 ORDER BY rel;
30+
SELECT a, MATCH (message) AGAINST ('steve' IN BOOLEAN MODE) as rel FROM t1 ORDER BY rel;
2431

2532
drop table t1;

sql/mysqld.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1892,7 +1892,7 @@ The server will not act as a slave.");
18921892

18931893
if (opt_myisam_log)
18941894
(void) mi_log( 1 );
1895-
ft_init_stopwords(ft_precompiled_stopwords); /* SerG */
1895+
ft_init_stopwords(ft_precompiled_stopwords);
18961896

18971897
#ifdef __WIN__
18981898
#define MYSQL_ERR_FILE "mysql.err"
@@ -2998,6 +2998,7 @@ struct show_var_st init_vars[]= {
29982998
{"ft_min_word_len", (char*) &ft_min_word_len, SHOW_LONG},
29992999
{"ft_max_word_len", (char*) &ft_max_word_len, SHOW_LONG},
30003000
{"ft_max_word_len_for_sort",(char*) &ft_max_word_len_for_sort, SHOW_LONG},
3001+
{"ft_boolean_syntax", ft_boolean_syntax, SHOW_CHAR},
30013002
{"have_bdb", (char*) &have_berkeley_db, SHOW_HAVE},
30023003
{"have_innodb", (char*) &have_innodb, SHOW_HAVE},
30033004
{"have_isam", (char*) &have_isam, SHOW_HAVE},

0 commit comments

Comments
 (0)