From a20d725e8a265aa714147e35f4e4e9900ab8136b Mon Sep 17 00:00:00 2001
From: unknown <bar@bar.udmsearch.izhnet.ru>
Date: Tue, 30 Jul 2002 14:02:29 +0500
Subject: [PATCH] Renamed some charset related constant New fields in
 CHARSET_INFO for more nice SHOW CHARACTER SET Dynamic charsets are now
 handled in faster way SHOW CHARACTER SET now displays not only compiled
 charsets but dynamic charsets too

include/m_ctype.h:
  Renamed constant
  New fields in CHARSET_INFO
include/my_sys.h:
  Constant have been moved to m_ctype.h
libmysqld/lib_sql.cc:
  Renamed constant
mysys/charset.c:
  Dynamic charsets are now handled in new way to speedup things
mysys/test_charset.c:
  Renamed constant
sql/mysqld.cc:
  Renamed constant
sql/sql_show.cc:
  SHOW CHARACTER SET now displays not only compiled charsets but dynamic charsets too
strings/ctype.c:
  New fields in CHARSET_INFO
---
 include/m_ctype.h    |  13 ++-
 include/my_sys.h     |   7 --
 libmysqld/lib_sql.cc |   2 +-
 mysys/charset.c      | 232 +++++++++++++++++--------------------------
 mysys/test_charset.c |   4 +-
 sql/mysqld.cc        |   2 +-
 sql/sql_show.cc      |   4 +-
 strings/ctype.c      |  78 ++++++++++++++-
 8 files changed, 187 insertions(+), 155 deletions(-)

diff --git a/include/m_ctype.h b/include/m_ctype.h
index 3715402b4f4..70acfcb3dec 100644
--- a/include/m_ctype.h
+++ b/include/m_ctype.h
@@ -42,6 +42,14 @@ typedef struct unicase_info_st {
 #define MY_CS_TOOSMALL	-1
 #define MY_CS_TOOFEW(n)	(-1-(n))
 
+        /* My charsets_list flags */
+#define MY_NO_SETS       0
+#define MY_CS_COMPILED  1      /* compiled-in sets               */
+#define MY_CS_CONFIG    2      /* sets that have a *.conf file   */
+#define MY_CS_INDEX     4      /* sets listed in the Index file  */
+#define MY_CS_LOADED    8      /* sets that are currently loaded */
+
+
 typedef struct my_uni_idx_st {
   uint16 from;
   uint16 to;
@@ -52,14 +60,16 @@ typedef struct my_uni_idx_st {
 typedef struct charset_info_st
 {
   uint      number;
+  uint      state;
   const char *name;
+  const char *comment;
   uchar    *ctype;
   uchar    *to_lower;
   uchar    *to_upper;
   uchar    *sort_order;
   uint16      *tab_to_uni;
   MY_UNI_IDX  *tab_from_uni;
-    
+  
   /* Collation routines */
   uint      strxfrm_multiply;
   int     (*strnncoll)(struct charset_info_st *,
@@ -107,6 +117,7 @@ extern CHARSET_INFO *system_charset_info;
 extern CHARSET_INFO *find_compiled_charset(uint cs_number);
 extern CHARSET_INFO *find_compiled_charset_by_name(const char *name);
 extern CHARSET_INFO  compiled_charsets[];
+extern CHARSET_INFO  all_charsets[256];
 extern uint compiled_charset_number(const char *name);
 extern const char *compiled_charset_name(uint charset_number);
 
diff --git a/include/my_sys.h b/include/my_sys.h
index 54ed9110e95..ab7159a334b 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -105,13 +105,6 @@ extern int NEAR my_errno;		/* Last error in mysys */
 #define MY_SEEK_CUR	1
 #define MY_SEEK_END	2
 
-        /* My charsets_list flags */
-#define MY_NO_SETS       0
-#define MY_COMPILED_SETS 1      /* show compiled-in sets */
-#define MY_CONFIG_SETS   2      /* sets that have a *.conf file */
-#define MY_INDEX_SETS    4      /* all sets listed in the Index file */
-#define MY_LOADED_SETS    8      /* the sets that are currently loaded */
-
 	/* Some constants */
 #define MY_WAIT_FOR_USER_TO_FIX_PANIC	60	/* in seconds */
 #define MY_WAIT_GIVE_USER_A_MESSAGE	10	/* Every 10 times of prev */
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index 1ef84607155..3616f1a44ca 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -413,7 +413,7 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
     mysql_server_end();
     return 1;
   }
-  charsets_list = list_charsets(MYF(MY_COMPILED_SETS|MY_CONFIG_SETS));
+  charsets_list = list_charsets(MYF(MY_CS_COMPILED|MY_CS_CONFIG));
 
   /* Parameter for threads created for connections */
   (void) pthread_attr_init(&connection_attrib);
diff --git a/mysys/charset.c b/mysys/charset.c
index 0178f346dbe..8c05863c44b 100644
--- a/mysys/charset.c
+++ b/mysys/charset.c
@@ -26,9 +26,8 @@ typedef struct cs_id_st {
 } CS_ID;
 
 const char *charsets_dir = NULL;
-static DYNAMIC_ARRAY cs_info_table;
-static CS_ID **available_charsets;
 static int charset_initialized=0;
+CHARSET_INFO all_charsets[256];
 
 #define MAX_LINE  1024
 
@@ -44,24 +43,6 @@ struct simpleconfig_buf_st {
   char *p;
 };
 
-static uint num_from_csname(CS_ID **cs, const char *name)
-{
-  CS_ID **c;
-  for (c = cs; *c; ++c)
-    if (!strcmp((*c)->name, name))
-      return (*c)->number;
-  return 0;   /* this mimics find_type() */
-}
-
-static char *name_from_csnum(CS_ID **cs, uint number)
-{
-  CS_ID **c;
-  if(cs)
-    for (c = cs; *c; ++c)
-      if ((*c)->number == number)
-	return (*c)->name;
-  return (char*) "?";   /* this mimics find_type() */
-}
 
 static my_bool get_word(struct simpleconfig_buf_st *fb, char *buf)
 {
@@ -109,13 +90,11 @@ char *get_charsets_dir(char *buf)
 }
 
 
-static my_bool read_charset_index(CS_ID ***charsets, myf myflags)
+static my_bool read_charset_index(myf myflags)
 {
   struct simpleconfig_buf_st fb;
   char buf[MAX_LINE], num_buf[MAX_LINE];
-  DYNAMIC_ARRAY cs;
-  CS_ID *csid;
-
+    
   strmov(get_charsets_dir(buf), "Index");
 
   if ((fb.f = my_fopen(buf, O_RDONLY, myflags)) == NULL)
@@ -123,13 +102,12 @@ static my_bool read_charset_index(CS_ID ***charsets, myf myflags)
   fb.buf[0] = '\0';
   fb.p = fb.buf;
 
-  if (my_init_dynamic_array(&cs, sizeof(CS_ID *), 32, 32))
-    return TRUE;
-
+  
   while (!get_word(&fb, buf) && !get_word(&fb, num_buf))
   {
     uint csnum;
     uint length;
+    CHARSET_INFO *cs;
 
     if (!(csnum = atoi(num_buf)))
     {
@@ -138,64 +116,56 @@ static my_bool read_charset_index(CS_ID ***charsets, myf myflags)
       return TRUE;
     }
 
-    if (!(csid = (CS_ID*) my_once_alloc(sizeof(CS_ID), myflags)) ||
-        !(csid->name=
+    cs=&all_charsets[csnum];
+    
+    if (!(cs->name=
            (char*) my_once_alloc(length= (uint) strlen(buf)+1, myflags)))
     {
       my_fclose(fb.f,myflags);
       return TRUE;
     }
-    memcpy(csid->name,buf,length);
-    csid->number = csnum;
-
-    insert_dynamic(&cs, (gptr) &csid);
+    memcpy((char*)cs->name,buf,length);
+    cs->number=csnum;
   }
   my_fclose(fb.f,myflags);
 
-
-  if (!(*charsets =
-      (CS_ID **) my_once_alloc((cs.elements + 1) * sizeof(CS_ID *), myflags)))
-    return TRUE;
-  /* unwarranted chumminess with dynamic_array implementation? */
-  memcpy((byte *) *charsets, cs.buffer, cs.elements * sizeof(CS_ID *));
-  (*charsets)[cs.elements] = NULL;
-  delete_dynamic(&cs);  
-
   return FALSE;
 }
 
 
 static my_bool init_available_charsets(myf myflags)
 {
-  my_bool error=0;
+  my_bool error=FALSE;
   /*
     We have to use charset_initialized to not lock on THR_LOCK_charset
     inside get_internal_charset...
    */
   if (!charset_initialized)
   {
+    CHARSET_INFO *cs;
   /*
     To make things thread safe we are not allowing other threads to interfere
     while we may changing the cs_info_table
   */
     pthread_mutex_lock(&THR_LOCK_charset);
-    if (!cs_info_table.buffer)			/* If not initialized */
-    {
-      my_init_dynamic_array(&cs_info_table, sizeof(CHARSET_INFO*), 16, 8);
-      error = read_charset_index(&available_charsets, myflags);
-    }
+
+    bzero(&all_charsets,sizeof(all_charsets));
+    
+    /* Copy compiled charsets */
+    
+    for (cs=compiled_charsets; cs->name; cs++)
+      all_charsets[cs->number]=cs[0];
+    
+    error = read_charset_index(myflags);
     charset_initialized=1;
     pthread_mutex_unlock(&THR_LOCK_charset);
   }
-  if(!available_charsets || !available_charsets[0])
-    error = TRUE;
   return error;
 }
 
 
 void free_charsets(void)
 {
-  delete_dynamic(&cs_info_table);
   charset_initialized=0;
 }
 
@@ -231,10 +201,9 @@ static my_bool fill_uint16_array(uint16 *array, int sz, struct simpleconfig_buf_
 }
 
 
-static void get_charset_conf_name(uint cs_number, char *buf)
+static void get_charset_conf_name(const char *cs_name, char *buf)
 {
-  strxmov(get_charsets_dir(buf),
-          name_from_csnum(available_charsets, cs_number), ".conf", NullS);
+  strxmov(get_charsets_dir(buf), cs_name, ".conf", NullS);
 }
 
 typedef struct {
@@ -323,19 +292,16 @@ static my_bool create_fromuni(CHARSET_INFO *cs){
 }
 
 
-static my_bool read_charset_file(uint cs_number, CHARSET_INFO *set,
+static my_bool read_charset_file(const char *cs_name, CHARSET_INFO *set,
 				 myf myflags)
 {
   struct simpleconfig_buf_st fb;
   char buf[FN_REFLEN];
   my_bool result;
   DBUG_ENTER("read_charset_file");
-  DBUG_PRINT("enter",("cs_number: %d", cs_number));
-
-  if (cs_number <= 0)
-    DBUG_RETURN(TRUE);
+  DBUG_PRINT("enter",("cs_name: %s", cs_name));
 
-  get_charset_conf_name(cs_number, buf);
+  get_charset_conf_name(cs_name, buf);
   DBUG_PRINT("info",("file name: %s", buf));
 
   if ((fb.f = my_fopen(buf, O_RDONLY, myflags)) == NULL)
@@ -358,70 +324,26 @@ static my_bool read_charset_file(uint cs_number, CHARSET_INFO *set,
 }
 
 
-uint get_charset_number(const char *charset_name)
-{
-  uint number=compiled_charset_number(charset_name);
-  if (number)
-    return number;
-  if (init_available_charsets(MYF(0)))	/* If it isn't initialized */
-    return 0;
-  return num_from_csname(available_charsets, charset_name);
-}
-
-const char *get_charset_name(uint charset_number)
-{
-  const char *name=compiled_charset_name(charset_number);
-  if (*name != '?')
-    return name;
-  if (init_available_charsets(MYF(0)))	/* If it isn't initialized */
-    return "?";
-  return name_from_csnum(available_charsets, charset_number);
-}
-
-
-static CHARSET_INFO *find_charset(CHARSET_INFO **table, uint cs_number,
-                                  size_t tablesz)
-{
-  uint i;
-  for (i = 0; i < tablesz; ++i)
-    if (table[i]->number == cs_number)
-      return table[i];
-  return NULL;
-}
-
-static CHARSET_INFO *find_charset_by_name(CHARSET_INFO **table,
-					  const char *name, size_t tablesz)
-{
-  uint i;
-  for (i = 0; i < tablesz; ++i)
-    if (!strcmp(table[i]->name,name))
-      return table[i];
-  return NULL;
-}
-
 static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags)
 {
-  CHARSET_INFO tmp_cs,*cs;
+  CHARSET_INFO *cs;
   uchar  tmp_ctype[CTYPE_TABLE_SIZE];
   uchar  tmp_to_lower[TO_LOWER_TABLE_SIZE];
   uchar  tmp_to_upper[TO_UPPER_TABLE_SIZE];
   uchar  tmp_sort_order[SORT_ORDER_TABLE_SIZE];
   uint16 tmp_to_uni[TO_UNI_TABLE_SIZE];
 
-  /* Don't allocate memory if we are not sure we can find the char set */
-  cs= &tmp_cs;
+  cs=&all_charsets[cs_number];
   bzero((char*) cs, sizeof(*cs));
   cs->ctype=tmp_ctype;
   cs->to_lower=tmp_to_lower;
   cs->to_upper=tmp_to_upper;
   cs->sort_order=tmp_sort_order;
   cs->tab_to_uni=tmp_to_uni;
-  if (read_charset_file(cs_number, cs, flags))
+  if (read_charset_file(cs_name, cs, flags))
     return NULL;
 
-  cs           = (CHARSET_INFO*) my_once_alloc(sizeof(CHARSET_INFO),
-                                               MYF(MY_WME));
-  *cs=tmp_cs;
+  /* FIXME: double allocation */
   cs->name     = (char *) my_once_alloc((uint) strlen(cs_name)+1, MYF(MY_WME));
   cs->ctype    = (uchar*) my_once_alloc(CTYPE_TABLE_SIZE,      MYF(MY_WME));
   cs->to_lower = (uchar*) my_once_alloc(TO_LOWER_TABLE_SIZE,   MYF(MY_WME));
@@ -446,10 +368,38 @@ static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags)
   cs->mb_wc       = my_mb_wc_8bit;
   cs->wc_mb       = my_wc_mb_8bit;
   
-  insert_dynamic(&cs_info_table, (gptr) &cs);
   return cs;
 }
 
+
+uint get_charset_number(const char *charset_name)
+{
+  CHARSET_INFO *cs;
+  if (init_available_charsets(MYF(0)))	/* If it isn't initialized */
+    return 0;
+  
+  for (cs = all_charsets; cs < all_charsets+255; ++cs)
+    if ( cs->name && !strcmp(cs->name, charset_name))
+      return cs->number;
+  
+  return 0;   /* this mimics find_type() */
+}
+
+
+const char *get_charset_name(uint charset_number)
+{
+  CHARSET_INFO *cs;
+  if (init_available_charsets(MYF(0)))	/* If it isn't initialized */
+    return "?";
+
+  for (cs = all_charsets; cs < all_charsets+255; ++cs)
+    if (cs->number == charset_number)
+      return (char*) cs->name;
+
+  return (char*) "?";   /* this mimics find_type() */
+}
+
+
 static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags)
 {
   CHARSET_INFO *cs;
@@ -458,10 +408,10 @@ static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags)
     while we may changing the cs_info_table
   */
   pthread_mutex_lock(&THR_LOCK_charset);
-  if (!(cs = find_charset((CHARSET_INFO**) cs_info_table.buffer, cs_number,
-			  cs_info_table.elements)))
-    if (!(cs = find_compiled_charset(cs_number)))
-      cs=add_charset(cs_number, get_charset_name(cs_number), flags);
+
+  if (!(cs = find_compiled_charset(cs_number)))
+    cs=add_charset(cs_number, get_charset_name(cs_number), flags);
+  
   pthread_mutex_unlock(&THR_LOCK_charset);
   return cs;
 }
@@ -475,10 +425,10 @@ static CHARSET_INFO *get_internal_charset_by_name(const char *name, myf flags)
     while we may changing the cs_info_table
   */
   pthread_mutex_lock(&THR_LOCK_charset);
-  if (!(cs = find_charset_by_name((CHARSET_INFO**) cs_info_table.buffer, name,
-				 cs_info_table.elements)))
-    if (!(cs = find_compiled_charset_by_name(name)))
-      cs=add_charset(get_charset_number(name), name, flags);
+
+  if (!(cs = find_compiled_charset_by_name(name)))
+    cs=add_charset(get_charset_number(name), name, flags);
+
   pthread_mutex_unlock(&THR_LOCK_charset);
   return cs;
 }
@@ -585,7 +535,7 @@ char * list_charsets(myf want_flags)
   (void)init_available_charsets(MYF(0));
   init_dynamic_string(&s, NullS, 256, 1024);
 
-  if (want_flags & MY_COMPILED_SETS)
+  if (want_flags & MY_CS_COMPILED)
   {
     CHARSET_INFO *cs;
     for (cs = compiled_charsets; cs->number > 0; cs++)
@@ -595,39 +545,43 @@ char * list_charsets(myf want_flags)
     }
   }
 
-  if (want_flags & MY_CONFIG_SETS)
+  if (want_flags & MY_CS_CONFIG)
   {
-    CS_ID **c;
+    CHARSET_INFO *cs;
     char buf[FN_REFLEN];
     MY_STAT status;
 
-    if((c=available_charsets))
-      for (; *c; ++c)
-	{
-	  if (charset_in_string((*c)->name, &s))
-	    continue;
-	  get_charset_conf_name((*c)->number, buf);
-	  if (!my_stat(buf, &status, MYF(0)))
-	    continue;       /* conf file doesn't exist */
-	  dynstr_append(&s, (*c)->name);
-	  dynstr_append(&s, " ");
-	}
+    for (cs=all_charsets; cs < all_charsets+255; cs++)
+    {
+      if (!cs->name || charset_in_string(cs->name, &s))
+	continue;
+      get_charset_conf_name(cs->name, buf);
+      if (!my_stat(buf, &status, MYF(0)))
+	continue;       /* conf file doesn't exist */
+      dynstr_append(&s, cs->name);
+      dynstr_append(&s, " ");
+    }
   }
 
-  if (want_flags & MY_INDEX_SETS)
+  if (want_flags & MY_CS_INDEX)
   {
-    CS_ID **c;
-    for (c = available_charsets; *c; ++c)
-      charset_append(&s, (*c)->name);
+    CHARSET_INFO *cs;
+    for (cs = all_charsets; cs < all_charsets + 255; cs++)
+      if (cs->name)
+        charset_append(&s, cs->name);
   }
 
+#if 0
   if (want_flags & MY_LOADED_SETS)
   {
-    uint i;
-    for (i = 0; i < cs_info_table.elements; i++)
-      charset_append(&s, 
-		     dynamic_element(&cs_info_table, i, CHARSET_INFO *)->name);
+    CHARSET_INFO *cs;
+    /* FIXME */
+    for (cs = all_charsets; cs < all_charsets + 255; cs++)
+      if (cs->name)
+        charset_append(&s, cs->name);
   }
+#endif
+
   s.str[s.length - 1] = '\0';   /* chop trailing space */
   p = my_strdup(s.str, MYF(MY_WME));
   dynstr_free(&s);
diff --git a/mysys/test_charset.c b/mysys/test_charset.c
index 5e623584355..47ed9062c05 100644
--- a/mysys/test_charset.c
+++ b/mysys/test_charset.c
@@ -77,11 +77,11 @@ int main(int argc, char **argv) {
   _print_csinfo(default_charset_info);
   fflush(stdout);
 
-  cs_list = list_charsets(MYF(MY_COMPILED_SETS | MY_CONFIG_SETS));
+  cs_list = list_charsets(MYF(MY_CS_COMPILED | MY_CS_CONFIG));
   printf("LIST OF CHARSETS (compiled + *.conf):\n%s\n", cs_list);
   my_free(cs_list,MYF(0));
 
-  cs_list = list_charsets(MYF(MY_INDEX_SETS | MY_LOADED_SETS));
+  cs_list = list_charsets(MYF(MY_CS_INDEX | MY_CS_LOADED));
   printf("LIST OF CHARSETS (index + loaded):\n%s\n", cs_list);
   my_free(cs_list,MYF(0));
 
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 98bfa162242..59630644e5a 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1840,7 +1840,7 @@ int main(int argc, char **argv)
 
   if (set_default_charset_by_name(default_charset, MYF(MY_WME)))
     exit( 1 );
-  charsets_list = list_charsets(MYF(MY_COMPILED_SETS|MY_CONFIG_SETS));
+  charsets_list = list_charsets(MYF(MY_CS_COMPILED|MY_CS_CONFIG));
 
 #ifdef HAVE_OPENSSL
   if (opt_use_ssl)
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 494607c7fff..e227a5bf5ca 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -1381,8 +1381,10 @@ int mysqld_show_charsets(THD *thd, const char *wild)
   if (send_fields(thd,field_list,1))
     DBUG_RETURN(1);
 
-  for (cs=compiled_charsets ; cs->name ; cs++ )
+  for (cs=all_charsets ; cs < all_charsets+255 ; cs++ )
   {
+    if (!cs->name)
+      continue;
     if (!(wild && wild[0] && wild_case_compare(system_charset_info,cs->name,wild)))
     {
       packet2.length(0);
diff --git a/strings/ctype.c b/strings/ctype.c
index 7c37eeff986..f91c8985aee 100644
--- a/strings/ctype.c
+++ b/strings/ctype.c
@@ -2805,8 +2805,10 @@ CHARSET_INFO compiled_charsets[] = {
 
 #ifdef HAVE_CHARSET_latin1
   {
-    8,    /* number */
-    "latin1",     /* name */
+    8,			/* number     */
+    MY_CS_COMPILED,	/* state      */
+    "latin1",		/* name       */
+    "",			/* comment    */
     ctype_latin1,
     to_lower_latin1,
     to_upper_latin1,
@@ -2838,7 +2840,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_big5
   {
     1,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "big5",		/* name */
+    "",			/* comment    */
     ctype_big5,
     to_lower_big5,
     to_upper_big5,
@@ -2870,7 +2874,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_cp1251
   {
     14,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "cp1251",		/* name */
+    "",			/* comment    */
     ctype_cp1251,
     to_lower_cp1251,
     to_upper_cp1251,
@@ -2902,7 +2908,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_cp1257
   {
     29,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "cp1257",		/* name */
+    "",			/* comment    */
     ctype_cp1257,
     to_lower_cp1257,
     to_upper_cp1257,
@@ -2934,7 +2942,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_croat
   {
     27,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "croat",		/* name */
+    "",			/* comment    */
     ctype_croat,
     to_lower_croat,
     to_upper_croat,
@@ -2966,7 +2976,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_czech
   {
     2,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "czech",		/* name */
+    "",			/* comment    */
     ctype_czech,
     to_lower_czech,
     to_upper_czech,
@@ -2998,7 +3010,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_danish
   {
     15,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "danish",		/* name */
+    "",			/* comment    */
     ctype_danish,
     to_lower_danish,
     to_upper_danish,
@@ -3030,7 +3044,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_dec8
   {
     3,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "dec8",		/* name */
+    "",			/* comment    */
     ctype_dec8,
     to_lower_dec8,
     to_upper_dec8,
@@ -3062,7 +3078,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_dos
   {
     4,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "dos",		/* name */
+    "",			/* comment    */
     ctype_dos,
     to_lower_dos,
     to_upper_dos,
@@ -3094,7 +3112,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_estonia
   {
     20,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "estonia",		/* name */
+    "",			/* comment    */
     ctype_estonia,
     to_lower_estonia,
     to_upper_estonia,
@@ -3126,7 +3146,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_euc_kr
   {
     19,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "euc_kr",		/* name */
+    "",			/* comment    */
     ctype_euc_kr,
     to_lower_euc_kr,
     to_upper_euc_kr,
@@ -3158,7 +3180,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_gb2312
   {
     24,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "gb2312",		/* name */
+    "",			/* comment    */
     ctype_gb2312,
     to_lower_gb2312,
     to_upper_gb2312,
@@ -3190,7 +3214,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_gbk
   {
     28,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "gbk",		/* name */
+    "",			/* comment    */
     ctype_gbk,
     to_lower_gbk,
     to_upper_gbk,
@@ -3222,7 +3248,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_german1
   {
     5,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "german1",		/* name */
+    "",			/* comment    */
     ctype_german1,
     to_lower_german1,
     to_upper_german1,
@@ -3254,7 +3282,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_greek
   {
     25,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "greek",		/* name */
+    "",			/* comment    */
     ctype_greek,
     to_lower_greek,
     to_upper_greek,
@@ -3286,7 +3316,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_hebrew
   {
     16,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "hebrew",		/* name */
+    "",			/* comment    */
     ctype_hebrew,
     to_lower_hebrew,
     to_upper_hebrew,
@@ -3318,7 +3350,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_hp8
   {
     6,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "hp8",		/* name */
+    "",			/* comment    */
     ctype_hp8,
     to_lower_hp8,
     to_upper_hp8,
@@ -3350,7 +3384,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_hungarian
   {
     21,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "hungarian",	/* name */
+    "",			/* comment    */
     ctype_hungarian,
     to_lower_hungarian,
     to_upper_hungarian,
@@ -3382,7 +3418,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_koi8_ru
   {
     7,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "koi8_ru",		/* name */
+    "",			/* comment    */
     ctype_koi8_ru,
     to_lower_koi8_ru,
     to_upper_koi8_ru,
@@ -3414,7 +3452,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_koi8_ukr
   {
     22,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "koi8_ukr",		/* name */
+    "",			/* comment    */
     ctype_koi8_ukr,
     to_lower_koi8_ukr,
     to_upper_koi8_ukr,
@@ -3446,7 +3486,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_latin1_de
   {
     31,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "latin1_de",	/* name */
+    "",			/* comment    */
     ctype_latin1_de,
     to_lower_latin1_de,
     to_upper_latin1_de,
@@ -3478,7 +3520,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_latin2
   {
     9,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "latin2",		/* name */
+    "",			/* comment    */
     ctype_latin2,
     to_lower_latin2,
     to_upper_latin2,
@@ -3510,7 +3554,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_latin5
   {
     30,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "latin5",		/* name */
+    "",			/* comment    */
     ctype_latin5,
     to_lower_latin5,
     to_upper_latin5,
@@ -3542,7 +3588,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_sjis
   {
     13,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "sjis",		/* name */
+    "",			/* comment    */
     ctype_sjis,
     to_lower_sjis,
     to_upper_sjis,
@@ -3574,7 +3622,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_swe7
   {
     10,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "swe7",		/* name */
+    "",			/* comment    */
     ctype_swe7,
     to_lower_swe7,
     to_upper_swe7,
@@ -3606,7 +3656,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_tis620
   {
     18,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "tis620",		/* name */
+    "",			/* comment    */
     ctype_tis620,
     to_lower_tis620,
     to_upper_tis620,
@@ -3638,7 +3690,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_ucs2
   {
     35,			/* number       */
+    MY_CS_COMPILED,	/* state      */
     "ucs2",		/* name         */
+    "",			/* comment    */
     ctype_ucs2,		/* ctype        */
     to_lower_ucs2,	/* to_lower     */
     to_upper_ucs2,	/* to_upper     */
@@ -3671,7 +3725,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_ujis
   {
     12,			/* number       */
+    MY_CS_COMPILED,	/* state      */
     "ujis",		/* name         */
+    "",			/* comment    */
     ctype_ujis,
     to_lower_ujis,
     to_upper_ujis,
@@ -3703,7 +3759,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_utf8
   {
     33,			/* number       */
+    MY_CS_COMPILED,	/* state      */
     "utf8",		/* name         */
+    "",			/* comment    */
     ctype_utf8,		/* ctype        */
     to_lower_utf8,	/* to_lower     */
     to_upper_utf8,	/* to_upper     */
@@ -3735,7 +3793,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_usa7
   {
     11,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "usa7",		/* name */
+    "",			/* comment    */
     ctype_usa7,
     to_lower_usa7,
     to_upper_usa7,
@@ -3767,7 +3827,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_win1250
   {
     26,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "win1250",		/* name */
+    "",			/* comment    */
     ctype_win1250,
     to_lower_win1250,
     to_upper_win1250,
@@ -3799,7 +3861,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_win1251ukr
   {
     23,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "win1251ukr",	/* name */
+    "",			/* comment    */
     ctype_win1251ukr,
     to_lower_win1251ukr,
     to_upper_win1251ukr,
@@ -3831,7 +3895,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_armscii8
   {
     32,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "armscii8",		/* name */
+    "",			/* comment    */
     ctype_armscii8,
     to_lower_armscii8,
     to_upper_armscii8,
@@ -3863,7 +3929,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_win1251
   {
     17,			/* number */
+    MY_CS_COMPILED,	/* state      */
     "win1251",		/* name */
+    "",			/* comment    */
     ctype_win1251,
     to_lower_win1251,
     to_upper_win1251,
@@ -3895,7 +3963,9 @@ CHARSET_INFO compiled_charsets[] = {
 #ifdef HAVE_CHARSET_win1250ch
   {
     34,				/* number */
+    MY_CS_COMPILED,	/* state      */
     "win1250ch",		/* name */
+    "",			/* comment    */
     ctype_win1250ch,
     to_lower_win1250ch,
     to_upper_win1250ch,
@@ -3926,7 +3996,9 @@ CHARSET_INFO compiled_charsets[] = {
 
   {
     0,			/* end-of-list marker */
-    NullS,
+    0,			/* state      */
+    NullS,		/* name       */
+    NullS,		/* comment    */
     NULL,
     NULL,
     NULL,
-- 
2.30.9