mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Ill-minded FULLTEXT impilict initialization hack removed.
From now on FULLTEXT search is initialized expilictly in mysql_select()
This commit is contained in:
@ -158,7 +158,6 @@ FT_DOCLIST * ft_init_search(void *info, uint keynr, byte *key,
|
|||||||
ALL_IN_ONE aio;
|
ALL_IN_ONE aio;
|
||||||
FT_DOCLIST *dlist;
|
FT_DOCLIST *dlist;
|
||||||
FT_DOC *dptr;
|
FT_DOC *dptr;
|
||||||
my_off_t saved_lastpos;
|
|
||||||
|
|
||||||
/* black magic ON */
|
/* black magic ON */
|
||||||
if ((int) (keynr = _mi_check_index((MI_INFO *)info,keynr)) < 0)
|
if ((int) (keynr = _mi_check_index((MI_INFO *)info,keynr)) < 0)
|
||||||
@ -174,8 +173,6 @@ FT_DOCLIST * ft_init_search(void *info, uint keynr, byte *key,
|
|||||||
aio.keyinfo=aio.info->s->keyinfo+keynr;
|
aio.keyinfo=aio.info->s->keyinfo+keynr;
|
||||||
aio.key_root=aio.info->s->state.key_root[keynr];
|
aio.key_root=aio.info->s->state.key_root[keynr];
|
||||||
|
|
||||||
saved_lastpos=aio.info->lastpos;
|
|
||||||
|
|
||||||
if (!(wtree=ft_parse(NULL,key,key_len))) return NULL;
|
if (!(wtree=ft_parse(NULL,key,key_len))) return NULL;
|
||||||
|
|
||||||
init_tree(&aio.dtree,0,sizeof(FT_SUPERDOC),(qsort_cmp)&FT_SUPERDOC_cmp,0,
|
init_tree(&aio.dtree,0,sizeof(FT_SUPERDOC),(qsort_cmp)&FT_SUPERDOC_cmp,0,
|
||||||
@ -204,7 +201,6 @@ FT_DOCLIST * ft_init_search(void *info, uint keynr, byte *key,
|
|||||||
}
|
}
|
||||||
|
|
||||||
err:
|
err:
|
||||||
aio.info->lastpos=saved_lastpos;
|
|
||||||
delete_tree(&aio.dtree);
|
delete_tree(&aio.dtree);
|
||||||
delete_tree(wtree);
|
delete_tree(wtree);
|
||||||
my_free((char*) wtree,MYF(0));
|
my_free((char*) wtree,MYF(0));
|
||||||
|
@ -1079,20 +1079,6 @@ ha_rows ha_myisam::records_in_range(int inx,
|
|||||||
end_search_flag);
|
end_search_flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ha_myisam::ft_init(uint inx, const byte *key, uint keylen, bool presort)
|
|
||||||
{
|
|
||||||
if (ft_handler)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
// Do the search!
|
|
||||||
ft_handler=ft_init_search(file,inx,(byte*) key,keylen,presort);
|
|
||||||
|
|
||||||
if (!ft_handler)
|
|
||||||
return (my_errno ? my_errno : -1);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ha_myisam::ft_read(byte * buf)
|
int ha_myisam::ft_read(byte * buf)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
@ -71,8 +71,9 @@ class ha_myisam: public handler
|
|||||||
int index_first(byte * buf);
|
int index_first(byte * buf);
|
||||||
int index_last(byte * buf);
|
int index_last(byte * buf);
|
||||||
int index_next_same(byte *buf, const byte *key, uint keylen);
|
int index_next_same(byte *buf, const byte *key, uint keylen);
|
||||||
int ft_init(uint inx,const byte *key, uint keylen, bool presort=1);
|
int ft_init()
|
||||||
void *ft_init_ext(uint inx,const byte *key, uint keylen, bool presort=0)
|
{ if(!ft_handler) return 1; ft_reinit_search(ft_handler); return 0; }
|
||||||
|
void *ft_init_ext(uint inx,const byte *key, uint keylen, bool presort)
|
||||||
{ return ft_init_search(file,inx,(byte*) key,keylen,presort); }
|
{ return ft_init_search(file,inx,(byte*) key,keylen,presort); }
|
||||||
int ft_read(byte *buf);
|
int ft_read(byte *buf);
|
||||||
int rnd_init(bool scan=1);
|
int rnd_init(bool scan=1);
|
||||||
|
@ -222,9 +222,9 @@ public:
|
|||||||
virtual int index_first(byte * buf)=0;
|
virtual int index_first(byte * buf)=0;
|
||||||
virtual int index_last(byte * buf)=0;
|
virtual int index_last(byte * buf)=0;
|
||||||
virtual int index_next_same(byte *buf, const byte *key, uint keylen);
|
virtual int index_next_same(byte *buf, const byte *key, uint keylen);
|
||||||
virtual int ft_init(uint inx,const byte *key, uint keylen, bool presort=1)
|
virtual int ft_init()
|
||||||
{ return -1; }
|
{ return -1; }
|
||||||
virtual void *ft_init_ext(uint inx,const byte *key, uint keylen, bool presort=0)
|
virtual void *ft_init_ext(uint inx,const byte *key, uint keylen, bool presort)
|
||||||
{ return (void *)NULL; }
|
{ return (void *)NULL; }
|
||||||
virtual int ft_read(byte *buf) { return -1; }
|
virtual int ft_read(byte *buf) { return -1; }
|
||||||
virtual int rnd_init(bool scan=1)=0;
|
virtual int rnd_init(bool scan=1)=0;
|
||||||
|
@ -1840,9 +1840,6 @@ err:
|
|||||||
|
|
||||||
double Item_func_match::val()
|
double Item_func_match::val()
|
||||||
{
|
{
|
||||||
if (first_call)
|
|
||||||
init_search();
|
|
||||||
|
|
||||||
// Don't know how to return an error from val(), so NULL will be returned
|
// Don't know how to return an error from val(), so NULL will be returned
|
||||||
if ((null_value=(ft_handler==NULL)))
|
if ((null_value=(ft_handler==NULL)))
|
||||||
return 0.0;
|
return 0.0;
|
||||||
@ -1853,8 +1850,7 @@ double Item_func_match::val()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* implicit initialization was done, so we'll have to find
|
/* we'll have to find ft_relevance manually in ft_handler array */
|
||||||
ft_relevance manually in ft_handler array */
|
|
||||||
|
|
||||||
int a,b,c;
|
int a,b,c;
|
||||||
FT_DOC *docs=ft_handler->doc;
|
FT_DOC *docs=ft_handler->doc;
|
||||||
@ -1881,9 +1877,8 @@ double Item_func_match::val()
|
|||||||
|
|
||||||
void Item_func_match::init_search()
|
void Item_func_match::init_search()
|
||||||
{
|
{
|
||||||
if (!first_call)
|
if (ft_handler)
|
||||||
return;
|
return;
|
||||||
first_call=false;
|
|
||||||
|
|
||||||
if (master)
|
if (master)
|
||||||
{
|
{
|
||||||
@ -1893,20 +1888,19 @@ void Item_func_match::init_search()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (join_key)
|
|
||||||
{
|
|
||||||
ft_handler=((FT_DOCLIST *)table->file->ft_handler);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* join won't use this ft-key, but we must to init it anyway */
|
|
||||||
String *ft_tmp=0;
|
String *ft_tmp=0;
|
||||||
char tmp1[FT_QUERY_MAXLEN];
|
char tmp1[FT_QUERY_MAXLEN];
|
||||||
String tmp2(tmp1,sizeof(tmp1));
|
String tmp2(tmp1,sizeof(tmp1));
|
||||||
|
|
||||||
ft_tmp=key_item()->val_str(&tmp2);
|
ft_tmp=key_item()->val_str(&tmp2);
|
||||||
ft_handler=(FT_DOCLIST *)
|
ft_handler=(FT_DOCLIST *)
|
||||||
table->file->ft_init_ext(key, (byte*) ft_tmp->ptr(), ft_tmp->length());
|
table->file->ft_init_ext(key, (byte*) ft_tmp->ptr(), ft_tmp->length(), join_key);
|
||||||
|
|
||||||
|
if (join_key)
|
||||||
|
{
|
||||||
|
table->file->ft_handler=ft_handler;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Item_func_match::fix_fields(THD *thd,struct st_table_list *tlist)
|
bool Item_func_match::fix_fields(THD *thd,struct st_table_list *tlist)
|
||||||
@ -1917,6 +1911,8 @@ bool Item_func_match::fix_fields(THD *thd,struct st_table_list *tlist)
|
|||||||
/* Why testing for const_item ? Monty */
|
/* Why testing for const_item ? Monty */
|
||||||
/* I'll remove it later, but this should include modifications to
|
/* I'll remove it later, but this should include modifications to
|
||||||
find_best and auto_close as complement to auto_init code above. SerG */
|
find_best and auto_close as complement to auto_init code above. SerG */
|
||||||
|
/* I'd rather say now that const_item is assumed in quite a bit of
|
||||||
|
places, so it would be difficult to remove. SerG */
|
||||||
if (Item_func::fix_fields(thd,tlist) || !const_item())
|
if (Item_func::fix_fields(thd,tlist) || !const_item())
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@ -1996,7 +1992,6 @@ bool Item_func_match::fix_index()
|
|||||||
}
|
}
|
||||||
|
|
||||||
this->key=max_key;
|
this->key=max_key;
|
||||||
first_call=1;
|
|
||||||
maybe_null=1;
|
maybe_null=1;
|
||||||
join_key=0;
|
join_key=0;
|
||||||
|
|
||||||
|
@ -838,7 +838,7 @@ public:
|
|||||||
List<Item> fields;
|
List<Item> fields;
|
||||||
TABLE *table;
|
TABLE *table;
|
||||||
uint key;
|
uint key;
|
||||||
bool first_call, join_key;
|
bool join_key;
|
||||||
Item_func_match *master;
|
Item_func_match *master;
|
||||||
FT_DOCLIST *ft_handler;
|
FT_DOCLIST *ft_handler;
|
||||||
|
|
||||||
|
11
sql/opt_ft.h
11
sql/opt_ft.h
@ -31,16 +31,7 @@ public:
|
|||||||
FT_SELECT(TABLE *table, TABLE_REF *tref) :
|
FT_SELECT(TABLE *table, TABLE_REF *tref) :
|
||||||
QUICK_SELECT (table,tref->key,1), ref(tref) {}
|
QUICK_SELECT (table,tref->key,1), ref(tref) {}
|
||||||
|
|
||||||
int init()
|
int init() { return error=file->ft_init(); }
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
if (cp_buffer_from_ref(ref)) // as ft-key doesn't use store_key's
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
return error=file->ft_init(ref->key,
|
|
||||||
ref->key_buff,
|
|
||||||
ref->key_length);
|
|
||||||
}
|
|
||||||
int get_next() { return error=file->ft_read(record); }
|
int get_next() { return error=file->ft_read(record); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ public:
|
|||||||
double read_time;
|
double read_time;
|
||||||
|
|
||||||
QUICK_SELECT(TABLE *table,uint index_arg,bool no_alloc=0);
|
QUICK_SELECT(TABLE *table,uint index_arg,bool no_alloc=0);
|
||||||
virtual ~QUICK_SELECT(); // fixed by Sasha needs to be virtual
|
virtual ~QUICK_SELECT();
|
||||||
void reset(void) { next=0; it.rewind(); }
|
void reset(void) { next=0; it.rewind(); }
|
||||||
virtual int init() { return 0; }
|
virtual int init() { return 0; }
|
||||||
virtual int get_next();
|
virtual int get_next();
|
||||||
|
@ -486,7 +486,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
|
|||||||
as in other cases the join is done before the sort.
|
as in other cases the join is done before the sort.
|
||||||
*/
|
*/
|
||||||
if ((order || group) && join.join_tab[join.const_tables].type != JT_ALL &&
|
if ((order || group) && join.join_tab[join.const_tables].type != JT_ALL &&
|
||||||
join.join_tab[join.const_tables].type != JT_FT && /* Beware! SerG */
|
join.join_tab[join.const_tables].type != JT_FT &&
|
||||||
(order && simple_order || group && simple_group))
|
(order && simple_order || group && simple_group))
|
||||||
{
|
{
|
||||||
if (add_ref_to_table_cond(thd,&join.join_tab[join.const_tables]))
|
if (add_ref_to_table_cond(thd,&join.join_tab[join.const_tables]))
|
||||||
@ -522,6 +522,19 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Perform FULLTEXT search before all regular searches */
|
||||||
|
if (ftfuncs.elements)
|
||||||
|
{
|
||||||
|
List_iterator<Item_func_match> li(ftfuncs);
|
||||||
|
Item_func_match *ifm;
|
||||||
|
DBUG_PRINT("info",("Performing FULLTEXT search"));
|
||||||
|
thd->proc_info="FULLTEXT searching";
|
||||||
|
|
||||||
|
while ((ifm=li++))
|
||||||
|
{
|
||||||
|
ifm->init_search();
|
||||||
|
}
|
||||||
|
}
|
||||||
/* Create a tmp table if distinct or if the sort is too complicated */
|
/* Create a tmp table if distinct or if the sort is too complicated */
|
||||||
if (need_tmp)
|
if (need_tmp)
|
||||||
{
|
{
|
||||||
@ -4438,26 +4451,14 @@ join_ft_read_first(JOIN_TAB *tab)
|
|||||||
if (cp_buffer_from_ref(&tab->ref)) // as ft-key doesn't use store_key's
|
if (cp_buffer_from_ref(&tab->ref)) // as ft-key doesn't use store_key's
|
||||||
return -1; // see also FT_SELECT::init()
|
return -1; // see also FT_SELECT::init()
|
||||||
#endif
|
#endif
|
||||||
if ((error=table->file->ft_init(tab->ref.key,
|
table->file->ft_init();
|
||||||
tab->ref.key_buff,
|
|
||||||
tab->ref.key_length)))
|
|
||||||
{
|
|
||||||
if (error != HA_ERR_KEY_NOT_FOUND)
|
|
||||||
{
|
|
||||||
sql_print_error("ft_read_first/init: Got error %d when reading table %s",error,
|
|
||||||
table->path);
|
|
||||||
table->file->print_error(error,MYF(0));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
error=table->file->ft_read(table->record[0]);
|
error=table->file->ft_read(table->record[0]);
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
if (error != HA_ERR_END_OF_FILE)
|
if (error != HA_ERR_END_OF_FILE)
|
||||||
{
|
{
|
||||||
sql_print_error("ft_read_first/read: Got error %d when reading table %s",
|
sql_print_error("ft_read_first: Got error %d when reading table %s",
|
||||||
error, table->path);
|
error, table->path);
|
||||||
table->file->print_error(error,MYF(0));
|
table->file->print_error(error,MYF(0));
|
||||||
return 1;
|
return 1;
|
||||||
|
Reference in New Issue
Block a user