diff --git a/mysql-test/r/distinct.result b/mysql-test/r/distinct.result index 00436019f85fe5f6e312a736e3269c7dec8aeeb0..a6ad95570f8fdc2e75a27e26d6766c54f580eac5 100644 --- a/mysql-test/r/distinct.result +++ b/mysql-test/r/distinct.result @@ -512,3 +512,24 @@ id IFNULL(dsc, '-') 2 line number two 3 line number three drop table t1; +CREATE TABLE t1 ( +ID int(11) NOT NULL auto_increment, +x varchar(20) default NULL, +y decimal(10,0) default NULL, +PRIMARY KEY (ID), +KEY (y) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES +(1,'ba','-1'), +(2,'ba','1150'), +(306,'ba','-1'), +(307,'ba','1150'), +(611,'ba','-1'), +(612,'ba','1150'); +select count(distinct x,y) from t1; +count(distinct x,y) +2 +select count(distinct concat(x,y)) from t1; +count(distinct concat(x,y)) +2 +drop table t1; diff --git a/mysql-test/t/distinct.test b/mysql-test/t/distinct.test index 6483284633fa2c8f0b396453cc0514cc3bb811f1..45bd0c7a51cda49e093e780e9550e502177c2ed8 100644 --- a/mysql-test/t/distinct.test +++ b/mysql-test/t/distinct.test @@ -358,3 +358,27 @@ select distinct id, IFNULL(dsc, '-') from t1; drop table t1; # End of 4.1 tests + + +# +# Bug #15745 ( COUNT(DISTINCT CONCAT(x,y)) returns wrong result) +# +CREATE TABLE t1 ( + ID int(11) NOT NULL auto_increment, + x varchar(20) default NULL, + y decimal(10,0) default NULL, + PRIMARY KEY (ID), + KEY (y) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +INSERT INTO t1 VALUES +(1,'ba','-1'), +(2,'ba','1150'), +(306,'ba','-1'), +(307,'ba','1150'), +(611,'ba','-1'), +(612,'ba','1150'); + +select count(distinct x,y) from t1; +select count(distinct concat(x,y)) from t1; +drop table t1; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index dc1cf6cc8b716a623e66f2c266f5fb80989af893..1ff82af1e2d10dab8e48e67e5c875cf89005ac5e 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -2564,9 +2564,9 @@ bool Item_sum_count_distinct::setup(THD *thd) Field *f= *field; enum enum_field_types type= f->type(); tree_key_length+= f->pack_length(); - if (!f->binary() && (type == MYSQL_TYPE_STRING || - type == MYSQL_TYPE_VAR_STRING || - type == MYSQL_TYPE_VARCHAR)) + if ((type == MYSQL_TYPE_VARCHAR) || + !f->binary() && (type == MYSQL_TYPE_STRING || + type == MYSQL_TYPE_VAR_STRING)) { all_binary= FALSE; break;