| Bug #70930 | count distinct get error result | ||
|---|---|---|---|
| Submitted: | 16 Nov 2013 15:51 | Modified: | 20 Nov 2013 14:01 |
| Reporter: | xiaobin lin (OCA) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: DML | Severity: | S2 (Serious) |
| Version: | 5.1+, 5.5+, 5.6.14, 5.7.2-m12 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | count, distinct, tmp_table_size | ||
[16 Nov 2013 15:52]
xiaobin lin
base on 5.6 (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: merge_walk_5613.diff (application/octet-stream, text), 1.77 KiB.
[18 Nov 2013 5:53]
xiaobin lin
5.1 is ok. only 5.5 and 5.6 can repeat
[18 Nov 2013 6:15]
MySQL Verification Team
Hello Xiaobin, Thank you for the bug report and contribution. Verified as described. Thanks, Umesh
[18 Nov 2013 7:45]
xiaobin lin
In 5.1, it use max_heap_table_size to limit the memory used. So the case should set max_heap_table_size=16384, and need more data (65536 rows can repeat it)
[20 Nov 2013 12:28]
Erlend Dahl
This has been fixed in 5.7.3 (to be released).
[20 Nov 2013 13:45]
Erlend Dahl
This is BUG#17500866 in the 5.7.3 changelog (http://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-3.html). It was fixed independently before the contribution was received.
[20 Nov 2013 14:01]
xiaobin lin
hi, Erlend, get it. Thank you. I am downing the bzr and will learn how it fixed in trunk :)

Description: If tmp_table_size do not verify the requirement when execute merge_walk (sql/uniques.cc), a count(distinct) query will return "0" , seems buggy. How to repeat: drop table if exists tb; set tmp_table_size=1024; create table tb(id int auto_increment primary key, v varchar(32)) charset=gbk; insert into tb(v) values("aaa"); insert into tb(v) (select v from tb); insert into tb(v) (select v from tb); insert into tb(v) (select v from tb); insert into tb(v) (select v from tb); insert into tb(v) (select v from tb); insert into tb(v) (select v from tb); insert into tb(v) (select v from tb); insert into tb(v) (select v from tb); update tb set v=concat(v, id); select count(distinct v) from tb; seems duplicated with http://bugs.mysql.com/bug.php?id=52582 Suggested fix: As merge_walk is almost the last step of a count(distinct) query, we can malloc temp buffer for it? See in the patch.