Commit 85c7a819 authored by bar@bar.mysql.r18.ru's avatar bar@bar.mysql.r18.ru

Fix:

CREATE TABLE t1 (s1 CHAR(5) CHARACTER SET latin1 COLLATE latin1_german2_ci);
INSERT INTO t1 VALUES ('Ü');
INSERT INTO t1 VALUES ('ue');
SELECT DISTINCT s1 FROM t1;

The above returned two rows in error.
Now it returns one row, in latin1_german2_ci:  Ü == ue
parent 544f96f0
...@@ -371,8 +371,9 @@ int hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) ...@@ -371,8 +371,9 @@ int hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2)
} }
if (seg->type == HA_KEYTYPE_TEXT) if (seg->type == HA_KEYTYPE_TEXT)
{ {
if (my_strnncoll(seg->charset,(uchar*) rec1+seg->start,seg->length, if (seg->charset->coll->strnncollsp(seg->charset,
(uchar*) rec2+seg->start,seg->length)) (uchar*) rec1+seg->start,seg->length,
(uchar*) rec2+seg->start,seg->length))
return 1; return 1;
} }
else else
...@@ -404,8 +405,9 @@ int hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key) ...@@ -404,8 +405,9 @@ int hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key)
} }
if (seg->type == HA_KEYTYPE_TEXT) if (seg->type == HA_KEYTYPE_TEXT)
{ {
if (my_strnncoll(seg->charset,(uchar*) rec+seg->start, seg->length, if (seg->charset->coll->strnncollsp(seg->charset,
(uchar*) key, seg->length)) (uchar*) rec+seg->start, seg->length,
(uchar*) key, seg->length))
return 1; return 1;
} }
else else
......
...@@ -264,3 +264,18 @@ select * from t1 where word like CAST(0xDF as CHAR); ...@@ -264,3 +264,18 @@ select * from t1 where word like CAST(0xDF as CHAR);
word word2 word word2
drop table t1; drop table t1;
CREATE TABLE t1 (
s1 CHAR(5) CHARACTER SET latin1 COLLATE latin1_german2_ci
);
INSERT INTO t1 VALUES ('');
INSERT INTO t1 VALUES ('ue');
SELECT DISTINCT s1 FROM t1;
s1
SELECT s1,COUNT(*) FROM t1 GROUP BY s1;
s1 COUNT(*)
2
SELECT COUNT(DISTINCT s1) FROM t1;
COUNT(DISTINCT s1)
1
DROP TABLE t1;
...@@ -73,3 +73,13 @@ select * from t1 where word like 'AE'; ...@@ -73,3 +73,13 @@ select * from t1 where word like 'AE';
select * from t1 where word like binary 0xDF; select * from t1 where word like binary 0xDF;
select * from t1 where word like CAST(0xDF as CHAR); select * from t1 where word like CAST(0xDF as CHAR);
drop table t1; drop table t1;
CREATE TABLE t1 (
s1 CHAR(5) CHARACTER SET latin1 COLLATE latin1_german2_ci
);
INSERT INTO t1 VALUES ('');
INSERT INTO t1 VALUES ('ue');
SELECT DISTINCT s1 FROM t1;
SELECT s1,COUNT(*) FROM t1 GROUP BY s1;
SELECT COUNT(DISTINCT s1) FROM t1;
DROP TABLE t1;
...@@ -1023,7 +1023,9 @@ int simple_str_key_cmp(void* arg, byte* key1, byte* key2) ...@@ -1023,7 +1023,9 @@ int simple_str_key_cmp(void* arg, byte* key1, byte* key2)
Item_sum_count_distinct* item = (Item_sum_count_distinct*)arg; Item_sum_count_distinct* item = (Item_sum_count_distinct*)arg;
CHARSET_INFO *cs=item->key_charset; CHARSET_INFO *cs=item->key_charset;
uint len=item->key_length; uint len=item->key_length;
return my_strnncoll(cs, (const uchar*) key1, len, (const uchar*) key2, len); return cs->coll->strnncollsp(cs,
(const uchar*) key1, len,
(const uchar*) key2, len);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment