mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
indexless boolean fulltext search was depending on default_charset_info - Bug#8159
ftbw->off wasn't cleared on reinit - Bug#8234
This commit is contained in:
@ -62,7 +62,7 @@ void ft_free_stopwords(void);
|
|||||||
#define FT_SORTED 2
|
#define FT_SORTED 2
|
||||||
#define FT_EXPAND 4 /* query expansion */
|
#define FT_EXPAND 4 /* query expansion */
|
||||||
|
|
||||||
FT_INFO *ft_init_search(uint,void *, uint, byte *, uint, byte *);
|
FT_INFO *ft_init_search(uint,void *, uint, byte *, uint,CHARSET_INFO *, byte *);
|
||||||
my_bool ft_boolean_check_syntax_string(const byte *);
|
my_bool ft_boolean_check_syntax_string(const byte *);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -365,6 +365,7 @@ static void _ftb_init_index_search(FT_INFO *ftb)
|
|||||||
reset_tree(& ftb->no_dupes);
|
reset_tree(& ftb->no_dupes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ftbw->off=0; /* in case of reinit */
|
||||||
if (_ft2_search(ftb, ftbw, 1))
|
if (_ft2_search(ftb, ftbw, 1))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -373,7 +374,7 @@ static void _ftb_init_index_search(FT_INFO *ftb)
|
|||||||
|
|
||||||
|
|
||||||
FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
||||||
uint query_len)
|
uint query_len, CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
FTB *ftb;
|
FTB *ftb;
|
||||||
FTB_EXPR *ftbe;
|
FTB_EXPR *ftbe;
|
||||||
@ -385,8 +386,8 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
|||||||
ftb->state=UNINITIALIZED;
|
ftb->state=UNINITIALIZED;
|
||||||
ftb->info=info;
|
ftb->info=info;
|
||||||
ftb->keynr=keynr;
|
ftb->keynr=keynr;
|
||||||
ftb->charset= ((keynr==NO_SUCH_KEY) ?
|
ftb->charset=cs;
|
||||||
default_charset_info : info->s->keyinfo[keynr].seg->charset);
|
DBUG_ASSERT(keynr==NO_SUCH_KEY || cs == info->s->keyinfo[keynr].seg->charset);
|
||||||
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));
|
||||||
|
@ -55,11 +55,12 @@ const struct _ft_vft _ft_vft_boolean = {
|
|||||||
|
|
||||||
|
|
||||||
FT_INFO *ft_init_search(uint flags, void *info, uint keynr,
|
FT_INFO *ft_init_search(uint flags, void *info, uint keynr,
|
||||||
byte *query, uint query_len, byte *record)
|
byte *query, uint query_len, CHARSET_INFO *cs,
|
||||||
|
byte *record)
|
||||||
{
|
{
|
||||||
FT_INFO *res;
|
FT_INFO *res;
|
||||||
if (flags & FT_BOOL)
|
if (flags & FT_BOOL)
|
||||||
res= ft_init_boolean_search((MI_INFO *)info, keynr, query, query_len);
|
res= ft_init_boolean_search((MI_INFO *)info, keynr, query, query_len,cs);
|
||||||
else
|
else
|
||||||
res= ft_init_nlq_search((MI_INFO *)info, keynr, query, query_len, flags,
|
res= ft_init_nlq_search((MI_INFO *)info, keynr, query, query_len, flags,
|
||||||
record);
|
record);
|
||||||
|
@ -131,7 +131,7 @@ FT_WORD * _mi_ft_parserecord(MI_INFO *, uint, const byte *);
|
|||||||
uint _mi_ft_parse(TREE *, MI_INFO *, uint, const byte *, my_bool);
|
uint _mi_ft_parse(TREE *, MI_INFO *, uint, const byte *, my_bool);
|
||||||
|
|
||||||
FT_INFO *ft_init_nlq_search(MI_INFO *, uint, byte *, uint, uint, byte *);
|
FT_INFO *ft_init_nlq_search(MI_INFO *, uint, byte *, uint, uint, byte *);
|
||||||
FT_INFO *ft_init_boolean_search(MI_INFO *, uint, byte *, uint);
|
FT_INFO *ft_init_boolean_search(MI_INFO *, uint, byte *, uint, CHARSET_INFO *);
|
||||||
|
|
||||||
extern const struct _ft_vft _ft_vft_nlq;
|
extern const struct _ft_vft _ft_vft_nlq;
|
||||||
int ft_nlq_read_next(FT_INFO *, char *);
|
int ft_nlq_read_next(FT_INFO *, char *);
|
||||||
|
@ -88,8 +88,12 @@ class ha_myisam: public handler
|
|||||||
ft_handler->please->reinit_search(ft_handler);
|
ft_handler->please->reinit_search(ft_handler);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
FT_INFO *ft_init_ext(uint flags, uint inx,const byte *key, uint keylen)
|
FT_INFO *ft_init_ext(uint flags, uint inx,String *key)
|
||||||
{ return ft_init_search(flags,file,inx,(byte*) key,keylen, table->record[0]); }
|
{
|
||||||
|
return ft_init_search(flags,file,inx,
|
||||||
|
(byte *)key->ptr(), key->length(), key->charset(),
|
||||||
|
table->record[0]);
|
||||||
|
}
|
||||||
int ft_read(byte *buf);
|
int ft_read(byte *buf);
|
||||||
int rnd_init(bool scan);
|
int rnd_init(bool scan);
|
||||||
int rnd_next(byte *buf);
|
int rnd_next(byte *buf);
|
||||||
|
@ -373,8 +373,7 @@ public:
|
|||||||
int compare_key(key_range *range);
|
int compare_key(key_range *range);
|
||||||
virtual int ft_init() { return HA_ERR_WRONG_COMMAND; }
|
virtual int ft_init() { return HA_ERR_WRONG_COMMAND; }
|
||||||
void ft_end() { ft_handler=NULL; }
|
void ft_end() { ft_handler=NULL; }
|
||||||
virtual FT_INFO *ft_init_ext(uint flags,uint inx,const byte *key,
|
virtual FT_INFO *ft_init_ext(uint flags, uint inx,String *key)
|
||||||
uint keylen)
|
|
||||||
{ return NULL; }
|
{ return NULL; }
|
||||||
virtual int ft_read(byte *buf) { return HA_ERR_WRONG_COMMAND; }
|
virtual int ft_read(byte *buf) { return HA_ERR_WRONG_COMMAND; }
|
||||||
virtual int rnd_next(byte *buf)=0;
|
virtual int rnd_next(byte *buf)=0;
|
||||||
|
@ -3047,9 +3047,7 @@ void Item_func_match::init_search(bool no_order)
|
|||||||
|
|
||||||
if (join_key && !no_order)
|
if (join_key && !no_order)
|
||||||
flags|=FT_SORTED;
|
flags|=FT_SORTED;
|
||||||
ft_handler=table->file->ft_init_ext(flags, key,
|
ft_handler=table->file->ft_init_ext(flags, key, ft_tmp);
|
||||||
(byte*) ft_tmp->ptr(),
|
|
||||||
ft_tmp->length());
|
|
||||||
|
|
||||||
if (join_key)
|
if (join_key)
|
||||||
table->file->ft_handler=ft_handler;
|
table->file->ft_handler=ft_handler;
|
||||||
@ -3091,12 +3089,12 @@ bool Item_func_match::fix_fields(THD *thd, TABLE_LIST *tlist, Item **ref)
|
|||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
Check that all columns come from the same table.
|
Check that all columns come from the same table.
|
||||||
We've already checked that columns in MATCH are fields so
|
We've already checked that columns in MATCH are fields so
|
||||||
PARAM_TABLE_BIT can only appear from AGAINST argument.
|
PARAM_TABLE_BIT can only appear from AGAINST argument.
|
||||||
*/
|
*/
|
||||||
if ((used_tables_cache & ~PARAM_TABLE_BIT) != item->used_tables())
|
if ((used_tables_cache & ~PARAM_TABLE_BIT) != item->used_tables())
|
||||||
key=NO_SUCH_KEY;
|
key=NO_SUCH_KEY;
|
||||||
|
|
||||||
if (key == NO_SUCH_KEY && !(flags & FT_BOOL))
|
if (key == NO_SUCH_KEY && !(flags & FT_BOOL))
|
||||||
{
|
{
|
||||||
my_error(ER_WRONG_ARGUMENTS,MYF(0),"MATCH");
|
my_error(ER_WRONG_ARGUMENTS,MYF(0),"MATCH");
|
||||||
|
Reference in New Issue
Block a user