mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.1-new
into poseidon.ndb.mysql.com:/home/tomas/mysql51
This commit is contained in:
@ -182,13 +182,13 @@ create table t1 (a varchar(200) not null, fulltext (a));
|
|||||||
insert t1 values ("aaa10 bbb20"), ("aaa20 bbb15"), ("aaa30 bbb10");
|
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* +bbb*" in boolean mode);
|
||||||
a
|
a
|
||||||
aaa10 bbb20
|
|
||||||
aaa20 bbb15
|
|
||||||
aaa30 bbb10
|
aaa30 bbb10
|
||||||
|
aaa20 bbb15
|
||||||
|
aaa10 bbb20
|
||||||
select * from t1 where match a against ("+aaa* +bbb1*" in boolean mode);
|
select * from t1 where match a against ("+aaa* +bbb1*" in boolean mode);
|
||||||
a
|
a
|
||||||
aaa20 bbb15
|
|
||||||
aaa30 bbb10
|
aaa30 bbb10
|
||||||
|
aaa20 bbb15
|
||||||
select * from t1 where match a against ("+aaa* +ccc*" in boolean mode);
|
select * from t1 where match a against ("+aaa* +ccc*" in boolean mode);
|
||||||
a
|
a
|
||||||
select * from t1 where match a against ("+aaa10 +(bbb*)" in boolean mode);
|
select * from t1 where match a against ("+aaa10 +(bbb*)" in boolean mode);
|
||||||
@ -196,12 +196,12 @@ a
|
|||||||
aaa10 bbb20
|
aaa10 bbb20
|
||||||
select * from t1 where match a against ("+(+aaa* +bbb1*)" in boolean mode);
|
select * from t1 where match a against ("+(+aaa* +bbb1*)" in boolean mode);
|
||||||
a
|
a
|
||||||
aaa20 bbb15
|
|
||||||
aaa30 bbb10
|
aaa30 bbb10
|
||||||
|
aaa20 bbb15
|
||||||
select * from t1 where match a against ("(+aaa* +bbb1*)" in boolean mode);
|
select * from t1 where match a against ("(+aaa* +bbb1*)" in boolean mode);
|
||||||
a
|
a
|
||||||
aaa20 bbb15
|
|
||||||
aaa30 bbb10
|
aaa30 bbb10
|
||||||
|
aaa20 bbb15
|
||||||
drop table t1;
|
drop table t1;
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
id int(11),
|
id int(11),
|
||||||
|
@ -1 +1 @@
|
|||||||
--binlog_ignore_db=test_ignore;
|
--binlog_ignore_db=test_ignore
|
||||||
|
@ -97,8 +97,7 @@ static int simple_parser_plugin_deinit(void)
|
|||||||
1 failure (cannot happen)
|
1 failure (cannot happen)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int simple_parser_init(MYSQL_FTPARSER_PARAM *param
|
static int simple_parser_init(MYSQL_FTPARSER_PARAM *param)
|
||||||
__attribute__((unused)))
|
|
||||||
{
|
{
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
@ -118,8 +117,7 @@ static int simple_parser_init(MYSQL_FTPARSER_PARAM *param
|
|||||||
1 failure (cannot happen)
|
1 failure (cannot happen)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int simple_parser_deinit(MYSQL_FTPARSER_PARAM *param
|
static int simple_parser_deinit(MYSQL_FTPARSER_PARAM *param)
|
||||||
__attribute__((unused)))
|
|
||||||
{
|
{
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
@ -107,6 +107,7 @@ typedef struct st_ftb_word
|
|||||||
my_off_t key_root;
|
my_off_t key_root;
|
||||||
my_off_t *max_docid;
|
my_off_t *max_docid;
|
||||||
MI_KEYDEF *keyinfo;
|
MI_KEYDEF *keyinfo;
|
||||||
|
struct st_ftb_word *prev;
|
||||||
float weight;
|
float weight;
|
||||||
uint ndepth;
|
uint ndepth;
|
||||||
uint len;
|
uint len;
|
||||||
@ -121,6 +122,7 @@ typedef struct st_ft_info
|
|||||||
CHARSET_INFO *charset;
|
CHARSET_INFO *charset;
|
||||||
FTB_EXPR *root;
|
FTB_EXPR *root;
|
||||||
FTB_WORD **list;
|
FTB_WORD **list;
|
||||||
|
FTB_WORD *last_word;
|
||||||
MEM_ROOT mem_root;
|
MEM_ROOT mem_root;
|
||||||
QUEUE queue;
|
QUEUE queue;
|
||||||
TREE no_dupes;
|
TREE no_dupes;
|
||||||
@ -199,7 +201,9 @@ static int ftb_query_add_word(void *param, char *word, int word_len,
|
|||||||
memcpy(ftbw->word + 1, word, word_len);
|
memcpy(ftbw->word + 1, word, word_len);
|
||||||
ftbw->word[0]= word_len;
|
ftbw->word[0]= word_len;
|
||||||
if (info->yesno > 0) ftbw->up->ythresh++;
|
if (info->yesno > 0) ftbw->up->ythresh++;
|
||||||
queue_insert(&ftb_param->ftb->queue, (byte *)ftbw);
|
ftb_param->ftb->queue.max_elements++;
|
||||||
|
ftbw->prev= ftb_param->ftb->last_word;
|
||||||
|
ftb_param->ftb->last_word= ftbw;
|
||||||
ftb_param->ftb->with_scan|= (info->trunc & FTB_FLAG_TRUNC);
|
ftb_param->ftb->with_scan|= (info->trunc & FTB_FLAG_TRUNC);
|
||||||
for (tmp_expr= ftb_param->ftbe; tmp_expr->up; tmp_expr= tmp_expr->up)
|
for (tmp_expr= ftb_param->ftbe; tmp_expr->up; tmp_expr= tmp_expr->up)
|
||||||
if (! (tmp_expr->flags & FTB_FLAG_YES))
|
if (! (tmp_expr->flags & FTB_FLAG_YES))
|
||||||
@ -505,7 +509,7 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
|||||||
{
|
{
|
||||||
FTB *ftb;
|
FTB *ftb;
|
||||||
FTB_EXPR *ftbe;
|
FTB_EXPR *ftbe;
|
||||||
uint res;
|
FTB_WORD *ftbw;
|
||||||
|
|
||||||
if (!(ftb=(FTB *)my_malloc(sizeof(FTB), MYF(MY_WME))))
|
if (!(ftb=(FTB *)my_malloc(sizeof(FTB), MYF(MY_WME))))
|
||||||
return 0;
|
return 0;
|
||||||
@ -518,19 +522,10 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
|||||||
ftb->with_scan=0;
|
ftb->with_scan=0;
|
||||||
ftb->lastpos=HA_OFFSET_ERROR;
|
ftb->lastpos=HA_OFFSET_ERROR;
|
||||||
bzero(& ftb->no_dupes, sizeof(TREE));
|
bzero(& ftb->no_dupes, sizeof(TREE));
|
||||||
|
ftb->last_word= 0;
|
||||||
|
|
||||||
init_alloc_root(&ftb->mem_root, 1024, 1024);
|
init_alloc_root(&ftb->mem_root, 1024, 1024);
|
||||||
|
ftb->queue.max_elements= 0;
|
||||||
/*
|
|
||||||
Hack: instead of init_queue, we'll use reinit queue to be able
|
|
||||||
to alloc queue with alloc_root()
|
|
||||||
*/
|
|
||||||
res=ftb->queue.max_elements=1+query_len/2;
|
|
||||||
if (!(ftb->queue.root=
|
|
||||||
(byte **)alloc_root(&ftb->mem_root, (res+1)*sizeof(void*))))
|
|
||||||
goto err;
|
|
||||||
reinit_queue(& ftb->queue, res, 0, 0,
|
|
||||||
(int (*)(void*,byte*,byte*))FTB_WORD_cmp, 0);
|
|
||||||
if (!(ftbe=(FTB_EXPR *)alloc_root(&ftb->mem_root, sizeof(FTB_EXPR))))
|
if (!(ftbe=(FTB_EXPR *)alloc_root(&ftb->mem_root, sizeof(FTB_EXPR))))
|
||||||
goto err;
|
goto err;
|
||||||
ftbe->weight=1;
|
ftbe->weight=1;
|
||||||
@ -545,6 +540,18 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
|||||||
_ftb_parse_query(ftb, query, query_len, keynr == NO_SUCH_KEY ?
|
_ftb_parse_query(ftb, query, query_len, keynr == NO_SUCH_KEY ?
|
||||||
&ft_default_parser :
|
&ft_default_parser :
|
||||||
info->s->keyinfo[keynr].parser);
|
info->s->keyinfo[keynr].parser);
|
||||||
|
/*
|
||||||
|
Hack: instead of init_queue, we'll use reinit queue to be able
|
||||||
|
to alloc queue with alloc_root()
|
||||||
|
*/
|
||||||
|
if (! (ftb->queue.root= (byte **)alloc_root(&ftb->mem_root,
|
||||||
|
(ftb->queue.max_elements + 1) *
|
||||||
|
sizeof(void *))))
|
||||||
|
goto err;
|
||||||
|
reinit_queue(&ftb->queue, ftb->queue.max_elements, 0, 0,
|
||||||
|
(int (*)(void*, byte*, byte*))FTB_WORD_cmp, 0);
|
||||||
|
for (ftbw= ftb->last_word; ftbw; ftbw= ftbw->prev)
|
||||||
|
queue_insert(&ftb->queue, (byte *)ftbw);
|
||||||
ftb->list=(FTB_WORD **)alloc_root(&ftb->mem_root,
|
ftb->list=(FTB_WORD **)alloc_root(&ftb->mem_root,
|
||||||
sizeof(FTB_WORD *)*ftb->queue.elements);
|
sizeof(FTB_WORD *)*ftb->queue.elements);
|
||||||
memcpy(ftb->list, ftb->queue.root+1, sizeof(FTB_WORD *)*ftb->queue.elements);
|
memcpy(ftb->list, ftb->queue.root+1, sizeof(FTB_WORD *)*ftb->queue.elements);
|
||||||
|
Reference in New Issue
Block a user