120
static void simple_cs_init_functions(CHARSET_INFO *cs)
122
if (cs->state & MY_CS_BINSORT)
123
cs->coll= &my_collation_8bit_bin_handler;
125
cs->coll= &my_collation_8bit_simple_ci_handler;
127
cs->cset= &my_charset_8bit_handler;
132
static int cs_copy_data(CHARSET_INFO *to, CHARSET_INFO *from)
134
to->number= from->number ? from->number : to->number;
137
if (!(to->csname= my_once_strdup(from->csname,MYF(MY_WME))))
141
if (!(to->name= my_once_strdup(from->name,MYF(MY_WME))))
145
if (!(to->comment= my_once_strdup(from->comment,MYF(MY_WME))))
150
if (!(to->ctype= (uchar*) my_once_memdup((char*) from->ctype,
151
MY_CS_CTYPE_TABLE_SIZE,
154
if (init_state_maps(to))
158
if (!(to->to_lower= (uchar*) my_once_memdup((char*) from->to_lower,
159
MY_CS_TO_LOWER_TABLE_SIZE,
164
if (!(to->to_upper= (uchar*) my_once_memdup((char*) from->to_upper,
165
MY_CS_TO_UPPER_TABLE_SIZE,
168
if (from->sort_order)
170
if (!(to->sort_order= (uchar*) my_once_memdup((char*) from->sort_order,
171
MY_CS_SORT_ORDER_TABLE_SIZE,
176
if (from->tab_to_uni)
178
uint sz= MY_CS_TO_UNI_TABLE_SIZE*sizeof(uint16_t);
179
if (!(to->tab_to_uni= (uint16_t*) my_once_memdup((char*)from->tab_to_uni,
184
if (!(to->tailoring= my_once_strdup(from->tailoring,MYF(MY_WME))))
195
static bool simple_cs_is_full(CHARSET_INFO *cs)
197
return ((cs->csname && cs->tab_to_uni && cs->ctype && cs->to_upper &&
199
(cs->number && cs->name &&
200
(cs->sort_order || (cs->state & MY_CS_BINSORT) )));
205
copy_uca_collation(CHARSET_INFO *to, CHARSET_INFO *from)
207
to->cset= from->cset;
208
to->coll= from->coll;
209
to->strxfrm_multiply= from->strxfrm_multiply;
210
to->min_sort_char= from->min_sort_char;
211
to->max_sort_char= from->max_sort_char;
212
to->mbminlen= from->mbminlen;
213
to->mbmaxlen= from->mbmaxlen;
217
static int add_collation(CHARSET_INFO *cs)
219
if (cs->name && (cs->number ||
220
(cs->number=get_collation_number_internal(cs->name))))
222
if (!all_charsets[cs->number])
224
if (!(all_charsets[cs->number]=
225
(CHARSET_INFO*) my_once_alloc(sizeof(CHARSET_INFO),MYF(0))))
227
memset(all_charsets[cs->number], 0, sizeof(CHARSET_INFO));
230
if (cs->primary_number == cs->number)
231
cs->state |= MY_CS_PRIMARY;
233
if (cs->binary_number == cs->number)
234
cs->state |= MY_CS_BINSORT;
236
all_charsets[cs->number]->state|= cs->state;
238
if (!(all_charsets[cs->number]->state & MY_CS_COMPILED))
240
CHARSET_INFO *newcs= all_charsets[cs->number];
241
if (cs_copy_data(all_charsets[cs->number],cs))
244
newcs->levels_for_compare= 1;
245
newcs->levels_for_order= 1;
247
if (!strcmp(cs->csname,"ucs2") )
249
#if defined(HAVE_CHARSET_ucs2) && defined(HAVE_UCA_COLLATIONS)
250
copy_uca_collation(newcs, &my_charset_ucs2_unicode_ci);
251
newcs->state|= MY_CS_AVAILABLE | MY_CS_LOADED | MY_CS_NONASCII;
254
else if (!strcmp(cs->csname, "utf8"))
256
#if defined (HAVE_CHARSET_utf8mb3) && defined(HAVE_UCA_COLLATIONS)
257
copy_uca_collation(newcs, &my_charset_utf8mb4_unicode_ci);
258
newcs->state|= MY_CS_AVAILABLE | MY_CS_LOADED;
261
else if (!strcmp(cs->csname, "utf8mb3"))
263
#if defined (HAVE_CHARSET_utf8mb3) && defined(HAVE_UCA_COLLATIONS)
264
copy_uca_collation(newcs, &my_charset_utf8mb3_unicode_ci);
265
newcs->state|= MY_CS_AVAILABLE | MY_CS_LOADED;
268
else if (!strcmp(cs->csname, "utf16"))
270
#if defined (HAVE_CHARSET_utf16) && defined(HAVE_UCA_COLLATIONS)
271
copy_uca_collation(newcs, &my_charset_utf16_unicode_ci);
272
newcs->state|= MY_CS_AVAILABLE | MY_CS_LOADED | MY_CS_NONASCII;
275
else if (!strcmp(cs->csname, "utf32"))
277
#if defined (HAVE_CHARSET_utf32) && defined(HAVE_UCA_COLLATIONS)
278
copy_uca_collation(newcs, &my_charset_utf32_unicode_ci);
279
newcs->state|= MY_CS_AVAILABLE | MY_CS_LOADED | MY_CS_NONASCII;
284
uchar *sort_order= all_charsets[cs->number]->sort_order;
285
simple_cs_init_functions(all_charsets[cs->number]);
288
if (simple_cs_is_full(all_charsets[cs->number]))
290
all_charsets[cs->number]->state |= MY_CS_LOADED;
292
all_charsets[cs->number]->state|= MY_CS_AVAILABLE;
295
Check if case sensitive sort order: A < a < B.
296
We need MY_CS_FLAG for regex library, and for
297
case sensitivity flag for 5.0 client protocol,
298
to support isCaseSensitive() method in JDBC driver
300
if (sort_order && sort_order['A'] < sort_order['a'] &&
301
sort_order['a'] < sort_order['B'])
302
all_charsets[cs->number]->state|= MY_CS_CSSORT;
304
if (my_charset_is_8bit_pure_ascii(all_charsets[cs->number]))
305
all_charsets[cs->number]->state|= MY_CS_PUREASCII;
306
if (!my_charset_is_ascii_compatible(cs))
307
all_charsets[cs->number]->state|= MY_CS_NONASCII;
313
We need the below to make get_charset_name()
314
and get_charset_number() working even if a
315
character set has not been really incompiled.
316
The above functions are used for example
317
in error message compiler extra/comp_err.c.
318
If a character set was compiled, this information
319
will get lost and overwritten in add_compiled_collation().
321
CHARSET_INFO *dst= all_charsets[cs->number];
322
dst->number= cs->number;
324
if (!(dst->comment= my_once_strdup(cs->comment,MYF(MY_WME))))
326
if (cs->csname && !dst->csname)
327
if (!(dst->csname= my_once_strdup(cs->csname,MYF(MY_WME))))
329
if (cs->name && !dst->name)
330
if (!(dst->name= my_once_strdup(cs->name,MYF(MY_WME))))
334
cs->primary_number= 0;
335
cs->binary_number= 0;
338
cs->sort_order= NULL;
345
119
#define MY_MAX_ALLOWED_BUF 1024*1024
346
120
#define MY_CHARSET_INDEX "Index.xml"