Hi Alexander,
really nice consolidation work :)
I have only some formal/cosmetic comments below.
On 23.11.10 13.36, Alexander Barkov wrote:
> #At file:///home/bar/mysql-bzr/mysql-5.5-bugteam.b57737/ based on
> revid:davi.arnaut@stripped
>
> 3135 Alexander Barkov 2010-11-23
> Bug#57737 Character sets: search fails with like, contraction, index
>
> Problem: LIKE over an indexed column optimized away good results,
> because my_like_range_utf32/utf16 returned wrong ranges for contractions.
>
> Fix: Make my_like_range_utf32/utf16 return correct ranges for contractions.
You should document here that you have implemented my_like_range_generic() to
replace both these functions.
>
> Note, this code presens in my_like_range_mb and my_like_range_ucs2.
code presens: Small typo.
> It was forgotten in utf32/utf16 versions (during mysql-6.0 push/revert mess).
>
>
> added:
> @ mysql-test/include/ctype_czech.inc
> @ mysql-test/include/ctype_like_ignorable.inc
> @ mysql-test/r/ctype_like_range.result
> @ mysql-test/t/ctype_like_range.test
> Adding tests
>
>
> modified:
>
> @ include/m_ctype.h
> - Adding helper functions for contractions.
> - Prototypes: removing ucs2,utf16,utf32 functions, adding generic function.
>
> @ mysql-test/r/ctype_uca.result
> @ mysql-test/r/ctype_utf16_uca.result
> @ mysql-test/r/ctype_utf32_uca.result
> @ mysql-test/t/ctype_uca.test
> @ mysql-test/t/ctype_utf16_uca.test
> @ mysql-test/t/ctype_utf32_uca.test
> - Adding tests.
>
> @ strings/ctype-mb.c
> - Pad function did not put the last character.
> - Implementing my_like_range_generic() - an universal replacement
> for three separate functions
> my_like_range_ucs2(), my_like_range_utf16() and my_like_range_utf32(),
> with correct contraction handling.
>
> @ strings/ctype-ucs2.c
> - my_fill_mb2 did not put the high byte, as previously
> it was used to put only characters in ASCII range.
> Now it puts high byte as well
> (needed to pupulate cs->max_sort_char correctly).
> - Adding DBUG_ASSERT()
> - Removing character set specific functions:
> my_like_range_ucs2(), my_like_range_utf16() and my_like_range_utf32().
> - Using my_like_range_generic() instead of the old functions.
>
> @ strings/ctype-uca.c
> - Using generic function instead of the old character set specific ones.
>
> @ sql/item_create.cc
> @ sql/item_strfunc.cc
> @ sql/item_strfunc.h
> - Adding SQL functions LIKE_RANGE_MIN and LIKE_RANGE_MAX,
> available only in debug build to make sure like_range()
> works correctly for all character sets and collations.
>
> added:
> mysql-test/include/ctype_czech.inc
> mysql-test/include/ctype_like_ignorable.inc
> mysql-test/r/ctype_like_range.result
> mysql-test/t/ctype_like_range.test
> modified:
> include/m_ctype.h
> mysql-test/r/ctype_uca.result
> mysql-test/r/ctype_utf16_uca.result
> mysql-test/r/ctype_utf32_uca.result
> mysql-test/t/ctype_uca.test
> mysql-test/t/ctype_utf16_uca.test
> mysql-test/t/ctype_utf32_uca.test
> sql/item_create.cc
> sql/item_strfunc.cc
> sql/item_strfunc.h
> strings/ctype-mb.c
> strings/ctype-uca.c
> strings/ctype-ucs2.c
> === modified file 'include/m_ctype.h'
> --- a/include/m_ctype.h 2010-09-28 15:15:58 +0000
> +++ b/include/m_ctype.h 2010-11-23 12:26:38 +0000
> @@ -356,6 +356,32 @@ extern CHARSET_INFO my_charset_utf8mb4_u
> #define MY_UTF8MB4 "utf8mb4"
>
>
> +/* Helper functions to handle contraction */
> +static inline my_bool
> +my_cs_have_contractions(CHARSET_INFO *cs)
> +{
> + return cs->contractions != NULL;
> +}
> +
> +static inline my_bool
> +my_cs_can_be_contraction_head(CHARSET_INFO *cs, my_wc_t wc)
> +{
> + return ((const char *)cs->contractions)[0x40*0x40 + (wc& 0xFF)];
> +}
> +
> +static inline my_bool
> +my_cs_can_be_contraction_tail(CHARSET_INFO *cs, my_wc_t wc)
> +{
> + return ((const char *)cs->contractions)[0x40*0x40 + (wc& 0xFF)];
> +}
> +
> +static inline uint16*
> +my_cs_contraction2_weight(CHARSET_INFO *cs, my_wc_t wc1, my_wc_t wc2)
> +{
> + return&cs->contractions[(wc1 - 0x40) * 0x40 + wc2 - 0x40];
> +}
> +
> +
> /* declarations for simple charsets */
> extern size_t my_strnxfrm_simple(CHARSET_INFO *, uchar *, size_t,
> const uchar *, size_t);
> @@ -430,6 +456,7 @@ ulonglong my_strntoull10rnd_ucs2(CHARSET
>
> void my_fill_8bit(CHARSET_INFO *cs, char* to, size_t l, int fill);
>
> +/* For 8-bit character set */
> my_bool my_like_range_simple(CHARSET_INFO *cs,
> const char *ptr, size_t ptr_length,
> pbool escape, pbool w_one, pbool w_many,
> @@ -437,6 +464,7 @@ my_bool my_like_range_simple(CHARSET_IN
> char *min_str, char *max_str,
> size_t *min_length, size_t *max_length);
>
> +/* For ASCII-based multi-byte character sets with mbminlen=1 */
> my_bool my_like_range_mb(CHARSET_INFO *cs,
> const char *ptr, size_t ptr_length,
> pbool escape, pbool w_one, pbool w_many,
> @@ -444,26 +472,13 @@ my_bool my_like_range_mb(CHARSET_INFO *
> char *min_str, char *max_str,
> size_t *min_length, size_t *max_length);
>
> -my_bool my_like_range_ucs2(CHARSET_INFO *cs,
> - const char *ptr, size_t ptr_length,
> - pbool escape, pbool w_one, pbool w_many,
> - size_t res_length,
> - char *min_str, char *max_str,
> - size_t *min_length, size_t *max_length);
> -
> -my_bool my_like_range_utf16(CHARSET_INFO *cs,
> - const char *ptr, size_t ptr_length,
> - pbool escape, pbool w_one, pbool w_many,
> - size_t res_length,
> - char *min_str, char *max_str,
> - size_t *min_length, size_t *max_length);
> -
> -my_bool my_like_range_utf32(CHARSET_INFO *cs,
> - const char *ptr, size_t ptr_length,
> - pbool escape, pbool w_one, pbool w_many,
> - size_t res_length,
> - char *min_str, char *max_str,
> - size_t *min_length, size_t *max_length);
> +/* For other character sets, with arbitrary mbminlen and mbmaxlen numbers */
> +my_bool my_like_range_generic(CHARSET_INFO *cs,
> + const char *ptr, size_t ptr_length,
> + pbool escape, pbool w_one, pbool w_many,
> + size_t res_length,
> + char *min_str, char *max_str,
> + size_t *min_length, size_t *max_length);
>
> int my_wildcmp_8bit(CHARSET_INFO *,
> const char *str,const char *str_end,
>
> === added file 'mysql-test/include/ctype_czech.inc'
> --- a/mysql-test/include/ctype_czech.inc 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/include/ctype_czech.inc 2010-11-23 12:26:38 +0000
> @@ -0,0 +1,12 @@
> +SELECT @@collation_connection;
> +--echo #
> +--echo # Bug#57737 Character sets: search fails with like, contraction, index
> +--echo #
> +CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS s1 LIMIT 0;
> +INSERT INTO t1 VALUES ('c'),('ce'),('cé'),('ch');
> +SELECT * FROM t1 WHERE s1 LIKE 'c%';
> +ALTER TABLE t1 ADD KEY s1 (s1);
> +SELECT * FROM t1 WHERE s1 LIKE 'c%';
> +ALTER TABLE t1 DROP KEY s1, ADD KEY(s1(1));
> +SELECT * FROM t1 WHERE s1 LIKE 'ch';
> +DROP TABLE t1;
>
> === added file 'mysql-test/include/ctype_like_ignorable.inc'
> --- a/mysql-test/include/ctype_like_ignorable.inc 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/include/ctype_like_ignorable.inc 2010-11-23 12:26:38 +0000
> @@ -0,0 +1,11 @@
> +SELECT @@collation_connection;
> +--echo #
> +--echo # Bug#57737 Character sets: search fails with like, contraction, index
> +--echo # Part#2 - ignorable characters
> +--echo #
> +CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS s1 LIMIT 0;
> +INSERT INTO t1 VALUES ('a\0\0\0\0\0\t'),('a'),('b'),('c'),('d'),('e');
> +SELECT HEX(s1) FROM t1 WHERE s1 LIKE 'a%';
> +ALTER TABLE t1 ADD KEY s1 (s1);
> +SELECT HEX(s1) FROM t1 WHERE s1 LIKE 'a%';
> +DROP TABLE t1;
>
> === added file 'mysql-test/r/ctype_like_range.result'
> --- a/mysql-test/r/ctype_like_range.result 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/r/ctype_like_range.result 2010-11-23 12:26:38 +0000
> @@ -0,0 +1,2310 @@
> +DROP TABLE IF EXISTS t1;
> +DROP VIEW IF EXISTS v1;
> +CREATE TABLE t1 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, a VARBINARY(32));
> +INSERT INTO t1 (a) VALUES (''),('_'),('%'),('\_'),('\%'),('\\');
> +INSERT INTO t1 (a) VALUES ('a'),('c');
> +INSERT INTO t1 (a) VALUES ('a_'),('c_');
> +INSERT INTO t1 (a) VALUES ('a%'),('c%');
> +INSERT INTO t1 (a) VALUES ('aa'),('cc'),('ch');
> +INSERT INTO t1 (a) VALUES ('aa_'),('cc_'),('ch_');
> +INSERT INTO t1 (a) VALUES ('aa%'),('cc%'),('ch%');
> +INSERT INTO t1 (a) VALUES ('aaa'),('ccc'),('cch');
> +INSERT INTO t1 (a) VALUES ('aaa_'),('ccc_'),('cch_');
> +INSERT INTO t1 (a) VALUES ('aaa%'),('ccc%'),('cch%');
> +INSERT INTO t1 (a) VALUES ('aaaaaaaaaaaaaaaaaaaa');
> +CREATE VIEW v1 AS
> +SELECT id, 'a' AS name, a AS val FROM t1
> +UNION
> +SELECT id, 'mn', HEX(LIKE_RANGE_MIN(a, 16)) AS min FROM t1
> +UNION
> +SELECT id, 'mx', HEX(LIKE_RANGE_MAX(a, 16)) AS max FROM t1
> +UNION
> +SELECT id, 'sp', REPEAT('-', 32) AS sep FROM t1
> +ORDER BY id, name;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 00
> +2 mx FF
> +2 sp --------------------------------
> +3 a %
> +3 mn
> +3 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 5F
> +4 mx 5F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 25
> +5 mx 25
> +5 sp --------------------------------
> +6 a \
> +6 mn 5C
> +6 mx 5C
> +6 sp --------------------------------
> +7 a a
> +7 mn 61
> +7 mx 61
> +7 sp --------------------------------
> +8 a c
> +8 mn 63
> +8 mx 63
> +8 sp --------------------------------
> +9 a a_
> +9 mn 6100
> +9 mx 61FF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 6300
> +10 mx 63FF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 61
> +11 mx 61FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 63
> +12 mx 63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 6161
> +13 mx 6161
> +13 sp --------------------------------
> +14 a cc
> +14 mn 6363
> +14 mx 6363
> +14 sp --------------------------------
> +15 a ch
> +15 mn 6368
> +15 mx 6368
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 616100
> +16 mx 6161FF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 636300
> +17 mx 6363FF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 636800
> +18 mx 6368FF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 6161
> +19 mx 6161FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 6363
> +20 mx 6363FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 6368
> +21 mx 6368FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 616161
> +22 mx 616161
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 636363
> +23 mx 636363
> +23 sp --------------------------------
> +24 a cch
> +24 mn 636368
> +24 mx 636368
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 61616100
> +25 mx 616161FF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 63636300
> +26 mx 636363FF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 63636800
> +27 mx 636368FF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 616161
> +28 mx 616161FFFFFFFFFFFFFFFFFFFFFFFFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 636363
> +29 mx 636363FFFFFFFFFFFFFFFFFFFFFFFFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 636368
> +30 mx 636368FFFFFFFFFFFFFFFFFFFFFFFFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 61616161616161616161616161616161
> +31 mx 61616161616161616161616161616161
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET latin1;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 00
> +2 mx FF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00000000000000000000000000000000
> +3 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 5F
> +4 mx 5F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 25
> +5 mx 25
> +5 sp --------------------------------
> +6 a \
> +6 mn 5C
> +6 mx 5C
> +6 sp --------------------------------
> +7 a a
> +7 mn 61
> +7 mx 61
> +7 sp --------------------------------
> +8 a c
> +8 mn 63
> +8 mx 63
> +8 sp --------------------------------
> +9 a a_
> +9 mn 6100
> +9 mx 61FF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 6300
> +10 mx 63FF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 61000000000000000000000000000000
> +11 mx 61FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 63000000000000000000000000000000
> +12 mx 63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 6161
> +13 mx 6161
> +13 sp --------------------------------
> +14 a cc
> +14 mn 6363
> +14 mx 6363
> +14 sp --------------------------------
> +15 a ch
> +15 mn 6368
> +15 mx 6368
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 616100
> +16 mx 6161FF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 636300
> +17 mx 6363FF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 636800
> +18 mx 6368FF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 61610000000000000000000000000000
> +19 mx 6161FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 63630000000000000000000000000000
> +20 mx 6363FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 63680000000000000000000000000000
> +21 mx 6368FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 616161
> +22 mx 616161
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 636363
> +23 mx 636363
> +23 sp --------------------------------
> +24 a cch
> +24 mn 636368
> +24 mx 636368
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 61616100
> +25 mx 616161FF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 63636300
> +26 mx 636363FF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 63636800
> +27 mx 636368FF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 61616100000000000000000000000000
> +28 mx 616161FFFFFFFFFFFFFFFFFFFFFFFFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 63636300000000000000000000000000
> +29 mx 636363FFFFFFFFFFFFFFFFFFFFFFFFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 63636800000000000000000000000000
> +30 mx 636368FFFFFFFFFFFFFFFFFFFFFFFFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 61616161616161616161616161616161
> +31 mx 61616161616161616161616161616161
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf8;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 00000000000000000000000000000000
> +2 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +2 sp --------------------------------
> +3 a %
> +3 mn 00000000000000000000000000000000
> +3 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +3 sp --------------------------------
> +4 a \_
> +4 mn 5F
> +4 mx 5F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 25
> +5 mx 25
> +5 sp --------------------------------
> +6 a \
> +6 mn 5C
> +6 mx 5C
> +6 sp --------------------------------
> +7 a a
> +7 mn 61
> +7 mx 61
> +7 sp --------------------------------
> +8 a c
> +8 mn 63
> +8 mx 63
> +8 sp --------------------------------
> +9 a a_
> +9 mn 61000000000000000000000000000000
> +9 mx 61EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 63000000000000000000000000000000
> +10 mx 63EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 61000000000000000000000000000000
> +11 mx 61EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 63000000000000000000000000000000
> +12 mx 63EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 6161
> +13 mx 6161
> +13 sp --------------------------------
> +14 a cc
> +14 mn 6363
> +14 mx 6363
> +14 sp --------------------------------
> +15 a ch
> +15 mn 6368
> +15 mx 6368
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 61610000000000000000000000000000
> +16 mx 6161EFBFBFEFBFBFEFBFBFEFBFBF2020
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 63630000000000000000000000000000
> +17 mx 6363EFBFBFEFBFBFEFBFBFEFBFBF2020
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 63680000000000000000000000000000
> +18 mx 6368EFBFBFEFBFBFEFBFBFEFBFBF2020
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 61610000000000000000000000000000
> +19 mx 6161EFBFBFEFBFBFEFBFBFEFBFBF2020
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 63630000000000000000000000000000
> +20 mx 6363EFBFBFEFBFBFEFBFBFEFBFBF2020
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 63680000000000000000000000000000
> +21 mx 6368EFBFBFEFBFBFEFBFBFEFBFBF2020
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 616161
> +22 mx 616161
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 636363
> +23 mx 636363
> +23 sp --------------------------------
> +24 a cch
> +24 mn 636368
> +24 mx 636368
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 61616100000000000000000000000000
> +25 mx 616161EFBFBFEFBFBFEFBFBFEFBFBF20
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 63636300000000000000000000000000
> +26 mx 636363EFBFBFEFBFBFEFBFBFEFBFBF20
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 63636800000000000000000000000000
> +27 mx 636368EFBFBFEFBFBFEFBFBFEFBFBF20
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 61616100000000000000000000000000
> +28 mx 616161EFBFBFEFBFBFEFBFBFEFBFBF20
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 63636300000000000000000000000000
> +29 mx 636363EFBFBFEFBFBFEFBFBFEFBFBF20
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 63636800000000000000000000000000
> +30 mx 636368EFBFBFEFBFBFEFBFBFEFBFBF20
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 6161616161
> +31 mx 6161616161
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 09090909090909090909090909090909
> +2 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +2 sp --------------------------------
> +3 a %
> +3 mn 09090909090909090909090909090909
> +3 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +3 sp --------------------------------
> +4 a \_
> +4 mn 5F
> +4 mx 5F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 25
> +5 mx 25
> +5 sp --------------------------------
> +6 a \
> +6 mn 5C
> +6 mx 5C
> +6 sp --------------------------------
> +7 a a
> +7 mn 61
> +7 mx 61
> +7 sp --------------------------------
> +8 a c
> +8 mn 63
> +8 mx 63
> +8 sp --------------------------------
> +9 a a_
> +9 mn 61090909090909090909090909090909
> +9 mx 61EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 63090909090909090909090909090909
> +10 mx 63EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 61090909090909090909090909090909
> +11 mx 61EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 63090909090909090909090909090909
> +12 mx 63EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 6161
> +13 mx 6161
> +13 sp --------------------------------
> +14 a cc
> +14 mn 6363
> +14 mx 6363
> +14 sp --------------------------------
> +15 a ch
> +15 mn 6368
> +15 mx 6368
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 61610909090909090909090909090909
> +16 mx 6161EFBFBFEFBFBFEFBFBFEFBFBF2020
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 63630909090909090909090909090909
> +17 mx 6363EFBFBFEFBFBFEFBFBFEFBFBF2020
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 63680909090909090909090909090909
> +18 mx 6368EFBFBFEFBFBFEFBFBFEFBFBF2020
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 61610909090909090909090909090909
> +19 mx 6161EFBFBFEFBFBFEFBFBFEFBFBF2020
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 63630909090909090909090909090909
> +20 mx 6363EFBFBFEFBFBFEFBFBFEFBFBF2020
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 63680909090909090909090909090909
> +21 mx 6368EFBFBFEFBFBFEFBFBFEFBFBF2020
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 616161
> +22 mx 616161
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 636363
> +23 mx 636363
> +23 sp --------------------------------
> +24 a cch
> +24 mn 636368
> +24 mx 636368
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 61616109090909090909090909090909
> +25 mx 616161EFBFBFEFBFBFEFBFBFEFBFBF20
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 63636309090909090909090909090909
> +26 mx 636363EFBFBFEFBFBFEFBFBFEFBFBF20
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 63636809090909090909090909090909
> +27 mx 636368EFBFBFEFBFBFEFBFBFEFBFBF20
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 61616109090909090909090909090909
> +28 mx 616161EFBFBFEFBFBFEFBFBFEFBFBF20
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 63636309090909090909090909090909
> +29 mx 636363EFBFBFEFBFBFEFBFBFEFBFBF20
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 63636809090909090909090909090909
> +30 mx 636368EFBFBFEFBFBFEFBFBFEFBFBF20
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 6161616161
> +31 mx 6161616161
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_czech_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 09090909090909090909090909090909
> +2 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +2 sp --------------------------------
> +3 a %
> +3 mn 09090909090909090909090909090909
> +3 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +3 sp --------------------------------
> +4 a \_
> +4 mn 5F
> +4 mx 5F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 25
> +5 mx 25
> +5 sp --------------------------------
> +6 a \
> +6 mn 5C
> +6 mx 5C
> +6 sp --------------------------------
> +7 a a
> +7 mn 61
> +7 mx 61
> +7 sp --------------------------------
> +8 a c
> +8 mn 63
> +8 mx 63
> +8 sp --------------------------------
> +9 a a_
> +9 mn 61090909090909090909090909090909
> +9 mx 61EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 09090909090909090909090909090909
> +10 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +10 sp --------------------------------
> +11 a a%
> +11 mn 61090909090909090909090909090909
> +11 mx 61EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 09090909090909090909090909090909
> +12 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +12 sp --------------------------------
> +13 a aa
> +13 mn 6161
> +13 mx 6161
> +13 sp --------------------------------
> +14 a cc
> +14 mn 6363
> +14 mx 6363
> +14 sp --------------------------------
> +15 a ch
> +15 mn 6368
> +15 mx 6368
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 61610909090909090909090909090909
> +16 mx 6161EFBFBFEFBFBFEFBFBFEFBFBF2020
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 63090909090909090909090909090909
> +17 mx 63EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 63680909090909090909090909090909
> +18 mx 6368EFBFBFEFBFBFEFBFBFEFBFBF2020
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 61610909090909090909090909090909
> +19 mx 6161EFBFBFEFBFBFEFBFBFEFBFBF2020
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 63090909090909090909090909090909
> +20 mx 63EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 63680909090909090909090909090909
> +21 mx 6368EFBFBFEFBFBFEFBFBFEFBFBF2020
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 616161
> +22 mx 616161
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 636363
> +23 mx 636363
> +23 sp --------------------------------
> +24 a cch
> +24 mn 636368
> +24 mx 636368
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 61616109090909090909090909090909
> +25 mx 616161EFBFBFEFBFBFEFBFBFEFBFBF20
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 63630909090909090909090909090909
> +26 mx 6363EFBFBFEFBFBFEFBFBFEFBFBF2020
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 63636809090909090909090909090909
> +27 mx 636368EFBFBFEFBFBFEFBFBFEFBFBF20
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 61616109090909090909090909090909
> +28 mx 616161EFBFBFEFBFBFEFBFBFEFBFBF20
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 63630909090909090909090909090909
> +29 mx 6363EFBFBFEFBFBFEFBFBFEFBFBF2020
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 63636809090909090909090909090909
> +30 mx 636368EFBFBFEFBFBFEFBFBFEFBFBF20
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 6161616161
> +31 mx 6161616161
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_danish_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 09090909090909090909090909090909
> +2 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +2 sp --------------------------------
> +3 a %
> +3 mn 09090909090909090909090909090909
> +3 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +3 sp --------------------------------
> +4 a \_
> +4 mn 5F
> +4 mx 5F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 25
> +5 mx 25
> +5 sp --------------------------------
> +6 a \
> +6 mn 5C
> +6 mx 5C
> +6 sp --------------------------------
> +7 a a
> +7 mn 61
> +7 mx 61
> +7 sp --------------------------------
> +8 a c
> +8 mn 63
> +8 mx 63
> +8 sp --------------------------------
> +9 a a_
> +9 mn 09090909090909090909090909090909
> +9 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +9 sp --------------------------------
> +10 a c_
> +10 mn 63090909090909090909090909090909
> +10 mx 63EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 09090909090909090909090909090909
> +11 mx EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF20
> +11 sp --------------------------------
> +12 a c%
> +12 mn 63090909090909090909090909090909
> +12 mx 63EFBFBFEFBFBFEFBFBFEFBFBFEFBFBF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 6161
> +13 mx 6161
> +13 sp --------------------------------
> +14 a cc
> +14 mn 6363
> +14 mx 6363
> +14 sp --------------------------------
> +15 a ch
> +15 mn 6368
> +15 mx 6368
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 61610909090909090909090909090909
> +16 mx 6161EFBFBFEFBFBFEFBFBFEFBFBF2020
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 63630909090909090909090909090909
> +17 mx 6363EFBFBFEFBFBFEFBFBFEFBFBF2020
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 63680909090909090909090909090909
> +18 mx 6368EFBFBFEFBFBFEFBFBFEFBFBF2020
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 61610909090909090909090909090909
> +19 mx 6161EFBFBFEFBFBFEFBFBFEFBFBF2020
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 63630909090909090909090909090909
> +20 mx 6363EFBFBFEFBFBFEFBFBFEFBFBF2020
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 63680909090909090909090909090909
> +21 mx 6368EFBFBFEFBFBFEFBFBFEFBFBF2020
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 616161
> +22 mx 616161
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 636363
> +23 mx 636363
> +23 sp --------------------------------
> +24 a cch
> +24 mn 636368
> +24 mx 636368
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 61610909090909090909090909090909
> +25 mx 6161EFBFBFEFBFBFEFBFBFEFBFBF2020
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 63636309090909090909090909090909
> +26 mx 636363EFBFBFEFBFBFEFBFBFEFBFBF20
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 63636809090909090909090909090909
> +27 mx 636368EFBFBFEFBFBFEFBFBFEFBFBF20
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 61610909090909090909090909090909
> +28 mx 6161EFBFBFEFBFBFEFBFBFEFBFBF2020
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 63636309090909090909090909090909
> +29 mx 636363EFBFBFEFBFBFEFBFBFEFBFBF20
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 63636809090909090909090909090909
> +30 mx 636368EFBFBFEFBFBFEFBFBFEFBFBF20
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 61616161090909090909090909090909
> +31 mx 61616161EFBFBFEFBFBFEFBFBFEFBFBF
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET ucs2;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 0000
> +2 mx FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00000000000000000000000000000000
> +3 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 005F
> +4 mx 005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 0025
> +5 mx 0025
> +5 sp --------------------------------
> +6 a \
> +6 mn 005C
> +6 mx 005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 0061
> +7 mx 0061
> +7 sp --------------------------------
> +8 a c
> +8 mn 0063
> +8 mx 0063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 00610000
> +9 mx 0061FFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 00630000
> +10 mx 0063FFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00610000000000000000000000000000
> +11 mx 0061FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00630000000000000000000000000000
> +12 mx 0063FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 00610061
> +13 mx 00610061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 00630063
> +14 mx 00630063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 00630068
> +15 mx 00630068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 006100610000
> +16 mx 00610061FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 006300630000
> +17 mx 00630063FFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 006300680000
> +18 mx 00630068FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00610061000000000000000000000000
> +19 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00630063000000000000000000000000
> +20 mx 00630063FFFFFFFFFFFFFFFFFFFFFFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00630068000000000000000000000000
> +21 mx 00630068FFFFFFFFFFFFFFFFFFFFFFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 006100610061
> +22 mx 006100610061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 006300630063
> +23 mx 006300630063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 006300630068
> +24 mx 006300630068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 0061006100610000
> +25 mx 006100610061FFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 0063006300630000
> +26 mx 006300630063FFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 0063006300680000
> +27 mx 006300630068FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00610061006100000000000000000000
> +28 mx 006100610061FFFFFFFFFFFFFFFFFFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00630063006300000000000000000000
> +29 mx 006300630063FFFFFFFFFFFFFFFFFFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00630063006800000000000000000000
> +30 mx 006300630068FFFFFFFFFFFFFFFFFFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 00610061006100610061006100610061
> +31 mx 00610061006100610061006100610061
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET ucs2 COLLATE ucs2_unicode_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 0009
> +2 mx FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00090009000900090009000900090009
> +3 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 005F
> +4 mx 005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 0025
> +5 mx 0025
> +5 sp --------------------------------
> +6 a \
> +6 mn 005C
> +6 mx 005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 0061
> +7 mx 0061
> +7 sp --------------------------------
> +8 a c
> +8 mn 0063
> +8 mx 0063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 00610009
> +9 mx 0061FFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 00630009
> +10 mx 0063FFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00610009000900090009000900090009
> +11 mx 0061FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00630009000900090009000900090009
> +12 mx 0063FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 00610061
> +13 mx 00610061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 00630063
> +14 mx 00630063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 00630068
> +15 mx 00630068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 006100610009
> +16 mx 00610061FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 006300630009
> +17 mx 00630063FFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 006300680009
> +18 mx 00630068FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00610061000900090009000900090009
> +19 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00630063000900090009000900090009
> +20 mx 00630063FFFFFFFFFFFFFFFFFFFFFFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00630068000900090009000900090009
> +21 mx 00630068FFFFFFFFFFFFFFFFFFFFFFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 006100610061
> +22 mx 006100610061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 006300630063
> +23 mx 006300630063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 006300630068
> +24 mx 006300630068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 0061006100610009
> +25 mx 006100610061FFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 0063006300630009
> +26 mx 006300630063FFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 0063006300680009
> +27 mx 006300630068FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00610061006100090009000900090009
> +28 mx 006100610061FFFFFFFFFFFFFFFFFFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00630063006300090009000900090009
> +29 mx 006300630063FFFFFFFFFFFFFFFFFFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00630063006800090009000900090009
> +30 mx 006300630068FFFFFFFFFFFFFFFFFFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 00610061006100610061006100610061
> +31 mx 00610061006100610061006100610061
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET ucs2 COLLATE ucs2_czech_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 0009
> +2 mx FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00090009000900090009000900090009
> +3 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 005F
> +4 mx 005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 0025
> +5 mx 0025
> +5 sp --------------------------------
> +6 a \
> +6 mn 005C
> +6 mx 005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 0061
> +7 mx 0061
> +7 sp --------------------------------
> +8 a c
> +8 mn 0063
> +8 mx 0063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 00610009
> +9 mx 0061FFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 00090009000900090009000900090009
> +10 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00610009000900090009000900090009
> +11 mx 0061FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00090009000900090009000900090009
> +12 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 00610061
> +13 mx 00610061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 00630063
> +14 mx 00630063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 00630068
> +15 mx 00630068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 006100610009
> +16 mx 00610061FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 00630009000900090009000900090009
> +17 mx 0063FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 006300680009
> +18 mx 00630068FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00610061000900090009000900090009
> +19 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00630009000900090009000900090009
> +20 mx 0063FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00630068000900090009000900090009
> +21 mx 00630068FFFFFFFFFFFFFFFFFFFFFFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 006100610061
> +22 mx 006100610061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 006300630063
> +23 mx 006300630063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 006300630068
> +24 mx 006300630068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 0061006100610009
> +25 mx 006100610061FFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 00630063000900090009000900090009
> +26 mx 00630063FFFFFFFFFFFFFFFFFFFFFFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 0063006300680009
> +27 mx 006300630068FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00610061006100090009000900090009
> +28 mx 006100610061FFFFFFFFFFFFFFFFFFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00630063000900090009000900090009
> +29 mx 00630063FFFFFFFFFFFFFFFFFFFFFFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00630063006800090009000900090009
> +30 mx 006300630068FFFFFFFFFFFFFFFFFFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 00610061006100610061006100610061
> +31 mx 00610061006100610061006100610061
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET ucs2 COLLATE ucs2_danish_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 0009
> +2 mx FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00090009000900090009000900090009
> +3 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 005F
> +4 mx 005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 0025
> +5 mx 0025
> +5 sp --------------------------------
> +6 a \
> +6 mn 005C
> +6 mx 005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 0061
> +7 mx 0061
> +7 sp --------------------------------
> +8 a c
> +8 mn 0063
> +8 mx 0063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 00090009000900090009000900090009
> +9 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 00630009
> +10 mx 0063FFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00090009000900090009000900090009
> +11 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00630009000900090009000900090009
> +12 mx 0063FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 00610061
> +13 mx 00610061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 00630063
> +14 mx 00630063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 00630068
> +15 mx 00630068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 006100610009
> +16 mx 00610061FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 006300630009
> +17 mx 00630063FFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 006300680009
> +18 mx 00630068FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00610061000900090009000900090009
> +19 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00630063000900090009000900090009
> +20 mx 00630063FFFFFFFFFFFFFFFFFFFFFFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00630068000900090009000900090009
> +21 mx 00630068FFFFFFFFFFFFFFFFFFFFFFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 006100610061
> +22 mx 006100610061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 006300630063
> +23 mx 006300630063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 006300630068
> +24 mx 006300630068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 00610061000900090009000900090009
> +25 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 0063006300630009
> +26 mx 006300630063FFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 0063006300680009
> +27 mx 006300630068FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00610061000900090009000900090009
> +28 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00630063006300090009000900090009
> +29 mx 006300630063FFFFFFFFFFFFFFFFFFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00630063006800090009000900090009
> +30 mx 006300630068FFFFFFFFFFFFFFFFFFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 00610061006100610061006100610061
> +31 mx 00610061006100610061006100610061
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf16;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 0000
> +2 mx FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00000000000000000000000000000000
> +3 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 005F
> +4 mx 005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 0025
> +5 mx 0025
> +5 sp --------------------------------
> +6 a \
> +6 mn 005C
> +6 mx 005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 0061
> +7 mx 0061
> +7 sp --------------------------------
> +8 a c
> +8 mn 0063
> +8 mx 0063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 00610000
> +9 mx 0061FFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 00630000
> +10 mx 0063FFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00610000000000000000000000000000
> +11 mx 0061FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00630000000000000000000000000000
> +12 mx 0063FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 00610061
> +13 mx 00610061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 00630063
> +14 mx 00630063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 00630068
> +15 mx 00630068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 006100610000
> +16 mx 00610061FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 006300630000
> +17 mx 00630063FFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 006300680000
> +18 mx 00630068FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00610061000000000000000000000000
> +19 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00630063000000000000000000000000
> +20 mx 00630063FFFFFFFFFFFFFFFFFFFFFFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00630068000000000000000000000000
> +21 mx 00630068FFFFFFFFFFFFFFFFFFFFFFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 006100610061
> +22 mx 006100610061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 006300630063
> +23 mx 006300630063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 006300630068
> +24 mx 006300630068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 0061006100610000
> +25 mx 006100610061FFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 0063006300630000
> +26 mx 006300630063FFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 0063006300680000
> +27 mx 006300630068FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00610061006100000000000000000000
> +28 mx 006100610061FFFFFFFFFFFFFFFFFFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00630063006300000000000000000000
> +29 mx 006300630063FFFFFFFFFFFFFFFFFFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00630063006800000000000000000000
> +30 mx 006300630068FFFFFFFFFFFFFFFFFFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 0061006100610061
> +31 mx 0061006100610061
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf16 COLLATE utf16_unicode_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 0009
> +2 mx FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00090009000900090009000900090009
> +3 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 005F
> +4 mx 005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 0025
> +5 mx 0025
> +5 sp --------------------------------
> +6 a \
> +6 mn 005C
> +6 mx 005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 0061
> +7 mx 0061
> +7 sp --------------------------------
> +8 a c
> +8 mn 0063
> +8 mx 0063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 00610009
> +9 mx 0061FFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 00630009
> +10 mx 0063FFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00610009000900090009000900090009
> +11 mx 0061FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00630009000900090009000900090009
> +12 mx 0063FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 00610061
> +13 mx 00610061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 00630063
> +14 mx 00630063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 00630068
> +15 mx 00630068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 006100610009
> +16 mx 00610061FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 006300630009
> +17 mx 00630063FFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 006300680009
> +18 mx 00630068FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00610061000900090009000900090009
> +19 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00630063000900090009000900090009
> +20 mx 00630063FFFFFFFFFFFFFFFFFFFFFFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00630068000900090009000900090009
> +21 mx 00630068FFFFFFFFFFFFFFFFFFFFFFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 006100610061
> +22 mx 006100610061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 006300630063
> +23 mx 006300630063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 006300630068
> +24 mx 006300630068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 0061006100610009
> +25 mx 006100610061FFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 0063006300630009
> +26 mx 006300630063FFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 0063006300680009
> +27 mx 006300630068FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00610061006100090009000900090009
> +28 mx 006100610061FFFFFFFFFFFFFFFFFFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00630063006300090009000900090009
> +29 mx 006300630063FFFFFFFFFFFFFFFFFFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00630063006800090009000900090009
> +30 mx 006300630068FFFFFFFFFFFFFFFFFFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 0061006100610061
> +31 mx 0061006100610061
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf16 COLLATE utf16_czech_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 0009
> +2 mx FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00090009000900090009000900090009
> +3 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 005F
> +4 mx 005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 0025
> +5 mx 0025
> +5 sp --------------------------------
> +6 a \
> +6 mn 005C
> +6 mx 005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 0061
> +7 mx 0061
> +7 sp --------------------------------
> +8 a c
> +8 mn 0063
> +8 mx 0063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 00610009
> +9 mx 0061FFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 00090009000900090009000900090009
> +10 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00610009000900090009000900090009
> +11 mx 0061FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00090009000900090009000900090009
> +12 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 00610061
> +13 mx 00610061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 00630063
> +14 mx 00630063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 00630068
> +15 mx 00630068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 006100610009
> +16 mx 00610061FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 00630009000900090009000900090009
> +17 mx 0063FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 006300680009
> +18 mx 00630068FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00610061000900090009000900090009
> +19 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00630009000900090009000900090009
> +20 mx 0063FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00630068000900090009000900090009
> +21 mx 00630068FFFFFFFFFFFFFFFFFFFFFFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 006100610061
> +22 mx 006100610061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 006300630063
> +23 mx 006300630063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 006300630068
> +24 mx 006300630068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 0061006100610009
> +25 mx 006100610061FFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 00630063000900090009000900090009
> +26 mx 00630063FFFFFFFFFFFFFFFFFFFFFFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 0063006300680009
> +27 mx 006300630068FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00610061006100090009000900090009
> +28 mx 006100610061FFFFFFFFFFFFFFFFFFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00630063000900090009000900090009
> +29 mx 00630063FFFFFFFFFFFFFFFFFFFFFFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00630063006800090009000900090009
> +30 mx 006300630068FFFFFFFFFFFFFFFFFFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 0061006100610061
> +31 mx 0061006100610061
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf16 COLLATE utf16_danish_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 0009
> +2 mx FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00090009000900090009000900090009
> +3 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 005F
> +4 mx 005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 0025
> +5 mx 0025
> +5 sp --------------------------------
> +6 a \
> +6 mn 005C
> +6 mx 005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 0061
> +7 mx 0061
> +7 sp --------------------------------
> +8 a c
> +8 mn 0063
> +8 mx 0063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 00090009000900090009000900090009
> +9 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 00630009
> +10 mx 0063FFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00090009000900090009000900090009
> +11 mx FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00630009000900090009000900090009
> +12 mx 0063FFFFFFFFFFFFFFFFFFFFFFFFFFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 00610061
> +13 mx 00610061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 00630063
> +14 mx 00630063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 00630068
> +15 mx 00630068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 006100610009
> +16 mx 00610061FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 006300630009
> +17 mx 00630063FFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 006300680009
> +18 mx 00630068FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00610061000900090009000900090009
> +19 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00630063000900090009000900090009
> +20 mx 00630063FFFFFFFFFFFFFFFFFFFFFFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00630068000900090009000900090009
> +21 mx 00630068FFFFFFFFFFFFFFFFFFFFFFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 006100610061
> +22 mx 006100610061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 006300630063
> +23 mx 006300630063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 006300630068
> +24 mx 006300630068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 00610061000900090009000900090009
> +25 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 0063006300630009
> +26 mx 006300630063FFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 0063006300680009
> +27 mx 006300630068FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00610061000900090009000900090009
> +28 mx 00610061FFFFFFFFFFFFFFFFFFFFFFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00630063006300090009000900090009
> +29 mx 006300630063FFFFFFFFFFFFFFFFFFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00630063006800090009000900090009
> +30 mx 006300630068FFFFFFFFFFFFFFFFFFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 0061006100610061
> +31 mx 0061006100610061
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf32;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 00000000
> +2 mx 0000FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00000000000000000000000000000000
> +3 mx 0000FFFF0000FFFF0000FFFF0000FFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 0000005F
> +4 mx 0000005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 00000025
> +5 mx 00000025
> +5 sp --------------------------------
> +6 a \
> +6 mn 0000005C
> +6 mx 0000005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 00000061
> +7 mx 00000061
> +7 sp --------------------------------
> +8 a c
> +8 mn 00000063
> +8 mx 00000063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 0000006100000000
> +9 mx 000000610000FFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 0000006300000000
> +10 mx 000000630000FFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00000061000000000000000000000000
> +11 mx 000000610000FFFF0000FFFF0000FFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00000063000000000000000000000000
> +12 mx 000000630000FFFF0000FFFF0000FFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 0000006100000061
> +13 mx 0000006100000061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 0000006300000063
> +14 mx 0000006300000063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 0000006300000068
> +15 mx 0000006300000068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 000000610000006100000000
> +16 mx 00000061000000610000FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 000000630000006300000000
> +17 mx 00000063000000630000FFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 000000630000006800000000
> +18 mx 00000063000000680000FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00000061000000610000000000000000
> +19 mx 00000061000000610000FFFF0000FFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00000063000000630000000000000000
> +20 mx 00000063000000630000FFFF0000FFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00000063000000680000000000000000
> +21 mx 00000063000000680000FFFF0000FFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 000000610000006100000061
> +22 mx 000000610000006100000061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 000000630000006300000063
> +23 mx 000000630000006300000063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 000000630000006300000068
> +24 mx 000000630000006300000068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 00000061000000610000006100000000
> +25 mx 0000006100000061000000610000FFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 00000063000000630000006300000000
> +26 mx 0000006300000063000000630000FFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 00000063000000630000006800000000
> +27 mx 0000006300000063000000680000FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00000061000000610000006100000000
> +28 mx 0000006100000061000000610000FFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00000063000000630000006300000000
> +29 mx 0000006300000063000000630000FFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00000063000000630000006800000000
> +30 mx 0000006300000063000000680000FFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 00000061000000610000006100000061
> +31 mx 00000061000000610000006100000061
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf32 COLLATE utf32_unicode_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 00000009
> +2 mx 0000FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00000009000000090000000900000009
> +3 mx 0000FFFF0000FFFF0000FFFF0000FFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 0000005F
> +4 mx 0000005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 00000025
> +5 mx 00000025
> +5 sp --------------------------------
> +6 a \
> +6 mn 0000005C
> +6 mx 0000005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 00000061
> +7 mx 00000061
> +7 sp --------------------------------
> +8 a c
> +8 mn 00000063
> +8 mx 00000063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 0000006100000009
> +9 mx 000000610000FFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 0000006300000009
> +10 mx 000000630000FFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00000061000000090000000900000009
> +11 mx 000000610000FFFF0000FFFF0000FFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00000063000000090000000900000009
> +12 mx 000000630000FFFF0000FFFF0000FFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 0000006100000061
> +13 mx 0000006100000061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 0000006300000063
> +14 mx 0000006300000063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 0000006300000068
> +15 mx 0000006300000068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 000000610000006100000009
> +16 mx 00000061000000610000FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 000000630000006300000009
> +17 mx 00000063000000630000FFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 000000630000006800000009
> +18 mx 00000063000000680000FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00000061000000610000000900000009
> +19 mx 00000061000000610000FFFF0000FFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00000063000000630000000900000009
> +20 mx 00000063000000630000FFFF0000FFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00000063000000680000000900000009
> +21 mx 00000063000000680000FFFF0000FFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 000000610000006100000061
> +22 mx 000000610000006100000061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 000000630000006300000063
> +23 mx 000000630000006300000063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 000000630000006300000068
> +24 mx 000000630000006300000068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 00000061000000610000006100000009
> +25 mx 0000006100000061000000610000FFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 00000063000000630000006300000009
> +26 mx 0000006300000063000000630000FFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 00000063000000630000006800000009
> +27 mx 0000006300000063000000680000FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00000061000000610000006100000009
> +28 mx 0000006100000061000000610000FFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00000063000000630000006300000009
> +29 mx 0000006300000063000000630000FFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00000063000000630000006800000009
> +30 mx 0000006300000063000000680000FFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 00000061000000610000006100000061
> +31 mx 00000061000000610000006100000061
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf32 COLLATE utf32_czech_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 00000009
> +2 mx 0000FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00000009000000090000000900000009
> +3 mx 0000FFFF0000FFFF0000FFFF0000FFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 0000005F
> +4 mx 0000005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 00000025
> +5 mx 00000025
> +5 sp --------------------------------
> +6 a \
> +6 mn 0000005C
> +6 mx 0000005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 00000061
> +7 mx 00000061
> +7 sp --------------------------------
> +8 a c
> +8 mn 00000063
> +8 mx 00000063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 0000006100000009
> +9 mx 000000610000FFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 00000009000000090000000900000009
> +10 mx 0000FFFF0000FFFF0000FFFF0000FFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00000061000000090000000900000009
> +11 mx 000000610000FFFF0000FFFF0000FFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00000009000000090000000900000009
> +12 mx 0000FFFF0000FFFF0000FFFF0000FFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 0000006100000061
> +13 mx 0000006100000061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 0000006300000063
> +14 mx 0000006300000063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 0000006300000068
> +15 mx 0000006300000068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 000000610000006100000009
> +16 mx 00000061000000610000FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 00000063000000090000000900000009
> +17 mx 000000630000FFFF0000FFFF0000FFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 000000630000006800000009
> +18 mx 00000063000000680000FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00000061000000610000000900000009
> +19 mx 00000061000000610000FFFF0000FFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00000063000000090000000900000009
> +20 mx 000000630000FFFF0000FFFF0000FFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00000063000000680000000900000009
> +21 mx 00000063000000680000FFFF0000FFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 000000610000006100000061
> +22 mx 000000610000006100000061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 000000630000006300000063
> +23 mx 000000630000006300000063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 000000630000006300000068
> +24 mx 000000630000006300000068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 00000061000000610000006100000009
> +25 mx 0000006100000061000000610000FFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 00000063000000630000000900000009
> +26 mx 00000063000000630000FFFF0000FFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 00000063000000630000006800000009
> +27 mx 0000006300000063000000680000FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00000061000000610000006100000009
> +28 mx 0000006100000061000000610000FFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00000063000000630000000900000009
> +29 mx 00000063000000630000FFFF0000FFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00000063000000630000006800000009
> +30 mx 0000006300000063000000680000FFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 00000061000000610000006100000061
> +31 mx 00000061000000610000006100000061
> +31 sp --------------------------------
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf32 COLLATE utf32_danish_ci;
> +SELECT * FROM v1;
> +id name val
> +1 a
> +1 mn
> +1 mx
> +1 sp --------------------------------
> +2 a _
> +2 mn 00000009
> +2 mx 0000FFFF
> +2 sp --------------------------------
> +3 a %
> +3 mn 00000009000000090000000900000009
> +3 mx 0000FFFF0000FFFF0000FFFF0000FFFF
> +3 sp --------------------------------
> +4 a \_
> +4 mn 0000005F
> +4 mx 0000005F
> +4 sp --------------------------------
> +5 a \%
> +5 mn 00000025
> +5 mx 00000025
> +5 sp --------------------------------
> +6 a \
> +6 mn 0000005C
> +6 mx 0000005C
> +6 sp --------------------------------
> +7 a a
> +7 mn 00000061
> +7 mx 00000061
> +7 sp --------------------------------
> +8 a c
> +8 mn 00000063
> +8 mx 00000063
> +8 sp --------------------------------
> +9 a a_
> +9 mn 00000009000000090000000900000009
> +9 mx 0000FFFF0000FFFF0000FFFF0000FFFF
> +9 sp --------------------------------
> +10 a c_
> +10 mn 0000006300000009
> +10 mx 000000630000FFFF
> +10 sp --------------------------------
> +11 a a%
> +11 mn 00000009000000090000000900000009
> +11 mx 0000FFFF0000FFFF0000FFFF0000FFFF
> +11 sp --------------------------------
> +12 a c%
> +12 mn 00000063000000090000000900000009
> +12 mx 000000630000FFFF0000FFFF0000FFFF
> +12 sp --------------------------------
> +13 a aa
> +13 mn 0000006100000061
> +13 mx 0000006100000061
> +13 sp --------------------------------
> +14 a cc
> +14 mn 0000006300000063
> +14 mx 0000006300000063
> +14 sp --------------------------------
> +15 a ch
> +15 mn 0000006300000068
> +15 mx 0000006300000068
> +15 sp --------------------------------
> +16 a aa_
> +16 mn 000000610000006100000009
> +16 mx 00000061000000610000FFFF
> +16 sp --------------------------------
> +17 a cc_
> +17 mn 000000630000006300000009
> +17 mx 00000063000000630000FFFF
> +17 sp --------------------------------
> +18 a ch_
> +18 mn 000000630000006800000009
> +18 mx 00000063000000680000FFFF
> +18 sp --------------------------------
> +19 a aa%
> +19 mn 00000061000000610000000900000009
> +19 mx 00000061000000610000FFFF0000FFFF
> +19 sp --------------------------------
> +20 a cc%
> +20 mn 00000063000000630000000900000009
> +20 mx 00000063000000630000FFFF0000FFFF
> +20 sp --------------------------------
> +21 a ch%
> +21 mn 00000063000000680000000900000009
> +21 mx 00000063000000680000FFFF0000FFFF
> +21 sp --------------------------------
> +22 a aaa
> +22 mn 000000610000006100000061
> +22 mx 000000610000006100000061
> +22 sp --------------------------------
> +23 a ccc
> +23 mn 000000630000006300000063
> +23 mx 000000630000006300000063
> +23 sp --------------------------------
> +24 a cch
> +24 mn 000000630000006300000068
> +24 mx 000000630000006300000068
> +24 sp --------------------------------
> +25 a aaa_
> +25 mn 00000061000000610000000900000009
> +25 mx 00000061000000610000FFFF0000FFFF
> +25 sp --------------------------------
> +26 a ccc_
> +26 mn 00000063000000630000006300000009
> +26 mx 0000006300000063000000630000FFFF
> +26 sp --------------------------------
> +27 a cch_
> +27 mn 00000063000000630000006800000009
> +27 mx 0000006300000063000000680000FFFF
> +27 sp --------------------------------
> +28 a aaa%
> +28 mn 00000061000000610000000900000009
> +28 mx 00000061000000610000FFFF0000FFFF
> +28 sp --------------------------------
> +29 a ccc%
> +29 mn 00000063000000630000006300000009
> +29 mx 0000006300000063000000630000FFFF
> +29 sp --------------------------------
> +30 a cch%
> +30 mn 00000063000000630000006800000009
> +30 mx 0000006300000063000000680000FFFF
> +30 sp --------------------------------
> +31 a aaaaaaaaaaaaaaaaaaaa
> +31 mn 00000061000000610000006100000061
> +31 mx 00000061000000610000006100000061
> +31 sp --------------------------------
> +DROP VIEW v1;
> +DROP TABLE t1;
>
> === modified file 'mysql-test/r/ctype_uca.result'
> --- a/mysql-test/r/ctype_uca.result 2008-03-26 09:51:16 +0000
> +++ b/mysql-test/r/ctype_uca.result 2010-11-23 12:26:38 +0000
> @@ -2888,3 +2888,101 @@ a hex(b) c
> DROP TABLE t1;
> set names utf8;
> End for 5.0 tests
> +#
> +# Start of 5.5 tests
> +#
> +SET collation_connection=utf8_czech_ci;
> +SELECT @@collation_connection;
> +@@collation_connection
> +utf8_czech_ci
> +#
> +# Bug#57737 Character sets: search fails with like, contraction, index
> +#
> +CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS s1 LIMIT 0;
> +INSERT INTO t1 VALUES ('c'),('ce'),('cé'),('ch');
> +SELECT * FROM t1 WHERE s1 LIKE 'c%';
> +s1
> +c
> +ce
> +cé
> +ch
> +ALTER TABLE t1 ADD KEY s1 (s1);
> +SELECT * FROM t1 WHERE s1 LIKE 'c%';
> +s1
> +c
> +ce
> +cé
> +ch
> +ALTER TABLE t1 DROP KEY s1, ADD KEY(s1(1));
> +SELECT * FROM t1 WHERE s1 LIKE 'ch';
> +s1
> +ch
> +DROP TABLE t1;
> +SELECT @@collation_connection;
> +@@collation_connection
> +utf8_czech_ci
> +#
> +# Bug#57737 Character sets: search fails with like, contraction, index
> +# Part#2 - ignorable characters
> +#
> +CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS s1 LIMIT 0;
> +INSERT INTO t1 VALUES ('a\0\0\0\0\0\t'),('a'),('b'),('c'),('d'),('e');
> +SELECT HEX(s1) FROM t1 WHERE s1 LIKE 'a%';
> +HEX(s1)
> +61000000000009
> +61
> +ALTER TABLE t1 ADD KEY s1 (s1);
> +SELECT HEX(s1) FROM t1 WHERE s1 LIKE 'a%';
> +HEX(s1)
> +61000000000009
> +61
> +DROP TABLE t1;
> +SET collation_connection=ucs2_czech_ci;
> +SELECT @@collation_connection;
> +@@collation_connection
> +ucs2_czech_ci
> +#
> +# Bug#57737 Character sets: search fails with like, contraction, index
> +#
> +CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS s1 LIMIT 0;
> +INSERT INTO t1 VALUES ('c'),('ce'),('cé'),('ch');
> +SELECT * FROM t1 WHERE s1 LIKE 'c%';
> +s1
> +c
> +ce
> +cé
> +ch
> +ALTER TABLE t1 ADD KEY s1 (s1);
> +SELECT * FROM t1 WHERE s1 LIKE 'c%';
> +s1
> +c
> +ce
> +cé
> +ch
> +ALTER TABLE t1 DROP KEY s1, ADD KEY(s1(1));
> +SELECT * FROM t1 WHERE s1 LIKE 'ch';
> +s1
> +ch
> +DROP TABLE t1;
> +SELECT @@collation_connection;
> +@@collation_connection
> +ucs2_czech_ci
> +#
> +# Bug#57737 Character sets: search fails with like, contraction, index
> +# Part#2 - ignorable characters
> +#
> +CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS s1 LIMIT 0;
> +INSERT INTO t1 VALUES ('a\0\0\0\0\0\t'),('a'),('b'),('c'),('d'),('e');
> +SELECT HEX(s1) FROM t1 WHERE s1 LIKE 'a%';
> +HEX(s1)
> +0061000000000000000000000009
> +0061
> +ALTER TABLE t1 ADD KEY s1 (s1);
> +SELECT HEX(s1) FROM t1 WHERE s1 LIKE 'a%';
> +HEX(s1)
> +0061000000000000000000000009
> +0061
> +DROP TABLE t1;
> +#
> +# End of 5.5 tests
> +#
>
> === modified file 'mysql-test/r/ctype_utf16_uca.result'
> --- a/mysql-test/r/ctype_utf16_uca.result 2010-02-24 09:15:34 +0000
> +++ b/mysql-test/r/ctype_utf16_uca.result 2010-11-23 12:26:38 +0000
> @@ -2368,6 +2368,52 @@ NULL
> NULL
> NULL
> drop table t1;
> +SET collation_connection=utf16_czech_ci;
> +SELECT @@collation_connection;
> +@@collation_connection
> +utf16_czech_ci
> +#
> +# Bug#57737 Character sets: search fails with like, contraction, index
> +#
> +CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS s1 LIMIT 0;
> +INSERT INTO t1 VALUES ('c'),('ce'),('cé'),('ch');
> +SELECT * FROM t1 WHERE s1 LIKE 'c%';
> +s1
> +c
> +ce
> +cé
> +ch
> +ALTER TABLE t1 ADD KEY s1 (s1);
> +SELECT * FROM t1 WHERE s1 LIKE 'c%';
> +s1
> +c
> +ce
> +cé
> +ch
> +ALTER TABLE t1 DROP KEY s1, ADD KEY(s1(1));
> +SELECT * FROM t1 WHERE s1 LIKE 'ch';
> +s1
> +ch
> +DROP TABLE t1;
> +SELECT @@collation_connection;
> +@@collation_connection
> +utf16_czech_ci
> +#
> +# Bug#57737 Character sets: search fails with like, contraction, index
> +# Part#2 - ignorable characters
> +#
> +CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS s1 LIMIT 0;
> +INSERT INTO t1 VALUES ('a\0\0\0\0\0\t'),('a'),('b'),('c'),('d'),('e');
> +SELECT HEX(s1) FROM t1 WHERE s1 LIKE 'a%';
> +HEX(s1)
> +0061000000000000000000000009
> +0061
> +ALTER TABLE t1 ADD KEY s1 (s1);
> +SELECT HEX(s1) FROM t1 WHERE s1 LIKE 'a%';
> +HEX(s1)
> +0061000000000000000000000009
> +0061
> +DROP TABLE t1;
> #
> # End of 5.5 tests
> #
>
> === modified file 'mysql-test/r/ctype_utf32_uca.result'
> --- a/mysql-test/r/ctype_utf32_uca.result 2010-02-24 09:15:34 +0000
> +++ b/mysql-test/r/ctype_utf32_uca.result 2010-11-23 12:26:38 +0000
> @@ -2368,6 +2368,52 @@ NULL
> NULL
> NULL
> drop table t1;
> +SET collation_connection=utf32_czech_ci;
> +SELECT @@collation_connection;
> +@@collation_connection
> +utf32_czech_ci
> +#
> +# Bug#57737 Character sets: search fails with like, contraction, index
> +#
> +CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS s1 LIMIT 0;
> +INSERT INTO t1 VALUES ('c'),('ce'),('cé'),('ch');
> +SELECT * FROM t1 WHERE s1 LIKE 'c%';
> +s1
> +c
> +ce
> +cé
> +ch
> +ALTER TABLE t1 ADD KEY s1 (s1);
> +SELECT * FROM t1 WHERE s1 LIKE 'c%';
> +s1
> +c
> +ce
> +cé
> +ch
> +ALTER TABLE t1 DROP KEY s1, ADD KEY(s1(1));
> +SELECT * FROM t1 WHERE s1 LIKE 'ch';
> +s1
> +ch
> +DROP TABLE t1;
> +SELECT @@collation_connection;
> +@@collation_connection
> +utf32_czech_ci
> +#
> +# Bug#57737 Character sets: search fails with like, contraction, index
> +# Part#2 - ignorable characters
> +#
> +CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS s1 LIMIT 0;
> +INSERT INTO t1 VALUES ('a\0\0\0\0\0\t'),('a'),('b'),('c'),('d'),('e');
> +SELECT HEX(s1) FROM t1 WHERE s1 LIKE 'a%';
> +HEX(s1)
> +00000061000000000000000000000000000000000000000000000009
> +00000061
> +ALTER TABLE t1 ADD KEY s1 (s1);
> +SELECT HEX(s1) FROM t1 WHERE s1 LIKE 'a%';
> +HEX(s1)
> +00000061000000000000000000000000000000000000000000000009
> +00000061
> +DROP TABLE t1;
> #
> # End of 5.5 tests
> #
>
> === added file 'mysql-test/t/ctype_like_range.test'
> --- a/mysql-test/t/ctype_like_range.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/t/ctype_like_range.test 2010-11-23 12:26:38 +0000
> @@ -0,0 +1,87 @@
> +--source include/have_debug.inc
> +--source include/have_ucs2.inc
> +--source include/have_utf16.inc
> +--source include/have_utf32.inc
> +
> +--disable_warnings
> +DROP TABLE IF EXISTS t1;
> +DROP VIEW IF EXISTS v1;
> +--enable_warnings
> +
> +CREATE TABLE t1 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, a VARBINARY(32));
> +INSERT INTO t1 (a) VALUES (''),('_'),('%'),('\_'),('\%'),('\\');
> +INSERT INTO t1 (a) VALUES ('a'),('c');
> +INSERT INTO t1 (a) VALUES ('a_'),('c_');
> +INSERT INTO t1 (a) VALUES ('a%'),('c%');
> +INSERT INTO t1 (a) VALUES ('aa'),('cc'),('ch');
> +INSERT INTO t1 (a) VALUES ('aa_'),('cc_'),('ch_');
> +INSERT INTO t1 (a) VALUES ('aa%'),('cc%'),('ch%');
> +INSERT INTO t1 (a) VALUES ('aaa'),('ccc'),('cch');
> +INSERT INTO t1 (a) VALUES ('aaa_'),('ccc_'),('cch_');
> +INSERT INTO t1 (a) VALUES ('aaa%'),('ccc%'),('cch%');
> +INSERT INTO t1 (a) VALUES ('aaaaaaaaaaaaaaaaaaaa');
> +
> +CREATE VIEW v1 AS
> + SELECT id, 'a' AS name, a AS val FROM t1
> +UNION
> + SELECT id, 'mn', HEX(LIKE_RANGE_MIN(a, 16)) AS min FROM t1
> +UNION
> + SELECT id, 'mx', HEX(LIKE_RANGE_MAX(a, 16)) AS max FROM t1
> +UNION
> + SELECT id, 'sp', REPEAT('-', 32) AS sep FROM t1
> +ORDER BY id, name;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET latin1;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf8;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_czech_ci;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_danish_ci;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET ucs2;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET ucs2 COLLATE ucs2_unicode_ci;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET ucs2 COLLATE ucs2_czech_ci;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET ucs2 COLLATE ucs2_danish_ci;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf16;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf16 COLLATE utf16_unicode_ci;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf16 COLLATE utf16_czech_ci;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf16 COLLATE utf16_danish_ci;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf32;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf32 COLLATE utf32_unicode_ci;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf32 COLLATE utf32_czech_ci;
> +SELECT * FROM v1;
> +
> +ALTER TABLE t1 MODIFY a VARCHAR(32) CHARACTER SET utf32 COLLATE utf32_danish_ci;
> +SELECT * FROM v1;
> +
> +DROP VIEW v1;
> +DROP TABLE t1;
>
> === modified file 'mysql-test/t/ctype_uca.test'
> --- a/mysql-test/t/ctype_uca.test 2008-02-20 18:49:26 +0000
> +++ b/mysql-test/t/ctype_uca.test 2010-11-23 12:26:38 +0000
> @@ -545,3 +545,19 @@ set collation_connection=ucs2_unicode_ci
> set names utf8;
>
> -- echo End for 5.0 tests
> +
> +--echo #
> +--echo # Start of 5.5 tests
> +--echo #
> +#
> +# Test my_like_range and contractions
> +#
> +SET collation_connection=utf8_czech_ci;
> +--source include/ctype_czech.inc
> +--source include/ctype_like_ignorable.inc
> +SET collation_connection=ucs2_czech_ci;
> +--source include/ctype_czech.inc
> +--source include/ctype_like_ignorable.inc
> +--echo #
> +--echo # End of 5.5 tests
> +--echo #
>
> === modified file 'mysql-test/t/ctype_utf16_uca.test'
> --- a/mysql-test/t/ctype_utf16_uca.test 2010-02-24 09:15:34 +0000
> +++ b/mysql-test/t/ctype_utf16_uca.test 2010-11-23 12:26:38 +0000
> @@ -284,6 +284,13 @@ DROP TABLE IF EXISTS t1;
> set collation_connection=utf16_unicode_ci;
> --source include/ctype_regex.inc
>
> +#
> +# Test my_like_range and contractions
> +#
> +SET collation_connection=utf16_czech_ci;
> +--source include/ctype_czech.inc
> +--source include/ctype_like_ignorable.inc
> +
>
> --echo #
> --echo # End of 5.5 tests
>
> === modified file 'mysql-test/t/ctype_utf32_uca.test'
> --- a/mysql-test/t/ctype_utf32_uca.test 2010-02-24 09:15:34 +0000
> +++ b/mysql-test/t/ctype_utf32_uca.test 2010-11-23 12:26:38 +0000
> @@ -286,6 +286,14 @@ set collation_connection=utf32_unicode_c
> --source include/ctype_regex.inc
>
>
> +#
> +# Test my_like_range and contractions
> +#
> +SET collation_connection=utf32_czech_ci;
> +--source include/ctype_czech.inc
> +--source include/ctype_like_ignorable.inc
> +
> +
> --echo #
> --echo # End of 5.5 tests
> --echo #
>
> === modified file 'sql/item_create.cc'
> --- a/sql/item_create.cc 2010-07-02 19:38:04 +0000
> +++ b/sql/item_create.cc 2010-11-23 12:26:38 +0000
> @@ -1330,6 +1330,34 @@ protected:
> };
>
>
> +#ifndef DBUG_OFF
> +class Create_func_like_range_min : public Create_func_arg2
> +{
> +public:
> + virtual Item *create(THD *thd, Item *arg1, Item *arg2);
> +
> + static Create_func_like_range_min s_singleton;
> +
> +protected:
> + Create_func_like_range_min() {}
> + virtual ~Create_func_like_range_min() {}
> +};
> +
> +
> +class Create_func_like_range_max : public Create_func_arg2
> +{
> +public:
> + virtual Item *create(THD *thd, Item *arg1, Item *arg2);
> +
> + static Create_func_like_range_max s_singleton;
> +
> +protected:
> + Create_func_like_range_max() {}
> + virtual ~Create_func_like_range_max() {}
> +};
> +#endif
> +
> +
> class Create_func_ln : public Create_func_arg1
> {
> public:
> @@ -3836,6 +3864,26 @@ Create_func_length::create(THD *thd, Ite
> }
>
>
> +#ifndef DBUG_OFF
> +Create_func_like_range_min Create_func_like_range_min::s_singleton;
> +
> +Item*
> +Create_func_like_range_min::create(THD *thd, Item *arg1, Item *arg2)
> +{
> + return new (thd->mem_root) Item_func_like_range_min(arg1, arg2);
> +}
> +
> +
> +Create_func_like_range_max Create_func_like_range_max::s_singleton;
> +
> +Item*
> +Create_func_like_range_max::create(THD *thd, Item *arg1, Item *arg2)
> +{
> + return new (thd->mem_root) Item_func_like_range_max(arg1, arg2);
> +}
> +#endif
> +
> +
> Create_func_ln Create_func_ln::s_singleton;
>
> Item*
> @@ -4924,6 +4972,10 @@ static Native_func_registry func_array[]
> { { C_STRING_WITH_LEN("LCASE") }, BUILDER(Create_func_lcase)},
> { { C_STRING_WITH_LEN("LEAST") }, BUILDER(Create_func_least)},
> { { C_STRING_WITH_LEN("LENGTH") }, BUILDER(Create_func_length)},
> +#ifndef DBUG_OFF
> + { { C_STRING_WITH_LEN("LIKE_RANGE_MIN") }, BUILDER(Create_func_like_range_min)},
> + { { C_STRING_WITH_LEN("LIKE_RANGE_MAX") }, BUILDER(Create_func_like_range_max)},
> +#endif
> { { C_STRING_WITH_LEN("LINEFROMTEXT") },
> GEOM_BUILDER(Create_func_geometry_from_text)},
> { { C_STRING_WITH_LEN("LINEFROMWKB") },
> GEOM_BUILDER(Create_func_geometry_from_wkb)},
> { { C_STRING_WITH_LEN("LINESTRINGFROMTEXT") },
> GEOM_BUILDER(Create_func_geometry_from_text)},
>
> === modified file 'sql/item_strfunc.cc'
> --- a/sql/item_strfunc.cc 2010-10-08 09:52:09 +0000
> +++ b/sql/item_strfunc.cc 2010-11-23 12:26:38 +0000
> @@ -3128,6 +3128,41 @@ String *Item_func_unhex::val_str(String
> }
>
>
> +#ifndef DBUG_OFF
> +String *Item_func_like_range::val_str(String *str)
> +{
> + DBUG_ASSERT(fixed == 1);
> + longlong nbytes= args[1]->val_int();
> + String *res= args[0]->val_str(str);
> + size_t min_len, max_len;
> + CHARSET_INFO *cs= collation.collation;
> +
> + if (!res || args[1]->null_value || args[1]->null_value ||
> + nbytes< 0 || nbytes> MAX_BLOB_WIDTH ||
> + min_str.alloc(nbytes) || max_str.alloc(nbytes))
> + goto err;
- args[1]->null_value is mentioned twice here.
- There are trailing spaces on the last line.
- The error handling here is half-baked, but I guess that is OK for a debug-only
function.
> + null_value=0;
> +
> + if (cs->coll->like_range(cs, res->ptr(), res->length(),
> + '\\', '_', '%', nbytes,
> + (char*) min_str.ptr(), (char*) max_str.ptr(),
> +&min_len,&max_len))
> + goto err;
- More trailing spaces.
> +
> + min_str.set_charset(collation.collation);
> + max_str.set_charset(collation.collation);
> + min_str.length(min_len);
> + max_str.length(max_len);
> +
> + return is_min ?&min_str :&max_str;
> +
> +err:
> + null_value= 1;
> + return 0;
> +}
> +#endif
> +
> +
> void Item_func_binary::print(String *str, enum_query_type query_type)
> {
> str->append(STRING_WITH_LEN("cast("));
>
> === modified file 'sql/item_strfunc.h'
> --- a/sql/item_strfunc.h 2010-08-20 11:14:11 +0000
> +++ b/sql/item_strfunc.h 2010-11-23 12:26:38 +0000
> @@ -657,6 +657,45 @@ public:
> };
>
>
> +#ifndef DBUG_OFF
> +class Item_func_like_range :public Item_str_func
> +{
> +protected:
> + String min_str;
> + String max_str;
> + bool is_min;
- is_min should be 'const', and may be transferred through the constructor
> +public:
> + Item_func_like_range(Item *a, Item *b) :Item_str_func(a, b)
ie:
Item_func_like_range(Item *a, Item *b, bool is_min)
:Item_str_func(a, b), is_min(is_min)
> + { maybe_null= 1; }
> + String *val_str(String *);
> + void fix_length_and_dec()
> + {
> + collation.set(args[0]->collation);
> + decimals=0;
> + max_length= MAX_BLOB_WIDTH;
> + }
> +};
> +
> +
> +class Item_func_like_range_min :public Item_func_like_range
> +{
> +public:
> + Item_func_like_range_min(Item *a, Item *b) :Item_func_like_range(a, b)
> + { is_min= TRUE; }
- You may use true/false if you like now.
> + const char *func_name() const { return "like_range_min"; }
> +};
> +
> +
> +class Item_func_like_range_max :public Item_func_like_range
> +{
> +public:
> + Item_func_like_range_max(Item *a, Item *b) :Item_func_like_range(a, b)
> + { is_min= FALSE; }
> + const char *func_name() const { return "like_range_max"; }
> +};
> +#endif
> +
> +
> class Item_func_binary :public Item_str_func
> {
> public:
>
> === modified file 'strings/ctype-mb.c'
> --- a/strings/ctype-mb.c 2010-07-26 06:47:03 +0000
> +++ b/strings/ctype-mb.c 2010-11-23 12:26:38 +0000
> @@ -636,7 +636,7 @@ static void pad_max_char(CHARSET_INFO *c
> DBUG_ASSERT(buflen> 0);
> do
> {
> - if ((str + buflen)< end)
> + if ((str + buflen)<= end)
> {
> /* Enough space for the characer */
> memcpy(str, buf, buflen);
> @@ -802,6 +802,184 @@ fill_max_and_min:
> }
>
There are a few lines extending beyond column 80 in the following function.
Please make sure all lines are 80 columns or less.
>
> +/**
> + Calculate min_str and max_str that ranges a LIKE string.
> + Generic function, currently used for ucs2, utf16, utf32,
> + but should be suitable for any other character sets with
> + cs->min_sort_char and cs->max_sort_char represented in
> + Unicode code points.
> +
> + @param cs Character set and collation pointer
> + @param ptr Pointer to LIKE pattern.
> + @param ptr_length Length of LIKE pattern.
> + @param escape Escape character pattern, typically '\'.
> + @param w_one 'One character' pattern, typically '_'.
> + @param w_many 'Many characters' pattern, typically '%'.
> + @param res_length Length of min_str and max_str.
> +
> + @param min_str OUT Smallest string that ranges LIKE.
> + @param max_str OUT Largest string that ranges LIKE.
> + @param min_len OUT Length of min_str
> + @param max_len OUT Length of max_str
I think the proper Doxygen syntax is @param[out]
> +
> + @return Optimization status.
> + @retval FALSE if LIKE pattern can be optimized
> + @rerval TRUE if LIKE can't be optimized.
> +*/
> +
> +my_bool
> +my_like_range_generic(CHARSET_INFO *cs,
> + const char *ptr, size_t ptr_length,
> + pbool escape, pbool w_one, pbool w_many,
> + size_t res_length,
> + char *min_str,char *max_str,
> + size_t *min_length,size_t *max_length)
> +{
> + const char *end= ptr + ptr_length;
> + const char *min_org= min_str;
> + const char *max_org= max_str;
> + char *min_end= min_str + res_length;
> + char *max_end= max_str + res_length;
> + size_t charlen= res_length / cs->mbmaxlen;
> + size_t res_length_diff, res_length_rounded;
> + my_bool have_contractions= my_cs_have_contractions(cs);
> + my_bool rc= FALSE;
rc is unused, except for the final return.
> +
> + for ( ; charlen> 0; charlen--)
> + {
> + my_wc_t wc, wc2;
> + int res;
> + if ((res= cs->cset->mb_wc(cs,&wc, (uchar*) ptr, (uchar*) end))<=
> 0)
> + {
> + if (res == MY_CS_ILSEQ) /* Bad sequence */
> + return TRUE; /* min_length and max_length are not important */
You may write 'return true' now, if you want to.
> + break; /* End of the string */
> + }
> + ptr+= res;
> +
> + if (wc == (my_wc_t) escape)
> + {
> + if ((res= cs->cset->mb_wc(cs,&wc, (uchar*) ptr, (uchar*) end))<=
> 0)
> + {
> + if (res == MY_CS_ILSEQ)
> + return TRUE; /* min_length and max_length are not important */
> + /*
> + End of the string: Escape is the last character.
> + Put escape as a normal character.
> + We'll will leave the loop on the next iteration.
> + */
> + }
> + else
> + ptr+= res;
> +
> + if ((res= cs->cset->wc_mb(cs, wc, (uchar*) min_str, (uchar*)
> min_end))<= 0)
> + goto pad_set_lengths; /* No space */
> + min_str+= res;
> +
> + if ((res= cs->cset->wc_mb(cs, wc, (uchar*) max_str, (uchar*)
> max_end))<= 0)
> + goto pad_set_lengths; /* No space */
> + max_str+= res;
> + continue;
> + }
> +
> + if (wc == (my_wc_t) w_one)
Personal preference: Use 'else if' to signal that this is a real alternative to
the if above.
This also applies to the next two if statements.
> + {
> + if ((res= cs->cset->wc_mb(cs, cs->min_sort_char, (uchar*) min_str,
> (uchar*) min_end))<= 0)
> + goto pad_set_lengths;
> + min_str+= res;
> +
> + if ((res= cs->cset->wc_mb(cs, cs->max_sort_char, (uchar*) max_str,
> (uchar*) max_end))<= 0)
> + goto pad_set_lengths;
> + max_str+= res;
> + continue;
> + }
> +
> + if (wc == (my_wc_t) w_many)
> + {
> + /*
> + Calculate length of keys:
> + a\min\min... is the smallest possible string
> + a\max\max... is the biggest possible string
> + */
> + *min_length= ((cs->state& MY_CS_BINSORT) ?
> + (size_t) (min_str - min_org) :
> + res_length);
> + *max_length= res_length;
> + goto pad_min_max;
> + }
> +
> + if (have_contractions&&
> + my_cs_can_be_contraction_head(cs, wc)&&
> + (res= cs->cset->mb_wc(cs,&wc2, (uchar*) ptr, (uchar*) end))>
> 0)
> + {
> + uint16 *weight;
> + if ((wc2 == (my_wc_t) w_one || wc2 == (my_wc_t) w_many))
> + {
> + /* Contraction head followed by a wildcard */
> + *min_length= *max_length= res_length;
> + goto pad_min_max;
> + }
> +
> + if (my_cs_can_be_contraction_tail(cs, wc2)&&
> + (weight= my_cs_contraction2_weight(cs, wc, wc2))&& weight[0])
> + {
> + /* Contraction found */
> + if (charlen == 1)
> + {
> + /* contraction does not fit to result */
> + *min_length= *max_length= res_length;
> + goto pad_min_max;
> + }
> +
> + ptr+= res;
> + charlen--;
> +
> + /* Put contraction head */
> + if ((res= cs->cset->wc_mb(cs, wc, (uchar*) min_str, (uchar*)
> min_end))<= 0)
> + goto pad_set_lengths;
> + min_str+= res;
> +
> + if ((res= cs->cset->wc_mb(cs, wc, (uchar*) max_str, (uchar*)
> max_end))<= 0)
> + goto pad_set_lengths;
> + max_str+= res;
> + wc= wc2; /* Prepare to put contraction tail */
> + }
> + }
> +
> + /* Normal character, or contraction tail */
> + if ((res= cs->cset->wc_mb(cs, wc, (uchar*) min_str, (uchar*)
> min_end))<= 0)
> + goto pad_set_lengths;
> + min_str+= res;
> + if ((res= cs->cset->wc_mb(cs, wc, (uchar*) max_str, (uchar*)
> max_end))<= 0)
> + goto pad_set_lengths;
> + max_str+= res;
> + }
> +
> +pad_set_lengths:
> + *min_length= (size_t) (min_str - min_org);
> + *max_length= (size_t) (max_str - max_org);
> +
> +pad_min_max:
> + /*
> + Fill up max_str and min_str to res_length.
> + fill() cannot set incomplete characters and
> + requires that "length" argument is divisible to mbmilen.
> + Make sure to call fill() with prolen "length".
mbmilen and prolen?
> + */
> + res_length_diff= res_length % cs->mbminlen;
> + res_length_rounded= res_length - res_length_diff;
It seems the last variable is redundant.
> + cs->cset->fill(cs, min_str, min_end - min_str - res_length_diff,
> cs->min_sort_char);
> + cs->cset->fill(cs, max_str, max_end - max_str - res_length_diff,
> cs->max_sort_char);
> +
> + /* In case of incomplete characters set the reminder to 0x00's */
-> remainder
> + if (res_length_diff)
> + {
> + /* Example: odd res_length for ucs2 */
> + memset(min_end - res_length_diff, 0, res_length_diff);
> + memset(max_end - res_length_diff, 0, res_length_diff);
> + }
> + return rc;
> +}
> int
> my_wildcmp_mb_bin(CHARSET_INFO *cs,
> const char *str,const char *str_end,
>
> === modified file 'strings/ctype-uca.c'
> --- a/strings/ctype-uca.c 2010-11-09 08:08:02 +0000
> +++ b/strings/ctype-uca.c 2010-11-23 12:26:38 +0000
> @@ -8127,7 +8127,7 @@ MY_COLLATION_HANDLER my_collation_ucs2_u
> my_strnncollsp_ucs2_uca,
> my_strnxfrm_ucs2_uca,
> my_strnxfrmlen_simple,
> - my_like_range_ucs2,
> + my_like_range_generic,
> my_wildcmp_uca,
> NULL,
> my_instr_mb,
> @@ -10134,7 +10134,7 @@ MY_COLLATION_HANDLER my_collation_utf32_
> my_strnncollsp_any_uca,
> my_strnxfrm_any_uca,
> my_strnxfrmlen_simple,
> - my_like_range_utf32,
> + my_like_range_generic,
> my_wildcmp_uca,
> NULL,
> my_instr_mb,
> @@ -10801,7 +10801,7 @@ MY_COLLATION_HANDLER my_collation_utf16_
> my_strnncollsp_any_uca,
> my_strnxfrm_any_uca,
> my_strnxfrmlen_simple,
> - my_like_range_utf16,
> + my_like_range_generic,
> my_wildcmp_uca,
> NULL,
> my_instr_mb,
>
> === modified file 'strings/ctype-ucs2.c'
> --- a/strings/ctype-ucs2.c 2010-10-20 19:02:59 +0000
> +++ b/strings/ctype-ucs2.c 2010-11-23 12:26:38 +0000
> @@ -903,7 +903,8 @@ static void
> my_fill_mb2(CHARSET_INFO *cs __attribute__((unused)),
> char *s, size_t l, int fill)
> {
> - for ( ; l>= 2; s[0]= 0, s[1]= fill, s+= 2, l-= 2);
> + DBUG_ASSERT(fill<= 0xFFFF);
> + for ( ; l>= 2; s[0]= (fill>> 8), s[1]= (fill& 0xFF), s+= 2, l-=
> 2);
> }
>
>
> @@ -1563,98 +1564,6 @@ my_hash_sort_utf16_bin(CHARSET_INFO *cs
> }
>
>
> -/**
> - Calculate min_str and max_str that ranges a LIKE string.
> -
> - @param ptr Pointer to LIKE pattern.
> - @param ptr_length Length of LIKE pattern.
> - @param escape Escape character in LIKE. (Normally '\').
> - All escape characters should be removed
> - from min_str and max_str.
> - @param res_length Length of min_str and max_str.
> - @param min_str Smallest case sensitive string that ranges LIKE.
> - Should be space padded to res_length.
> - @param max_str Largest case sensitive string that ranges LIKE.
> - Normally padded with the biggest character sort value.
> -
> - @return Optimization status.
> - @retval FALSE if LIKE pattern can be optimized
> - @rerval TRUE if LIKE can't be optimized.
> -*/
> -
> -my_bool
> -my_like_range_utf16(CHARSET_INFO *cs,
> - const char *ptr, size_t ptr_length,
> - pbool escape, pbool w_one, pbool w_many,
> - size_t res_length,
> - char *min_str,char *max_str,
> - size_t *min_length,size_t *max_length)
> -{
> - const char *end=ptr+ptr_length;
> - char *min_org=min_str;
> - char *min_end=min_str+res_length;
> - size_t charlen= res_length / cs->mbmaxlen;
> -
> - for ( ; ptr + 1< end&& min_str + 1< min_end&&
> charlen> 0
> - ; ptr+=2, charlen--)
> - {
> - if (ptr[0] == '\0'&& ptr[1] == escape&& ptr + 1< end)
> - {
> - ptr+=2; /* Skip escape */
> - *min_str++= *max_str++ = ptr[0];
> - *min_str++= *max_str++ = ptr[1];
> - continue;
> - }
> - if (ptr[0] == '\0'&& ptr[1] == w_one) /* '_' in SQL */
> - {
> - *min_str++= (char) (cs->min_sort_char>> 8);
> - *min_str++= (char) (cs->min_sort_char& 255);
> - *max_str++= (char) (cs->max_sort_char>> 8);
> - *max_str++= (char) (cs->max_sort_char& 255);
> - continue;
> - }
> - if (ptr[0] == '\0'&& ptr[1] == w_many) /* '%' in SQL */
> - {
> - /*
> - Calculate length of keys:
> - 'a\0\0... is the smallest possible string when we have space expand
> - a\ff\ff... is the biggest possible string
> - */
> - *min_length= ((cs->state& MY_CS_BINSORT) ? (size_t) (min_str -
> min_org) :
> - res_length);
> - *max_length= res_length;
> - do {
> - *min_str++ = 0;
> - *min_str++ = 0;
> - *max_str++ = (char) (cs->max_sort_char>> 8);
> - *max_str++ = (char) (cs->max_sort_char& 255);
> - } while (min_str + 1< min_end);
> - return FALSE;
> - }
> - *min_str++= *max_str++ = ptr[0];
> - *min_str++= *max_str++ = ptr[1];
> - }
> -
> - /* Temporary fix for handling w_one at end of string (key compression) */
> - {
> - char *tmp;
> - for (tmp= min_str ; tmp-1> min_org&& tmp[-1] == '\0'&&
> tmp[-2]=='\0';)
> - {
> - *--tmp=' ';
> - *--tmp='\0';
> - }
> - }
> -
> - *min_length= *max_length = (size_t) (min_str - min_org);
> - while (min_str + 1< min_end)
> - {
> - *min_str++ = *max_str++ = '\0';
> - *min_str++ = *max_str++ = ' '; /* Because if key compression */
> - }
> - return FALSE;
> -}
> -
> -
> static MY_COLLATION_HANDLER my_collation_utf16_general_ci_handler =
> {
> NULL, /* init */
> @@ -1662,7 +1571,7 @@ static MY_COLLATION_HANDLER my_collation
> my_strnncollsp_utf16,
> my_strnxfrm_unicode,
> my_strnxfrmlen_simple,
> - my_like_range_utf16,
> + my_like_range_generic,
> my_wildcmp_utf16_ci,
> my_strcasecmp_mb2_or_mb4,
> my_instr_mb,
> @@ -1678,7 +1587,7 @@ static MY_COLLATION_HANDLER my_collation
> my_strnncollsp_utf16_bin,
> my_strnxfrm_unicode_full_bin,
> my_strnxfrmlen_unicode_full_bin,
> - my_like_range_utf16,
> + my_like_range_generic,
> my_wildcmp_utf16_bin,
> my_strcasecmp_mb2_or_mb4,
> my_instr_mb,
> @@ -2551,113 +2460,6 @@ my_strnncollsp_utf32_bin(CHARSET_INFO *c
> }
>
>
> -/**
> - Calculate min_str and max_str that ranges a LIKE string.
> -
> - @param ptr Pointer to LIKE pattern.
> - @param ptr_length Length of LIKE pattern.
> - @param escape Escape character in LIKE. (Normally '\').
> - All escape characters should be removed
> - from min_str and max_str.
> - @param res_length Length of min_str and max_str.
> - @param min_str Smallest case sensitive string that ranges LIKE.
> - Should be space padded to res_length.
> - @param max_str Largest case sensitive string that ranges LIKE.
> - Normally padded with the biggest character sort value.
> -
> - @return Optimization status.
> - @retval FALSE if LIKE pattern can be optimized
> - @rerval TRUE if LIKE can't be optimized.
> -*/
> -
> -my_bool
> -my_like_range_utf32(CHARSET_INFO *cs,
> - const char *ptr, size_t ptr_length,
> - pbool escape, pbool w_one, pbool w_many,
> - size_t res_length,
> - char *min_str,char *max_str,
> - size_t *min_length,size_t *max_length)
> -{
> - const char *end= ptr + ptr_length;
> - char *min_org= min_str;
> - char *min_end= min_str + res_length;
> - char *max_end= max_str + res_length;
> - size_t charlen= res_length / cs->mbmaxlen;
> -
> - DBUG_ASSERT((res_length % 4) == 0);
> -
> - for ( ; charlen> 0; ptr+= 4, charlen--)
> - {
> - my_wc_t wc;
> - int res;
> - if ((res= my_utf32_uni(cs,&wc, (uchar*) ptr, (uchar*) end))< 0)
> - {
> - my_fill_utf32(cs, min_str, min_end - min_str, cs->min_sort_char);
> - my_fill_utf32(cs, max_str, min_end - min_str, cs->max_sort_char);
> - /* min_length and max_legnth are not important */
> - return TRUE;
> - }
> -
> - if (wc == (my_wc_t) escape)
> - {
> - ptr+= 4; /* Skip escape */
> - if ((res= my_utf32_uni(cs,&wc, (uchar*) ptr, (uchar*) end))< 0)
> - {
> - my_fill_utf32(cs, min_str, min_end - min_str, cs->min_sort_char);
> - my_fill_utf32(cs, max_str, max_end - min_str, cs->max_sort_char);
> - /* min_length and max_length are not important */
> - return TRUE;
> - }
> - if (my_uni_utf32(cs, wc, (uchar*) min_str, (uchar*) min_end) != 4 ||
> - my_uni_utf32(cs, wc, (uchar*) max_str, (uchar*) max_end) != 4)
> - goto pad_set_lengths;
> - *min_str++= 4;
> - *max_str++= 4;
> - continue;
> - }
> -
> - if (wc == (my_wc_t) w_one)
> - {
> - if (my_uni_utf32(cs, cs->min_sort_char, (uchar*) min_str, (uchar*) min_end)
> != 4 ||
> - my_uni_utf32(cs, cs->max_sort_char, (uchar*) max_str, (uchar*) max_end)
> != 4)
> - goto pad_set_lengths;
> - min_str+= 4;
> - max_str+= 4;
> - continue;
> - }
> -
> - if (wc == (my_wc_t) w_many)
> - {
> - /*
> - Calculate length of keys:
> - 'a\0\0... is the smallest possible string when we have space expand
> - a\ff\ff... is the biggest possible string
> - */
> - *min_length= ((cs->state& MY_CS_BINSORT) ?
> - (size_t) (min_str - min_org) :
> - res_length);
> - *max_length= res_length;
> - goto pad_min_max;
> - }
> -
> - /* Normal character */
> - if (my_uni_utf32(cs, wc, (uchar*) min_str, (uchar*) min_end) != 4 ||
> - my_uni_utf32(cs, wc, (uchar*) max_str, (uchar*) max_end) != 4)
> - goto pad_set_lengths;
> - min_str+= 4;
> - max_str+= 4;
> - }
> -
> -pad_set_lengths:
> - *min_length= *max_length= (size_t) (min_str - min_org);
> -
> -pad_min_max:
> - my_fill_utf32(cs, min_str, min_end - min_str, cs->min_sort_char);
> - my_fill_utf32(cs, max_str, max_end - max_str, cs->max_sort_char);
> - return FALSE;
> -}
> -
> -
> static size_t
> my_scan_utf32(CHARSET_INFO *cs,
> const char *str, const char *end, int sequence_type)
> @@ -2689,7 +2491,7 @@ static MY_COLLATION_HANDLER my_collation
> my_strnncollsp_utf32,
> my_strnxfrm_unicode,
> my_strnxfrmlen_utf32,
> - my_like_range_utf32,
> + my_like_range_generic,
> my_wildcmp_utf32_ci,
> my_strcasecmp_mb2_or_mb4,
> my_instr_mb,
> @@ -2705,7 +2507,7 @@ static MY_COLLATION_HANDLER my_collation
> my_strnncollsp_utf32_bin,
> my_strnxfrm_unicode_full_bin,
> my_strnxfrmlen_unicode_full_bin,
> - my_like_range_utf32,
> + my_like_range_generic,
> my_wildcmp_utf32_bin,
> my_strcasecmp_mb2_or_mb4,
> my_instr_mb,
> @@ -3252,120 +3054,6 @@ void my_hash_sort_ucs2_bin(CHARSET_INFO
> }
> }
>
> -/*
> -** Calculate min_str and max_str that ranges a LIKE string.
> -** Arguments:
> -** ptr Pointer to LIKE string.
> -** ptr_length Length of LIKE string.
> -** escape Escape character in LIKE. (Normally '\').
> -** All escape characters should be removed from min_str and max_str
> -** res_length Length of min_str and max_str.
> -** min_str Smallest case sensitive string that ranges LIKE.
> -** Should be space padded to res_length.
> -** max_str Largest case sensitive string that ranges LIKE.
> -** Normally padded with the biggest character sort value.
> -**
> -** The function should return 0 if ok and 1 if the LIKE string can't be
> -** optimized !
> -*/
> -
> -my_bool my_like_range_ucs2(CHARSET_INFO *cs,
> - const char *ptr, size_t ptr_length,
> - pbool escape, pbool w_one, pbool w_many,
> - size_t res_length,
> - char *min_str,char *max_str,
> - size_t *min_length,size_t *max_length)
> -{
> - const char *end=ptr+ptr_length;
> - char *min_org=min_str;
> - char *min_end=min_str+res_length;
> - size_t charlen= res_length / cs->mbmaxlen;
> - const char *contraction_flags= cs->contractions ?
> - ((const char*) cs->contractions) + 0x40*0x40 : NULL;
> -
> - for ( ; ptr + 1< end&& min_str + 1< min_end&&
> charlen> 0
> - ; ptr+=2, charlen--)
> - {
> - if (ptr[0] == '\0'&& ptr[1] == escape&& ptr + 1< end)
> - {
> - ptr+=2; /* Skip escape */
> - *min_str++= *max_str++ = ptr[0];
> - *min_str++= *max_str++ = ptr[1];
> - continue;
> - }
> - if (ptr[0] == '\0'&& ptr[1] == w_one) /* '_' in SQL */
> - {
> - *min_str++= (char) (cs->min_sort_char>> 8);
> - *min_str++= (char) (cs->min_sort_char& 255);
> - *max_str++= (char) (cs->max_sort_char>> 8);
> - *max_str++= (char) (cs->max_sort_char& 255);
> - continue;
> - }
> - if (ptr[0] == '\0'&& ptr[1] == w_many) /* '%' in SQL */
> - {
> -fill_max_and_min:
> - /*
> - Calculate length of keys:
> - 'a\0\0... is the smallest possible string when we have space expand
> - a\ff\ff... is the biggest possible string
> - */
> - *min_length= ((cs->state& MY_CS_BINSORT) ? (size_t) (min_str -
> min_org) :
> - res_length);
> - *max_length= res_length;
> - do {
> - *min_str++ = 0;
> - *min_str++ = 0;
> - *max_str++ = (char) (cs->max_sort_char>> 8);
> - *max_str++ = (char) (cs->max_sort_char& 255);
> - } while (min_str + 1< min_end);
> - return 0;
> - }
> -
> - if (contraction_flags&& ptr + 3< end&&
> - ptr[0] == '\0'&& contraction_flags[(uchar) ptr[1]])
> - {
> - /* Contraction head found */
> - if (ptr[2] == '\0'&& (ptr[3] == w_one || ptr[3] == w_many))
> - {
> - /* Contraction head followed by a wildcard, quit */
> - goto fill_max_and_min;
> - }
> -
> - /*
> - Check if the second letter can be contraction part,
> - and if two letters really produce a contraction.
> - */
> - if (ptr[2] == '\0'&& contraction_flags[(uchar) ptr[3]]&&
> - cs->contractions[(ptr[1]-0x40)*0x40 + ptr[3] - 0x40])
> - {
> - /* Contraction found */
> - if (charlen == 1 || min_str + 2>= min_end)
> - {
> - /* Full contraction doesn't fit, quit */
> - goto fill_max_and_min;
> - }
> -
> - /* Put contraction head */
> - *min_str++= *max_str++= *ptr++;
> - *min_str++= *max_str++= *ptr++;
> - charlen--;
> - }
> - }
> - /* Put contraction tail, or a single character */
> - *min_str++= *max_str++ = ptr[0];
> - *min_str++= *max_str++ = ptr[1];
> - }
> -
> - *min_length= *max_length = (size_t) (min_str - min_org);
> - while (min_str + 1< min_end)
> - {
> - *min_str++ = *max_str++ = '\0';
> - *min_str++ = *max_str++ = ' '; /* Because if key compression */
> - }
> - return 0;
> -}
> -
> -
>
> static MY_COLLATION_HANDLER my_collation_ucs2_general_ci_handler =
> {
> @@ -3374,7 +3062,7 @@ static MY_COLLATION_HANDLER my_collation
> my_strnncollsp_ucs2,
> my_strnxfrm_unicode,
> my_strnxfrmlen_simple,
> - my_like_range_ucs2,
> + my_like_range_generic,
> my_wildcmp_ucs2_ci,
> my_strcasecmp_mb2_or_mb4,
> my_instr_mb,
> @@ -3390,7 +3078,7 @@ static MY_COLLATION_HANDLER my_collation
> my_strnncollsp_ucs2_bin,
> my_strnxfrm_unicode,
> my_strnxfrmlen_simple,
> - my_like_range_ucs2,
> + my_like_range_generic,
> my_wildcmp_ucs2_bin,
> my_strcasecmp_mb2_or_mb4,
> my_instr_mb,
Thanks,
Roy