From 9a920d980a67b26add23e75e8fc4273828b11e1a Mon Sep 17 00:00:00 2001
From: unknown <serg@infomag.ape.relarn.ru>
Date: Fri, 25 Aug 2000 19:56:55 +0400
Subject: [PATCH] Stopwords (English only); fulltext keys now can be repaired

myisam/fulltext.h:
  stopwords moved to include/ft_global.h
myisam/mi_check.c:
  fulltext keys now can be repaired
include/ft_global.h:
  stopwords declaration
sql/ha_myisam.cc:
  bug in ::repair
sql/mysqld.cc:
  stopwords initialized with PRECOMPILED_STOPWORDS
include/Makefile.am:
  because `bk ci' set permissions to 444, the my_global.h
  should be removed, not overwritten.]
---
 include/Makefile.am |  1 +
 include/ft_global.h |  2 ++
 myisam/fulltext.h   |  8 +++-----
 myisam/mi_check.c   | 47 ++++++++++++++++++++++++++++++++++-----------
 sql/ha_myisam.cc    |  1 +
 sql/mysqld.cc       | 46 ++++++++++++++++++++++----------------------
 6 files changed, 66 insertions(+), 39 deletions(-)

diff --git a/include/Makefile.am b/include/Makefile.am
index 5ee60521ca0..30b763e42ec 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -45,6 +45,7 @@ my_config.h:  ../config.h
 
 # This should be changed in the source and removed.
 my_global.h: global.h
+	-$(RM) my_global.h
 	$(CP) global.h my_global.h
 
 # These files should not be included in distributions since they are
diff --git a/include/ft_global.h b/include/ft_global.h
index 0de13974027..32490dd079f 100644
--- a/include/ft_global.h
+++ b/include/ft_global.h
@@ -40,6 +40,8 @@ typedef struct st_ft_doclist {
   FT_DOC    doc[1];
 } FT_DOCLIST;
 
+extern const char *ft_precompiled_stopwords[];
+
 int ft_init_stopwords(const char **);
 
 FT_DOCLIST * ft_init_search(void *, uint, byte *, uint, my_bool);
diff --git a/myisam/fulltext.h b/myisam/fulltext.h
index 3555abe1a1c..8fcac8172b1 100644
--- a/myisam/fulltext.h
+++ b/myisam/fulltext.h
@@ -1,15 +1,15 @@
 /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
@@ -35,8 +35,6 @@
 
 extern const MI_KEYSEG ft_keysegs[FT_SEGS];
 
-extern const char *ft_precompiled_stopwords[];
-
 int  _mi_ft_cmp(MI_INFO *, uint, const byte *, const byte *);
 int  _mi_ft_add(MI_INFO *, uint, byte *, const byte *, my_off_t);
 int  _mi_ft_del(MI_INFO *, uint, byte *, const byte *, my_off_t);
diff --git a/myisam/mi_check.c b/myisam/mi_check.c
index bf9891ae7f8..c6bd9f67c65 100644
--- a/myisam/mi_check.c
+++ b/myisam/mi_check.c
@@ -1,15 +1,15 @@
 /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
@@ -1083,7 +1083,7 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info,
   if (!(sort_info->record=(byte*) my_malloc((uint) share->base.pack_reclength,
 					   MYF(0))))
   {
-    mi_check_print_error(param,"Not Enough memory for extra record");
+    mi_check_print_error(param,"Not enough memory for extra record");
     goto err;
   }
 
@@ -1141,6 +1141,8 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info,
   for (i=0 ; i < share->state.header.max_block_size ; i++)
     share->state.key_del[i]=  HA_OFFSET_ERROR;
 
+  share->state.key_map= ((ulonglong)1L << share->base.keys)-1; /* Should I ? */
+
   info->state->key_file_length=share->base.keystart;
 
   lock_memory(param);			/* Everything is alloced */
@@ -1271,8 +1273,15 @@ static int writekeys(register MI_INFO *info,byte *buff,my_off_t filepos)
   {
     if (((ulonglong) 1 << i) & info->s->state.key_map)
     {
-      uint key_length=_mi_make_key(info,i,key,buff,filepos);
-      if (_mi_ck_write(info,i,key,key_length)) goto err;
+      if (info->s->keyinfo[i].flag & HA_FULLTEXT )
+      {
+        if (_mi_ft_add(info,i,(char*) key,buff,filepos))  goto err;
+      }
+      else
+      {
+	uint key_length=_mi_make_key(info,i,key,buff,filepos);
+	if (_mi_ck_write(info,i,key,key_length)) goto err;
+      }
     }
   }
   DBUG_RETURN(0);
@@ -1285,8 +1294,15 @@ static int writekeys(register MI_INFO *info,byte *buff,my_off_t filepos)
     {
       if (((ulonglong) 1 << i) & info->s->state.key_map)
       {
-	uint key_length=_mi_make_key(info,i,key,buff,filepos);
-	if (_mi_ck_delete(info,i,key,key_length)) break;
+	if (info->s->keyinfo[i].flag & HA_FULLTEXT)
+        {
+          if (_mi_ft_del(info,i,(char*) key,buff,filepos)) break;
+        }
+        else
+	{
+	  uint key_length=_mi_make_key(info,i,key,buff,filepos);
+	  if (_mi_ck_delete(info,i,key,key_length)) break;
+	}
       }
     }
   }
@@ -1919,8 +1935,17 @@ static int sort_key_read(SORT_INFO *sort_info, void *key)
 			 "Found too many records; Can`t continue");
     DBUG_RETURN(1);
   }
-  VOID(_mi_make_key(info,sort_info->key,key,sort_info->record,
-		    sort_info->filepos));
+  if (sort_info->keyinfo->flag & HA_FULLTEXT )
+  {
+    mi_check_print_error(sort_info->param,
+    			 "Can`t use repair_by_sort with FULLTEXT key");
+    DBUG_RETURN(1);
+  }
+  else
+  {
+    VOID(_mi_make_key(info,sort_info->key,key,sort_info->record,
+                      sort_info->filepos));
+  }
   DBUG_RETURN(sort_write_record(sort_info));
 } /* sort_key_read */
 
@@ -2984,7 +3009,7 @@ my_bool mi_test_if_sort_rep(MI_INFO *info, ha_rows rows)
     return FALSE;				/* Can't use sort */
   for (i=0 ; i < share->base.keys ; i++,key++)
   {
-    if (mi_too_big_key_for_sort(key,rows))
+    if (mi_too_big_key_for_sort(key,rows) || (key->flag & HA_FULLTEXT))
       return FALSE;
   }
   return TRUE;
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc
index f45309ddaeb..8536aa5219c 100644
--- a/sql/ha_myisam.cc
+++ b/sql/ha_myisam.cc
@@ -372,6 +372,7 @@ int ha_myisam::repair(THD *thd, MI_CHECK &param)
   param.table_name = table->table_name;
   param.tmpfile_createflag = O_RDWR | O_TRUNC;
   param.using_global_keycache = 1;
+  param.thd=thd;
 
   VOID(fn_format(fixed_name,file->filename,"",MI_NAME_IEXT,
 		     4+ (param.opt_follow_links ? 16 : 0)));
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index bf0a88bb702..f8ce60b9681 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1,15 +1,15 @@
 /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
@@ -875,7 +875,7 @@ void end_thread(THD *thd, bool put_in_cache)
   (void) pthread_mutex_lock(&LOCK_thread_count);
   thread_count--;
   delete thd;
-  
+
   if (put_in_cache && cached_thread_count < thread_cache_size &&
       ! abort_loop && !kill_cached_threads)
   {
@@ -1455,7 +1455,7 @@ int main(int argc, char **argv)
     sql_print_error("Can't init databases");
     exit(1);
   }
-  ft_init_stopwords(NULL);                                          /* SerG */
+  ft_init_stopwords(ft_precompiled_stopwords);       /* SerG */
 
 #ifdef __WIN__
 #define MYSQL_ERR_FILE "mysql.err"
@@ -1531,12 +1531,12 @@ int main(int argc, char **argv)
   // slave thread
   if(master_host)
   {
-    pthread_t hThread; 
+    pthread_t hThread;
     if(pthread_create(&hThread, &connection_attrib, handle_slave, 0))
       sql_print_error("Warning: Can't create thread to handle slave");
 
   }
-  
+
   printf(ER(ER_READY),my_progname,server_version,"");
   fflush(stdout);
 
@@ -2179,7 +2179,7 @@ static struct option long_options[] =
   {"log-update",	optional_argument, 0, (int) OPT_UPDATE_LOG},
   {"log-slow-queries",	optional_argument, 0, (int) OPT_SLOW_QUERY_LOG},
   {"log-long-format",	no_argument, 0, (int) OPT_LONG_FORMAT},
-  {"log-slave-updates", no_argument,0, (int) OPT_LOG_SLAVE_UPDATES},  
+  {"log-slave-updates", no_argument,0, (int) OPT_LOG_SLAVE_UPDATES},
   {"low-priority-updates", no_argument, 0, (int) OPT_LOW_PRIORITY_UPDATES},
   {"master-host",      	required_argument, 0, (int) OPT_MASTER_HOST},
   {"master-user",      	required_argument, 0, (int) OPT_MASTER_USER},
@@ -2209,7 +2209,7 @@ static struct option long_options[] =
   {"skip-show-database",no_argument,0, (int) OPT_SKIP_SHOW_DB},
   {"skip-networking",	no_argument,0, (int) OPT_SKIP_NETWORKING},
   {"skip-thread-priority", no_argument,0,(int) OPT_SKIP_PRIOR},
-  {"sql-bin-update-same", no_argument, 0, (int)OPT_SQL_BIN_UPDATE_SAME},  
+  {"sql-bin-update-same", no_argument, 0, (int)OPT_SQL_BIN_UPDATE_SAME},
 #include "sslopt-longopts.h"
 #ifdef __WIN__
   {"standalone",	no_argument,0, (int) OPT_STANDALONE},
@@ -2393,7 +2393,7 @@ struct show_var_st status_vars[]= {
   {"Questions",		(char*) 0, SHOW_QUESTION},
   {"Slow_launch_threads", (char*) &slow_launch_threads, SHOW_LONG},
   {"Slow_queries",	(char*) &long_query_count, SHOW_LONG},
-  {"Slave_running",	(char*) &slave_running, SHOW_BOOL},  
+  {"Slave_running",	(char*) &slave_running, SHOW_BOOL},
   {"Threads_cached",	(char*) &cached_thread_count, SHOW_LONG_CONST},
   {"Threads_connected", (char*) &thread_count, SHOW_INT_CONST},
   {"Threads_running",	(char*) &thread_running, SHOW_INT_CONST},
@@ -2502,7 +2502,7 @@ static void usage(void)
   --bdb-tmpdir=directory  Berkeley DB tempfile name\n\
   --skip-bdb		  Don't use berkeley db (will save memory)\n\
 ");
-#endif  
+#endif
   print_defaults("my",load_default_groups);
   puts("");
 
@@ -2687,39 +2687,39 @@ static void get_options(int argc,char **argv)
       break;
     case (int) OPT_BIN_LOG:
       opt_bin_log=1;
-      opt_bin_logname=optarg;		
+      opt_bin_logname=optarg;
       break;
     case (int) OPT_LOG_SLAVE_UPDATES:
       opt_log_slave_updates = 1;
       break;
-      
+
     case (int)OPT_REPLICATE_IGNORE_DB:
       {
-	i_string *db = new i_string(optarg); 
+	i_string *db = new i_string(optarg);
 	replicate_ignore_db.push_back(db);
         break;
       }
     case (int)OPT_REPLICATE_DO_DB:
       {
-	i_string *db = new i_string(optarg); 
+	i_string *db = new i_string(optarg);
 	replicate_do_db.push_back(db);
         break;
       }
-      
+
     case (int)OPT_BINLOG_IGNORE_DB:
       {
-	i_string *db = new i_string(optarg); 
+	i_string *db = new i_string(optarg);
 	binlog_ignore_db.push_back(db);
         break;
       }
     case (int)OPT_BINLOG_DO_DB:
       {
-	i_string *db = new i_string(optarg); 
+	i_string *db = new i_string(optarg);
 	binlog_do_db.push_back(db);
         break;
       }
-      
-      
+
+
     case (int) OPT_SQL_BIN_UPDATE_SAME:
       opt_sql_bin_update  = 1;
       break;
@@ -2878,7 +2878,7 @@ static void get_options(int argc,char **argv)
 	if (test_if_int(optarg,(uint) strlen(optarg)))
 	  berkeley_lock_scan_time=atoi(optarg);
 	else
-	{	  
+	{
 	  fprintf(stderr,"Unknown lock type: %s\n",optarg);
 	  exit(1);
 	}
@@ -3314,7 +3314,7 @@ static int get_service_parameters()
 	      0 )
     {
       SET_CHANGEABLE_VARVAL( "thread_concurrency" );
-    } 
+    }
     else
     {
       TCHAR szErrorMsg [ 512 ];
@@ -3341,7 +3341,7 @@ static int get_service_parameters()
 static char *get_relative_path(const char *path)
 {
   if (test_if_hard_path(path) &&
-      is_prefix(path,DEFAULT_MYSQL_HOME) && 
+      is_prefix(path,DEFAULT_MYSQL_HOME) &&
       strcmp(DEFAULT_MYSQL_HOME,FN_ROOTDIR))
   {
     path+=(uint) strlen(DEFAULT_MYSQL_HOME);
-- 
2.30.9