From 0e93376e71bd719658bbf99e413d51d7ee349dee Mon Sep 17 00:00:00 2001
From: unknown <monty@mishka.mysql.fi>
Date: Mon, 6 Oct 2003 22:56:34 +0300
Subject: [PATCH] Move init_compiled_charsets to own file Remove dependency of
 charsets (in my_init) to get smaller binaries when charsets are not used
 Simple code cleanup

client/mysql.cc:
  Fixed indentation
include/my_sys.h:
  Move init_compiled_charsets to own file
include/mysql.h:
  Remove compiler warning
libmysql/Makefile.shared:
  Move init_compiled_charsets to own file
mysys/Makefile.am:
  Move init_compiled_charsets to own file
mysys/charset.c:
  Move init_compiled_charsets to own file
mysys/my_init.c:
  Remove dependency of charsets
scripts/mysql_create_system_tables.sh:
  Remove run time warning
scripts/mysql_fix_privilege_tables.sql:
  Add help tables
sql/sql_insert.cc:
  Code cleanup
---
 client/mysql.cc                        |  27 +++----
 include/my_sys.h                       |   3 +-
 include/mysql.h                        |   2 +-
 libmysql/Makefile.shared               |   2 +-
 mysys/Makefile.am                      |   2 +-
 mysys/charset-def.c                    |  93 +++++++++++++++++++++++
 mysys/charset.c                        | 101 ++++---------------------
 mysys/my_init.c                        |   1 -
 scripts/mysql_create_system_tables.sh  |   2 +-
 scripts/mysql_fix_privilege_tables.sql |  35 +++++++++
 sql/sql_insert.cc                      |  10 ++-
 11 files changed, 165 insertions(+), 113 deletions(-)
 create mode 100644 mysys/charset-def.c

diff --git a/client/mysql.cc b/client/mysql.cc
index 37c83411091..e63ee1d2d75 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -1474,6 +1474,7 @@ static void print_help_item(MYSQL_ROW *cur, int num_name, int num_cat, char *las
   tee_fprintf(PAGER, "   %s\n", (*cur)[num_name]);
 }
 
+
 static int com_server_help(String *buffer __attribute__((unused)),
 			   char *line __attribute__((unused)), char *help_arg)
 {
@@ -1575,23 +1576,19 @@ com_help(String *buffer __attribute__((unused)),
   char * help_arg= strchr(line,' ');
 
   if (help_arg)
-  {
     return com_server_help(buffer,line,help_arg+1);
-  }
-  else
+
+  put_info("\nFor the complete MySQL Manual online visit:\n   http://www.mysql.com/documentation\n", INFO_INFO);
+  put_info("For info on technical support from MySQL developers visit:\n   http://www.mysql.com/support\n", INFO_INFO);
+  put_info("For info on MySQL books, utilities, consultants, etc. visit:\n   http://www.mysql.com/portal\n", INFO_INFO);
+  put_info("List of all MySQL commands:", INFO_INFO);
+  if (!named_cmds)
+    put_info("Note that all text commands must be first on line and end with ';'",INFO_INFO);
+  for (i = 0; commands[i].name; i++)
   {
-    put_info("\nFor the complete MySQL Manual online visit:\n   http://www.mysql.com/documentation\n", INFO_INFO);
-    put_info("For info on technical support from MySQL developers visit:\n   http://www.mysql.com/support\n", INFO_INFO);
-    put_info("For info on MySQL books, utilities, consultants, etc. visit:\n   http://www.mysql.com/portal\n", INFO_INFO);
-    put_info("List of all MySQL commands:", INFO_INFO);
-    if (!named_cmds)
-      put_info("Note that all text commands must be first on line and end with ';'",INFO_INFO);
-    for (i = 0; commands[i].name; i++)
-    {
-      if (commands[i].func)
-        tee_fprintf(stdout, "%s\t(\\%c)\t%s\n", commands[i].name,
-		    commands[i].cmd_char, commands[i].doc);
-    }
+    if (commands[i].func)
+      tee_fprintf(stdout, "%s\t(\\%c)\t%s\n", commands[i].name,
+		  commands[i].cmd_char, commands[i].doc);
   }
   if (connected && mysql_get_server_version(&mysql) >= 40100)
     put_info("\nFor server side help, type 'help all'\n", INFO_INFO);
diff --git a/include/my_sys.h b/include/my_sys.h
index 6f04b766aec..331ff3d60c9 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -220,7 +220,8 @@ extern CHARSET_INFO *get_charset_by_csname(const char *cs_name,
 extern void free_charsets(void);
 extern char *get_charsets_dir(char *buf);
 extern my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2);
-
+extern my_bool init_compiled_charsets(myf flags);
+extern void add_compiled_collation(CHARSET_INFO *cs);
 
 /* statistics */
 extern ulong	my_cache_w_requests, my_cache_write, my_cache_r_requests,
diff --git a/include/mysql.h b/include/mysql.h
index 95f480b41c1..5672744729a 100644
--- a/include/mysql.h
+++ b/include/mysql.h
@@ -278,7 +278,7 @@ typedef struct st_mysql_res {
 #define MANAGER_CLIENT_ERR   450
 #define MANAGER_INTERNAL_ERR 500
 
-#ifndef MYSQL_SERVER
+#if !defined(MYSQL_SERVER) && !defined(MYSQL_CLIENT)
 #define MYSQL_CLIENT
 #endif
 
diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared
index 1d431fa3624..1cffae4dc56 100644
--- a/libmysql/Makefile.shared
+++ b/libmysql/Makefile.shared
@@ -59,7 +59,7 @@ mysysobjects1 =		my_init.lo my_static.lo my_malloc.lo my_realloc.lo \
 			mf_loadpath.lo my_pthread.lo my_thr_init.lo \
 			thr_mutex.lo mulalloc.lo string.lo default.lo \
 			my_compress.lo array.lo my_once.lo list.lo my_net.lo \
-                        charset.lo hash.lo mf_iocache.lo \
+                        charset.lo charset-def.lo hash.lo mf_iocache.lo \
                         mf_iocache2.lo my_seek.lo my_sleep.lo \
 			my_pread.lo mf_cache.lo md5.lo sha1.lo\
 			my_getopt.lo my_gethostbyname.lo my_port.lo
diff --git a/mysys/Makefile.am b/mysys/Makefile.am
index 9e563755ebd..6ec1e1ec40d 100644
--- a/mysys/Makefile.am
+++ b/mysys/Makefile.am
@@ -50,7 +50,7 @@ libmysys_a_SOURCES =	my_init.c my_getwd.c mf_getdate.c\
 			my_getopt.c my_mkdir.c \
 			default.c my_compress.c checksum.c raid.cc \
 			my_net.c my_semaphore.c my_port.c my_sleep.c \
-			charset.c my_bitmap.c my_bit.c md5.c \
+			charset.c charset-def.c my_bitmap.c my_bit.c md5.c \
 			my_gethostbyname.c rijndael.c my_aes.c sha1.c \
 			my_handler.c my_netware.c
 EXTRA_DIST =		thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \
diff --git a/mysys/charset-def.c b/mysys/charset-def.c
new file mode 100644
index 00000000000..650431eaf76
--- /dev/null
+++ b/mysys/charset-def.c
@@ -0,0 +1,93 @@
+/* Copyright (C) 2000 MySQL 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 */
+
+#include "mysys_priv.h"
+
+/*
+  Include all compiled character sets into the client
+  If a client don't want to use all of them, he can define his own
+  init_compiled_charsets() that only adds those that he wants
+*/
+
+my_bool init_compiled_charsets(myf flags __attribute__((unused)))
+{
+  CHARSET_INFO *cs;
+
+  add_compiled_collation(&my_charset_bin);
+  
+  add_compiled_collation(&my_charset_latin1);
+  add_compiled_collation(&my_charset_latin1_bin);
+  add_compiled_collation(&my_charset_latin1_german2_ci);
+
+#ifdef HAVE_CHARSET_big5
+  add_compiled_collation(&my_charset_big5_chinese_ci);
+  add_compiled_collation(&my_charset_big5_bin);
+#endif
+
+#ifdef HAVE_CHARSET_cp1250
+  add_compiled_collation(&my_charset_cp1250_czech_ci);
+#endif
+
+#ifdef HAVE_CHARSET_latin2
+  add_compiled_collation(&my_charset_latin2_czech_ci);
+#endif
+
+#ifdef HAVE_CHARSET_euckr
+  add_compiled_collation(&my_charset_euckr_korean_ci);
+  add_compiled_collation(&my_charset_euckr_bin);
+#endif
+
+#ifdef HAVE_CHARSET_gb2312
+  add_compiled_collation(&my_charset_gb2312_chinese_ci);
+  add_compiled_collation(&my_charset_gb2312_bin);
+#endif
+
+#ifdef HAVE_CHARSET_gbk
+  add_compiled_collation(&my_charset_gbk_chinese_ci);
+  add_compiled_collation(&my_charset_gbk_bin);
+#endif
+
+#ifdef HAVE_CHARSET_sjis
+  add_compiled_collation(&my_charset_sjis_japanese_ci);
+  add_compiled_collation(&my_charset_sjis_bin);
+#endif
+
+#ifdef HAVE_CHARSET_tis620
+  add_compiled_collation(&my_charset_tis620_thai_ci);
+  add_compiled_collation(&my_charset_tis620_bin);
+#endif
+
+#ifdef HAVE_CHARSET_ucs2
+  add_compiled_collation(&my_charset_ucs2_general_ci);
+  add_compiled_collation(&my_charset_ucs2_bin);
+#endif
+
+#ifdef HAVE_CHARSET_ujis
+  add_compiled_collation(&my_charset_ujis_japanese_ci);
+  add_compiled_collation(&my_charset_ujis_bin);
+#endif
+
+#ifdef HAVE_CHARSET_utf8
+  add_compiled_collation(&my_charset_utf8_general_ci);
+  add_compiled_collation(&my_charset_utf8_bin);
+#endif
+
+  /* Copy compiled charsets */
+  for (cs=compiled_charsets; cs->name; cs++)
+    add_compiled_collation(cs);
+  
+  return FALSE;
+}
diff --git a/mysys/charset.c b/mysys/charset.c
index 7d0516ac81b..e97ac0675d6 100644
--- a/mysys/charset.c
+++ b/mysys/charset.c
@@ -21,9 +21,18 @@
 #include <my_dir.h>
 #include <my_xml.h>
 
+typedef struct
+{
+  int		nchars;
+  MY_UNI_IDX	uidx;
+} uni_idx;
+
+#define PLANE_SIZE	0x100
+#define PLANE_NUM	0x100
+#define PLANE_NUMBER(x)	(((x)>>8) % PLANE_NUM)
+
 
 /*
-
   The code below implements this functionality:
   
     - Initializing charset related structures
@@ -38,6 +47,7 @@ my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2)
   return ((cs1 == cs2) || !strcmp(cs1->csname,cs2->csname));
 }
 
+
 static void set_max_sort_char(CHARSET_INFO *cs)
 {
   uchar max_char;
@@ -110,37 +120,21 @@ static void init_state_maps(CHARSET_INFO *cs)
   state_map[(uchar)'x']= state_map[(uchar)'X']= (uchar) MY_LEX_IDENT_OR_HEX;
   state_map[(uchar)'b']= state_map[(uchar)'b']= (uchar) MY_LEX_IDENT_OR_BIN;
   state_map[(uchar)'n']= state_map[(uchar)'N']= (uchar) MY_LEX_IDENT_OR_NCHAR;
-
-
 }
 
+
 static void simple_cs_init_functions(CHARSET_INFO *cs)
 {
-  
   if (cs->state & MY_CS_BINSORT)
-  {
     cs->coll= &my_collation_8bit_bin_handler;
-  }
   else
-  {
     cs->coll= &my_collation_8bit_simple_ci_handler;
-  }
   
   cs->cset= &my_charset_8bit_handler;
   cs->mbmaxlen    = 1;
 }
 
 
-typedef struct
-{
-  int		nchars;
-  MY_UNI_IDX	uidx;
-} uni_idx;
-
-#define PLANE_SIZE	0x100
-#define PLANE_NUM	0x100
-#define PLANE_NUMBER(x)	(((x)>>8) % PLANE_NUM)
-
 static int pcmp(const void * f, const void * s)
 {
   const uni_idx *F= (const uni_idx*) f;
@@ -401,82 +395,13 @@ char *get_charsets_dir(char *buf)
 CHARSET_INFO *all_charsets[256];
 CHARSET_INFO *default_charset_info = &my_charset_latin1;
 
-static void add_compiled_collation(CHARSET_INFO *cs)
+void add_compiled_collation(CHARSET_INFO *cs)
 {
   all_charsets[cs->number]= cs;
   cs->state|= MY_CS_AVAILABLE;
 }
 
 
-static my_bool init_compiled_charsets(myf flags __attribute__((unused)))
-{
-  CHARSET_INFO *cs;
-
-  add_compiled_collation(&my_charset_bin);
-  
-  add_compiled_collation(&my_charset_latin1);
-  add_compiled_collation(&my_charset_latin1_bin);
-  add_compiled_collation(&my_charset_latin1_german2_ci);
-
-#ifdef HAVE_CHARSET_big5
-  add_compiled_collation(&my_charset_big5_chinese_ci);
-  add_compiled_collation(&my_charset_big5_bin);
-#endif
-
-#ifdef HAVE_CHARSET_cp1250
-  add_compiled_collation(&my_charset_cp1250_czech_ci);
-#endif
-
-#ifdef HAVE_CHARSET_latin2
-  add_compiled_collation(&my_charset_latin2_czech_ci);
-#endif
-
-#ifdef HAVE_CHARSET_euckr
-  add_compiled_collation(&my_charset_euckr_korean_ci);
-  add_compiled_collation(&my_charset_euckr_bin);
-#endif
-
-#ifdef HAVE_CHARSET_gb2312
-  add_compiled_collation(&my_charset_gb2312_chinese_ci);
-  add_compiled_collation(&my_charset_gb2312_bin);
-#endif
-
-#ifdef HAVE_CHARSET_gbk
-  add_compiled_collation(&my_charset_gbk_chinese_ci);
-  add_compiled_collation(&my_charset_gbk_bin);
-#endif
-
-#ifdef HAVE_CHARSET_sjis
-  add_compiled_collation(&my_charset_sjis_japanese_ci);
-  add_compiled_collation(&my_charset_sjis_bin);
-#endif
-
-#ifdef HAVE_CHARSET_tis620
-  add_compiled_collation(&my_charset_tis620_thai_ci);
-  add_compiled_collation(&my_charset_tis620_bin);
-#endif
-
-#ifdef HAVE_CHARSET_ucs2
-  add_compiled_collation(&my_charset_ucs2_general_ci);
-  add_compiled_collation(&my_charset_ucs2_bin);
-#endif
-
-#ifdef HAVE_CHARSET_ujis
-  add_compiled_collation(&my_charset_ujis_japanese_ci);
-  add_compiled_collation(&my_charset_ujis_bin);
-#endif
-
-#ifdef HAVE_CHARSET_utf8
-  add_compiled_collation(&my_charset_utf8_general_ci);
-  add_compiled_collation(&my_charset_utf8_bin);
-#endif
-
-  /* Copy compiled charsets */
-  for (cs=compiled_charsets; cs->name; cs++)
-    add_compiled_collation(cs);
-  
-  return FALSE;
-}
 
 #ifdef __NETWARE__
 my_bool STDCALL init_available_charsets(myf myflags)
diff --git a/mysys/my_init.c b/mysys/my_init.c
index a72652f266b..4a7e9194dae 100644
--- a/mysys/my_init.c
+++ b/mysys/my_init.c
@@ -130,7 +130,6 @@ void my_end(int infoflag)
       DBUG_PRINT("error",("%s",errbuff[0]));
     }
   }
-  free_charsets();
   my_once_free();
   if (infoflag & MY_GIVE_INFO || info_file != stderr)
   {
diff --git a/scripts/mysql_create_system_tables.sh b/scripts/mysql_create_system_tables.sh
index c4cdc7b52d7..a65004bec4c 100644
--- a/scripts/mysql_create_system_tables.sh
+++ b/scripts/mysql_create_system_tables.sh
@@ -150,7 +150,7 @@ then
     INSERT INTO user (host,user) values ('$hostname','');"
   else
     i_u="INSERT INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);"
-    if test "$windows" -eq 0
+    if test "$windows" = "0"
     then
       i_u="$i_u 
            INSERT INTO user VALUES ('$hostname','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
diff --git a/scripts/mysql_fix_privilege_tables.sql b/scripts/mysql_fix_privilege_tables.sql
index 220bf4036db..de5779b9ac0 100644
--- a/scripts/mysql_fix_privilege_tables.sql
+++ b/scripts/mysql_fix_privilege_tables.sql
@@ -99,3 +99,38 @@ ADD Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL;
 ALTER TABLE host
 ADD Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,
 ADD Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL;
+
+#
+# Create some possible missing tables
+#
+CREATE TABLE IF NOT EXISTS help_topic (
+help_topic_id int unsigned not null,
+name varchar(64) not null,
+help_category_id smallint unsigned not null,
+description text not null,
+example text not null,
+url varchar(128) not null,
+primary key (help_topic_id), unique index (name)
+) comment='help topics';
+
+CREATE TABLE IF NOT EXISTS help_category (
+help_category_id smallint unsigned not null,
+name varchar(64) not null,
+parent_category_id smallint unsigned null,
+url varchar(128) not null,
+primary key (help_category_id),
+unique index (name)
+) comment='help categories';
+
+CREATE TABLE IF NOT EXISTS help_relation (
+help_topic_id int unsigned not null references help_topic,
+help_keyword_id  int unsigned not null references help_keyword,
+primary key (help_keyword_id, help_topic_id)
+) comment='keyword-topic relation';
+
+CREATE TABLE IF NOT EXISTS help_keyword (
+help_keyword_id int unsigned not null,
+name varchar(64) not null,
+primary key (help_keyword_id),
+unique index (name)
+) comment='help keywords';
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index af28d48ed8a..d523d868514 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -172,13 +172,15 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
       }
     }
     if ((table= delayed_get_table(thd,table_list)) && !thd->is_fatal_error)
-      if (table_list->next && table)
+    {
+      res= 0;
+      if (table_list->next)			/* if sub select */
 	res= open_and_lock_tables(thd, table_list->next);
-      else
-	res= (table == 0);
+    }
     else
     {
-      lock_type=TL_WRITE;
+      /* Too many delayed insert threads;  Use a normal insert */
+      table_list->lock_type= lock_type= TL_WRITE;
       res= open_and_lock_tables(thd, table_list);
     }
   }