From 759214fa418c5570925ba1d5efd5a154e3b7c076 Mon Sep 17 00:00:00 2001
From: "bar@bar.mysql.r18.ru" <>
Date: Tue, 3 Jun 2003 14:59:17 +0500
Subject: [PATCH] MY_CS_NONTEXT flag for sprintf() incompatible charsets (ucs2
 if the only one now) Some default_charset_info were removed

---
 include/m_ctype.h    |  2 +-
 myisam/mi_create.c   |  2 +-
 myisam/mi_test1.c    |  4 ++--
 myisam/mi_test2.c    |  8 ++++----
 myisam/rt_test.c     |  2 +-
 myisam/sp_test.c     |  2 +-
 sql/field.cc         | 20 ++++++++++----------
 sql/item.cc          |  2 +-
 sql/item_create.cc   |  2 +-
 sql/item_geofunc.cc  |  2 +-
 sql/item_strfunc.cc  |  4 ++--
 sql/sql_parse.cc     |  2 +-
 sql/sql_string.cc    |  4 ++--
 sql/sql_string.h     |  2 +-
 sql/sql_yacc.yy      | 10 +++++-----
 strings/ctype-ucs2.c |  4 ++--
 16 files changed, 36 insertions(+), 36 deletions(-)

diff --git a/include/m_ctype.h b/include/m_ctype.h
index 59f75081ff9..f6b5a1ca44f 100644
--- a/include/m_ctype.h
+++ b/include/m_ctype.h
@@ -62,9 +62,9 @@ typedef struct unicase_info_st
 #define MY_CS_PRIMARY	32     /* if primary collation           */
 #define MY_CS_STRNXFRM	64     /* if strnxfrm is used for sort   */
 #define MY_CS_UNICODE	128    /* is a charset is full unicode   */
+#define MY_CS_NONTEXT	256    /* if a charset is not sprintf() compatible */
 
 #define MY_CHARSET_UNDEFINED 0
-#define MY_CHARSET_CURRENT (default_charset_info->number)
 
 
 typedef struct my_uni_idx_st
diff --git a/myisam/mi_create.c b/myisam/mi_create.c
index 964845cc051..26bb23c3a7f 100644
--- a/myisam/mi_create.c
+++ b/myisam/mi_create.c
@@ -441,7 +441,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
   mi_int2store(share.state.header.base_info_length,MI_BASE_INFO_SIZE);
   mi_int2store(share.state.header.base_pos,base_pos);
   share.state.header.language= (ci->language ?
-				ci->language : MY_CHARSET_CURRENT);
+				ci->language : default_charset_info->number);
   share.state.header.max_block_size=max_key_block_length/MI_MIN_KEY_BLOCK_LENGTH;
 
   share.state.dellink = HA_OFFSET_ERROR;
diff --git a/myisam/mi_test1.c b/myisam/mi_test1.c
index 6aa4b9cf9f1..5a6818b8a3e 100644
--- a/myisam/mi_test1.c
+++ b/myisam/mi_test1.c
@@ -99,7 +99,7 @@ static int run_test(const char *filename)
   keyinfo[0].seg[0].length=key_length;
   keyinfo[0].seg[0].null_bit= null_fields ? 2 : 0;
   keyinfo[0].seg[0].null_pos=0;
-  keyinfo[0].seg[0].language=MY_CHARSET_CURRENT;
+  keyinfo[0].seg[0].language= default_charset_info->number;
   if (pack_seg & HA_BLOB_PART)
   {
     keyinfo[0].seg[0].bit_start=4;		/* Length of blob length */
@@ -122,7 +122,7 @@ static int run_test(const char *filename)
       uniqueseg[i].start=start;
       start+=recinfo[i+1].length;
       uniqueseg[i].length=recinfo[i+1].length;
-      uniqueseg[i].language=MY_CHARSET_CURRENT;
+      uniqueseg[i].language= default_charset_info->number;
     }
     uniqueseg[0].type= key_type;
     uniqueseg[0].null_bit= null_fields ? 2 : 0;
diff --git a/myisam/mi_test2.c b/myisam/mi_test2.c
index 75adf74294f..8dc279b6d97 100644
--- a/myisam/mi_test2.c
+++ b/myisam/mi_test2.c
@@ -87,7 +87,7 @@ int main(int argc, char *argv[])
   keyinfo[0].seg[0].start=0;
   keyinfo[0].seg[0].length=6;
   keyinfo[0].seg[0].type=HA_KEYTYPE_TEXT;
-  keyinfo[0].seg[0].language=MY_CHARSET_CURRENT;
+  keyinfo[0].seg[0].language= default_charset_info->number;
   keyinfo[0].seg[0].flag=(uint8) pack_seg;
   keyinfo[0].seg[0].null_bit=0;
   keyinfo[0].seg[0].null_pos=0;
@@ -124,7 +124,7 @@ int main(int argc, char *argv[])
   keyinfo[3].seg[0].start=0;
   keyinfo[3].seg[0].length=reclength-(use_blob ? 8 : 0);
   keyinfo[3].seg[0].type=HA_KEYTYPE_TEXT;
-  keyinfo[3].seg[0].language=MY_CHARSET_CURRENT;
+  keyinfo[3].seg[0].language=default_charset_info->number;
   keyinfo[3].seg[0].flag=(uint8) pack_seg;
   keyinfo[3].seg[0].null_bit=0;
   keyinfo[3].seg[0].null_pos=0;
@@ -135,7 +135,7 @@ int main(int argc, char *argv[])
   keyinfo[4].seg[0].start=0;
   keyinfo[4].seg[0].length=5;
   keyinfo[4].seg[0].type=HA_KEYTYPE_TEXT;
-  keyinfo[4].seg[0].language=MY_CHARSET_CURRENT;
+  keyinfo[4].seg[0].language=default_charset_info->number;
   keyinfo[4].seg[0].flag=0;
   keyinfo[4].seg[0].null_bit=0;
   keyinfo[4].seg[0].null_pos=0;
@@ -146,7 +146,7 @@ int main(int argc, char *argv[])
   keyinfo[5].seg[0].start=0;
   keyinfo[5].seg[0].length=4;
   keyinfo[5].seg[0].type=HA_KEYTYPE_TEXT;
-  keyinfo[5].seg[0].language=MY_CHARSET_CURRENT;
+  keyinfo[5].seg[0].language=default_charset_info->number;
   keyinfo[5].seg[0].flag=pack_seg;
   keyinfo[5].seg[0].null_bit=0;
   keyinfo[5].seg[0].null_pos=0;
diff --git a/myisam/rt_test.c b/myisam/rt_test.c
index 8bb4687e967..61890bfded1 100644
--- a/myisam/rt_test.c
+++ b/myisam/rt_test.c
@@ -98,7 +98,7 @@ int run_test(const char *filename)
     keyinfo[0].seg[i].length=key_length;
     keyinfo[0].seg[i].null_bit= null_fields ? 2 : 0;
     keyinfo[0].seg[i].null_pos=0;
-    keyinfo[0].seg[i].language=MY_CHARSET_CURRENT;
+    keyinfo[0].seg[i].language=default_charset_info->number;
   }
   
   
diff --git a/myisam/sp_test.c b/myisam/sp_test.c
index 7021cb4a8ee..c4847217efd 100644
--- a/myisam/sp_test.c
+++ b/myisam/sp_test.c
@@ -96,7 +96,7 @@ int run_test(const char *filename)
   keyinfo[0].seg[0].length=1; /* Spatial ignores it anyway */
   keyinfo[0].seg[0].null_bit= null_fields ? 2 : 0;
   keyinfo[0].seg[0].null_pos=0;
-  keyinfo[0].seg[0].language=MY_CHARSET_CURRENT;
+  keyinfo[0].seg[0].language=default_charset_info->number;
   keyinfo[0].seg[0].bit_start=4; /* Long BLOB */
   
   
diff --git a/sql/field.cc b/sql/field.cc
index a61654ed8f4..044684b2675 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -335,7 +335,7 @@ bool Field::optimize_range(uint idx)
 
 void Field_null::sql_type(String &res) const
 {
-  res.set_latin1("null", 4);
+  res.set_ascii("null", 4);
 }
 
 
@@ -856,7 +856,7 @@ String *Field_decimal::val_str(String *val_buffer __attribute__((unused)),
   if (field_length < tmp_length)		// Error in data
     val_ptr->length(0);
   else
-    val_ptr->set_latin1((const char*) str, field_length-tmp_length);
+    val_ptr->set_ascii((const char*) str, field_length-tmp_length);
   return val_ptr;
 }
 
@@ -2389,7 +2389,7 @@ void Field_float::sql_type(String &res) const
 {
   if (dec == NOT_FIXED_DEC)
   {
-    res.set_latin1("float", 5);
+    res.set_ascii("float", 5);
   }
   else
   {
@@ -2647,7 +2647,7 @@ void Field_double::sql_type(String &res) const
   CHARSET_INFO *cs=res.charset();
   if (dec == NOT_FIXED_DEC)
   {
-    res.set_latin1("double",6);
+    res.set_ascii("double",6);
   }
   else
   {
@@ -2987,7 +2987,7 @@ void Field_timestamp::sort_string(char *to,uint length __attribute__((unused)))
 
 void Field_timestamp::sql_type(String &res) const
 {
-  res.set_latin1("timestamp", 9);
+  res.set_ascii("timestamp", 9);
 }
 
 
@@ -3186,7 +3186,7 @@ void Field_time::sort_string(char *to,uint length __attribute__((unused)))
 
 void Field_time::sql_type(String &res) const
 {
-  res.set_latin1("time", 4);
+  res.set_ascii("time", 4);
 }
 
 /****************************************************************************
@@ -3467,7 +3467,7 @@ void Field_date::sort_string(char *to,uint length __attribute__((unused)))
 
 void Field_date::sql_type(String &res) const
 {
-  res.set_latin1("date", 4);
+  res.set_ascii("date", 4);
 }
 
 /****************************************************************************
@@ -3637,7 +3637,7 @@ void Field_newdate::sort_string(char *to,uint length __attribute__((unused)))
 
 void Field_newdate::sql_type(String &res) const
 {
-  res.set_latin1("date", 4);
+  res.set_ascii("date", 4);
 }
 
 
@@ -3870,7 +3870,7 @@ void Field_datetime::sort_string(char *to,uint length __attribute__((unused)))
 
 void Field_datetime::sql_type(String &res) const
 {
-  res.set_latin1("datetime", 8);
+  res.set_ascii("datetime", 8);
 }
 
 /****************************************************************************
@@ -4615,7 +4615,7 @@ void Field_blob::sql_type(String &res) const
   case 3:  str="medium"; length= 6; break;
   case 4:  str="long";  length=4; break;
   }
-  res.set_latin1(str,length);
+  res.set_ascii(str,length);
   if (charset() == &my_charset_bin)
     res.append("blob");
   else
diff --git a/sql/item.cc b/sql/item.cc
index 636cefb511b..42a949287e5 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -1452,7 +1452,7 @@ bool Item_insert_value::fix_fields(THD *thd, struct st_table_list *table_list, I
     Field *field=field_arg->field;
     /* charset doesn't matter here, it's to avoid sigsegv only */
     set_field(new Field_null(0,0,Field::NONE,field->field_name,field->table,
-          default_charset_info));
+          &my_charset_bin));
   }
   return 0;
 }
diff --git a/sql/item_create.cc b/sql/item_create.cc
index 3edec7fdab0..00c98937659 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -324,7 +324,7 @@ Item *create_func_current_user()
   length= (uint) (strxmov(buff, thd->priv_user, "@", thd->priv_host, NullS) -
 		  buff);
   return new Item_string(NullS, thd->memdup(buff, length), length,
-			 default_charset_info);
+			 system_charset_info);
 }
 
 Item *create_func_quarter(Item* a)
diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc
index 06ba67cbc73..fa858922c1b 100644
--- a/sql/item_geofunc.cc
+++ b/sql/item_geofunc.cc
@@ -141,7 +141,7 @@ String *Item_func_geometry_type::val_str(String *str)
     return 0;
   str->copy(geom.get_class_info()->m_name,
 	    strlen(geom.get_class_info()->m_name),
-	    default_charset_info);
+	    default_charset());
   return str;
 }
 
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 06569095018..3c4b5070850 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -2257,7 +2257,7 @@ String *Item_func_hex::val_str(String *str)
     if ((null_value= args[0]->null_value))
       return 0;
     ptr= longlong2str(dec,ans,16);
-    if (str->copy(ans,(uint32) (ptr-ans),default_charset_info))
+    if (str->copy(ans,(uint32) (ptr-ans),default_charset()))
       return &empty_string;			// End of memory
     return str;
   }
@@ -2366,7 +2366,7 @@ String* Item_func_export_set::val_str(String* str)
     }
     break;
   case 3:
-    sep_buf.set(",", 1, default_charset_info);
+    sep_buf.set(",", 1, default_charset());
     sep = &sep_buf;
   }
   null_value=0;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 9ebb6305f70..f098ce0d0b6 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -623,7 +623,7 @@ check_connections(THD *thd)
     memcpy(end,thd->scramble,SCRAMBLE_LENGTH+1);
     end+=SCRAMBLE_LENGTH +1;
     int2store(end,client_flags);
-    end[2]=(char) MY_CHARSET_CURRENT;
+    end[2]=(char) default_charset_info->number;
     int2store(end+3,thd->server_status);
     bzero(end+5,13);
     end+=18;
diff --git a/sql/sql_string.cc b/sql/sql_string.cc
index 6077c42bd1d..cf6645fa23e 100644
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@ -265,9 +265,9 @@ bool String::copy(const char *str, uint32 arg_length,
 
 */
 
-bool String::set_latin1(const char *str, uint32 arg_length)
+bool String::set_ascii(const char *str, uint32 arg_length)
 {
-  if (str_charset->mbmaxlen == 1)
+  if (!(str_charset->state & MY_CS_NONTEXT))
   {
     set(str, arg_length, str_charset);
     return 0;
diff --git a/sql/sql_string.h b/sql/sql_string.h
index 8212bd0a2bd..ee38853a2d3 100644
--- a/sql/sql_string.h
+++ b/sql/sql_string.h
@@ -117,7 +117,7 @@ class String
     Ptr=(char*) str; str_length=arg_length; Alloced_length=0 ; alloced=0;
     str_charset=cs;
   }
-  bool set_latin1(const char *str, uint32 arg_length);
+  bool set_ascii(const char *str, uint32 arg_length);
   inline void set_quick(char *str,uint32 arg_length, CHARSET_INFO *cs)
   {
     if (!alloced)
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 1002d06be88..66a29a8cbd5 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -2863,15 +2863,15 @@ key_usage_list2:
 	key_usage_list2 ',' ident
         { Select->select_lex()->
 	    interval_list.push_back(new String((const char*) $3.str, $3.length,
-				    default_charset_info)); }
+				    system_charset_info)); }
 	| ident
         { Select->select_lex()->
 	    interval_list.push_back(new String((const char*) $1.str, $1.length,
-				    default_charset_info)); }
+				    system_charset_info)); }
 	| PRIMARY_SYM
         { Select->select_lex()->
 	    interval_list.push_back(new String("PRIMARY", 7,
-				    default_charset_info)); };
+				    system_charset_info)); };
 
 using_list:
 	ident
@@ -3756,7 +3756,7 @@ opt_describe_column:
 	/* empty */	{}
 	| text_string	{ Lex->wild= $1; }
 	| ident
-	  { Lex->wild= new String((const char*) $1.str,$1.length,default_charset_info); };
+	  { Lex->wild= new String((const char*) $1.str,$1.length,system_charset_info); };
 
 
 /* flush things */
@@ -4829,7 +4829,7 @@ column_list:
 column_list_id:
 	ident
 	{
-	  String *new_str = new String((const char*) $1.str,$1.length,default_charset_info);
+	  String *new_str = new String((const char*) $1.str,$1.length,system_charset_info);
 	  List_iterator <LEX_COLUMN> iter(Lex->columns);
 	  class LEX_COLUMN *point;
 	  LEX *lex=Lex;
diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c
index 8cb8f84f281..5d78ab5dcff 100644
--- a/strings/ctype-ucs2.c
+++ b/strings/ctype-ucs2.c
@@ -1042,7 +1042,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
 CHARSET_INFO my_charset_ucs2_general_ci=
 {
     35,0,0,		/* number       */
-    MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE,	/* state */
+    MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONTEXT,
     "ucs2",		/* cs name    */
     "ucs2_general_ci",	/* name         */
     "",			/* comment      */
@@ -1065,7 +1065,7 @@ CHARSET_INFO my_charset_ucs2_general_ci=
 CHARSET_INFO my_charset_ucs2_bin=
 {
     90,0,0,		/* number       */
-    MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_UNICODE,	/* state */
+    MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_UNICODE|MY_CS_NONTEXT,
     "ucs2",		/* cs name    */
     "ucs2_bin",		/* name         */
     "",			/* comment      */
-- 
2.30.9