diff options
author | bar@bar.mysql.r18.ru <> | 2003-05-23 17:45:52 +0500 |
---|---|---|
committer | bar@bar.mysql.r18.ru <> | 2003-05-23 17:45:52 +0500 |
commit | 8192d169a2dea5ec8a5855440e5eb1c167c8ce7c (patch) | |
tree | 40660f305f13b43f69d092c4719cebfaaf120a40 | |
parent | 2eccde258dd79f50e15640e508fd55cd2c094b34 (diff) | |
download | mariadb-git-8192d169a2dea5ec8a5855440e5eb1c167c8ce7c.tar.gz |
CHARSET_INFO structure reorganization for easier maintainance
-rw-r--r-- | client/sql_string.cc | 12 | ||||
-rw-r--r-- | heap/hp_hash.c | 4 | ||||
-rw-r--r-- | include/m_ctype.h | 121 | ||||
-rw-r--r-- | myisam/mi_unique.c | 2 | ||||
-rw-r--r-- | mysys/charset.c | 38 | ||||
-rw-r--r-- | mysys/hash.c | 2 | ||||
-rw-r--r-- | sql/field.cc | 57 | ||||
-rw-r--r-- | sql/field.h | 2 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 4 | ||||
-rw-r--r-- | sql/item_strfunc.cc | 6 | ||||
-rw-r--r-- | sql/item_timefunc.cc | 10 | ||||
-rw-r--r-- | sql/sql_string.cc | 14 | ||||
-rw-r--r-- | strings/ctype-big5.c | 67 | ||||
-rw-r--r-- | strings/ctype-bin.c | 65 | ||||
-rw-r--r-- | strings/ctype-czech.c | 40 | ||||
-rw-r--r-- | strings/ctype-euc_kr.c | 66 | ||||
-rw-r--r-- | strings/ctype-extra.c | 26 | ||||
-rw-r--r-- | strings/ctype-gb2312.c | 66 | ||||
-rw-r--r-- | strings/ctype-gbk.c | 66 | ||||
-rw-r--r-- | strings/ctype-latin1.c | 95 | ||||
-rw-r--r-- | strings/ctype-simple.c | 35 | ||||
-rw-r--r-- | strings/ctype-sjis.c | 67 | ||||
-rw-r--r-- | strings/ctype-tis620.c | 48 | ||||
-rw-r--r-- | strings/ctype-ucs2.c | 79 | ||||
-rw-r--r-- | strings/ctype-ujis.c | 49 | ||||
-rw-r--r-- | strings/ctype-utf8.c | 65 | ||||
-rw-r--r-- | strings/ctype-win1250ch.c | 40 |
27 files changed, 611 insertions, 535 deletions
diff --git a/client/sql_string.cc b/client/sql_string.cc index 8ab205d9fb1..65a9ff68c53 100644 --- a/client/sql_string.cc +++ b/client/sql_string.cc @@ -97,13 +97,13 @@ bool String::set(longlong num, CHARSET_INFO *cs) if (alloc(l)) return TRUE; - if (cs->snprintf == my_snprintf_8bit) + if (cs->cset->snprintf == my_snprintf_8bit) { str_length=(uint32) (longlong10_to_str(num,Ptr,-10)-Ptr); } else { - str_length=cs->snprintf(cs,Ptr,l,"%d",num); + str_length=cs->cset->snprintf(cs,Ptr,l,"%d",num); } str_charset=cs; return FALSE; @@ -115,13 +115,13 @@ bool String::set(ulonglong num, CHARSET_INFO *cs) if (alloc(l)) return TRUE; - if (cs->snprintf == my_snprintf_8bit) + if (cs->cset->snprintf == my_snprintf_8bit) { str_length=(uint32) (longlong10_to_str(num,Ptr,10)-Ptr); } else { - str_length=cs->snprintf(cs,Ptr,l,"%d",num); + str_length=cs->cset->snprintf(cs,Ptr,l,"%d",num); } str_charset=cs; return FALSE; @@ -255,7 +255,7 @@ bool String::copy(const char *str,uint32 arg_length, CHARSET_INFO *from, CHARSET for (str_length=new_length ; s < se && d < de ; ) { - if ((cnvres=from->mb_wc(from,&wc,s,se)) > 0 ) + if ((cnvres=from->cset->mb_wc(from,&wc,s,se)) > 0 ) { s+=cnvres; } @@ -268,7 +268,7 @@ bool String::copy(const char *str,uint32 arg_length, CHARSET_INFO *from, CHARSET break; outp: - if((cnvres=to->wc_mb(to,wc,d,de)) >0 ) + if((cnvres=to->cset->wc_mb(to,wc,d,de)) >0 ) { d+=cnvres; } diff --git a/heap/hp_hash.c b/heap/hp_hash.c index e315c1bbcb8..2a946dcd7b9 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -215,7 +215,7 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) } if (seg->type == HA_KEYTYPE_TEXT) { - seg->charset->hash_sort(seg->charset,pos,((uchar*)key)-pos,&nr,&nr2); + seg->charset->coll->hash_sort(seg->charset,pos,((uchar*)key)-pos,&nr,&nr2); } else { @@ -250,7 +250,7 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) } if (seg->type == HA_KEYTYPE_TEXT) { - seg->charset->hash_sort(seg->charset,pos,end-pos,&nr,&nr2); + seg->charset->coll->hash_sort(seg->charset,pos,end-pos,&nr,&nr2); } else { diff --git a/include/m_ctype.h b/include/m_ctype.h index 6cf0ecfbb8a..59f75081ff9 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -91,27 +91,11 @@ enum my_lex_states MY_LEX_STRING_OR_DELIMITER }; +struct charset_info_st; -typedef struct charset_info_st +typedef struct my_collation_handler_st { - uint number; - uint primary_number; - uint binary_number; - uint state; - const char *csname; - 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; - uchar state_map[256]; - uchar ident_map[256]; - /* Collation routines */ - uint strxfrm_multiply; int (*strnncoll)(struct charset_info_st *, const uchar *, uint, const uchar *, uint); int (*strnncollsp)(struct charset_info_st *, @@ -128,9 +112,21 @@ typedef struct charset_info_st const char *str,const char *str_end, const char *wildstr,const char *wildend, int escape,int w_one, int w_many); + + int (*strcasecmp)(struct charset_info_st *, const char *, const char *); + /* Hash calculation */ + void (*hash_sort)(struct charset_info_st *cs, const uchar *key, uint len, + ulong *nr1, ulong *nr2); +} MY_COLLATION_HANDLER; + +extern MY_COLLATION_HANDLER my_collation_bin_handler; +extern MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler; + + +typedef struct my_charset_handler_st +{ /* Multibyte routines */ - uint mbmaxlen; int (*ismbchar)(struct charset_info_st *, const char *, const char *); int (*mbcharlen)(struct charset_info_st *, uint); uint (*numchars)(struct charset_info_st *, const char *b, const char *e); @@ -148,15 +144,6 @@ typedef struct charset_info_st void (*caseup)(struct charset_info_st *, char *, uint); void (*casedn)(struct charset_info_st *, char *, uint); - /* Functions for case comparison */ - int (*strcasecmp)(struct charset_info_st *, const char *, const char *); - - /* Hash calculation */ - void (*hash_sort)(struct charset_info_st *cs, const uchar *key, uint len, - ulong *nr1, ulong *nr2); - - char max_sort_char; /* For LIKE optimization */ - /* Charset dependant snprintf() */ int (*snprintf)(struct charset_info_st *, char *to, uint n, const char *fmt, ...); @@ -181,6 +168,35 @@ typedef struct charset_info_st ulong (*scan)(struct charset_info_st *, const char *b, const char *e, int sq); +} MY_CHARSET_HANDLER; + +extern MY_CHARSET_HANDLER my_charset_8bit_handler; + + + +typedef struct charset_info_st +{ + uint number; + uint primary_number; + uint binary_number; + uint state; + const char *csname; + 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; + uchar state_map[256]; + uchar ident_map[256]; + uint strxfrm_multiply; + uint mbmaxlen; + char max_sort_char; /* For LIKE optimization */ + + MY_CHARSET_HANDLER *cset; + MY_COLLATION_HANDLER *coll; } CHARSET_INFO; @@ -211,9 +227,6 @@ extern CHARSET_INFO my_charset_utf8_bin; extern CHARSET_INFO my_charset_cp1250_czech_ci; -extern my_bool my_parse_charset_xml(const char *bug, uint len, - int (*add)(CHARSET_INFO *cs)); - /* declarations for simple charsets */ extern int my_strnxfrm_simple(CHARSET_INFO *, uchar *, uint, const uchar *, uint); @@ -254,7 +267,6 @@ ulonglong my_strntoull_8bit(CHARSET_INFO *, const char *s, uint l, int base, char **e, int *err); double my_strntod_8bit(CHARSET_INFO *, char *s, uint l,char **e, int *err); - int my_long10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix, long int val); int my_longlong10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix, @@ -279,7 +291,6 @@ uint my_numchars_8bit(CHARSET_INFO *, const char *b, const char *e); uint my_charpos_8bit(CHARSET_INFO *, const char *b, const char *e, uint pos); -#ifdef USE_MB /* Functions for multibyte charsets */ extern void my_caseup_str_mb(CHARSET_INFO *, char *); extern void my_casedn_str_mb(CHARSET_INFO *, char *); @@ -294,7 +305,10 @@ int my_wildcmp_mb(CHARSET_INFO *, uint my_numchars_mb(CHARSET_INFO *, const char *b, const char *e); uint my_charpos_mb(CHARSET_INFO *, const char *b, const char *e, uint pos); -#endif + +extern my_bool my_parse_charset_xml(const char *bug, uint len, + int (*add)(CHARSET_INFO *cs)); + #define _U 01 /* Upper case */ #define _L 02 /* Lower case */ @@ -329,27 +343,26 @@ uint my_charpos_mb(CHARSET_INFO *, const char *b, const char *e, uint pos); #define my_isvar_start(s,c) (my_isalpha(s,c) || (c) == '_') #define use_strnxfrm(s) ((s)->state & MY_CS_STRNXFRM) -#define my_strnxfrm(s, a, b, c, d) ((s)->strnxfrm((s), (a), (b), (c), (d))) -#define my_strnncoll(s, a, b, c, d) ((s)->strnncoll((s), (a), (b), (c), (d))) +#define my_strnxfrm(s, a, b, c, d) ((s)->coll->strnxfrm((s), (a), (b), (c), (d))) +#define my_strnncoll(s, a, b, c, d) ((s)->coll->strnncoll((s), (a), (b), (c), (d))) #define my_like_range(s, a, b, c, d, e, f, g, h, i, j) \ - ((s)->like_range((s), (a), (b), (c), (d), (e), (f), (g), (h), (i), (j))) -#define my_wildcmp(cs,s,se,w,we,e,o,m) ((cs)->wildcmp((cs),(s),(se),(w),(we),(e),(o),(m))) - -#define use_mb(s) ((s)->ismbchar != NULL) -#define my_ismbchar(s, a, b) ((s)->ismbchar((s), (a), (b))) -#define my_mbcharlen(s, a) ((s)->mbcharlen((s),(a))) - -#define my_caseup(s, a, l) ((s)->caseup((s), (a), (l))) -#define my_casedn(s, a, l) ((s)->casedn((s), (a), (l))) -#define my_caseup_str(s, a) ((s)->caseup_str((s), (a))) -#define my_casedn_str(s, a) ((s)->casedn_str((s), (a))) -#define my_strcasecmp(s, a, b) ((s)->strcasecmp((s), (a), (b))) - -#define my_strntol(s, a, b, c, d, e) ((s)->strntol((s),(a),(b),(c),(d),(e))) -#define my_strntoul(s, a, b, c, d, e) ((s)->strntoul((s),(a),(b),(c),(d),(e))) -#define my_strntoll(s, a, b, c, d, e) ((s)->strntoll((s),(a),(b),(c),(d),(e))) -#define my_strntoull(s, a, b, c,d, e) ((s)->strntoull((s),(a),(b),(c),(d),(e))) -#define my_strntod(s, a, b, c, d) ((s)->strntod((s),(a),(b),(c),(d))) + ((s)->coll->like_range((s), (a), (b), (c), (d), (e), (f), (g), (h), (i), (j))) +#define my_wildcmp(cs,s,se,w,we,e,o,m) ((cs)->coll->wildcmp((cs),(s),(se),(w),(we),(e),(o),(m))) +#define my_strcasecmp(s, a, b) ((s)->coll->strcasecmp((s), (a), (b))) + +#define use_mb(s) ((s)->cset->ismbchar != NULL) +#define my_ismbchar(s, a, b) ((s)->cset->ismbchar((s), (a), (b))) +#define my_mbcharlen(s, a) ((s)->cset->mbcharlen((s),(a))) + +#define my_caseup(s, a, l) ((s)->cset->caseup((s), (a), (l))) +#define my_casedn(s, a, l) ((s)->cset->casedn((s), (a), (l))) +#define my_caseup_str(s, a) ((s)->cset->caseup_str((s), (a))) +#define my_casedn_str(s, a) ((s)->cset->casedn_str((s), (a))) +#define my_strntol(s, a, b, c, d, e) ((s)->cset->strntol((s),(a),(b),(c),(d),(e))) +#define my_strntoul(s, a, b, c, d, e) ((s)->cset->strntoul((s),(a),(b),(c),(d),(e))) +#define my_strntoll(s, a, b, c, d, e) ((s)->cset->strntoll((s),(a),(b),(c),(d),(e))) +#define my_strntoull(s, a, b, c,d, e) ((s)->cset->strntoull((s),(a),(b),(c),(d),(e))) +#define my_strntod(s, a, b, c, d) ((s)->cset->strntod((s),(a),(b),(c),(d))) /* XXX: still need to take care of this one */ diff --git a/myisam/mi_unique.c b/myisam/mi_unique.c index 3eb25aefe0e..f4ee39e55ca 100644 --- a/myisam/mi_unique.c +++ b/myisam/mi_unique.c @@ -109,7 +109,7 @@ ha_checksum mi_unique_hash(MI_UNIQUEDEF *def, const byte *record) if (type == HA_KEYTYPE_TEXT || type == HA_KEYTYPE_VARTEXT) { ulong nr=1, nr2=4; - keyseg->charset->hash_sort(keyseg->charset,(const uchar*)pos,length,&nr, &nr2); + keyseg->charset->coll->hash_sort(keyseg->charset,(const uchar*)pos,length,&nr, &nr2); crc=nr; } else diff --git a/mysys/charset.c b/mysys/charset.c index af4d3620df2..f5d07403948 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -120,45 +120,15 @@ static void simple_cs_init_functions(CHARSET_INFO *cs) if (cs->state & MY_CS_BINSORT) { - CHARSET_INFO *b= &my_charset_bin; - cs->strnxfrm = b->strnxfrm; - cs->like_range = b->like_range; - cs->wildcmp = b->wildcmp; - cs->strnncoll = b->strnncoll; - cs->strnncollsp = b->strnncollsp; - cs->strcasecmp = b->strcasecmp; - cs->hash_sort = b->hash_sort; + cs->coll= &my_collation_bin_handler; } else { - cs->strnxfrm = my_strnxfrm_simple; - cs->like_range = my_like_range_simple; - cs->wildcmp = my_wildcmp_8bit; - cs->strnncoll = my_strnncoll_simple; - cs->strnncollsp = my_strnncollsp_simple; - cs->strcasecmp = my_strcasecmp_8bit; - cs->hash_sort = my_hash_sort_simple; + cs->coll= &my_collation_8bit_simple_ci_handler; } - cs->caseup_str = my_caseup_str_8bit; - cs->casedn_str = my_casedn_str_8bit; - cs->caseup = my_caseup_8bit; - cs->casedn = my_casedn_8bit; - cs->mb_wc = my_mb_wc_8bit; - cs->wc_mb = my_wc_mb_8bit; - cs->snprintf = my_snprintf_8bit; - cs->long10_to_str= my_long10_to_str_8bit; - cs->longlong10_to_str= my_longlong10_to_str_8bit; - cs->fill = my_fill_8bit; - cs->strntol = my_strntol_8bit; - cs->strntoul = my_strntoul_8bit; - cs->strntoll = my_strntoll_8bit; - cs->strntoull = my_strntoull_8bit; - cs->strntod = my_strntod_8bit; - cs->scan = my_scan_8bit; + cs->cset= &my_charset_8bit_handler; cs->mbmaxlen = 1; - cs->numchars = my_numchars_8bit; - cs->charpos = my_charpos_8bit; } @@ -329,10 +299,10 @@ static int add_collation(CHARSET_INFO *cs) if (!(all_charsets[cs->number]->state & MY_CS_COMPILED)) { + simple_cs_init_functions(all_charsets[cs->number]); simple_cs_copy_data(all_charsets[cs->number],cs); if (simple_cs_is_full(all_charsets[cs->number])) { - simple_cs_init_functions(all_charsets[cs->number]); all_charsets[cs->number]->state |= MY_CS_LOADED; } } diff --git a/mysys/hash.c b/mysys/hash.c index 9169613c39f..0b2dbc484bc 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -36,7 +36,7 @@ static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length); static uint calc_hash(HASH *hash,const byte *key,uint length) { ulong nr1=1, nr2=4; - hash->charset->hash_sort(hash->charset,key,length,&nr1,&nr2); + hash->charset->coll->hash_sort(hash->charset,key,length,&nr1,&nr2); return nr1; } diff --git a/sql/field.cc b/sql/field.cc index 3288aa2c4c7..7da9c9309cb 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -932,7 +932,7 @@ void Field_decimal::sql_type(String &res) const tmp--; if (dec) tmp--; - res.length(cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(), + res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "decimal(%d,%d)",tmp,dec)); add_zerofill_and_unsigned(res); } @@ -1100,9 +1100,11 @@ String *Field_tiny::val_str(String *val_buffer, char *to=(char*) val_buffer->ptr(); if (unsigned_flag) - length= (uint) cs->long10_to_str(cs,to,mlength, 10,(long) *((uchar*) ptr)); + length= (uint) cs->cset->long10_to_str(cs,to,mlength, 10, + (long) *((uchar*) ptr)); else - length= (uint) cs->long10_to_str(cs,to,mlength,-10,(long) *((signed char*) ptr)); + length= (uint) cs->cset->long10_to_str(cs,to,mlength,-10, + (long) *((signed char*) ptr)); val_buffer->length(length); if (zerofill) @@ -1135,7 +1137,7 @@ void Field_tiny::sort_string(char *to,uint length __attribute__((unused))) void Field_tiny::sql_type(String &res) const { CHARSET_INFO *cs=res.charset(); - res.length(cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(), + res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "tinyint(%d)",(int) field_length)); add_zerofill_and_unsigned(res); } @@ -1345,9 +1347,10 @@ String *Field_short::val_str(String *val_buffer, shortget(j,ptr); if (unsigned_flag) - length=(uint) cs->long10_to_str(cs, to, mlength, 10, (long) (uint16) j); + length=(uint) cs->cset->long10_to_str(cs, to, mlength, 10, + (long) (uint16) j); else - length=(uint) cs->long10_to_str(cs, to, mlength,-10, (long) j); + length=(uint) cs->cset->long10_to_str(cs, to, mlength,-10, (long) j); val_buffer->length(length); if (zerofill) prepend_zeros(val_buffer); @@ -1408,7 +1411,7 @@ void Field_short::sort_string(char *to,uint length __attribute__((unused))) void Field_short::sql_type(String &res) const { CHARSET_INFO *cs=res.charset(); - res.length(cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(), + res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "smallint(%d)",(int) field_length)); add_zerofill_and_unsigned(res); } @@ -1583,7 +1586,7 @@ String *Field_medium::val_str(String *val_buffer, char *to=(char*) val_buffer->ptr(); long j= unsigned_flag ? (long) uint3korr(ptr) : sint3korr(ptr); - length=(uint) cs->long10_to_str(cs,to,mlength,-10,j); + length=(uint) cs->cset->long10_to_str(cs,to,mlength,-10,j); val_buffer->length(length); if (zerofill) prepend_zeros(val_buffer); /* purecov: inspected */ @@ -1627,7 +1630,7 @@ void Field_medium::sort_string(char *to,uint length __attribute__((unused))) void Field_medium::sql_type(String &res) const { CHARSET_INFO *cs=res.charset(); - res.length(cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(), + res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "mediumint(%d)",(int) field_length)); add_zerofill_and_unsigned(res); } @@ -1643,7 +1646,7 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs) int error= 0; char *end; - tmp= cs->scan(cs, from, from+len, MY_SEQ_SPACES); + tmp= cs->cset->scan(cs, from, from+len, MY_SEQ_SPACES); len-= tmp; from+= tmp; my_errno=0; @@ -1821,9 +1824,9 @@ String *Field_long::val_str(String *val_buffer, longget(j,ptr); if (unsigned_flag) - length=cs->long10_to_str(cs,to,mlength, 10,(long) (uint32)j); + length=cs->cset->long10_to_str(cs,to,mlength, 10,(long) (uint32)j); else - length=cs->long10_to_str(cs,to,mlength,-10,(long) j); + length=cs->cset->long10_to_str(cs,to,mlength,-10,(long) j); val_buffer->length(length); if (zerofill) prepend_zeros(val_buffer); @@ -1886,7 +1889,7 @@ void Field_long::sort_string(char *to,uint length __attribute__((unused))) void Field_long::sql_type(String &res) const { CHARSET_INFO *cs=res.charset(); - res.length(cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(), + res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "int(%d)",(int) field_length)); add_zerofill_and_unsigned(res); } @@ -1901,7 +1904,7 @@ int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) int error= 0; char *end; - tmp= cs->scan(cs, from, from+len, MY_SEQ_SPACES); + tmp= cs->cset->scan(cs, from, from+len, MY_SEQ_SPACES); len-= (uint)tmp; from+= tmp; my_errno=0; @@ -2045,7 +2048,7 @@ String *Field_longlong::val_str(String *val_buffer, #endif longlongget(j,ptr); - length=(uint) (cs->longlong10_to_str)(cs,to,mlength, + length=(uint) (cs->cset->longlong10_to_str)(cs,to,mlength, unsigned_flag ? 10 : -10, j); val_buffer->length(length); if (zerofill) @@ -2119,7 +2122,7 @@ void Field_longlong::sort_string(char *to,uint length __attribute__((unused))) void Field_longlong::sql_type(String &res) const { CHARSET_INFO *cs=res.charset(); - res.length(cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(), + res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "bigint(%d)",(int) field_length)); add_zerofill_and_unsigned(res); } @@ -2391,7 +2394,7 @@ void Field_float::sql_type(String &res) const else { CHARSET_INFO *cs= res.charset(); - res.length(cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(), + res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "float(%d,%d)",(int) field_length,dec)); } add_zerofill_and_unsigned(res); @@ -2648,7 +2651,7 @@ void Field_double::sql_type(String &res) const } else { - res.length(cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(), + res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "double(%d,%d)",(int) field_length,dec)); } add_zerofill_and_unsigned(res); @@ -3281,7 +3284,7 @@ String *Field_year::val_str(String *val_buffer, void Field_year::sql_type(String &res) const { CHARSET_INFO *cs=res.charset(); - res.length(cs->snprintf(cs,(char*)res.ptr(),res.alloced_length(), + res.length(cs->cset->snprintf(cs,(char*)res.ptr(),res.alloced_length(), "year(%d)",(int) field_length)); } @@ -3898,7 +3901,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) { memcpy(ptr,from,length); if (length < field_length) - field_charset->fill(field_charset,ptr+length,field_length-length,' '); + field_charset->cset->fill(field_charset,ptr+length,field_length-length,' '); } else { @@ -3907,7 +3910,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) { // Check if we loosed some info const char *end=from+length; from+= field_length; - from+= field_charset->scan(field_charset, from, end, MY_SEQ_SPACES); + from+= field_charset->cset->scan(field_charset, from, end, MY_SEQ_SPACES); if (from != end) { set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED); @@ -3934,7 +3937,7 @@ int Field_string::store(longlong nr) char buff[64]; int l; CHARSET_INFO *cs=charset(); - l= (cs->longlong10_to_str)(cs,buff,sizeof(buff),-10,nr); + l= (cs->cset->longlong10_to_str)(cs,buff,sizeof(buff),-10,nr); return Field_string::store(buff,(uint)l,cs); } @@ -3977,11 +3980,11 @@ int Field_string::cmp(const char *a_ptr, const char *b_ptr) We have to remove end space to be able to compare multi-byte-characters like in latin_de 'ae' and 0xe4 */ - return field_charset->strnncollsp(field_charset, + return field_charset->coll->strnncollsp(field_charset, (const uchar*) a_ptr, field_length, (const uchar*) b_ptr, field_length); } - return field_charset->strnncoll(field_charset, + return field_charset->coll->strnncoll(field_charset, (const uchar*) a_ptr, field_length, (const uchar*) b_ptr, field_length); } @@ -3999,7 +4002,7 @@ void Field_string::sort_string(char *to,uint length) void Field_string::sql_type(String &res) const { CHARSET_INFO *cs=res.charset(); - ulong length= cs->snprintf(cs,(char*) res.ptr(), + ulong length= cs->cset->snprintf(cs,(char*) res.ptr(), res.alloced_length(), "%s(%d)", (field_length > 3 && (table->db_options_in_use & @@ -4112,7 +4115,7 @@ int Field_varstring::store(longlong nr) char buff[64]; int l; CHARSET_INFO *cs=charset(); - l= (cs->longlong10_to_str)(cs,buff,sizeof(buff),-10,nr); + l= (cs->cset->longlong10_to_str)(cs,buff,sizeof(buff),-10,nr); return Field_varstring::store(buff,(uint)l,cs); } @@ -4169,7 +4172,7 @@ void Field_varstring::sort_string(char *to,uint length) void Field_varstring::sql_type(String &res) const { CHARSET_INFO *cs=res.charset(); - ulong length= cs->snprintf(cs,(char*) res.ptr(), + ulong length= cs->cset->snprintf(cs,(char*) res.ptr(), res.alloced_length(),"varchar(%u)", field_length); res.length(length); diff --git a/sql/field.h b/sql/field.h index 7d4abbd1d41..3f3e32af285 100644 --- a/sql/field.h +++ b/sql/field.h @@ -788,7 +788,7 @@ public: enum ha_base_keytype key_type() const { return binary() ? HA_KEYTYPE_BINARY : HA_KEYTYPE_TEXT; } bool zero_pack() const { return 0; } - void reset(void) { charset()->fill(charset(),ptr,field_length,' '); } + void reset(void) { charset()->cset->fill(charset(),ptr,field_length,' '); } int store(const char *to,uint length,CHARSET_INFO *charset); int store(double nr); int store(longlong nr); diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 7392ef6c276..4f55357f288 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1491,7 +1491,7 @@ bool Item_func_in::nulls_in_row() static int srtcmp_in(const String *x,const String *y) { CHARSET_INFO *cs= x->charset(); - return cs->strnncollsp(cs, + return cs->coll->strnncollsp(cs, (unsigned char *) x->ptr(),x->length(), (unsigned char *) y->ptr(),y->length()); } @@ -1499,7 +1499,7 @@ static int srtcmp_in(const String *x,const String *y) static int bincmp_in(const String *x,const String *y) { CHARSET_INFO *cs= &my_charset_bin; - return cs->strnncollsp(cs, + return cs->coll->strnncollsp(cs, (unsigned char *) x->ptr(),x->length(), (unsigned char *) y->ptr(),y->length()); } diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index eb34c8691a3..ae48aeb115a 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1489,7 +1489,7 @@ String *Item_func_user::val_str(String *str) null_value=1; return 0; } - res_length=cs->snprintf(cs, (char*)str->ptr(), res_length, "%s@%s", + res_length=cs->cset->snprintf(cs, (char*)str->ptr(), res_length, "%s@%s", thd->user, host); str->length(res_length); str->set_charset(cs); @@ -2133,7 +2133,7 @@ String *Item_func_conv_charset3::val_str(String *str) while (1) { - cnvres=from_charset->mb_wc(from_charset,&wc,s,se); + cnvres=from_charset->cset->mb_wc(from_charset,&wc,s,se); if (cnvres>0) { s+=cnvres; @@ -2147,7 +2147,7 @@ String *Item_func_conv_charset3::val_str(String *str) break; outp: - cnvres=to_charset->wc_mb(to_charset,wc,d,de); + cnvres=to_charset->cset->wc_mb(to_charset,wc,d,de); if (cnvres>0) { d+=cnvres; diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 997247b6141..61c869cddba 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -511,7 +511,7 @@ void Item_func_curtime::fix_length_and_dec() (ulong) (((uint) start->tm_min)*100L+ (uint) start->tm_sec)); - buff_length=cs->snprintf(cs,buff,sizeof(buff),"%02d:%02d:%02d", + buff_length=cs->cset->snprintf(cs,buff,sizeof(buff),"%02d:%02d:%02d", (int) start->tm_hour, (int) start->tm_min, (int) start->tm_sec); @@ -543,7 +543,7 @@ void Item_func_now::fix_length_and_dec() (ulong) (((uint) start->tm_min)*100L+ (uint) start->tm_sec))); - buff_length= (uint) cs->snprintf(cs,buff, sizeof(buff), + buff_length= (uint) cs->cset->snprintf(cs,buff, sizeof(buff), "%04d-%02d-%02d %02d:%02d:%02d", ((int) (start->tm_year+1900)) % 10000, (int) start->tm_mon+1, @@ -950,7 +950,7 @@ String *Item_func_from_unixtime::val_str(String *str) l=20*cs->mbmaxlen+32; if (str->alloc(l)) return str; /* purecov: inspected */ - l=cs->snprintf(cs,(char*) str->ptr(),l,"%04d-%02d-%02d %02d:%02d:%02d", + l=cs->cset->snprintf(cs,(char*) str->ptr(),l,"%04d-%02d-%02d %02d:%02d:%02d", (int) start->tm_year+1900, (int) start->tm_mon+1, (int) start->tm_mday, @@ -1134,7 +1134,7 @@ String *Item_date_add_interval::val_str(String *str) l=11*cs->mbmaxlen+32; if (str->alloc(l)) goto null_date; - l=cs->snprintf(cs,(char*) str->ptr(),l,"%04d-%02d-%02d", + l=cs->cset->snprintf(cs,(char*) str->ptr(),l,"%04d-%02d-%02d", ltime.year,ltime.month,ltime.day); str->length(l); } @@ -1143,7 +1143,7 @@ String *Item_date_add_interval::val_str(String *str) l=20*cs->mbmaxlen+32; if (str->alloc(l)) goto null_date; - l=cs->snprintf(cs,(char*) str->ptr(),l,"%04d-%02d-%02d %02d:%02d:%02d", + l=cs->cset->snprintf(cs,(char*) str->ptr(),l,"%04d-%02d-%02d %02d:%02d:%02d", ltime.year,ltime.month,ltime.day, ltime.hour,ltime.minute,ltime.second); str->length(l); diff --git a/sql/sql_string.cc b/sql/sql_string.cc index 126fb84d6d9..6077c42bd1d 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -101,7 +101,7 @@ bool String::set(longlong num, CHARSET_INFO *cs) if (alloc(l)) return TRUE; - str_length=(uint32) (cs->longlong10_to_str)(cs,Ptr,l,-10,num); + str_length=(uint32) (cs->cset->longlong10_to_str)(cs,Ptr,l,-10,num); str_charset=cs; return FALSE; } @@ -112,7 +112,7 @@ bool String::set(ulonglong num, CHARSET_INFO *cs) if (alloc(l)) return TRUE; - str_length=(uint32) (cs->longlong10_to_str)(cs,Ptr,l,10,num); + str_length=(uint32) (cs->cset->longlong10_to_str)(cs,Ptr,l,10,num); str_charset=cs; return FALSE; } @@ -396,13 +396,13 @@ bool String::append(IO_CACHE* file, uint32 arg_length) uint32 String::numchars() { - return str_charset->numchars(str_charset, Ptr, Ptr+str_length); + return str_charset->cset->numchars(str_charset, Ptr, Ptr+str_length); } int String::charpos(int i,uint32 offset) { if (i<0) return i; - return str_charset->charpos(str_charset,Ptr+offset,Ptr+str_length,i); + return str_charset->cset->charpos(str_charset,Ptr+offset,Ptr+str_length,i); } int String::strstr(const String &s,uint32 offset) @@ -580,7 +580,7 @@ void String::qs_append(const char &c) int sortcmp(const String *x,const String *y, CHARSET_INFO *cs) { - return cs->strnncollsp(cs, + return cs->coll->strnncollsp(cs, (unsigned char *) x->ptr(),x->length(), (unsigned char *) y->ptr(),y->length()); } @@ -639,7 +639,7 @@ copy_and_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs, while (1) { - if ((cnvres=from_cs->mb_wc(from_cs, &wc, (uchar*) from, from_end)) > 0) + if ((cnvres=from_cs->cset->mb_wc(from_cs, &wc, (uchar*) from, from_end)) > 0) from+= cnvres; else if (cnvres == MY_CS_ILSEQ) { @@ -650,7 +650,7 @@ copy_and_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs, break; // Impossible char. outp: - if ((cnvres= to_cs->wc_mb(to_cs, wc, (uchar*) to, to_end)) > 0) + if ((cnvres= to_cs->cset->wc_mb(to_cs, wc, (uchar*) to, to_end)) > 0) to+= cnvres; else if (cnvres == MY_CS_ILUNI && wc != '?') { diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index ec723e8690a..3f7218b20fc 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -6226,6 +6226,42 @@ my_mb_wc_big5(CHARSET_INFO *cs __attribute__((unused)), return 2; } +static MY_COLLATION_HANDLER my_collation_big5_chinese_ci_handler = +{ + my_strnncoll_big5, + my_strnncollsp_big5, + my_strnxfrm_big5, + my_like_range_big5, + my_wildcmp_mb, + my_strcasecmp_mb, + my_hash_sort_simple +}; + +static MY_CHARSET_HANDLER my_charset_big5_handler= +{ + ismbchar_big5, + mbcharlen_big5, + my_numchars_mb, + my_charpos_mb, + my_mb_wc_big5, /* mb_wc */ + my_wc_mb_big5, /* wc_mb */ + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_snprintf_8bit, + my_long10_to_str_8bit, + my_longlong10_to_str_8bit, + my_fill_8bit, + + my_strntol_8bit, + my_strntoul_8bit, + my_strntoll_8bit, + my_strntoull_8bit, + my_strntod_8bit, + my_scan_8bit +}; + CHARSET_INFO my_charset_big5_chinese_ci = { 1,0,0, /* number */ @@ -6241,37 +6277,12 @@ CHARSET_INFO my_charset_big5_chinese_ci = NULL, /* tab_from_uni */ "","", 1, /* strxfrm_multiply */ - my_strnncoll_big5, - my_strnncollsp_big5, - my_strnxfrm_big5, - my_like_range_big5, - my_wildcmp_mb, 2, /* mbmaxlen */ - ismbchar_big5, - mbcharlen_big5, - my_numchars_mb, - my_charpos_mb, - my_mb_wc_big5, /* mb_wc */ - my_wc_mb_big5, /* wc_mb */ - my_caseup_str_mb, - my_casedn_str_mb, - my_caseup_mb, - my_casedn_mb, - my_strcasecmp_mb, - my_hash_sort_simple, 0, - my_snprintf_8bit, - my_long10_to_str_8bit, - my_longlong10_to_str_8bit, - my_fill_8bit, - - my_strntol_8bit, - my_strntoul_8bit, - my_strntoll_8bit, - my_strntoull_8bit, - my_strntod_8bit, - my_scan_8bit + &my_charset_big5_handler, + &my_collation_big5_chinese_ci_handler }; + #endif diff --git a/strings/ctype-bin.c b/strings/ctype-bin.c index 77152db845c..ebe73016db7 100644 --- a/strings/ctype-bin.c +++ b/strings/ctype-bin.c @@ -262,6 +262,42 @@ static int my_strnxfrm_bin(CHARSET_INFO *cs __attribute__((unused)), return len; } + +MY_COLLATION_HANDLER my_collation_bin_handler = +{ + my_strnncoll_binary, + my_strnncollsp_binary, + my_strnxfrm_bin, + my_like_range_simple, + my_wildcmp_bin, + my_strcasecmp_bin, + my_hash_sort_bin +}; + +static MY_CHARSET_HANDLER my_charset_handler= +{ + NULL, /* ismbchar */ + NULL, /* mbcharlen */ + my_numchars_8bit, + my_charpos_8bit, + my_mb_wc_bin, + my_wc_mb_bin, + my_caseup_str_bin, + my_casedn_str_bin, + my_caseup_bin, + my_casedn_bin, + my_snprintf_8bit, + my_long10_to_str_8bit, + my_longlong10_to_str_8bit, + my_fill_8bit, + my_strntol_8bit, + my_strntoul_8bit, + my_strntoll_8bit, + my_strntoull_8bit, + my_strntod_8bit, + my_scan_8bit +}; + CHARSET_INFO my_charset_bin = { 63,0,0, /* number */ @@ -277,33 +313,8 @@ CHARSET_INFO my_charset_bin = NULL, /* tab_from_uni */ "","", 0, /* strxfrm_multiply */ - my_strnncoll_binary, /* strnncoll */ - my_strnncollsp_binary, - my_strnxfrm_bin, /* strxnfrm */ - my_like_range_simple, /* like_range */ - my_wildcmp_bin, /* wildcmp */ 1, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* mbcharlen */ - my_numchars_8bit, - my_charpos_8bit, - my_mb_wc_bin, /* mb_wc */ - my_wc_mb_bin, /* wc_mb */ - my_caseup_str_bin, /* caseup_str */ - my_casedn_str_bin, /* casedn_str */ - my_caseup_bin, /* caseup */ - my_casedn_bin, /* casedn */ - my_strcasecmp_bin, /* strcasecmp */ - my_hash_sort_bin, /* hash_sort */ (char) 255, /* max_sort_char */ - my_snprintf_8bit, /* snprintf */ - my_long10_to_str_8bit, - my_longlong10_to_str_8bit, - my_fill_8bit, - my_strntol_8bit, - my_strntoul_8bit, - my_strntoll_8bit, - my_strntoull_8bit, - my_strntod_8bit, - my_scan_8bit + &my_charset_handler, + &my_collation_bin_handler }; diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c index 788cd96ad13..fc3ff137778 100644 --- a/strings/ctype-czech.c +++ b/strings/ctype-czech.c @@ -604,6 +604,16 @@ int my_strnncollsp_czech(CHARSET_INFO * cs, return my_strnncoll_czech(cs,s,slen,t,tlen); } +static MY_COLLATION_HANDLER my_collation_latin2_czech_ci_handler = +{ + my_strnncoll_czech, + my_strnncollsp_czech, + my_strnxfrm_czech, + my_like_range_czech, + my_wildcmp_8bit, + my_strcasecmp_8bit, + my_hash_sort_simple, +}; CHARSET_INFO my_charset_latin2_czech_ci = { @@ -620,37 +630,13 @@ CHARSET_INFO my_charset_latin2_czech_ci = idx_uni_8859_2, /* tab_from_uni */ "","", 4, /* strxfrm_multiply */ - my_strnncoll_czech, - my_strnncollsp_czech, - my_strnxfrm_czech, - my_like_range_czech, - my_wildcmp_8bit, 1, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* mbcharlen */ - my_numchars_8bit, - my_charpos_8bit, - my_mb_wc_8bit, /* mb_wc */ - my_wc_mb_8bit, /* wc_mb */ - my_caseup_str_8bit, - my_casedn_str_8bit, - my_caseup_8bit, - my_casedn_8bit, - my_strcasecmp_8bit, - my_hash_sort_simple, 0, - my_snprintf_8bit, - my_long10_to_str_8bit, - my_longlong10_to_str_8bit, - my_fill_8bit, - my_strntol_8bit, - my_strntoul_8bit, - my_strntoll_8bit, - my_strntoull_8bit, - my_strntod_8bit, - my_scan_8bit + &my_charset_8bit_handler, + &my_collation_latin2_czech_ci_handler }; + #endif #endif diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index 3bf689910e6..8c5b394cc1f 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -8634,6 +8634,43 @@ my_mb_wc_euc_kr(CHARSET_INFO *cs __attribute__((unused)), return 2; } + +static MY_COLLATION_HANDLER my_collation_ci_handler = +{ + my_strnncoll_simple,/* strnncoll */ + my_strnncollsp_simple, + my_strnxfrm_simple, /* strnxfrm */ + my_like_range_simple,/* like_range */ + my_wildcmp_mb, /* wildcmp */ + my_strcasecmp_mb, + my_hash_sort_simple, +}; + +static MY_CHARSET_HANDLER my_charset_handler= +{ + ismbchar_euc_kr, + mbcharlen_euc_kr, + my_numchars_mb, + my_charpos_mb, + my_mb_wc_euc_kr, /* mb_wc */ + my_wc_mb_euc_kr, /* wc_mb */ + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_snprintf_8bit, + my_long10_to_str_8bit, + my_longlong10_to_str_8bit, + my_fill_8bit, + my_strntol_8bit, + my_strntoul_8bit, + my_strntoll_8bit, + my_strntoull_8bit, + my_strntod_8bit, + my_scan_8bit +}; + + CHARSET_INFO my_charset_euckr_korean_ci = { 19,0,0, /* number */ @@ -8649,35 +8686,10 @@ CHARSET_INFO my_charset_euckr_korean_ci = NULL, /* tab_from_uni */ "","", 0, /* strxfrm_multiply */ - my_strnncoll_simple,/* strnncoll */ - my_strnncollsp_simple, - my_strnxfrm_simple, /* strnxfrm */ - my_like_range_simple,/* like_range */ - my_wildcmp_mb, /* wildcmp */ 2, /* mbmaxlen */ - ismbchar_euc_kr, - mbcharlen_euc_kr, - my_numchars_mb, - my_charpos_mb, - my_mb_wc_euc_kr, /* mb_wc */ - my_wc_mb_euc_kr, /* wc_mb */ - my_caseup_str_mb, - my_casedn_str_mb, - my_caseup_mb, - my_casedn_mb, - my_strcasecmp_mb, - my_hash_sort_simple, 0, - my_snprintf_8bit, - my_long10_to_str_8bit, - my_longlong10_to_str_8bit, - my_fill_8bit, - my_strntol_8bit, - my_strntoul_8bit, - my_strntoll_8bit, - my_strntoull_8bit, - my_strntod_8bit, - my_scan_8bit + &my_charset_handler, + &my_collation_ci_handler }; #endif diff --git a/strings/ctype-extra.c b/strings/ctype-extra.c index 40d2b7ab1da..55bfa09ea5f 100644 --- a/strings/ctype-extra.c +++ b/strings/ctype-extra.c @@ -32,35 +32,9 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* tab_from_uni */ "","", 0, - NULL, /* strnncoll */ - NULL, /* strnncollsp */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - NULL, /* wildcmp */ 0, - NULL, - NULL, - NULL, - NULL, - NULL, /* mb_wc */ - NULL, /* wc_mb */ - - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, /* hash_sort */ 0, NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, NULL } }; diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 20e1ce888e8..b3aa58bb38a 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -5684,6 +5684,43 @@ my_mb_wc_gb2312(CHARSET_INFO *cs __attribute__((unused)), return 2; } + +static MY_COLLATION_HANDLER my_collation_ci_handler = +{ + my_strnncoll_simple,/* strnncoll */ + my_strnncollsp_simple, + my_strnxfrm_simple, /* strnxfrm */ + my_like_range_simple,/* like_range */ + my_wildcmp_mb, /* wildcmp */ + my_strcasecmp_mb, + my_hash_sort_simple, +}; + +static MY_CHARSET_HANDLER my_charset_handler= +{ + ismbchar_gb2312, + mbcharlen_gb2312, + my_numchars_mb, + my_charpos_mb, + my_mb_wc_gb2312, /* mb_wc */ + my_wc_mb_gb2312, /* wc_mb */ + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_snprintf_8bit, + my_long10_to_str_8bit, + my_longlong10_to_str_8bit, + my_fill_8bit, + my_strntol_8bit, + my_strntoul_8bit, + my_strntoll_8bit, + my_strntoull_8bit, + my_strntod_8bit, + my_scan_8bit +}; + + CHARSET_INFO my_charset_gb2312_chinese_ci = { 24,0,0, /* number */ @@ -5699,35 +5736,10 @@ CHARSET_INFO my_charset_gb2312_chinese_ci = NULL, /* tab_from_uni */ "","", 0, /* strxfrm_multiply */ - my_strnncoll_simple,/* strnncoll */ - my_strnncollsp_simple, - my_strnxfrm_simple, /* strnxfrm */ - my_like_range_simple,/* like_range */ - my_wildcmp_mb, /* wildcmp */ 2, /* mbmaxlen */ - ismbchar_gb2312, - mbcharlen_gb2312, - my_numchars_mb, - my_charpos_mb, - my_mb_wc_gb2312, /* mb_wc */ - my_wc_mb_gb2312, /* wc_mb */ - my_caseup_str_mb, - my_casedn_str_mb, - my_caseup_mb, - my_casedn_mb, - my_strcasecmp_mb, - my_hash_sort_simple, 0, - my_snprintf_8bit, - my_long10_to_str_8bit, - my_longlong10_to_str_8bit, - my_fill_8bit, - my_strntol_8bit, - my_strntoul_8bit, - my_strntoll_8bit, - my_strntoull_8bit, - my_strntod_8bit, - my_scan_8bit + &my_charset_handler, + &my_collation_ci_handler }; #endif diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index ec0cc01881b..9d249143db8 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -9881,6 +9881,43 @@ my_mb_wc_gbk(CHARSET_INFO *cs __attribute__((unused)), } + +static MY_COLLATION_HANDLER my_collation_ci_handler = +{ + my_strnncoll_gbk, + my_strnncollsp_gbk, + my_strnxfrm_gbk, + my_like_range_gbk, + my_wildcmp_mb, + my_strcasecmp_mb, + my_hash_sort_simple, +}; + +static MY_CHARSET_HANDLER my_charset_handler= +{ + ismbchar_gbk, + mbcharlen_gbk, + my_numchars_mb, + my_charpos_mb, + my_mb_wc_gbk, + my_wc_mb_gbk, + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_snprintf_8bit, + my_long10_to_str_8bit, + my_longlong10_to_str_8bit, + my_fill_8bit, + my_strntol_8bit, + my_strntoul_8bit, + my_strntoll_8bit, + my_strntoull_8bit, + my_strntod_8bit, + my_scan_8bit +}; + + CHARSET_INFO my_charset_gbk_chinese_ci = { 28,0,0, /* number */ @@ -9896,35 +9933,10 @@ CHARSET_INFO my_charset_gbk_chinese_ci = NULL, /* tab_from_uni */ "","", 1, /* strxfrm_multiply */ - my_strnncoll_gbk, - my_strnncollsp_gbk, - my_strnxfrm_gbk, - my_like_range_gbk, - my_wildcmp_mb, /* wildcmp */ 2, /* mbmaxlen */ - ismbchar_gbk, - mbcharlen_gbk, - my_numchars_mb, - my_charpos_mb, - my_mb_wc_gbk, /* mb_wc */ - my_wc_mb_gbk, /* wc_mb */ - my_caseup_str_mb, - my_casedn_str_mb, - my_caseup_mb, - my_casedn_mb, - my_strcasecmp_mb, - my_hash_sort_simple, 0, - my_snprintf_8bit, - my_long10_to_str_8bit, - my_longlong10_to_str_8bit, - my_fill_8bit, - my_strntol_8bit, - my_strntoul_8bit, - my_strntoll_8bit, - my_strntoull_8bit, - my_strntod_8bit, - my_scan_8bit + &my_charset_handler, + &my_collation_ci_handler }; diff --git a/strings/ctype-latin1.c b/strings/ctype-latin1.c index 4340d0973aa..5ac60326e62 100644 --- a/strings/ctype-latin1.c +++ b/strings/ctype-latin1.c @@ -174,6 +174,30 @@ int my_wc_mb_latin1(CHARSET_INFO *cs __attribute__((unused)), return ((wc < 256) && ((str[0]=uni_latin1[wc]) || (!wc))) ? 1 : MY_CS_ILUNI; } +static MY_CHARSET_HANDLER my_charset_handler= +{ + NULL, + NULL, + my_numchars_8bit, + my_charpos_8bit, + my_mb_wc_latin1, + my_wc_mb_latin1, + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_snprintf_8bit, + my_long10_to_str_8bit, + my_longlong10_to_str_8bit, + my_fill_8bit, + my_strntol_8bit, + my_strntoul_8bit, + my_strntoll_8bit, + my_strntoull_8bit, + my_strntod_8bit, + my_scan_8bit +}; + CHARSET_INFO my_charset_latin1 = { @@ -190,35 +214,10 @@ CHARSET_INFO my_charset_latin1 = NULL, /* tab_from_uni */ "","", 0, /* strxfrm_multiply */ - my_strnncoll_simple, - my_strnncollsp_simple, - my_strnxfrm_simple, - my_like_range_simple, - my_wildcmp_8bit, /* wildcmp */ 1, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* mbcharlen */ - my_numchars_8bit, - my_charpos_8bit, - my_mb_wc_latin1, /* mb_wc */ - my_wc_mb_latin1, /* wc_mb */ - my_caseup_str_8bit, - my_casedn_str_8bit, - my_caseup_8bit, - my_casedn_8bit, - my_strcasecmp_8bit, - my_hash_sort_simple, 0, - my_snprintf_8bit, - my_long10_to_str_8bit, - my_longlong10_to_str_8bit, - my_fill_8bit, - my_strntol_8bit, - my_strntoul_8bit, - my_strntoll_8bit, - my_strntoull_8bit, - my_strntod_8bit, - my_scan_8bit + &my_charset_handler, + &my_collation_8bit_simple_ci_handler }; @@ -428,6 +427,19 @@ static int my_strnxfrm_latin1_de(CHARSET_INFO *cs __attribute__((unused)), return dest - dest_orig; } + +static MY_COLLATION_HANDLER my_collation_german2_ci_handler = +{ + my_strnncoll_latin1_de, + my_strnncollsp_latin1_de, + my_strnxfrm_latin1_de, + my_like_range_simple, + my_wildcmp_8bit, + my_strcasecmp_8bit, + my_hash_sort_simple +}; + + CHARSET_INFO my_charset_latin1_german2_ci = { 31,0,0, /* number */ @@ -443,34 +455,9 @@ CHARSET_INFO my_charset_latin1_german2_ci = NULL, /* tab_from_uni */ "","", 2, /* strxfrm_multiply */ - my_strnncoll_latin1_de, - my_strnncollsp_latin1_de, - my_strnxfrm_latin1_de, - my_like_range_simple, - my_wildcmp_8bit, /* wildcmp */ 1, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* mbcharlen */ - my_numchars_8bit, - my_charpos_8bit, - my_mb_wc_latin1, /* mb_wc */ - my_wc_mb_latin1, /* wc_mb */ - my_caseup_str_8bit, - my_casedn_str_8bit, - my_caseup_8bit, - my_casedn_8bit, - my_strcasecmp_8bit, - my_hash_sort_simple, 0, - my_snprintf_8bit, - my_long10_to_str_8bit, - my_longlong10_to_str_8bit, - my_fill_8bit, - my_strntol_8bit, - my_strntoul_8bit, - my_strntoll_8bit, - my_strntoull_8bit, - my_strntod_8bit, - my_scan_8bit + &my_charset_handler, + &my_collation_german2_ci_handler }; diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index 7d8f5b9535b..8f3e66f782e 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -1019,3 +1019,38 @@ uint my_charpos_8bit(CHARSET_INFO *cs __attribute__((unused)), { return pos; } + +MY_CHARSET_HANDLER my_charset_8bit_handler= +{ + NULL, /* ismbchar */ + NULL, /* mbcharlen */ + my_numchars_8bit, + my_charpos_8bit, + my_mb_wc_8bit, + my_wc_mb_8bit, + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_snprintf_8bit, + my_long10_to_str_8bit, + my_longlong10_to_str_8bit, + my_fill_8bit, + my_strntol_8bit, + my_strntoul_8bit, + my_strntoll_8bit, + my_strntoull_8bit, + my_strntod_8bit, + my_scan_8bit +}; + +MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler = +{ + my_strnncoll_simple, + my_strnncollsp_simple, + my_strnxfrm_simple, + my_like_range_simple, + my_wildcmp_8bit, + my_strcasecmp_8bit, + my_hash_sort_simple +}; diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index 058558fa419..3e33fb3810a 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -4468,6 +4468,43 @@ my_mb_wc_sjis(CHARSET_INFO *cs __attribute__((unused)), return 2; } + +static MY_COLLATION_HANDLER my_collation_ci_handler = +{ + my_strnncoll_sjis, + my_strnncollsp_sjis, + my_strnxfrm_sjis, + my_like_range_sjis, + my_wildcmp_mb, /* wildcmp */ + my_strcasecmp_8bit, + my_hash_sort_simple, +}; + +static MY_CHARSET_HANDLER my_charset_handler= +{ + ismbchar_sjis, + mbcharlen_sjis, + my_numchars_mb, + my_charpos_mb, + my_mb_wc_sjis, /* mb_wc */ + my_wc_mb_sjis, /* wc_mb */ + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_snprintf_8bit, + my_long10_to_str_8bit, + my_longlong10_to_str_8bit, + my_fill_8bit, + my_strntol_8bit, + my_strntoul_8bit, + my_strntoll_8bit, + my_strntoull_8bit, + my_strntod_8bit, + my_scan_8bit +}; + + CHARSET_INFO my_charset_sjis_japanese_ci = { 13,0,0, /* number */ @@ -4483,35 +4520,11 @@ CHARSET_INFO my_charset_sjis_japanese_ci = NULL, /* tab_from_uni */ "","", 1, /* strxfrm_multiply */ - my_strnncoll_sjis, - my_strnncollsp_sjis, - my_strnxfrm_sjis, - my_like_range_sjis, - my_wildcmp_mb, /* wildcmp */ 2, /* mbmaxlen */ - ismbchar_sjis, - mbcharlen_sjis, - my_numchars_mb, - my_charpos_mb, - my_mb_wc_sjis, /* mb_wc */ - my_wc_mb_sjis, /* wc_mb */ - my_caseup_str_8bit, - my_casedn_str_8bit, - my_caseup_8bit, - my_casedn_8bit, - my_strcasecmp_8bit, - my_hash_sort_simple, 0, - my_snprintf_8bit, - my_long10_to_str_8bit, - my_longlong10_to_str_8bit, - my_fill_8bit, - my_strntol_8bit, - my_strntoul_8bit, - my_strntoll_8bit, - my_strntoull_8bit, - my_strntod_8bit, - my_scan_8bit + &my_charset_handler, + &my_collation_ci_handler + }; #endif diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index 9fcecdfdffd..8574b3d7d84 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -688,27 +688,19 @@ void ThNormalize(uchar* ptr, uint field_length, const uchar* from, uint length) } -CHARSET_INFO my_charset_tis620_thai_ci = +static MY_COLLATION_HANDLER my_collation_ci_handler = { - 18,0,0, /* number */ - MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */ - "tis620", /* cs name */ - "tis620_thai_ci", /* name */ - "", /* comment */ - ctype_tis620, - to_lower_tis620, - to_upper_tis620, - sort_order_tis620, - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - "","", - 4, /* strxfrm_multiply */ my_strnncoll_tis620, my_strnncollsp_tis620, my_strnxfrm_tis620, my_like_range_tis620, my_wildcmp_8bit, /* wildcmp */ - 1, /* mbmaxlen */ + my_strcasecmp_8bit, + my_hash_sort_simple, +}; + +static MY_CHARSET_HANDLER my_charset_handler= +{ NULL, /* ismbchar */ NULL, /* mbcharlen */ my_numchars_8bit, @@ -719,9 +711,6 @@ CHARSET_INFO my_charset_tis620_thai_ci = my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, - my_strcasecmp_8bit, - my_hash_sort_simple, - 0, my_snprintf_8bit, my_long10_to_str_8bit, my_longlong10_to_str_8bit, @@ -735,4 +724,27 @@ CHARSET_INFO my_charset_tis620_thai_ci = }; + +CHARSET_INFO my_charset_tis620_thai_ci = +{ + 18,0,0, /* number */ + MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */ + "tis620", /* cs name */ + "tis620_thai_ci", /* name */ + "", /* comment */ + ctype_tis620, + to_lower_tis620, + to_upper_tis620, + sort_order_tis620, + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + "","", + 4, /* strxfrm_multiply */ + 1, /* mbmaxlen */ + 0, + &my_charset_handler, + &my_collation_ci_handler +}; + + #endif diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index dae0632f754..3e3981f1be9 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -403,7 +403,7 @@ long my_strntol_ucs2(CHARSET_INFO *cs, *err= 0; do { - if ((cnv=cs->mb_wc(cs,&wc,s,e))>0) + if ((cnv=cs->cset->mb_wc(cs,&wc,s,e))>0) { switch (wc) { @@ -438,7 +438,7 @@ bs: cutlim = (uint) (((ulong)~0L) % (unsigned long int) base); do { - if ((cnv=cs->mb_wc(cs,&wc,s,e))>0) + if ((cnv=cs->cset->mb_wc(cs,&wc,s,e))>0) { s+=cnv; if ( wc>='0' && wc<='9') @@ -518,7 +518,7 @@ ulong my_strntoul_ucs2(CHARSET_INFO *cs, *err= 0; do { - if ((cnv=cs->mb_wc(cs,&wc,s,e))>0) + if ((cnv=cs->cset->mb_wc(cs,&wc,s,e))>0) { switch (wc) { @@ -554,7 +554,7 @@ bs: do { - if ((cnv=cs->mb_wc(cs,&wc,s,e))>0) + if ((cnv=cs->cset->mb_wc(cs,&wc,s,e))>0) { s+=cnv; if ( wc>='0' && wc<='9') @@ -628,7 +628,7 @@ longlong my_strntoll_ucs2(CHARSET_INFO *cs, *err= 0; do { - if ((cnv=cs->mb_wc(cs,&wc,s,e))>0) + if ((cnv=cs->cset->mb_wc(cs,&wc,s,e))>0) { switch (wc) { @@ -663,7 +663,7 @@ bs: cutlim = (uint) ((~(ulonglong) 0) % (unsigned long int) base); do { - if ((cnv=cs->mb_wc(cs,&wc,s,e))>0) + if ((cnv=cs->cset->mb_wc(cs,&wc,s,e))>0) { s+=cnv; if ( wc>='0' && wc<='9') @@ -745,7 +745,7 @@ ulonglong my_strntoull_ucs2(CHARSET_INFO *cs, *err= 0; do { - if ((cnv=cs->mb_wc(cs,&wc,s,e))>0) + if ((cnv=cs->cset->mb_wc(cs,&wc,s,e))>0) { switch (wc) { @@ -781,7 +781,7 @@ bs: do { - if ((cnv=cs->mb_wc(cs,&wc,s,e))>0) + if ((cnv=cs->cset->mb_wc(cs,&wc,s,e))>0) { s+=cnv; if ( wc>='0' && wc<='9') @@ -853,7 +853,7 @@ double my_strntod_ucs2(CHARSET_INFO *cs __attribute__((unused)), length= sizeof(buf)-1; end= s+length; - while ((cnv=cs->mb_wc(cs,&wc,s,end)) > 0) + while ((cnv=cs->cset->mb_wc(cs,&wc,s,end)) > 0) { s+=cnv; if (wc > (int) (uchar) 'e' || !wc) @@ -913,7 +913,7 @@ int my_l10tostr_ucs2(CHARSET_INFO *cs, for ( db=dst, de=dst+len ; (dst<de) && *p ; p++) { - int cnvres=cs->wc_mb(cs,(my_wc_t)p[0],(uchar*) dst, (uchar*) de); + int cnvres=cs->cset->wc_mb(cs,(my_wc_t)p[0],(uchar*) dst, (uchar*) de); if (cnvres>0) dst+=cnvres; else @@ -972,7 +972,7 @@ cnv: for ( db=dst, de=dst+len ; (dst<de) && *p ; p++) { - int cnvres=cs->wc_mb(cs, (my_wc_t) p[0], (uchar*) dst, (uchar*) de); + int cnvres=cs->cset->wc_mb(cs, (my_wc_t) p[0], (uchar*) dst, (uchar*) de); if (cnvres>0) dst+=cnvres; else @@ -997,27 +997,20 @@ uint my_charpos_ucs2(CHARSET_INFO *cs __attribute__((unused)), return pos*2; } -CHARSET_INFO my_charset_ucs2_general_ci = + +static MY_COLLATION_HANDLER my_collation_ci_handler = { - 35,0,0, /* number */ - MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE, /* state */ - "ucs2", /* cs name */ - "ucs2_general_ci", /* name */ - "", /* comment */ - ctype_ucs2, /* ctype */ - to_lower_ucs2, /* to_lower */ - to_upper_ucs2, /* to_upper */ - to_upper_ucs2, /* sort_order */ - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - "","", - 1, /* strxfrm_multiply */ - my_strnncoll_ucs2, /* strnncoll */ my_strnncoll_ucs2, - my_strnxfrm_ucs2, /* strnxfrm */ - my_like_range_simple,/* like_range */ - my_wildcmp_mb, /* wildcmp */ - 2, /* mbmaxlen */ + my_strnncoll_ucs2, + my_strnxfrm_ucs2, + my_like_range_simple, + my_wildcmp_mb, + my_strcasecmp_ucs2, + my_hash_sort_ucs2 +}; + +static MY_CHARSET_HANDLER my_charset_handler= +{ my_ismbchar_ucs2, /* ismbchar */ my_mbcharlen_ucs2, /* mbcharlen */ my_numchars_ucs2, @@ -1028,9 +1021,6 @@ CHARSET_INFO my_charset_ucs2_general_ci = my_casedn_str_ucs2, my_caseup_ucs2, my_casedn_ucs2, - my_strcasecmp_ucs2, - my_hash_sort_ucs2, /* hash_sort */ - 0, my_snprintf_ucs2, my_l10tostr_ucs2, my_ll10tostr_ucs2, @@ -1044,4 +1034,27 @@ CHARSET_INFO my_charset_ucs2_general_ci = }; + +CHARSET_INFO my_charset_ucs2_general_ci = +{ + 35,0,0, /* number */ + MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE, /* state */ + "ucs2", /* cs name */ + "ucs2_general_ci", /* name */ + "", /* comment */ + ctype_ucs2, /* ctype */ + to_lower_ucs2, /* to_lower */ + to_upper_ucs2, /* to_upper */ + to_upper_ucs2, /* sort_order */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + "","", + 1, /* strxfrm_multiply */ + 2, /* mbmaxlen */ + 0, + &my_charset_handler, + &my_collation_ci_handler +}; + + #endif diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 76c69637906..bf81269059c 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -8425,27 +8425,20 @@ my_wc_mb_euc_jp(CHARSET_INFO *c,my_wc_t wc, unsigned char *s, unsigned char *e) return MY_CS_ILUNI; } -CHARSET_INFO my_charset_ujis_japanese_ci = + +static MY_COLLATION_HANDLER my_collation_ci_handler = { - 12,0,0, /* number */ - MY_CS_COMPILED|MY_CS_PRIMARY, /* state */ - "ujis", /* cs name */ - "ujis_japanese_ci", /* name */ - "", /* comment */ - ctype_ujis, - to_lower_ujis, - to_upper_ujis, - sort_order_ujis, - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - "","", - 0, /* strxfrm_multiply */ my_strnncoll_simple,/* strnncoll */ my_strnncollsp_simple, my_strnxfrm_simple, /* strnxfrm */ my_like_range_simple,/* like_range */ my_wildcmp_mb, /* wildcmp */ - 3, /* mbmaxlen */ + my_strcasecmp_mb, + my_hash_sort_simple, +}; + +static MY_CHARSET_HANDLER my_charset_handler= +{ ismbchar_ujis, mbcharlen_ujis, my_numchars_mb, @@ -8456,9 +8449,6 @@ CHARSET_INFO my_charset_ujis_japanese_ci = my_casedn_str_mb, my_caseup_mb, my_casedn_mb, - my_strcasecmp_mb, - my_hash_sort_simple, - 0, my_snprintf_8bit, my_long10_to_str_8bit, my_longlong10_to_str_8bit, @@ -8472,4 +8462,27 @@ CHARSET_INFO my_charset_ujis_japanese_ci = }; + +CHARSET_INFO my_charset_ujis_japanese_ci = +{ + 12,0,0, /* number */ + MY_CS_COMPILED|MY_CS_PRIMARY, /* state */ + "ujis", /* cs name */ + "ujis_japanese_ci", /* name */ + "", /* comment */ + ctype_ujis, + to_lower_ujis, + to_upper_ujis, + sort_order_ujis, + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + "","", + 0, /* strxfrm_multiply */ + 3, /* mbmaxlen */ + 0, + &my_charset_handler, + &my_collation_ci_handler +}; + + #endif diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 9f08ca2e169..16e42385300 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -1950,40 +1950,30 @@ static int my_mbcharlen_utf8(CHARSET_INFO *cs __attribute__((unused)) , uint c) return 0; /* Illegal mb head */; } -CHARSET_INFO my_charset_utf8_general_ci = + +static MY_COLLATION_HANDLER my_collation_ci_handler = { - 33,0,0, /* number */ - MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE, /* state */ - "utf8", /* cs name */ - "utf8_general_ci", /* name */ - "", /* comment */ - ctype_utf8, /* ctype */ - to_lower_utf8, /* to_lower */ - to_upper_utf8, /* to_upper */ - to_upper_utf8, /* sort_order */ - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - "","", - 1, /* strxfrm_multiply */ - my_strnncoll_utf8, /* strnncoll */ + my_strnncoll_utf8, my_strnncollsp_utf8, - my_strnxfrm_utf8, /* strnxfrm */ - my_like_range_simple,/* like_range */ - my_wildcmp_mb, /* wildcmp */ - 3, /* mbmaxlen */ - my_ismbchar_utf8, /* ismbchar */ - my_mbcharlen_utf8, /* mbcharlen */ + my_strnxfrm_utf8, + my_like_range_simple, + my_wildcmp_mb, + my_strcasecmp_utf8, + my_hash_sort_utf8 +}; + +static MY_CHARSET_HANDLER my_charset_handler= +{ + my_ismbchar_utf8, + my_mbcharlen_utf8, my_numchars_mb, my_charpos_mb, - my_utf8_uni, /* mb_wc */ - my_uni_utf8, /* wc_mb */ + my_utf8_uni, + my_uni_utf8, my_caseup_str_utf8, my_casedn_str_utf8, my_caseup_utf8, my_casedn_utf8, - my_strcasecmp_utf8, - my_hash_sort_utf8, /* hash_sort */ - 0, my_snprintf_8bit, my_long10_to_str_8bit, my_longlong10_to_str_8bit, @@ -1997,6 +1987,29 @@ CHARSET_INFO my_charset_utf8_general_ci = }; + +CHARSET_INFO my_charset_utf8_general_ci = +{ + 33,0,0, /* number */ + MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE, /* state */ + "utf8", /* cs name */ + "utf8_general_ci", /* name */ + "", /* comment */ + ctype_utf8, /* ctype */ + to_lower_utf8, /* to_lower */ + to_upper_utf8, /* to_upper */ + to_upper_utf8, /* sort_order */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + "","", + 1, /* strxfrm_multiply */ + 3, /* mbmaxlen */ + 0, + &my_charset_handler, + &my_collation_ci_handler +}; + + #ifdef MY_TEST_UTF8 #include <stdio.h> diff --git a/strings/ctype-win1250ch.c b/strings/ctype-win1250ch.c index 87ba58d0553..af4faca46e1 100644 --- a/strings/ctype-win1250ch.c +++ b/strings/ctype-win1250ch.c @@ -640,6 +640,17 @@ static my_bool my_like_range_win1250ch(CHARSET_INFO *cs __attribute__((unused)), } +static MY_COLLATION_HANDLER my_collation_czech_ci_handler = +{ + my_strnncoll_win1250ch, + my_strnncollsp_win1250ch, + my_strnxfrm_win1250ch, + my_like_range_win1250ch, + my_wildcmp_8bit, + my_strcasecmp_8bit, + my_hash_sort_simple +}; + CHARSET_INFO my_charset_cp1250_czech_ci = { 34,0,0, /* number */ @@ -655,35 +666,10 @@ CHARSET_INFO my_charset_cp1250_czech_ci = idx_uni_cp1250, /* tab_from_uni */ "","", 2, /* strxfrm_multiply */ - my_strnncoll_win1250ch, - my_strnncollsp_win1250ch, - my_strnxfrm_win1250ch, - my_like_range_win1250ch, - my_wildcmp_8bit, /* wildcmp */ 1, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* mbcharlen */ - my_numchars_8bit, - my_charpos_8bit, - my_mb_wc_8bit, /* mb_wc */ - my_wc_mb_8bit, /* wc_mb */ - my_caseup_str_8bit, - my_casedn_str_8bit, - my_caseup_8bit, - my_casedn_8bit, - my_strcasecmp_8bit, - my_hash_sort_simple, 0, - my_snprintf_8bit, - my_long10_to_str_8bit, - my_longlong10_to_str_8bit, - my_fill_8bit, - my_strntol_8bit, - my_strntoul_8bit, - my_strntoll_8bit, - my_strntoull_8bit, - my_strntod_8bit, - my_scan_8bit + &my_charset_8bit_handler, + &my_collation_czech_ci_handler }; |