From: Alexander Nozdrin Date: October 4 2009 11:30am Subject: bzr push into mysql-5.4.5-next-mr branch (alik:2887) List-Archive: http://lists.mysql.com/commits/85677 Message-Id: <20091004113023.95B2D7FCA0@quad> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_AF0/ZMsHLvblQ18Mnc6R6g)" --Boundary_(ID_AF0/ZMsHLvblQ18Mnc6R6g) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline 2887 Alexander Nozdrin 2009-10-04 [merge] Merge from mysql-next-mr. === modified file 'include/m_ctype.h' --- a/include/m_ctype.h 2009-06-10 08:59:49 +0000 +++ b/include/m_ctype.h 2009-09-30 05:09:28 +0000 @@ -87,6 +87,7 @@ extern MY_UNI_CTYPE my_uni_ctype[256]; #define MY_CS_CSSORT 1024 /* if case sensitive sort order */ #define MY_CS_HIDDEN 2048 /* don't display in SHOW */ #define MY_CS_PUREASCII 4096 /* if a charset is pure ascii */ +#define MY_CS_NONASCII 8192 /* if not ASCII-compatible */ #define MY_CHARSET_UNDEFINED 0 /* Character repertoire flags */ @@ -474,6 +475,7 @@ my_bool my_charset_is_ascii_based(CHARSE my_bool my_charset_is_8bit_pure_ascii(CHARSET_INFO *cs); uint my_charset_repertoire(CHARSET_INFO *cs); +my_bool my_charset_is_ascii_compatible(CHARSET_INFO *cs); #define _MY_U 01 /* Upper case */ #define _MY_L 02 /* Lower case */ === modified file 'libmysqld/lib_sql.cc' --- a/libmysqld/lib_sql.cc 2009-09-10 09:18:29 +0000 +++ b/libmysqld/lib_sql.cc 2009-09-30 05:09:28 +0000 @@ -1175,3 +1175,27 @@ int vprint_msg_to_log(enum loglevel leve mysql_server_last_errno= CR_UNKNOWN_ERROR; return 0; } + + +bool Protocol::net_store_data(const uchar *from, size_t length, + CHARSET_INFO *from_cs, CHARSET_INFO *to_cs) +{ + uint conv_length= to_cs->mbmaxlen * length / from_cs->mbminlen; + uint dummy_error; + char *field_buf; + if (!thd->mysql) // bootstrap file handling + return false; + + if (!(field_buf= (char*) alloc_root(alloc, conv_length + sizeof(uint) + 1))) + return true; + *next_field= field_buf + sizeof(uint); + length= copy_and_convert(*next_field, conv_length, to_cs, + (const char*) from, length, from_cs, &dummy_error); + *(uint *) field_buf= length; + (*next_field)[length]= 0; + if (next_mysql_field->max_length < length) + next_mysql_field->max_length= length; + ++next_field; + ++next_mysql_field; + return false; +} === modified file 'mysys/charset.c' --- a/mysys/charset.c 2009-06-10 08:59:49 +0000 +++ b/mysys/charset.c 2009-09-30 05:09:28 +0000 @@ -248,6 +248,7 @@ static int add_collation(CHARSET_INFO *c { #if defined(HAVE_CHARSET_ucs2) && defined(HAVE_UCA_COLLATIONS) copy_uca_collation(newcs, &my_charset_ucs2_unicode_ci); + newcs->state|= MY_CS_AVAILABLE | MY_CS_LOADED | MY_CS_NONASCII; #endif } else if (!strcmp(cs->csname, "utf8")) @@ -280,6 +281,8 @@ static int add_collation(CHARSET_INFO *c if (my_charset_is_8bit_pure_ascii(all_charsets[cs->number])) all_charsets[cs->number]->state|= MY_CS_PUREASCII; + if (!my_charset_is_ascii_compatible(cs)) + all_charsets[cs->number]->state|= MY_CS_NONASCII; } } else === modified file 'sql/protocol.cc' --- a/sql/protocol.cc 2009-09-10 09:18:29 +0000 +++ b/sql/protocol.cc 2009-09-30 05:09:28 +0000 @@ -58,6 +58,64 @@ bool Protocol_binary::net_store_data(con } + + +/* + net_store_data() - extended version with character set conversion. + + It is optimized for short strings whose length after + conversion is garanteed to be less than 251, which accupies + exactly one byte to store length. It allows not to use + the "convert" member as a temporary buffer, conversion + is done directly to the "packet" member. + The limit 251 is good enough to optimize send_result_set_metadata() + because column, table, database names fit into this limit. +*/ + +#ifndef EMBEDDED_LIBRARY +bool Protocol::net_store_data(const uchar *from, size_t length, + CHARSET_INFO *from_cs, CHARSET_INFO *to_cs) +{ + uint dummy_errors; + /* Calculate maxumum possible result length */ + uint conv_length= to_cs->mbmaxlen * length / from_cs->mbminlen; + if (conv_length > 250) + { + /* + For strings with conv_length greater than 250 bytes + we don't know how many bytes we will need to store length: one or two, + because we don't know result length until conversion is done. + For example, when converting from utf8 (mbmaxlen=3) to latin1, + conv_length=300 means that the result length can vary between 100 to 300. + length=100 needs one byte, length=300 needs to bytes. + + Thus conversion directly to "packet" is not worthy. + Let's use "convert" as a temporary buffer. + */ + return (convert->copy((const char*) from, length, from_cs, + to_cs, &dummy_errors) || + net_store_data((const uchar*) convert->ptr(), convert->length())); + } + + ulong packet_length= packet->length(); + ulong new_length= packet_length + conv_length + 1; + + if (new_length > packet->alloced_length() && packet->realloc(new_length)) + return 1; + + char *length_pos= (char*) packet->ptr() + packet_length; + char *to= length_pos + 1; + + to+= copy_and_convert(to, conv_length, to_cs, + (const char*) from, length, from_cs, &dummy_errors); + + net_store_length((uchar*) length_pos, to - length_pos - 1); + packet->length((uint) (to - packet->ptr())); + return 0; +} +#endif + + /** Send a error string to client. @@ -827,10 +885,10 @@ bool Protocol::store_string_aux(const ch fromcs != &my_charset_bin && tocs != &my_charset_bin) { - uint dummy_errors; - return (convert->copy(from, length, fromcs, tocs, &dummy_errors) || - net_store_data((uchar*) convert->ptr(), convert->length())); + /* Store with conversion */ + return net_store_data((uchar*) from, length, fromcs, tocs); } + /* Store without conversion */ return net_store_data((uchar*) from, length); } === modified file 'sql/protocol.h' --- a/sql/protocol.h 2009-09-10 09:18:29 +0000 +++ b/sql/protocol.h 2009-09-30 05:09:28 +0000 @@ -43,6 +43,8 @@ protected: MYSQL_FIELD *next_mysql_field; MEM_ROOT *alloc; #endif + bool net_store_data(const uchar *from, size_t length, + CHARSET_INFO *fromcs, CHARSET_INFO *tocs); bool store_string_aux(const char *from, size_t length, CHARSET_INFO *fromcs, CHARSET_INFO *tocs); public: === modified file 'sql/sql_string.cc' --- a/sql/sql_string.cc 2009-07-31 17:14:52 +0000 +++ b/sql/sql_string.cc 2009-09-30 05:09:28 +0000 @@ -794,10 +794,11 @@ String *copy_if_not_alloced(String *to,S */ -uint32 -copy_and_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs, - const char *from, uint32 from_length, CHARSET_INFO *from_cs, - uint *errors) +static uint32 +copy_and_convert_extended(char *to, uint32 to_length, CHARSET_INFO *to_cs, + const char *from, uint32 from_length, + CHARSET_INFO *from_cs, + uint *errors) { int cnvres; my_wc_t wc; @@ -849,6 +850,65 @@ outp: } +/* + Optimized for quick copying of ASCII characters in the range 0x00..0x7F. +*/ +uint32 +copy_and_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs, + const char *from, uint32 from_length, CHARSET_INFO *from_cs, + uint *errors) +{ + /* + If any of the character sets is not ASCII compatible, + immediately switch to slow mb_wc->wc_mb method. + */ + if ((to_cs->state | from_cs->state) & MY_CS_NONASCII) + return copy_and_convert_extended(to, to_length, to_cs, + from, from_length, from_cs, errors); + + uint32 length= min(to_length, from_length), length2= length; + +#if defined(__i386__) + /* + Special loop for i386, it allows to refer to a + non-aligned memory block as UINT32, which makes + it possible to copy four bytes at once. This + gives about 10% performance improvement comparing + to byte-by-byte loop. + */ + for ( ; length >= 4; length-= 4, from+= 4, to+= 4) + { + if ((*(uint32*)from) & 0x80808080) + break; + *((uint32*) to)= *((const uint32*) from); + } +#endif + + for (; ; *to++= *from++, length--) + { + if (!length) + { + *errors= 0; + return length2; + } + if (*((unsigned char*) from) > 0x7F) /* A non-ASCII character */ + { + uint32 copied_length= length2 - length; + to_length-= copied_length; + from_length-= copied_length; + return copied_length + copy_and_convert_extended(to, to_length, + to_cs, + from, from_length, + from_cs, + errors); + } + } + + DBUG_ASSERT(FALSE); // Should never get to here + return 0; // Make compiler happy +} + + /** Copy string with HEX-encoding of "bad" characters. === modified file 'strings/conf_to_src.c' --- a/strings/conf_to_src.c 2008-11-14 16:29:38 +0000 +++ b/strings/conf_to_src.c 2009-09-30 05:09:28 +0000 @@ -184,11 +184,12 @@ void dispcset(FILE *f,CHARSET_INFO *cs) { fprintf(f,"{\n"); fprintf(f," %d,%d,%d,\n",cs->number,0,0); - fprintf(f," MY_CS_COMPILED%s%s%s%s,\n", + fprintf(f," MY_CS_COMPILED%s%s%s%s%s,\n", cs->state & MY_CS_BINSORT ? "|MY_CS_BINSORT" : "", cs->state & MY_CS_PRIMARY ? "|MY_CS_PRIMARY" : "", is_case_sensitive(cs) ? "|MY_CS_CSSORT" : "", - my_charset_is_8bit_pure_ascii(cs) ? "|MY_CS_PUREASCII" : ""); + my_charset_is_8bit_pure_ascii(cs) ? "|MY_CS_PUREASCII" : "", + !my_charset_is_ascii_compatible(cs) ? "|MY_CS_NONASCII": ""); if (cs->name) { === modified file 'strings/ctype-extra.c' --- a/strings/ctype-extra.c 2007-08-20 11:47:31 +0000 +++ b/strings/ctype-extra.c 2009-09-30 05:09:28 +0000 @@ -6,7 +6,7 @@ ./conf_to_src ../sql/share/charsets/ > FILE */ -/* Copyright (C) 2000-2007 MySQL AB +/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -6804,7 +6804,7 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_swe7 { 10,0,0, - MY_CS_COMPILED|MY_CS_PRIMARY, + MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_NONASCII, "swe7", /* cset name */ "swe7_swedish_ci", /* coll name */ "", /* comment */ @@ -8454,7 +8454,7 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_swe7 { 82,0,0, - MY_CS_COMPILED|MY_CS_BINSORT, + MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NONASCII, "swe7", /* cset name */ "swe7_bin", /* coll name */ "", /* comment */ @@ -8550,72 +8550,6 @@ CHARSET_INFO compiled_charsets[] = { } , #endif -#ifdef HAVE_CHARSET_geostd8 -{ - 92,0,0, - MY_CS_COMPILED|MY_CS_PRIMARY, - "geostd8", /* cset name */ - "geostd8_general_ci", /* coll name */ - "", /* comment */ - NULL, /* tailoring */ - ctype_geostd8_general_ci, /* ctype */ - to_lower_geostd8_general_ci, /* lower */ - to_upper_geostd8_general_ci, /* upper */ - sort_order_geostd8_general_ci, /* sort_order */ - NULL, /* contractions */ - NULL, /* sort_order_big*/ - to_uni_geostd8_general_ci, /* to_uni */ - NULL, /* from_uni */ - my_unicase_default, /* caseinfo */ - NULL, /* state map */ - NULL, /* ident map */ - 1, /* strxfrm_multiply*/ - 1, /* caseup_multiply*/ - 1, /* casedn_multiply*/ - 1, /* mbminlen */ - 1, /* mbmaxlen */ - 0, /* min_sort_char */ - 255, /* max_sort_char */ - ' ', /* pad_char */ - 0, /* escape_with_backslash_is_dangerous */ - &my_charset_8bit_handler, - &my_collation_8bit_simple_ci_handler, -} -, -#endif -#ifdef HAVE_CHARSET_geostd8 -{ - 93,0,0, - MY_CS_COMPILED|MY_CS_BINSORT, - "geostd8", /* cset name */ - "geostd8_bin", /* coll name */ - "", /* comment */ - NULL, /* tailoring */ - ctype_geostd8_bin, /* ctype */ - to_lower_geostd8_bin, /* lower */ - to_upper_geostd8_bin, /* upper */ - NULL, /* sort_order */ - NULL, /* contractions */ - NULL, /* sort_order_big*/ - to_uni_geostd8_bin, /* to_uni */ - NULL, /* from_uni */ - my_unicase_default, /* caseinfo */ - NULL, /* state map */ - NULL, /* ident map */ - 1, /* strxfrm_multiply*/ - 1, /* caseup_multiply*/ - 1, /* casedn_multiply*/ - 1, /* mbminlen */ - 1, /* mbmaxlen */ - 0, /* min_sort_char */ - 255, /* max_sort_char */ - ' ', /* pad_char */ - 0, /* escape_with_backslash_is_dangerous */ - &my_charset_8bit_handler, - &my_collation_8bit_bin_handler, -} -, -#endif #ifdef HAVE_CHARSET_latin1 { 94,0,0, === modified file 'strings/ctype-sjis.c' --- a/strings/ctype-sjis.c 2009-05-05 06:55:22 +0000 +++ b/strings/ctype-sjis.c 2009-10-01 07:22:31 +0000 @@ -4672,7 +4672,7 @@ static MY_CHARSET_HANDLER my_charset_han CHARSET_INFO my_charset_sjis_japanese_ci= { 13,0,0, /* number */ - MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */ + MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_NONASCII, /* state */ "sjis", /* cs name */ "sjis_japanese_ci", /* name */ "", /* comment */ @@ -4704,7 +4704,7 @@ CHARSET_INFO my_charset_sjis_japanese_ci CHARSET_INFO my_charset_sjis_bin= { 88,0,0, /* number */ - MY_CS_COMPILED|MY_CS_BINSORT, /* state */ + MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NONASCII, /* state */ "sjis", /* cs name */ "sjis_bin", /* name */ "", /* comment */ === modified file 'strings/ctype-uca.c' --- a/strings/ctype-uca.c 2009-06-04 09:35:29 +0000 +++ b/strings/ctype-uca.c 2009-09-30 05:09:28 +0000 @@ -8087,7 +8087,7 @@ MY_COLLATION_HANDLER my_collation_ucs2_u CHARSET_INFO my_charset_ucs2_unicode_ci= { 128,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_unicode_ci", /* name */ "", /* comment */ @@ -8119,7 +8119,7 @@ CHARSET_INFO my_charset_ucs2_unicode_ci= CHARSET_INFO my_charset_ucs2_icelandic_uca_ci= { 129,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_icelandic_ci",/* name */ "", /* comment */ @@ -8151,7 +8151,7 @@ CHARSET_INFO my_charset_ucs2_icelandic_u CHARSET_INFO my_charset_ucs2_latvian_uca_ci= { 130,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_latvian_ci", /* name */ "", /* comment */ @@ -8183,7 +8183,7 @@ CHARSET_INFO my_charset_ucs2_latvian_uca CHARSET_INFO my_charset_ucs2_romanian_uca_ci= { 131,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_romanian_ci", /* name */ "", /* comment */ @@ -8215,7 +8215,7 @@ CHARSET_INFO my_charset_ucs2_romanian_uc CHARSET_INFO my_charset_ucs2_slovenian_uca_ci= { 132,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_slovenian_ci",/* name */ "", /* comment */ @@ -8247,7 +8247,7 @@ CHARSET_INFO my_charset_ucs2_slovenian_u CHARSET_INFO my_charset_ucs2_polish_uca_ci= { 133,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_polish_ci", /* name */ "", /* comment */ @@ -8279,7 +8279,7 @@ CHARSET_INFO my_charset_ucs2_polish_uca_ CHARSET_INFO my_charset_ucs2_estonian_uca_ci= { 134,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_estonian_ci", /* name */ "", /* comment */ @@ -8311,7 +8311,7 @@ CHARSET_INFO my_charset_ucs2_estonian_uc CHARSET_INFO my_charset_ucs2_spanish_uca_ci= { 135,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_spanish_ci", /* name */ "", /* comment */ @@ -8343,7 +8343,7 @@ CHARSET_INFO my_charset_ucs2_spanish_uca CHARSET_INFO my_charset_ucs2_swedish_uca_ci= { 136,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_swedish_ci", /* name */ "", /* comment */ @@ -8375,7 +8375,7 @@ CHARSET_INFO my_charset_ucs2_swedish_uca CHARSET_INFO my_charset_ucs2_turkish_uca_ci= { 137,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_turkish_ci", /* name */ "", /* comment */ @@ -8407,7 +8407,7 @@ CHARSET_INFO my_charset_ucs2_turkish_uca CHARSET_INFO my_charset_ucs2_czech_uca_ci= { 138,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_czech_ci", /* name */ "", /* comment */ @@ -8440,7 +8440,7 @@ CHARSET_INFO my_charset_ucs2_czech_uca_c CHARSET_INFO my_charset_ucs2_danish_uca_ci= { 139,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_danish_ci", /* name */ "", /* comment */ @@ -8472,7 +8472,7 @@ CHARSET_INFO my_charset_ucs2_danish_uca_ CHARSET_INFO my_charset_ucs2_lithuanian_uca_ci= { 140,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_lithuanian_ci",/* name */ "", /* comment */ @@ -8504,7 +8504,7 @@ CHARSET_INFO my_charset_ucs2_lithuanian_ CHARSET_INFO my_charset_ucs2_slovak_uca_ci= { 141,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_slovak_ci", /* name */ "", /* comment */ @@ -8536,7 +8536,7 @@ CHARSET_INFO my_charset_ucs2_slovak_uca_ CHARSET_INFO my_charset_ucs2_spanish2_uca_ci= { 142,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_spanish2_ci", /* name */ "", /* comment */ @@ -8569,7 +8569,7 @@ CHARSET_INFO my_charset_ucs2_spanish2_uc CHARSET_INFO my_charset_ucs2_roman_uca_ci= { 143,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_roman_ci", /* name */ "", /* comment */ @@ -8602,7 +8602,7 @@ CHARSET_INFO my_charset_ucs2_roman_uca_c CHARSET_INFO my_charset_ucs2_persian_uca_ci= { 144,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_persian_ci", /* name */ "", /* comment */ @@ -8635,7 +8635,7 @@ CHARSET_INFO my_charset_ucs2_persian_uca CHARSET_INFO my_charset_ucs2_esperanto_uca_ci= { 145,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_esperanto_ci",/* name */ "", /* comment */ @@ -8668,7 +8668,7 @@ CHARSET_INFO my_charset_ucs2_esperanto_u CHARSET_INFO my_charset_ucs2_hungarian_uca_ci= { 146,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_hungarian_ci",/* name */ "", /* comment */ @@ -8748,7 +8748,7 @@ extern MY_CHARSET_HANDLER my_charset_utf CHARSET_INFO my_charset_utf8_unicode_ci= { 192,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_unicode_ci", /* name */ "", /* comment */ @@ -8781,7 +8781,7 @@ CHARSET_INFO my_charset_utf8_unicode_ci= CHARSET_INFO my_charset_utf8_icelandic_uca_ci= { 193,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_icelandic_ci",/* name */ "", /* comment */ @@ -8813,7 +8813,7 @@ CHARSET_INFO my_charset_utf8_icelandic_u CHARSET_INFO my_charset_utf8_latvian_uca_ci= { 194,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_latvian_ci", /* name */ "", /* comment */ @@ -8845,7 +8845,7 @@ CHARSET_INFO my_charset_utf8_latvian_uca CHARSET_INFO my_charset_utf8_romanian_uca_ci= { 195,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_romanian_ci", /* name */ "", /* comment */ @@ -8877,7 +8877,7 @@ CHARSET_INFO my_charset_utf8_romanian_uc CHARSET_INFO my_charset_utf8_slovenian_uca_ci= { 196,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_slovenian_ci",/* name */ "", /* comment */ @@ -8909,7 +8909,7 @@ CHARSET_INFO my_charset_utf8_slovenian_u CHARSET_INFO my_charset_utf8_polish_uca_ci= { 197,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_polish_ci", /* name */ "", /* comment */ @@ -8941,7 +8941,7 @@ CHARSET_INFO my_charset_utf8_polish_uca_ CHARSET_INFO my_charset_utf8_estonian_uca_ci= { 198,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_estonian_ci", /* name */ "", /* comment */ @@ -8973,7 +8973,7 @@ CHARSET_INFO my_charset_utf8_estonian_uc CHARSET_INFO my_charset_utf8_spanish_uca_ci= { 199,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_spanish_ci", /* name */ "", /* comment */ @@ -9005,7 +9005,7 @@ CHARSET_INFO my_charset_utf8_spanish_uca CHARSET_INFO my_charset_utf8_swedish_uca_ci= { 200,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_swedish_ci", /* name */ "", /* comment */ @@ -9037,7 +9037,7 @@ CHARSET_INFO my_charset_utf8_swedish_uca CHARSET_INFO my_charset_utf8_turkish_uca_ci= { 201,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_turkish_ci", /* name */ "", /* comment */ @@ -9069,7 +9069,7 @@ CHARSET_INFO my_charset_utf8_turkish_uca CHARSET_INFO my_charset_utf8_czech_uca_ci= { 202,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_czech_ci", /* name */ "", /* comment */ @@ -9102,7 +9102,7 @@ CHARSET_INFO my_charset_utf8_czech_uca_c CHARSET_INFO my_charset_utf8_danish_uca_ci= { 203,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_danish_ci", /* name */ "", /* comment */ @@ -9134,7 +9134,7 @@ CHARSET_INFO my_charset_utf8_danish_uca_ CHARSET_INFO my_charset_utf8_lithuanian_uca_ci= { 204,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_lithuanian_ci",/* name */ "", /* comment */ @@ -9166,7 +9166,7 @@ CHARSET_INFO my_charset_utf8_lithuanian_ CHARSET_INFO my_charset_utf8_slovak_uca_ci= { 205,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_slovak_ci", /* name */ "", /* comment */ @@ -9198,7 +9198,7 @@ CHARSET_INFO my_charset_utf8_slovak_uca_ CHARSET_INFO my_charset_utf8_spanish2_uca_ci= { 206,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_spanish2_ci", /* name */ "", /* comment */ @@ -9230,7 +9230,7 @@ CHARSET_INFO my_charset_utf8_spanish2_uc CHARSET_INFO my_charset_utf8_roman_uca_ci= { 207,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_roman_ci", /* name */ "", /* comment */ @@ -9262,7 +9262,7 @@ CHARSET_INFO my_charset_utf8_roman_uca_c CHARSET_INFO my_charset_utf8_persian_uca_ci= { 208,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_persian_ci", /* name */ "", /* comment */ @@ -9294,7 +9294,7 @@ CHARSET_INFO my_charset_utf8_persian_uca CHARSET_INFO my_charset_utf8_esperanto_uca_ci= { 209,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_esperanto_ci",/* name */ "", /* comment */ @@ -9326,7 +9326,7 @@ CHARSET_INFO my_charset_utf8_esperanto_u CHARSET_INFO my_charset_utf8_hungarian_uca_ci= { 210,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "utf8", /* cs name */ "utf8_hungarian_ci",/* name */ "", /* comment */ === modified file 'strings/ctype-ucs2.c' --- a/strings/ctype-ucs2.c 2009-08-28 16:21:54 +0000 +++ b/strings/ctype-ucs2.c 2009-09-30 05:09:28 +0000 @@ -1712,7 +1712,7 @@ MY_CHARSET_HANDLER my_charset_ucs2_handl CHARSET_INFO my_charset_ucs2_general_ci= { 35,0,0, /* number */ - MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE, + MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_general_ci", /* name */ "", /* comment */ @@ -1744,7 +1744,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, + MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_UNICODE|MY_CS_NONASCII, "ucs2", /* cs name */ "ucs2_bin", /* name */ "", /* comment */ === modified file 'strings/ctype-utf8.c' --- a/strings/ctype-utf8.c 2009-08-28 16:21:54 +0000 +++ b/strings/ctype-utf8.c 2009-10-01 07:22:31 +0000 @@ -4200,7 +4200,7 @@ static MY_CHARSET_HANDLER my_charset_fil CHARSET_INFO my_charset_filename= { 17,0,0, /* number */ - MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_HIDDEN, + MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_HIDDEN|MY_CS_NONASCII, "filename", /* cs name */ "filename", /* name */ "", /* comment */ === modified file 'strings/ctype.c' --- a/strings/ctype.c 2009-06-06 13:05:44 +0000 +++ b/strings/ctype.c 2009-09-30 05:09:28 +0000 @@ -405,3 +405,23 @@ my_charset_is_8bit_pure_ascii(CHARSET_IN } return 1; } + + +/* + Shared function between conf_to_src and mysys. + Check if a 8bit character set is compatible with + ascii on the range 0x00..0x7F. +*/ +my_bool +my_charset_is_ascii_compatible(CHARSET_INFO *cs) +{ + uint i; + if (!cs->tab_to_uni) + return 1; + for (i= 0; i < 128; i++) + { + if (cs->tab_to_uni[i] != i) + return 0; + } + return 1; +} --Boundary_(ID_AF0/ZMsHLvblQ18Mnc6R6g) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/alik@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/alik@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alik@stripped # target_branch: file:///mnt/raid/alik/MySQL/bzr/mysql-next-mr-bar/ # testament_sha1: f7ec23533c4f58b748f5ad5ef7f8811f8a7315f3 # timestamp: 2009-10-04 15:30:23 +0400 # source_branch: file:///mnt/raid/alik/MySQL/bzr/mysql-next-mr-wtf/ # base_revision_id: alik@stripped # # Begin bundle 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 --Boundary_(ID_AF0/ZMsHLvblQ18Mnc6R6g)--