Loading myisam/mi_open.c +10 −1 Original line number Diff line number Diff line Loading @@ -791,8 +791,17 @@ static void setup_key_functions(register MI_KEYDEF *keyinfo) keyinfo->get_key= _mi_get_pack_key; if (keyinfo->seg[0].flag & HA_PACK_KEY) { /* Prefix compression */ /* _mi_prefix_search() compares end-space against ASCII blank (' '). It cannot be used for character sets, that do not encode the blank character like ASCII does. UCS2 is an example. All character sets with a fixed width > 1 or a mimimum width > 1 cannot represent blank like ASCII does. In these cases we have to use _mi_seq_search() for the search. */ if (!keyinfo->seg->charset || use_strnxfrm(keyinfo->seg->charset) || (keyinfo->seg->flag & HA_NULL_PART)) (keyinfo->seg->flag & HA_NULL_PART) || (keyinfo->seg->charset->mbminlen > 1)) keyinfo->bin_search=_mi_seq_search; else keyinfo->bin_search=_mi_prefix_search; Loading mysql-test/r/ctype_ucs2_def.result +10 −0 Original line number Diff line number Diff line Loading @@ -21,4 +21,14 @@ INSERT INTO t1 VALUES('A', 'A'), ('B', 'B'), ('C', 'C'); INSERT INTO t1 VALUES('A ', 'A '); ERROR 23000: Duplicate entry '' for key 1 DROP TABLE t1; CREATE TABLE t1 ( c1 CHAR(255) CHARACTER SET UCS2 COLLATE UCS2_BIN NOT NULL, KEY(c1) ) ENGINE=MyISAM; INSERT INTO t1 VALUES ('marshall\'s'); INSERT INTO t1 VALUES ('marsh'); CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check status OK DROP TABLE t1; End of 5.0 tests mysql-test/t/ctype_ucs2_def.test +13 −0 Original line number Diff line number Diff line Loading @@ -39,4 +39,17 @@ INSERT INTO t1 VALUES('A', 'A'), ('B', 'B'), ('C', 'C'); INSERT INTO t1 VALUES('A ', 'A '); DROP TABLE t1; # # Bug#32705 - myisam corruption: Key in wrong position # at page 1024 with ucs2_bin # CREATE TABLE t1 ( c1 CHAR(255) CHARACTER SET UCS2 COLLATE UCS2_BIN NOT NULL, KEY(c1) ) ENGINE=MyISAM; INSERT INTO t1 VALUES ('marshall\'s'); INSERT INTO t1 VALUES ('marsh'); CHECK TABLE t1 EXTENDED; DROP TABLE t1; --echo End of 5.0 tests Loading
myisam/mi_open.c +10 −1 Original line number Diff line number Diff line Loading @@ -791,8 +791,17 @@ static void setup_key_functions(register MI_KEYDEF *keyinfo) keyinfo->get_key= _mi_get_pack_key; if (keyinfo->seg[0].flag & HA_PACK_KEY) { /* Prefix compression */ /* _mi_prefix_search() compares end-space against ASCII blank (' '). It cannot be used for character sets, that do not encode the blank character like ASCII does. UCS2 is an example. All character sets with a fixed width > 1 or a mimimum width > 1 cannot represent blank like ASCII does. In these cases we have to use _mi_seq_search() for the search. */ if (!keyinfo->seg->charset || use_strnxfrm(keyinfo->seg->charset) || (keyinfo->seg->flag & HA_NULL_PART)) (keyinfo->seg->flag & HA_NULL_PART) || (keyinfo->seg->charset->mbminlen > 1)) keyinfo->bin_search=_mi_seq_search; else keyinfo->bin_search=_mi_prefix_search; Loading
mysql-test/r/ctype_ucs2_def.result +10 −0 Original line number Diff line number Diff line Loading @@ -21,4 +21,14 @@ INSERT INTO t1 VALUES('A', 'A'), ('B', 'B'), ('C', 'C'); INSERT INTO t1 VALUES('A ', 'A '); ERROR 23000: Duplicate entry '' for key 1 DROP TABLE t1; CREATE TABLE t1 ( c1 CHAR(255) CHARACTER SET UCS2 COLLATE UCS2_BIN NOT NULL, KEY(c1) ) ENGINE=MyISAM; INSERT INTO t1 VALUES ('marshall\'s'); INSERT INTO t1 VALUES ('marsh'); CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check status OK DROP TABLE t1; End of 5.0 tests
mysql-test/t/ctype_ucs2_def.test +13 −0 Original line number Diff line number Diff line Loading @@ -39,4 +39,17 @@ INSERT INTO t1 VALUES('A', 'A'), ('B', 'B'), ('C', 'C'); INSERT INTO t1 VALUES('A ', 'A '); DROP TABLE t1; # # Bug#32705 - myisam corruption: Key in wrong position # at page 1024 with ucs2_bin # CREATE TABLE t1 ( c1 CHAR(255) CHARACTER SET UCS2 COLLATE UCS2_BIN NOT NULL, KEY(c1) ) ENGINE=MyISAM; INSERT INTO t1 VALUES ('marshall\'s'); INSERT INTO t1 VALUES ('marsh'); CHECK TABLE t1 EXTENDED; DROP TABLE t1; --echo End of 5.0 tests