List:Commits« Previous MessageNext Message »
From:Alexander Barkov Date:March 27 2009 8:40am
Subject:bzr commit into mysql-6.0 branch (bar:3067) WL#4013
View as plain text  
#At file:///home/bar/mysql-bzr/mysql-6.1-glob/ based on revid:bar@stripped

 3067 Alexander Barkov	2009-03-27
      WL#4013 Unicode german2 collation
      - Adding support for two-letter expansions
      - Adding German collations itself
      - Monor code refactoring for easier reading and maitaining.
      - Adding tests for ucs2_german2_ci, utf8_german2_ci,
        utf16_german2_ci, utf32_german2_ci
      - Extending tests for latin1_german2_ci
     @ mysql-test/include/ctype_german.inc
        Extendings tests
     @ mysql-test/r/ctype_latin1_de.result
        Recording extended test
     @ mysql-test/r/ctype_uca.result
        - Recording extended old tests.
        - Recording test for the new collation utf8_german2_ci
     @ mysql-test/r/ctype_ucs.result
        - Recording extended old tests
        - Recording test for the new collation ucs2_german2_ci
     @ mysql-test/r/ctype_utf16_uca.result
        Recording tests for the new collation utf16_german2_ci
     @ mysql-test/r/ctype_utf32_uca.result
        Recording tests for the new collation utf32_german2_ci
     @ mysql-test/r/ctype_utf8.result
        Recording extended old tests
     @ mysql-test/t/ctype_uca.test
        Adding test for utf8_german2_ci
     @ mysql-test/t/ctype_ucs.test
        Adding test for ucs2_german2_ci
     @ mysql-test/t/ctype_utf16_uca.test
        Adding test for utf16_german2_ci
     @ mysql-test/t/ctype_utf32_uca.test
        Adding test for utf32_german2_ci
     @ mysys/charset-def.c
        Adding initialization of the new collations.
     @ strings/ctype-uca.c
        - Adding support for two-letter expansions
        - Adding German collations itself
        - Monor code refactoring for easier reading and maitaining

    modified:
      mysql-test/include/ctype_german.inc
      mysql-test/r/ctype_latin1_de.result
      mysql-test/r/ctype_uca.result
      mysql-test/r/ctype_ucs.result
      mysql-test/r/ctype_utf16_uca.result
      mysql-test/r/ctype_utf32_uca.result
      mysql-test/r/ctype_utf8.result
      mysql-test/t/ctype_uca.test
      mysql-test/t/ctype_ucs.test
      mysql-test/t/ctype_utf16_uca.test
      mysql-test/t/ctype_utf32_uca.test
      mysys/charset-def.c
      strings/ctype-uca.c
=== modified file 'mysql-test/include/ctype_german.inc'
--- a/mysql-test/include/ctype_german.inc	2008-02-11 12:28:33 +0000
+++ b/mysql-test/include/ctype_german.inc	2009-03-27 07:40:07 +0000
@@ -1,3 +1,4 @@
+--echo "BEGIN ctype_german.inc"
 #
 # Bug #27877 incorrect german order in utf8_general_ci
 #
@@ -27,6 +28,11 @@ delete from t1;
 # Populate data
 #
 
+INSERT INTO t1 VALUES ('ud'),('uf');
+INSERT INTO t1 VALUES ('od'),('of');
+INSERT INTO t1 VALUES ('e');
+INSERT INTO t1 VALUES ('ad'),('af');
+
 insert into t1 values ('a'),('ae'),(_latin1 0xE4);
 insert into t1 values ('o'),('oe'),(_latin1 0xF6);
 insert into t1 values ('s'),('ss'),(_latin1 0xDF);
@@ -37,4 +43,10 @@ insert into t1 values ('u'),('ue'),(_lat
 #
 select s1, hex(s1) from t1 order by s1, binary s1;
 select group_concat(s1 order by binary s1) from t1 group by s1;
+
+SELECT s1, hex(s1), hex(weight_string(s1)) FROM t1 ORDER BY s1, BINARY(s1);
+SELECT s1, hex(s1) FROM t1 WHERE s1='ae' ORDER BY s1, BINARY(s1);
+
 drop table t1;
+
+--echo "END ctype_german.inc"

=== modified file 'mysql-test/r/ctype_latin1_de.result'
--- a/mysql-test/r/ctype_latin1_de.result	2008-07-23 09:43:50 +0000
+++ b/mysql-test/r/ctype_latin1_de.result	2009-03-27 07:40:07 +0000
@@ -326,12 +326,17 @@ latin1_german2_ci	6109
 latin1_german2_ci	61
 latin1_german2_ci	6120
 drop table t1;
+"BEGIN ctype_german.inc"
 drop table if exists t1;
 create table t1 as select repeat(' ', 64) as s1;
 select collation(s1) from t1;
 collation(s1)
 latin1_german2_ci
 delete from t1;
+INSERT INTO t1 VALUES ('ud'),('uf');
+INSERT INTO t1 VALUES ('od'),('of');
+INSERT INTO t1 VALUES ('e');
+INSERT INTO t1 VALUES ('ad'),('af');
 insert into t1 values ('a'),('ae'),(_latin1 0xE4);
 insert into t1 values ('o'),('oe'),(_latin1 0xF6);
 insert into t1 values ('s'),('ss'),(_latin1 0xDF);
@@ -339,28 +344,68 @@ insert into t1 values ('u'),('ue'),(_lat
 select s1, hex(s1) from t1 order by s1, binary s1;
 s1	hex(s1)
 a	61
+ad	6164
 ae	6165
 ä	E4
+af	6166
+e	65
 o	6F
+od	6F64
 oe	6F65
 ö	F6
+of	6F66
 s	73
 ss	7373
 ß	DF
 u	75
+ud	7564
 ue	7565
 ü	FC
+uf	7566
 select group_concat(s1 order by binary s1) from t1 group by s1;
 group_concat(s1 order by binary s1)
 a
+ad
 ae,ä
+af
+e
 o
+od
 oe,ö
+of
 s
 ss,ß
 u
+ud
 ue,ü
+uf
+SELECT s1, hex(s1), hex(weight_string(s1)) FROM t1 ORDER BY s1, BINARY(s1);
+s1	hex(s1)	hex(weight_string(s1))
+a	61	41
+ad	6164	4144
+ae	6165	4145
+ä	E4	4145
+af	6166	4146
+e	65	45
+o	6F	4F
+od	6F64	4F44
+oe	6F65	4F45
+ö	F6	4F45
+of	6F66	4F46
+s	73	53
+ss	7373	5353
+ß	DF	5353
+u	75	55
+ud	7564	5544
+ue	7565	5545
+ü	FC	5545
+uf	7566	5546
+SELECT s1, hex(s1) FROM t1 WHERE s1='ae' ORDER BY s1, BINARY(s1);
+s1	hex(s1)
+ae	6165
+ä	E4
 drop table t1;
+"END ctype_german.inc"
 SET NAMES latin1;
 CREATE TABLE t1 (
 col1 varchar(255) NOT NULL default ''

=== modified file 'mysql-test/r/ctype_uca.result'
--- a/mysql-test/r/ctype_uca.result	2008-08-18 05:43:50 +0000
+++ b/mysql-test/r/ctype_uca.result	2009-03-27 07:40:07 +0000
@@ -2666,12 +2666,17 @@ select c1 as c2h from t1 where c1 like '
 c2h
 ab_def
 drop table t1;
+"BEGIN ctype_german.inc"
 drop table if exists t1;
 create table t1 as select repeat(' ', 64) as s1;
 select collation(s1) from t1;
 collation(s1)
 utf8_unicode_ci
 delete from t1;
+INSERT INTO t1 VALUES ('ud'),('uf');
+INSERT INTO t1 VALUES ('od'),('of');
+INSERT INTO t1 VALUES ('e');
+INSERT INTO t1 VALUES ('ad'),('af');
 insert into t1 values ('a'),('ae'),(_latin1 0xE4);
 insert into t1 values ('o'),('oe'),(_latin1 0xF6);
 insert into t1 values ('s'),('ss'),(_latin1 0xDF);
@@ -2680,27 +2685,66 @@ select s1, hex(s1) from t1 order by s1, 
 s1	hex(s1)
 a	61
 6
+od	6F64
 oe	6F65
+of	6F66
 s	73
 ss	7373
 ß	C39F
 u	75
 ü	C3BC
+ud	7564
 ue	7565
+uf	7566
 select group_concat(s1 order by binary s1) from t1 group by s1;
 group_concat(s1 order by binary s1)
 a,ä
+ad
 ae
+af
+e
 o,1, hex(s1), hex(weight_string(s1)) FROM t1 ORDER BY s1, BINARY(s1);
+s1	hex(s1)	hex(weight_string(s1))
+a	61	0E33
+ä	C3A4	0E33
+ad	6164	0E330E6D
+ae	6165	0E330E8B
+af	6166	0E330EB9
+e	65	0E8B
+o	6F	0F82
+ö	C3B6	0F82
+od	6F64	0F820E6D
+oe	6F65	0F820E8B
+of	6F66	0F820EB9
+s	73	0FEA
+ss	7373	0FEA0FEA
+ß	C39F	0FEA0FEA
+u	75	101F
+ü	C3BC	101F
+ud	7564	101F0E6D
+ue	7565	101F0E8B
+uf	7566	101F0EB9
+SELECT s1, hex(s1) FROM t1 WHERE s1='ae' ORDER BY s1, BINARY(s1);
+s1	hex(s1)
+ae	6165
 drop table t1;
+"END ctype_german.inc"
 CREATE TABLE t1 (id int, a varchar(30) character set utf8);
 INSERT INTO t1 VALUES (1, _ucs2 0x01310069), (2, _ucs2 0x01310131);
 INSERT INTO t1 VALUES (3, _ucs2 0x00690069), (4, _ucs2 0x01300049);
@@ -3544,3 +3588,86 @@ hex(weight_string(cast(_latin1 0xDF6368 
 select hex(weight_string(_utf8 0xF0908080 /* U+10000 */ collate utf8_unicode_ci));
 hex(weight_string(_utf8 0xF0908080 /* U+10000 */ collate utf8_unicode_ci))
 FFFD
+Start of 6.1 tests
+SET collation_connection=utf8_german2_ci;
+"BEGIN ctype_german.inc"
+drop table if exists t1;
+create table t1 as select repeat(' ', 64) as s1;
+select collation(s1) from t1;
+collation(s1)
+utf8_german2_ci
+delete from t1;
+INSERT INTO t1 VALUES ('ud'),('uf');
+INSERT INTO t1 VALUES ('od'),('of');
+INSERT INTO t1 VALUES ('e');
+INSERT INTO t1 VALUES ('ad'),('af');
+insert into t1 values ('a'),('ae'),(_latin1 0xE4);
+insert into t1 values ('o'),('oe'),(_latin1 0xF6);
+insert into t1 values ('s'),('ss'),(_latin1 0xDF);
+insert into t1 values ('u'),('ue'),(_latin1 0xFC);
+select s1, hex(s1) from t1 order by s1, binary s1;
+s1	hex(s1)
+a	61
+ad	6164
+ae	6165
+ä	C3A4
+af	6166
+e	65
+o	6F
+od	6F64
+oe	6F65
+ö	C3B6
+of	6F66
+s	73
+ss	7373
+ß	C39F
+u	75
+ud	7564
+ue	7565
+ü	C3BC
+uf	7566
+select group_concat(s1 order by binary s1) from t1 group by s1;
+group_concat(s1 order by binary s1)
+a
+ad
+ae,ä
+af
+e
+o
+od
+oe,ö
+of
+s
+ss,ß
+u
+ud
+ue,ü
+uf
+SELECT s1, hex(s1), hex(weight_string(s1)) FROM t1 ORDER BY s1, BINARY(s1);
+s1	hex(s1)	hex(weight_string(s1))
+a	61	0E33
+ad	6164	0E330E6D
+ae	6165	0E330E8B
+ä	C3A4	0E330E8B
+af	6166	0E330EB9
+e	65	0E8B
+o	6F	0F82
+od	6F64	0F820E6D
+oe	6F65	0F820E8B
+ö	C3B6	0F820E8B
+of	6F66	0F820EB9
+s	73	0FEA
+ss	7373	0FEA0FEA
+ß	C39F	0FEA0FEA
+u	75	101F
+ud	7564	101F0E6D
+ue	7565	101F0E8B
+ü	C3BC	101F0E8B
+uf	7566	101F0EB9
+SELECT s1, hex(s1) FROM t1 WHERE s1='ae' ORDER BY s1, BINARY(s1);
+s1	hex(s1)
+ae	6165
+ä	C3A4
+drop table t1;
+"END ctype_german.inc"
+End of 6.1 tests

=== modified file 'mysql-test/r/ctype_ucs.result'
--- a/mysql-test/r/ctype_ucs.result	2009-01-06 10:38:47 +0000
+++ b/mysql-test/r/ctype_ucs.result	2009-03-27 07:40:07 +0000
@@ -716,12 +716,17 @@ select c1 as c2h from t1 where c1 like '
 c2h
 ab_def
 drop table t1;
+"BEGIN ctype_german.inc"
 drop table if exists t1;
 create table t1 as select repeat(' ', 64) as s1;
 select collation(s1) from t1;
 collation(s1)
 ucs2_general_ci
 delete from t1;
+INSERT INTO t1 VALUES ('ud'),('uf');
+INSERT INTO t1 VALUES ('od'),('of');
+INSERT INTO t1 VALUES ('e');
+INSERT INTO t1 VALUES ('ad'),('af');
 insert into t1 values ('a'),('ae'),(_latin1 0xE4);
 insert into t1 values ('o'),('oe'),(_latin1 0xF6);
 insert into t1 values ('s'),('ss'),(_latin1 0xDF);
@@ -730,27 +735,66 @@ select s1, hex(s1) from t1 order by s1, 
 s1	hex(s1)
 a	0061
 ä	00E4
+ad	00610064
 ae	00610065
+af	00610066
+e	0065
 o	006F
 ö	00F6
+od	006F0064
 oe	006F0065
+of	006F0066
 s	0073
 ß	00DF
 ss	00730073
 u	0075
 ü	00FC
+ud	00750064
 ue	00750065
+uf	00750066
 select group_concat(s1 order by binary s1) from t1 group by s1;
 group_concat(s1 order by binary s1)
 a,ä
+ad
 ae
+af
+e
 o,ö
+od
 oe
+of
 s,ß
 ss
 u,ü
+ud
 ue
+uf
+SELECT s1, hex(s1), hex(weight_string(s1)) FROM t1 ORDER BY s1, BINARY(s1);
+s1	hex(s1)	hex(weight_string(s1))
+a	0061	0041
+ä	00E4	0041
+ad	00610064	00410044
+ae	00610065	00410045
+af	00610066	00410046
+e	0065	0045
+o	006F	004F
+ö	00F6	004F
+od	006F0064	004F0044
+oe	006F0065	004F0045
+of	006F0066	004F0046
+s	0073	0053
+ß	00DF	0053
+ss	00730073	00530053
+u	0075	0055
+ü	00FC	0055
+ud	00750064	00550044
+ue	00750065	00550045
+uf	00750066	00550046
+SELECT s1, hex(s1) FROM t1 WHERE s1='ae' ORDER BY s1, BINARY(s1);
+s1	hex(s1)
+ae	00610065
 drop table t1;
+"END ctype_german.inc"
 CREATE TABLE t1 AS
 SELECT 10 AS a, REPEAT('a',20) AS b, REPEAT('a',8) AS c, REPEAT('a',8) AS d;
 ALTER TABLE t1 ADD PRIMARY KEY(a), ADD KEY(b);
@@ -1604,3 +1648,87 @@ s1	hex(s1)
 DROP TABLE t1;
 SET timestamp=0;
 SET NAMES latin1;
+End of 6.0 tests
+Start of 6.0 tests
+SET collation_connection=ucs2_german2_ci;
+"BEGIN ctype_german.inc"
+drop table if exists t1;
+create table t1 as select repeat(' ', 64) as s1;
+select collation(s1) from t1;
+collation(s1)
+ucs2_german2_ci
+delete from t1;
+INSERT INTO t1 VALUES ('ud'),('uf');
+INSERT INTO t1 VALUES ('od'),('of');
+INSERT INTO t1 VALUES ('e');
+INSERT INTO t1 VALUES ('ad'),('af');
+insert into t1 values ('a'),('ae'),(_latin1 0xE4);
+insert into t1 values ('o'),('oe'),(_latin1 0xF6);
+insert into t1 values ('s'),('ss'),(_latin1 0xDF);
+insert into t1 values ('u'),('ue'),(_latin1 0xFC);
+select s1, hex(s1) from t1 order by s1, binary s1;
+s1	hex(s1)
+a	0061
+ad	00610064
+ae	00610065
+ä	00E4
+af	00610066
+e	0065
+o	006F
+od	006F0064
+oe	006F0065
+ö	00F6
+of	006F0066
+s	0073
+ss	00730073
+ß	00DF
+u	0075
+ud	00750064
+ue	00750065
+ü	00FC
+uf	00750066
+select group_concat(s1 order by binary s1) from t1 group by s1;
+group_concat(s1 order by binary s1)
+a
+ad
+ae,ä
+af
+e
+o
+od
+oe,x(weight_string(s1)) FROM t1 ORDER BY s1, BINARY(s1);
+s1	hex(s1)	hex(weight_string(s1))
+a	0061	0E33
+ad	00610064	0E330E6D
+ae	00610065	0E330E8B
+ä	00E4	0E330E8B
+af	00610066	0E330EB9
+e	0065	0E8B
+o	006F	0F82
+od	006F0064	0F820E6D
+oe	006F0065	0F820E8B
+ö	00F6	0F820E8B
+of	006F0066	0F820EB9
+s	0073	0FEA
+ss	00730073	0FEA0FEA
+ß	00DF	0FEA0FEA
+u	0075	101F
+ud	00750064	101F0E6D
+ue	00750065	101F0E8B
+ü	00FC	101F0E8B
+uf	00750066	101F0EB9
+SELECT s1, hex(s1) FROM t1 WHERE s1='ae' ORDER BY s1, BINARY(s1);
+s1	hex(s1)
+ae	00610065
+ä	00E4
+drop table t1;
+"END ctype_german.inc"
+End of 6.1 tests

=== modified file 'mysql-test/r/ctype_utf16_uca.result'
--- a/mysql-test/r/ctype_utf16_uca.result	2008-07-23 09:43:50 +0000
+++ b/mysql-test/r/ctype_utf16_uca.result	2009-03-27 07:40:07 +0000
@@ -2698,5 +2698,87 @@ NULL
 NULL
 NULL
 drop table t1;
-set names latin1;
 End of 5.2 tests
+SET NAMES utf8;
+SET collation_connection=utf16_german2_ci;
+"BEGIN ctype_german.inc"
+drop table if exists t1;
+create table t1 as select repeat(' ', 64) as s1;
+select collation(s1) from t1;
+collation(s1)
+utf16_german2_ci
+delete from t1;
+INSERT INTO t1 VALUES ('ud'),('uf');
+INSERT INTO t1 VALUES ('od'),('of');
+INSERT INTO t1 VALUES ('e');
+INSERT INTO t1 VALUES ('ad'),('af');
+insert into t1 values ('a'),('ae'),(_latin1 0xE4);
+insert into t1 values ('o'),('oe'),(_latin1 0xF6);
+insert into t1 values ('s'),('ss'),(_latin1 0xDF);
+insert into t1 values ('u'),('ue'),(_latin1 0xFC);
+select s1, hex(s1) from t1 order by s1, binary s1;
+s1	hex(s1)
+a	0061
+ad	00610064
+ae	00610065
+ä	00E4
+af	00610066
+e	0065
+o	006F
+od	006F0064
+oe	006F0065
+0075
+ud	00750064
+ue	00750065
+ü	00FC
+uf	00750066
+select group_concat(s1 order by binary s1) from t1 group by s1;
+group_concat(s1 order by binary s1)
+a
+ad
+ae,Ã+uf
+SELECT s1, hex(s1), hex(weight_string(s1)) FROM t1 ORDER BY s1, BINARY(s1);
+s1	hex(s1)	hex(weight_string(s1))
+a	0061	0E33
+ad	00610064	0E330E6D
+ae	00610065	0E330E8B
+ä	00E4	0E330E8B
+af	00610066	0E330EB9
+e	0065	0E8B
+o	006F	0F82
+od	006F0064	0F820E6D
+oe	006F0065	0F820E8B
+ö	00F6	0F820E8B
+of	006F0066	0F820EB9
+s	0073	0FEA
+ss	00730073	0FEA0FEA
+ß	00DF	0FEA0FEA
+u	0075	101F
+ud	00750064	101F0E6D
+ue	00750065	101F0E8B
+ü	00FC	101F0E8B
+uf	00750066	101F0EB9
+SELECT s1, hex(s1) FROM t1 WHERE s1='ae' ORDER BY s1, BINARY(s1);
+s1	hex(s1)
+ae	00610065
+ä	00E4
+drop table t1;
+"END ctype_german.inc"
+End of 6.1 tests

=== modified file 'mysql-test/r/ctype_utf32_uca.result'
--- a/mysql-test/r/ctype_utf32_uca.result	2008-07-23 09:43:50 +0000
+++ b/mysql-test/r/ctype_utf32_uca.result	2009-03-27 07:40:07 +0000
@@ -2698,5 +2698,87 @@ NULL
 NULL
 NULL
 drop table t1;
-set names latin1;
 End of 5.2 tests
+SET NAMES utf8;
+SET collation_connection=utf32_german2_ci;
+"BEGIN ctype_german.inc"
+drop table if exists t1;
+create table t1 as select repeat(' ', 64) as s1;
+select collation(s1) from t1;
+collation(s1)
+utf32_german2_ci
+delete from t1;
+INSERT INTO t1 VALUES ('ud'),('uf');
+INSERT INTO t1 VALUES ('od'),('of');
+INSERT INTO t1 VALUES ('e');
+INSERT INTO t1 VALUES ('ad'),('af');
+insert into t1 values ('a'),('ae'),(_latin1 0xE4);
+insert into t1 values ('o'),('oe'),(_latin1 0xF6);
+insert into t1 values ('s'),('ss'),(_latin1 0xDF);
+insert into t1 values ('u'),('ue'),(_latin1 0xFC);
+select s1, hex(s1) from t1 order by s1, binary s1;
+s1	hex(s1)
+a	00000061
+ad	0000006100000064
+ae	0000006100000065
+ä	000000E4
+af	0000006100000066
+e	00000065
+o	0000006F
+od	0000006F00000064
+oe	0000006F00000065
+ö	000000F6
+of	0000006F00000066
+s	00000073
+ss	0000007300000073
+ß	000000DF
+u	00000075
+ud	0000007500000064
+ue	0000007500000065
+ü	000000FC
+uf	0000007500000066
+select group_concat(s1 order by binary s1) from t1 group by s1;
+group_concat(s1 order by binary s1)
+a
+ad
+ae,ä
+af
+e
+o
+od
+oe,ö
+of
+s
+ss,ß
+u
+ud
+ue,ü
+uf
+SELECT s1, hex(s1), hex(weight_string(s1)) FROM t1 ORDER BY s1, BINARY(s1);
+s1	hex(s1)	hex(weight_string(s1))
+a	00000061	0E33
+ad	0000006100000064	0E330E6D
+ae	0000006100000065	0E330E8B
+ä	000000E4	0E330E8B
+af	0000006100000066	0E330EB9
+e	00000065	0E8B
+o	0000006F	0F82
+od	0000006F00000064	0F820E6D
+oe	0000006F00000065	0F820E8B
+ö	000000F6	0F820E8B
+of	0000006F00000066	0F820EB9
+s	00000073	0FEA
+ss	0000007300000073	0FEA0FEA
+ß	000000DF	0FEA0FEA
+u	00000075	101F
+ud	0000007500000064	101F0E6D
+ue	0000007500000065	101F0E8B
+ü	000000FC	101F0E8B
+uf	0000007500000066	101F0EB9
+SELECT s1, hex(s1) FROM t1 WHERE s1='ae' ORDER BY s1, BINARY(s1);
+s1	hex(s1)
+ae	0000006100000065
+ä	000000E4
+drop table t1;
+"END ctype_german.inc"
+End of 6.1 tests

=== modified file 'mysql-test/r/ctype_utf8.result'
--- a/mysql-test/r/ctype_utf8.result	2009-02-13 16:30:54 +0000
+++ b/mysql-test/r/ctype_utf8.result	2009-03-27 07:40:07 +0000
@@ -939,12 +939,17 @@ select c1 as c2h from t1 where c1 like '
 c2h
 ab_def
 drop table t1;
+"BEGIN ctype_german.inc"
 drop table if exists t1;
 create table t1 as select repeat(' ', 64) as s1;
 select collation(s1) from t1;
 collation(s1)
 utf8_general_ci
 delete from t1;
+INSERT INTO t1 VALUES ('ud'),('uf');
+INSERT INTO t1 VALUES ('od'),('of');
+INSERT INTO t1 VALUES ('e');
+INSERT INTO t1 VALUES ('ad'),('af');
 insert into t1 values ('a'),('ae'),(_latin1 0xE4);
 insert into t1 values ('o'),('oe'),(_latin1 0xF6);
 insert into t1 values ('s'),('ss'),(_latin1 0xDF);
@@ -953,27 +958,66 @@ select s1, hex(s1) from t1 order by s1, 
 s1	hex(s1)
 a	61
 ä	C3A4
+ad	6164
 ae	6165
+af	6166
+e	65
 o	6F
 ö	C3B6
+od	6F64
 oe	6F65
+of	6F66
 s	73
 ß	C39F
 ss	7373
 u	75
 ü	C3BC
+ud	7564
 ue	7565
+uf	7566
 select group_concat(s1 order by binary s1) from t1 group by s1;
 group_concat(s1 order by binary s1)
 a,ä
+ad
 ae
+af
+e
 o,ö
+od
 oe
+of
 s,ß
 ss
 u,ü
+ud
 ue
+uf
+SELECT s1, hex(s1), hex(weight_string(s1)) FROM t1 ORDER BY s1, BINARY(s1);
+s1	hex(s1)	hex(weight_string(s1))
+a	61	0041
+ä	C3A4	0041
+ad	6164	00410044
+ae	6165	00410045
+af	6166	00410046
+e	65	0045
+o	6F	004F
+ö	C3B6	004F
+od	6F64	004F0044
+oe	6F65	004F0045
+of	6F66	004F0046
+s	73	0053
+ß	C39F	0053
+ss	7373	00530053
+u	75	0055
+ü	C3BC	0055
+ud	7564	00550044
+ue	7565	00550045
+uf	7566	00550046
+SELECT s1, hex(s1) FROM t1 WHERE s1='ae' ORDER BY s1, BINARY(s1);
+s1	hex(s1)
+ae	6165
 drop table t1;
+"END ctype_german.inc"
 SET collation_connection='utf8_bin';
 create table t1 select repeat('a',4000) a;
 delete from t1;

=== modified file 'mysql-test/t/ctype_uca.test'
--- a/mysql-test/t/ctype_uca.test	2008-07-23 09:43:50 +0000
+++ b/mysql-test/t/ctype_uca.test	2009-03-27 07:40:07 +0000
@@ -567,3 +567,13 @@ set @@collation_connection=ucs2_czech_ci
 # Bug#33077 weight of supplementary characters is not 0xfffd
 #
 select hex(weight_string(_utf8 0xF0908080 /* U+10000 */ collate utf8_unicode_ci));
+
+
+--echo Start of 6.1 tests
+#
+# WL#4013 Unicode german2 collation
+#
+SET collation_connection=utf8_german2_ci;
+--source include/ctype_german.inc
+
+--echo End of 6.1 tests

=== modified file 'mysql-test/t/ctype_ucs.test'
--- a/mysql-test/t/ctype_ucs.test	2009-01-06 10:38:47 +0000
+++ b/mysql-test/t/ctype_ucs.test	2009-03-27 07:40:07 +0000
@@ -708,4 +708,14 @@ select hex(char(0x01020304 using ucs2));
 SET collation_connection=ucs2_general_ci;
 --source include/ctype_datetime.inc
 SET NAMES latin1;
+--echo End of 6.0 tests
 
+--echo Start of 6.0 tests
+
+#
+# WL#4013 Unicode german2 collation
+#
+SET collation_connection=ucs2_german2_ci;
+--source include/ctype_german.inc
+
+--echo End of 6.1 tests

=== modified file 'mysql-test/t/ctype_utf16_uca.test'
--- a/mysql-test/t/ctype_utf16_uca.test	2008-07-23 09:43:50 +0000
+++ b/mysql-test/t/ctype_utf16_uca.test	2009-03-27 07:40:07 +0000
@@ -290,6 +290,14 @@ set @@collation_connection=utf16_czech_c
 #
 set collation_connection=utf16_unicode_ci;
 --source include/ctype_regex.inc
-set names latin1;
 
 --echo End of 5.2 tests
+
+#
+# WL#4013 Unicode german2 collation
+#
+SET NAMES utf8;
+SET collation_connection=utf16_german2_ci;
+--source include/ctype_german.inc
+
+--echo End of 6.1 tests

=== modified file 'mysql-test/t/ctype_utf32_uca.test'
--- a/mysql-test/t/ctype_utf32_uca.test	2008-07-23 09:43:50 +0000
+++ b/mysql-test/t/ctype_utf32_uca.test	2009-03-27 07:40:07 +0000
@@ -291,6 +291,14 @@ set @@collation_connection=utf32_czech_c
 #
 set collation_connection=utf32_unicode_ci;
 --source include/ctype_regex.inc
-set names latin1;
 
 --echo End of 5.2 tests
+
+#
+# WL#4013 Unicode german2 collation
+#
+SET NAMES utf8;
+SET collation_connection=utf32_german2_ci;
+--source include/ctype_german.inc
+
+--echo End of 6.1 tests

=== modified file 'mysys/charset-def.c'
--- a/mysys/charset-def.c	2007-10-22 12:02:48 +0000
+++ b/mysys/charset-def.c	2009-03-27 07:40:07 +0000
@@ -24,6 +24,7 @@
 #ifdef HAVE_UCA_COLLATIONS
 
 #ifdef HAVE_CHARSET_ucs2
+extern CHARSET_INFO my_charset_ucs2_german2_uca_ci;
 extern CHARSET_INFO my_charset_ucs2_icelandic_uca_ci;
 extern CHARSET_INFO my_charset_ucs2_latvian_uca_ci;
 extern CHARSET_INFO my_charset_ucs2_romanian_uca_ci;
@@ -47,6 +48,7 @@ extern CHARSET_INFO my_charset_ucs2_sinh
 
 
 #ifdef HAVE_CHARSET_utf32
+extern CHARSET_INFO my_charset_utf32_german2_uca_ci;
 extern CHARSET_INFO my_charset_utf32_icelandic_uca_ci;
 extern CHARSET_INFO my_charset_utf32_latvian_uca_ci;
 extern CHARSET_INFO my_charset_utf32_romanian_uca_ci;
@@ -70,6 +72,7 @@ extern CHARSET_INFO my_charset_utf32_sin
  
  
 #ifdef HAVE_CHARSET_utf16
+extern CHARSET_INFO my_charset_utf16_german2_uca_ci;
 extern CHARSET_INFO my_charset_utf16_icelandic_uca_ci;
 extern CHARSET_INFO my_charset_utf16_latvian_uca_ci;
 extern CHARSET_INFO my_charset_utf16_romanian_uca_ci;
@@ -93,6 +96,7 @@ extern CHARSET_INFO my_charset_utf16_sin
  
 
 #ifdef HAVE_CHARSET_utf8mb3
+extern CHARSET_INFO my_charset_utf8mb3_german2_uca_ci;
 extern CHARSET_INFO my_charset_utf8mb3_icelandic_uca_ci;
 extern CHARSET_INFO my_charset_utf8mb3_latvian_uca_ci;
 extern CHARSET_INFO my_charset_utf8mb3_romanian_uca_ci;
@@ -118,6 +122,7 @@ extern CHARSET_INFO my_charset_utf8mb3_g
 #endif /* HAVE_CHARSET_utf8mb3 */
 
 #ifdef HAVE_CHARSET_utf8mb4
+extern CHARSET_INFO my_charset_utf8mb4_german2_uca_ci;
 extern CHARSET_INFO my_charset_utf8mb4_icelandic_uca_ci;
 extern CHARSET_INFO my_charset_utf8mb4_latvian_uca_ci;
 extern CHARSET_INFO my_charset_utf8mb4_romanian_uca_ci;
@@ -206,6 +211,7 @@ my_bool init_compiled_charsets(myf flags
   add_compiled_collation(&my_charset_ucs2_bin);
 #ifdef HAVE_UCA_COLLATIONS
   add_compiled_collation(&my_charset_ucs2_unicode_ci);
+  add_compiled_collation(&my_charset_ucs2_german2_uca_ci);
   add_compiled_collation(&my_charset_ucs2_icelandic_uca_ci);
   add_compiled_collation(&my_charset_ucs2_latvian_uca_ci);
   add_compiled_collation(&my_charset_ucs2_romanian_uca_ci);
@@ -241,6 +247,7 @@ my_bool init_compiled_charsets(myf flags
 #endif
 #ifdef HAVE_UCA_COLLATIONS
   add_compiled_collation(&my_charset_utf8mb3_unicode_ci);
+  add_compiled_collation(&my_charset_utf8mb3_german2_uca_ci);
   add_compiled_collation(&my_charset_utf8mb3_icelandic_uca_ci);
   add_compiled_collation(&my_charset_utf8mb3_latvian_uca_ci);
   add_compiled_collation(&my_charset_utf8mb3_romanian_uca_ci);
@@ -269,6 +276,7 @@ my_bool init_compiled_charsets(myf flags
   add_compiled_collation(&my_charset_utf8mb4_bin);
 #ifdef HAVE_UCA_COLLATIONS
   add_compiled_collation(&my_charset_utf8mb4_unicode_ci);
+  add_compiled_collation(&my_charset_utf8mb4_german2_uca_ci);
   add_compiled_collation(&my_charset_utf8mb4_icelandic_uca_ci);
   add_compiled_collation(&my_charset_utf8mb4_latvian_uca_ci);
   add_compiled_collation(&my_charset_utf8mb4_romanian_uca_ci);
@@ -297,6 +305,7 @@ my_bool init_compiled_charsets(myf flags
   add_compiled_collation(&my_charset_utf16_bin);
 #ifdef HAVE_UCA_COLLATIONS
   add_compiled_collation(&my_charset_utf16_unicode_ci);
+  add_compiled_collation(&my_charset_utf16_german2_uca_ci);
   add_compiled_collation(&my_charset_utf16_icelandic_uca_ci);
   add_compiled_collation(&my_charset_utf16_latvian_uca_ci);
   add_compiled_collation(&my_charset_utf16_romanian_uca_ci);
@@ -325,6 +334,7 @@ my_bool init_compiled_charsets(myf flags
   add_compiled_collation(&my_charset_utf32_bin);
 #ifdef HAVE_UCA_COLLATIONS
   add_compiled_collation(&my_charset_utf32_unicode_ci);
+  add_compiled_collation(&my_charset_utf32_german2_uca_ci);
   add_compiled_collation(&my_charset_utf32_icelandic_uca_ci);
   add_compiled_collation(&my_charset_utf32_latvian_uca_ci);
   add_compiled_collation(&my_charset_utf32_romanian_uca_ci);

=== modified file 'strings/ctype-uca.c'
--- a/strings/ctype-uca.c	2008-10-31 12:25:42 +0000
+++ b/strings/ctype-uca.c	2009-03-27 07:40:07 +0000
@@ -6521,6 +6521,16 @@ NULL       ,page0F9data,page0FAdata,page
 page0FCdata,page0FDdata,page0FEdata,page0FFdata
 };
 
+
+/*
+  German Phonebook
+*/
+static const char german2[]=
+    "&AE << \\u00E4 <<< \\u00C4 "
+    "&OE << \\u00F6 <<< \\u00D6 "
+    "&UE << \\u00FC <<< \\u00DC ";
+
+
 /*
   Some sources treat LETTER A WITH DIARESIS (00E4,00C4)
   secondary greater than LETTER AE (00E6,00C6).
@@ -7741,7 +7751,7 @@ ex:
 
 typedef struct my_coll_rule_item_st
 {
-  uint base;     /* Base character                             */
+  uint base[2];  /* Base character                             */
   uint curr[2];  /* Current character                          */
   int diff[3];   /* Primary, Secondary and Tertiary difference */
 } MY_COLL_RULE;
@@ -7817,16 +7827,30 @@ static int my_coll_rule_parse(MY_COLL_RU
       
       if (prevlexnum == MY_COLL_LEXEM_SHIFT)
       {
-        item.base= lexem.code;
+        MY_COLL_LEXEM savlex= lexem;
+        item.base[0]= lexem.code;
         item.diff[0]= 0;
         item.diff[1]= 0;
         item.diff[2]= 0;
+        
+        /* Check if shift to a double character (expansion) */
+        if ((lexnum= my_coll_lexem_next(&lexem)) == MY_COLL_LEXEM_CHAR)
+        {
+          item.base[1]= lexem.code;
+        }
+        else
+        {
+          item.base[1]= 0;
+          lexem= savlex;   /* Restore previous parser state */
+        }
       }
       else if (prevlexnum == MY_COLL_LEXEM_DIFF)
       {
         MY_COLL_LEXEM savlex;
         savlex= lexem;
         item.curr[0]= lexem.code;
+        
+        /* Check if diff for a double character (contraction) */
         if ((lexnum= my_coll_lexem_next(&lexem)) == MY_COLL_LEXEM_CHAR)
         {
           item.curr[1]= lexem.code;
@@ -7876,6 +7900,67 @@ static int my_coll_rule_parse(MY_COLL_RU
 
 #define MY_MAX_COLL_RULE 128
 
+/**
+  Helper function:
+  Find address of weights of the given character.
+  
+  @weights  UCA weight array
+  @lengths  UCA length array
+  @ch       character Unicode code point
+  
+  @return Weight array
+    @retval  pointer to weight array for the given character,
+             or NULL if this page does not have implicit weights.
+*/
+
+static inline uint16 *
+my_char_weight_addr(uint16 **weights, const uchar *lengths, uint ch)
+{
+  uint page= (ch >> 8) & 0xFF;
+  uint ofst= ch & 0xFF;
+  return weights[page] ? weights[page] + ofst * lengths[page] : NULL;
+}
+
+
+
+/**
+  Helper function:
+  Copies UCA weights for a given "uint" string
+  to the given location.
+  
+  @weights    source UCA weight array
+  @lengths    source UCA length array
+  @to         destination
+  @to_length  size of destination
+  @str        string
+  @len        string length
+  
+  @return    number of weights put
+*/
+
+static size_t
+my_char_weight_put(uint16 **weights, const uchar *lengths,
+                   uint16 *to, size_t to_length,
+                   uint *str, size_t len)
+{
+  size_t i, count;
+  if (!to_length)
+    return 0;
+  to_length--; /* Without trailing zero */
+  for (count=0, i= 0; (i < len) && (count < to_length); i++, str++)
+  {
+    uint16 *from= my_char_weight_addr(weights, lengths, *str);
+    for ( ; from && from[0]; from++)
+    {
+      *to++= *from;
+      count++;
+    }
+  }
+  *to= 0;
+  return count;
+}
+
+
 /*
   This function copies an UCS2 collation from
   the default Unicode Collation Algorithm (UCA)
@@ -7895,14 +7980,13 @@ static int my_coll_rule_parse(MY_COLL_RU
 
 static my_bool create_tailoring(CHARSET_INFO *cs, void *(*alloc)(size_t))
 {
-  MY_COLL_RULE rule[MY_MAX_COLL_RULE];
+  MY_COLL_RULE rule[MY_MAX_COLL_RULE], *r, *rlast;
   char errstr[128];
   uchar   *newlengths;
   uint16 **newweights;
   const uchar *deflengths= uca_length;
   uint16     **defweights= uca_weight;
-  int rc, i;
-  int ncontractions= 0;
+  int rc, ncontractions= 0;
   
   if (!cs->tailoring)
     return 1;
@@ -7919,6 +8003,7 @@ static my_bool create_tailoring(CHARSET_
     */
     return 1;
   }
+  rlast= rule + rc;
   
   if (!(newweights= (uint16**) (*alloc)(256*sizeof(uint16*))))
     return 1;
@@ -7933,12 +8018,12 @@ static my_bool create_tailoring(CHARSET_
     Calculate maximum lenghts for the pages
     which will be overwritten.
   */
-  for (i=0; i < rc; i++)
+  for (r= rule; r < rlast; r++)
   {
-    if (!rule[i].curr[1]) /* If not a contraction */
+    if (!r->curr[1]) /* If not a contraction */
     {
-      uint pageb= (rule[i].base >> 8) & 0xFF;
-      uint pagec= (rule[i].curr[0] >> 8) & 0xFF;
+      uint pageb= (r->base[0] >> 8) & 0xFF;
+      uint pagec= (r->curr[0] >> 8) & 0xFF;
     
       if (newlengths[pagec] < deflengths[pageb])
         newlengths[pagec]= deflengths[pageb];
@@ -7947,57 +8032,7 @@ static my_bool create_tailoring(CHARSET_
       ncontractions++;
   }
   
-  for (i=0; i < rc;  i++)
-  {
-    uint pageb= (rule[i].base >> 8) & 0xFF;
-    uint pagec= (rule[i].curr[0] >> 8) & 0xFF;
-    uint chb, chc;
-    
-    if (rule[i].curr[1]) /* Skip contraction */
-      continue;
-    
-    if (!newweights[pagec])
-    {
-      /* Alloc new page and copy the default UCA weights */
-      uint size= 256*newlengths[pagec]*sizeof(uint16);
-      
-      if (!(newweights[pagec]= (uint16*) (*alloc)(size)))
-        return 1;
-      bzero((void*) newweights[pagec], size);
-      
-      for (chc=0 ; chc < 256; chc++)
-      {
-        memcpy(newweights[pagec] + chc*newlengths[pagec],
-               defweights[pagec] + chc*deflengths[pagec],
-               deflengths[pagec]*sizeof(uint16));
-      }
-    }
-    
-    /* 
-      Aply the alternative rule:
-      shift to the base character and primary difference.
-    */
-    chc= rule[i].curr[0] & 0xFF;
-    chb= rule[i].base & 0xFF;
-    memcpy(newweights[pagec] + chc*newlengths[pagec],
-           defweights[pageb] + chb*deflengths[pageb],
-           deflengths[pageb]*sizeof(uint16));
-    /* Apply primary difference */
-    newweights[pagec][chc*newlengths[pagec]]+= rule[i].diff[0];
-  }
-  
-  /* Copy non-overwritten pages from the default UCA weights */
-  for (i= 0; i < 256 ; i++)
-  {
-    if (!newweights[i])
-      newweights[i]= defweights[i];
-  }
-  
-  cs->sort_order= newlengths;
-  cs->sort_order_big= newweights;
-  cs->contractions= NULL;
   
-  /* Now process contractions */
   if (ncontractions)
   {
     /*
@@ -8005,42 +8040,92 @@ static my_bool create_tailoring(CHARSET_
       plus 256 bytes for "is contraction part" flags.
     */
     uint size= 0x40*0x40*sizeof(uint16) + 256;
-    char *contraction_flags;
     if (!(cs->contractions= (uint16*) (*alloc)(size)))
         return 1;
     bzero((void*)cs->contractions, size);
-    contraction_flags= ((char*) cs->contractions) + 0x40*0x40;
-    for (i=0; i < rc; i++)
+  }
+  else
+    cs->contractions= NULL;
+  
+  
+  for (r= rule; r < rlast;  r++)
+  {
+    size_t nweights, baselen= r->base[1] ? 2 : 1;
+    uint16 *to;
+    
+    if (r->curr[1]) /* Contraction */
+    {
+      char *contraction_flags= ((char*) cs->contractions) + 0x40*0x40;
+      uint pageb= (r->base[0] >> 8) & 0xFF;
+      uint chb= r->base[0] & 0xFF;
+      uint16 *offsb= defweights[pageb] + chb*deflengths[pageb];
+      
+      if (offsb[1] || 
+          r->curr[0] < 0x40 || r->curr[0] > 0x7f ||
+          r->curr[1] < 0x40 || r->curr[1] > 0x7f)
+      {
+        /* 
+         TODO: add error reporting;
+         We support only basic latin letters contractions at this point.
+         Also, We don't support contractions with weight longer than one.
+         Otherwise, we'd need much more memory.
+        */
+        return 1;
+      }
+      /* Mark both letters as "is contraction part */
+      contraction_flags[r->curr[0]]= 1;
+      contraction_flags[r->curr[1]]= 1;
+
+      to= &cs->contractions[(r->curr[0] - 0x40) * 0x40 + (r->curr[1] - 0x40)];
+      nweights= 2; /* +1 for trailing zero */
+    }
+    else
     {
-      if (rule[i].curr[1])
+      uint16 pagec;
+      if (!newweights[pagec= ((r->curr[0] >> 8) & 0xFF)])
       {
-        uint pageb= (rule[i].base >> 8) & 0xFF;
-        uint chb= rule[i].base & 0xFF;
-        uint16 *offsb= defweights[pageb] + chb*deflengths[pageb];
-        uint offsc;
+        /* Alloc new page and copy the default UCA weights */
+        uint chc, size= 256 * newlengths[pagec] * sizeof(uint16);
         
-        if (offsb[1] || 
-            rule[i].curr[0] < 0x40 || rule[i].curr[0] > 0x7f ||
-            rule[i].curr[1] < 0x40 || rule[i].curr[1] > 0x7f)
-        {
-          /* 
-           TODO: add error reporting;
-           We support only basic latin letters contractions at this point.
-           Also, We don't support contractions with weight longer than one.
-           Otherwise, we'd need much more memory.
-          */
+        if (!(newweights[pagec]= (uint16*) (*alloc)(size)))
           return 1;
-        }
-        offsc= (rule[i].curr[0]-0x40)*0x40+(rule[i].curr[1]-0x40);
+        bzero((void*) newweights[pagec], size);
         
-        /* Copy base weight applying primary difference */
-        cs->contractions[offsc]= offsb[0] + rule[i].diff[0];
-        /* Mark both letters as "is contraction part */
-        contraction_flags[rule[i].curr[0]]= 1;
-        contraction_flags[rule[i].curr[1]]= 1;
+        for (chc=0 ; chc < 256; chc++)
+        {
+          memcpy(newweights[pagec] + chc*newlengths[pagec],
+                 defweights[pagec] + chc*deflengths[pagec],
+                 deflengths[pagec]*sizeof(uint16));
+        }
       }
+      to= my_char_weight_addr(newweights, newlengths, r->curr[0]);
+      nweights= newlengths[pagec];
+    }
+
+    /* Copy weights of the "shift to" character */
+    nweights= my_char_weight_put(defweights, deflengths,
+                                 to, nweights,
+                                 r->base, baselen);
+
+    /* Apply primary difference */
+    if (nweights)
+      to[nweights - 1]+= r->diff[0];
+  }
+  
+  
+  /* Copy non-overwritten pages from the default UCA weights */
+  {
+    size_t i;
+    for (i= 0; i < 256 ; i++)
+    {
+      if (!newweights[i])
+        newweights[i]= defweights[i];
     }
   }
+  
+  cs->sort_order= newlengths;
+  cs->sort_order_big= newweights;
+  
   return 0;
 }
 
@@ -8800,7 +8885,7 @@ CHARSET_INFO my_charset_ucs2_hungarian_u
 CHARSET_INFO my_charset_ucs2_sinhala_uca_ci=
 {
     147,0,0,             /* number       */
-    MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+    MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII,
     "ucs2",              /* csname    */
     "ucs2_sinhala_ci",   /* name         */
     "",                  /* comment      */
@@ -8832,6 +8917,41 @@ CHARSET_INFO my_charset_ucs2_sinhala_uca
 };
 
 
+CHARSET_INFO my_charset_ucs2_german2_uca_ci=
+{
+    148,0,0,             /* number       */
+    MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII,
+    "ucs2",              /* csname    */
+    "ucs2_german2_ci",   /* name         */
+    "",                  /* comment      */
+    german2,             /* tailoring    */
+    NULL,                /* ctype        */
+    NULL,                /* to_lower     */
+    NULL,                /* to_upper     */
+    NULL,                /* sort_order   */
+    NULL,                /* contractions */
+    NULL,                /* sort_order_big*/
+    NULL,                /* tab_to_uni   */
+    NULL,                /* tab_from_uni */
+    my_unicase_default,  /* caseinfo     */
+    NULL,                /* state_map    */
+    NULL,                /* ident_map    */
+    8,                   /* strxfrm_multiply */
+    1,                   /* caseup_multiply  */
+    1,                   /* casedn_multiply  */
+    2,                   /* mbminlen     */
+    2,                   /* mbmaxlen     */
+    9,                   /* min_sort_char */
+    0xFFFF,              /* max_sort_char */
+    ' ',                 /* pad char      */
+    0,                   /* escape_with_backslash_is_dangerous */
+    1,                   /* levels_for_compare */
+    1,                   /* levels_for_order   */
+    &my_charset_ucs2_handler,
+    &my_collation_ucs2_uca_handler
+};
+
+
 #endif
 
 
@@ -9568,6 +9688,41 @@ CHARSET_INFO my_charset_utf8mb3_sinhala_
     &my_collation_any_uca_handler
 };
 
+
+CHARSET_INFO my_charset_utf8mb3_german2_uca_ci=
+{
+    212,0,0,             /* number       */
+    MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+    MY_UTF8MB3,          /* cs name      */
+    MY_UTF8MB3 "_german2_ci",/* name    */
+    "",                  /* comment      */
+    german2,             /* tailoring    */
+    ctype_utf8,          /* ctype        */
+    NULL,                /* to_lower     */
+    NULL,                /* to_upper     */
+    NULL,                /* sort_order   */
+    NULL,                /* contractions */
+    NULL,                /* sort_order_big*/
+    NULL,                /* tab_to_uni   */
+    NULL,                /* tab_from_uni */
+    my_unicase_default,  /* caseinfo     */
+    NULL,                /* state_map    */
+    NULL,                /* ident_map    */
+    8,                   /* strxfrm_multiply */
+    1,                   /* caseup_multiply  */
+    1,                   /* casedn_multiply  */
+    3,                   /* mbminlen     */
+    3,                   /* mbmaxlen     */
+    9,                   /* min_sort_char */
+    0xFFFF,              /* max_sort_char */
+    ' ',                 /* pad char      */
+    0,                   /* escape_with_backslash_is_dangerous */
+    1,                   /* levels_for_compare */
+    1,                   /* levels_for_order   */
+    &my_charset_utf8mb3_handler,
+    &my_collation_any_uca_handler
+};
+
 #endif /* HAVE_CHARSET_utf8mb3 */
 
 
@@ -10257,6 +10412,40 @@ CHARSET_INFO my_charset_utf8mb4_sinhala_
     &my_collation_any_uca_handler
 };
 
+CHARSET_INFO my_charset_utf8mb4_german2_uca_ci=
+{
+    244,0,0,            /* number       */
+    MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+    MY_UTF8MB4,         /* csname      */
+    MY_UTF8MB4 "_german2_ci",/* name  */
+    "",                 /* comment      */
+    german2,            /* tailoring    */
+    ctype_utf8,         /* ctype        */
+    NULL,               /* to_lower     */
+    NULL,               /* to_upper     */
+    NULL,               /* sort_order   */
+    NULL,               /* contractions */
+    NULL,               /* sort_order_big*/
+    NULL,               /* tab_to_uni   */
+    NULL,               /* tab_from_uni */
+    my_unicase_default, /* caseinfo     */
+    NULL,               /* state_map    */
+    NULL,               /* ident_map    */
+    8,                  /* strxfrm_multiply */
+    1,                  /* caseup_multiply  */
+    1,                  /* casedn_multiply  */
+    1,                  /* mbminlen      */
+    4,                  /* mbmaxlen      */
+    9,                  /* min_sort_char */
+    0xFFFF,             /* max_sort_char */
+    ' ',                /* pad char      */
+    0,                  /* escape_with_backslash_is_dangerous */
+    1,                  /* levels_for_compare */
+    1,                  /* levels_for_order   */
+    &my_charset_utf8mb4_handler,
+    &my_collation_any_uca_handler
+};
+
 #endif /* HAVE_CHARSET_utf8mb4 */
 
 
@@ -10961,6 +11150,40 @@ CHARSET_INFO my_charset_utf32_sinhala_uc
     &my_collation_utf32_uca_handler
 };
 
+CHARSET_INFO my_charset_utf32_german2_uca_ci=
+{
+    180,0,0,            /* number       */
+    MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII,
+    "utf32",            /* csname      */
+    "utf32_german2_ci", /* name         */
+    "",                 /* comment      */
+    german2,            /* tailoring    */
+    NULL,               /* ctype        */
+    NULL,               /* to_lower     */
+    NULL,               /* to_upper     */
+    NULL,               /* sort_order   */
+    NULL,               /* contractions */
+    NULL,               /* sort_order_big*/
+    NULL,               /* tab_to_uni   */
+    NULL,               /* tab_from_uni */
+    my_unicase_default, /* caseinfo     */
+    NULL,               /* state_map    */
+    NULL,               /* ident_map    */
+    8,                  /* strxfrm_multiply */
+    1,                  /* caseup_multiply  */
+    1,                  /* casedn_multiply  */
+    4,                  /* mbminlen     */
+    4,                  /* mbmaxlen     */
+    9,                  /* min_sort_char */
+    0xFFFF,             /* max_sort_char */
+    ' ',                /* pad char      */
+    0,                  /* escape_with_backslash_is_dangerous */
+    1,                  /* levels_for_compare */
+    1,                  /* levels_for_order   */
+    &my_charset_utf32_handler,
+    &my_collation_utf32_uca_handler
+};
+
 #endif /* HAVE_CHARSET_utf32 */
 
 
@@ -11666,6 +11889,40 @@ CHARSET_INFO my_charset_utf16_sinhala_uc
     &my_collation_utf16_uca_handler
 };
 
+CHARSET_INFO my_charset_utf16_german2_uca_ci=
+{
+    121,0,0,           /* number       */
+    MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII,
+    "utf16",           /* cs name    */
+    "utf16_german2_ci",/* name         */
+    "",                /* comment      */
+    german2,           /* tailoring    */
+    NULL,              /* ctype        */
+    NULL,              /* to_lower     */
+    NULL,              /* to_upper     */
+    NULL,              /* sort_order   */
+    NULL,              /* contractions */
+    NULL,              /* sort_order_big*/
+    NULL,              /* tab_to_uni   */
+    NULL,              /* tab_from_uni */
+    my_unicase_default,/* caseinfo     */
+    NULL,              /* state_map    */
+    NULL,              /* ident_map    */
+    8,                 /* strxfrm_multiply */
+    1,                 /* caseup_multiply  */
+    1,                 /* casedn_multiply  */
+    2,                 /* mbminlen     */
+    4,                 /* mbmaxlen     */
+    9,                 /* min_sort_char */
+    0xFFFF,            /* max_sort_char */
+    ' ',               /* pad char      */
+    0,                 /* escape_with_backslash_is_dangerous */
+    1,                 /* levels_for_compare */
+    1,                 /* levels_for_order   */
+    &my_charset_utf16_handler,
+    &my_collation_utf16_uca_handler
+};
+
 #endif /* HAVE_CHARSET_utf16 */
 
 

Attachment: [text/bzr-bundle] bzr/bar@mysql.com-20090327074007-b3ad6jaro05e0ai1.bundle
Thread
bzr commit into mysql-6.0 branch (bar:3067) WL#4013Alexander Barkov27 Mar