mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 04:26:45 +03:00 
			
		
		
		
	Merge work:/home/bk/mysql
into threads.polyesthetic.msg:/usr/local/src/my/work
This commit is contained in:
		| @@ -4149,11 +4149,26 @@ USA [LinuxWired/Scottsdale, AZ] @ | |||||||
| @uref{http://mysql.linuxwired.net/, WWW} | @uref{http://mysql.linuxwired.net/, WWW} | ||||||
| @uref{ftp://ftp.linuxwired.net/pub/mirrors/mysql/, FTP} | @uref{ftp://ftp.linuxwired.net/pub/mirrors/mysql/, FTP} | ||||||
| 
 | 
 | ||||||
|  | @item | ||||||
|  | @c EMAIL: dan@surfsouth.com (Dan Muntz) | ||||||
|  | @c @image{Flags/usa} | ||||||
|  | USA [Venoma.Org/Valdosta, GA] @ | ||||||
|  | @uref{http://mysql.venoma.org/, WWW} | ||||||
|  | 
 | ||||||
| @end itemize | @end itemize | ||||||
| 
 | 
 | ||||||
| @strong{South America:} | @strong{South America:} | ||||||
| 
 | 
 | ||||||
| @itemize @bullet | @itemize @bullet | ||||||
|  | 
 | ||||||
|  | @item | ||||||
|  | @c Added 20001102 | ||||||
|  | @c EMAIL: nico@bannerlandia.com (Nicolas Moldavsky) | ||||||
|  | @c @image{Flags/argentina} | ||||||
|  | Argentina [bannerlandia.com] @ | ||||||
|  | @uref{http://mysql.bannerlandia.com.ar/, WWW} | ||||||
|  | @uref{ftp://mysql.bannerlandia.com.ar/mirrors/mysql/, FTP} | ||||||
|  | 
 | ||||||
| @c @item | @c @item | ||||||
| @c Not ok 20000919; Non-existent (Matt) | @c Not ok 20000919; Non-existent (Matt) | ||||||
| @c EMAIL: gaiser@matrix.com.br (Roberto Gaiser) | @c EMAIL: gaiser@matrix.com.br (Roberto Gaiser) | ||||||
|   | |||||||
| @@ -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
	 tim@threads.polyesthetic.msg
					tim@threads.polyesthetic.msg