diff --git a/acconfig.h b/acconfig.h index 426ef45f6cd..5f47365709c 100644 --- a/acconfig.h +++ b/acconfig.h @@ -309,9 +309,6 @@ /* Use MySQL RAID */ #undef USE_RAID -/* Use strcoll() functions when comparing and sorting. */ -#undef USE_STRCOLL - /* Program version */ #undef VERSION diff --git a/client/sql_string.cc b/client/sql_string.cc index 652ea1737e4..8ab205d9fb1 100644 --- a/client/sql_string.cc +++ b/client/sql_string.cc @@ -576,7 +576,6 @@ int sortcmp(const String *x,const String *y) const char *t= y->ptr(); uint32 x_len=x->length(),y_len=y->length(),len=min(x_len,y_len); -#ifdef USE_STRCOLL if (use_strnxfrm(x->str_charset)) { #ifndef CMP_ENDSPACE @@ -590,7 +589,6 @@ int sortcmp(const String *x,const String *y) } else { -#endif /* USE_STRCOLL */ x_len-=len; // For easy end space test y_len-=len; if (x->str_charset->sort_order) @@ -633,9 +631,7 @@ int sortcmp(const String *x,const String *y) #else return (int) (x_len-y_len); #endif /* CMP_ENDSPACE */ -#ifdef USE_STRCOLL } -#endif } diff --git a/configure.in b/configure.in index be18ef2ada9..212737535a6 100644 --- a/configure.in +++ b/configure.in @@ -2256,9 +2256,6 @@ then AC_DEFINE(USE_MB_IDENT) fi -# Temporary hack for USE_STRCOLL -AC_DEFINE(USE_STRCOLL) - AC_SUBST(default_charset) AC_DEFINE_UNQUOTED(DEFAULT_CHARSET_NAME,"$default_charset") diff --git a/isam/_key.c b/isam/_key.c index 002ad480c56..871ec82eba7 100644 --- a/isam/_key.c +++ b/isam/_key.c @@ -53,9 +53,7 @@ uint _nisam_make_key(register N_INFO *info, uint keynr, uchar *key, const char * } *key++= (uchar) (length=(uint) (end-pos)); memcpy((byte*) key,(byte*) pos,(size_t) length); -#ifdef USE_STRCOLL if (!use_strnxfrm(default_charset_info)) -#endif { if (type == HA_KEYTYPE_TEXT) my_tosort(default_charset_info,(byte*) key,length); @@ -66,9 +64,7 @@ uint _nisam_make_key(register N_INFO *info, uint keynr, uchar *key, const char * { memcpy((byte*) key,(byte*) record+keyseg->base.start, (size_t) keyseg->base.length); -#ifdef USE_STRCOLL if (!use_strnxfrm(default_charset_info)) -#endif { if (type == HA_KEYTYPE_TEXT) my_tosort(default_charset_info,(byte*) key,(uint) keyseg->base.length); @@ -149,9 +145,7 @@ uint _nisam_pack_key(register N_INFO *info, uint keynr, uchar *key, uchar *old, } else memcpy((byte*) key,old,(size_t) length); -#ifdef USE_STRCOLL if (!use_strnxfrm(default_charset_info)) -#endif { if (type == HA_KEYTYPE_TEXT) my_tosort(default_charset_info,(byte*) key,length); diff --git a/isam/_search.c b/isam/_search.c index d5e145ae0bf..1ceeab1e824 100644 --- a/isam/_search.c +++ b/isam/_search.c @@ -331,7 +331,6 @@ int _nisam_key_cmp(register N_KEYSEG *keyseg, register uchar *a, register uchar (int) *as : b_length; end= a+ min(key_length,(uint) length); -#ifdef USE_STRCOLL if (use_strnxfrm(default_charset_info)) { if (((enum ha_base_keytype) keyseg->base.type) == HA_KEYTYPE_BINARY) { @@ -349,7 +348,6 @@ int _nisam_key_cmp(register N_KEYSEG *keyseg, register uchar *a, register uchar } } else -#endif { while (a < end) if ((flag= (int) *a++ - (int) *b++)) @@ -382,7 +380,6 @@ int _nisam_key_cmp(register N_KEYSEG *keyseg, register uchar *a, register uchar } else { -#ifdef USE_STRCOLL if (use_strnxfrm(default_charset_info)) { if (((enum ha_base_keytype) keyseg->base.type) == HA_KEYTYPE_BINARY) { @@ -400,7 +397,6 @@ int _nisam_key_cmp(register N_KEYSEG *keyseg, register uchar *a, register uchar } } else -#endif { while (a < end) if ((flag= (int) *a++ - (int) *b++)) diff --git a/sql/filesort.cc b/sql/filesort.cc index 6d2932946e4..27c4b962515 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -123,11 +123,9 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, if (param.sort_length == param.ref_length && records > param.max_rows) records=param.max_rows; /* purecov: inspected */ -#ifdef USE_STRCOLL if (use_strnxfrm(charset) && !(param.tmp_buffer=my_malloc(param.sort_length,MYF(MY_WME)))) goto err; -#endif memavl= thd->variables.sortbuff_size; while (memavl >= MIN_SORT_MEMORY) @@ -200,10 +198,8 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, error =0; err: -#ifdef USE_STRCOLL if (param.tmp_buffer) x_free(param.tmp_buffer); -#endif x_free((gptr) sort_keys); x_free((gptr) buffpek); close_cached_file(&tempfile); @@ -494,7 +490,6 @@ static void make_sortkey(register SORTPARAM *param, diff=0; /* purecov: inspected */ length=sort_field->length; } -#ifdef USE_STRCOLL if (use_strnxfrm(cs)) { if (item->binary()) @@ -520,15 +515,12 @@ static void make_sortkey(register SORTPARAM *param, } else { -#endif if (res->ptr() != (char*) to) memcpy(to,res->ptr(),length); bzero((char *)to+length,diff); if (!item->binary()) my_tosort(cs, (char*) to,length); -#ifdef USE_STRCOLL } -#endif break; } case INT_RESULT: @@ -930,34 +922,27 @@ sortlength(SORT_FIELD *sortorder, uint s_length) else { sortorder->length=sortorder->field->pack_length(); -#ifdef USE_STRCOLL if (!sortorder->field->binary()) { CHARSET_INFO *cs=sortorder->field->charset(); if (use_strnxfrm(cs)) sortorder->length= sortorder->length*cs->strxfrm_multiply; } -#endif } if (sortorder->field->maybe_null()) length++; // Place for NULL marker } else { -#ifdef USE_STRCOLL - -#endif switch ((sortorder->result_type=sortorder->item->result_type())) { case STRING_RESULT: sortorder->length=sortorder->item->max_length; -#ifdef USE_STRCOLL if (!sortorder->item->binary()) { CHARSET_INFO *cs=sortorder->item->charset(); if (use_strnxfrm(cs)) sortorder->length= sortorder->length*cs->strxfrm_multiply; } -#endif break; case INT_RESULT: #if SIZEOF_LONG_LONG > 4 diff --git a/sql/share/charsets/cp1256.xml b/sql/share/charsets/cp1256.xml index 4947839a728..2a6f6032358 100644 --- a/sql/share/charsets/cp1256.xml +++ b/sql/share/charsets/cp1256.xml @@ -4,7 +4,7 @@ - + diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index df06bcfd5c0..9a4ce1b81a4 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -2476,7 +2476,9 @@ TABLE_COUNTER_TYPE Query_cache::is_cacheable(THD *thd, uint32 query_len, (tables_used->db_length == 5 && #ifdef FN_NO_CASE_SENCE // TODO: latin1 charset should be replaced with system charset - my_strncasecmp(my_charset_latin1,tables_used->db,"mysql",5) == 0 + my_strncasecmp(&my_charset_latin1, + tables_used->db, + "mysql",5) == 0 #else tables_used->db[0]=='m' && tables_used->db[1]=='y' && diff --git a/sql/sql_sort.h b/sql/sql_sort.h index 62c5f1cb164..14463a67a28 100644 --- a/sql/sql_sort.h +++ b/sql/sql_sort.h @@ -38,9 +38,7 @@ typedef struct st_sort_param { SORT_FIELD *end; uchar *unique_buff; bool not_killable; -#ifdef USE_STRCOLL char* tmp_buffer; -#endif } SORTPARAM; diff --git a/sql/sql_string.cc b/sql/sql_string.cc index ce1b469bf5e..8c12261f949 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -577,7 +577,6 @@ int sortcmp(const String *x,const String *y) const char *t= y->ptr(); uint32 x_len=x->length(),y_len=y->length(),len=min(x_len,y_len); -#ifdef USE_STRCOLL if (use_strnxfrm(x->str_charset)) { #ifndef CMP_ENDSPACE @@ -591,7 +590,6 @@ int sortcmp(const String *x,const String *y) } else { -#endif /* USE_STRCOLL */ x_len-=len; // For easy end space test y_len-=len; if (x->str_charset->sort_order) @@ -634,9 +632,7 @@ int sortcmp(const String *x,const String *y) #else return (int) (x_len-y_len); #endif /* CMP_ENDSPACE */ -#ifdef USE_STRCOLL } -#endif } diff --git a/strings/conf_to_src.c b/strings/conf_to_src.c index 7f85becfe87..69dccbca0a7 100644 --- a/strings/conf_to_src.c +++ b/strings/conf_to_src.c @@ -25,13 +25,10 @@ #include #include -#define CHARSETS_SUBDIR "sql/share/charsets" -#define CTYPE_TABLE_SIZE 257 -#define TO_LOWER_TABLE_SIZE 256 -#define TO_UPPER_TABLE_SIZE 256 -#define SORT_ORDER_TABLE_SIZE 256 -#define MAX_BUF 16*1024 +#define ROW_LEN 16 +#define ROW16_LEN 8 +#define MAX_BUF 16*1024 static CHARSET_INFO all_charsets[256]; @@ -45,12 +42,30 @@ print_array(FILE *f, const char *set, const char *name, uchar *a, int n) for (i=0 ;iname, "ctype", cs->ctype, CTYPE_TABLE_SIZE); - print_array(f, cs->name, "to_lower", cs->to_lower, TO_LOWER_TABLE_SIZE); - print_array(f, cs->name, "to_upper", cs->to_upper, TO_UPPER_TABLE_SIZE); - print_array(f, cs->name, "sort_order", cs->sort_order, SORT_ORDER_TABLE_SIZE); + fprintf(f,"#ifdef HAVE_CHARSET_%s\n",cs->csname); + print_array(f, cs->name, "ctype", cs->ctype, MY_CS_CTYPE_TABLE_SIZE); + print_array(f, cs->name, "to_lower", cs->to_lower, MY_CS_TO_LOWER_TABLE_SIZE); + print_array(f, cs->name, "to_upper", cs->to_upper, MY_CS_TO_UPPER_TABLE_SIZE); + print_array(f, cs->name, "sort_order", cs->sort_order, MY_CS_SORT_ORDER_TABLE_SIZE); + print_array16(f, cs->name, "to_uni", cs->tab_to_uni, MY_CS_TO_UNI_TABLE_SIZE); + fprintf(f,"#endif\n"); fprintf(f,"\n"); } } diff --git a/strings/ctype-latin1.c b/strings/ctype-latin1.c index 23aee491497..ac1e6dcdc18 100644 --- a/strings/ctype-latin1.c +++ b/strings/ctype-latin1.c @@ -19,7 +19,7 @@ #include "m_ctype.h" -static uint16 latin1_uni[256]={ +static my_wc_t latin1_uni[256]={ 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, @@ -72,12 +72,6 @@ static uchar uni_latin1[]={ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}; -static MY_UNI_IDX idx_uni_latin1[]={ - {0x0000,0x00FF,uni_latin1}, - {0,0,NULL} -}; - - static uchar ctype_latin1[] = { 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, @@ -156,6 +150,31 @@ static uchar sort_order_latin1[] = { }; +static +int my_mb_wc_latin1(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t *wc, + const unsigned char *str, + const unsigned char *end) +{ + if (str >= end) + return MY_CS_TOOFEW(0); + + return ((wc[0]= latin1_uni[*str]) || (!str[0])) ? 1 : MY_CS_ILSEQ; +} + +static +int my_wc_mb_latin1(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t wc, + unsigned char *str, + unsigned char *end) +{ + if (str >= end) + return MY_CS_TOOSMALL; + + return ((wc < 256) && ((str[0]=uni_latin1[wc]) || (!wc))) ? 1 : MY_CS_ILUNI; +} + + CHARSET_INFO my_charset_latin1 = { 8, /* number */ @@ -167,8 +186,8 @@ CHARSET_INFO my_charset_latin1 = to_lower_latin1, to_upper_latin1, sort_order_latin1, - latin1_uni, /* tab_to_uni */ - idx_uni_latin1, /* tab_from_uni */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ 2, /* strxfrm_multiply */ my_strnncoll_simple, my_strnxfrm_simple, @@ -178,8 +197,8 @@ CHARSET_INFO my_charset_latin1 = NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - my_mb_wc_8bit, /* mb_wc */ - my_wc_mb_8bit, /* wc_mb */ + my_mb_wc_latin1, /* mb_wc */ + my_wc_mb_latin1, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit,