Bug #77632 | count distinct returns in-correct result | ||
---|---|---|---|
Submitted: | 6 Jul 2015 19:07 | Modified: | 26 Aug 2015 13:29 |
Reporter: | Son Nguyen | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: DML | Severity: | S2 (Serious) |
Version: | 5.7.7 | OS: | Linux |
Assigned to: | CPU Architecture: | Any |
[6 Jul 2015 19:07]
Son Nguyen
[6 Jul 2015 19:40]
MySQL Verification Team
Please attach a dump file with create table and data inserts. Thanks.
[15 Jul 2015 18:04]
Son Nguyen
dump file of GOSALES1 database
Attachment: gosales1.sql.zip (application/x-zip-compressed, text), 926.75 KiB.
[15 Jul 2015 18:04]
Son Nguyen
Please find attached the dump file of our database. The schema name is GOSALES1. Thanks Son Nguyen
[16 Jul 2015 9:31]
Chiranjeevi Battula
Hello Son Nguyen, Thank you for the bug report. Verified this behavior on MySql Server 5.7.7 as described. Thanks, Chiranjeevi.
[16 Jul 2015 9:32]
Chiranjeevi Battula
Enter password: ****** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 5.7.7-rc-enterprise-commercial-advanced-log MySQL Enterprise Ser ver - Advanced Edition (Commercial) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use gosales1 Database changed mysql> select -> `PRODUCTTYPE`.`PRODUCTTYPE` as `C0` , -> count(distinct `PRODUCT`.`PRODUCTNAME`) as `C1` -> from (`PRODUCTTYPE` `PRODUCTTYPE` INNER JOIN `PRODUCT` `PRODUCT` -> on `PRODUCTTYPE`.`PRODUCTTYPECODE` = `PRODUCT`.`PRODUCTTYPECODE`) -> INNER JOIN `ORDERDETAIL` `ORDERDETAIL` on `PRODUCT`.`PRODUCTNUMBER` = `OR DERDETAIL`.`PRODUCTNUMBER` -> where ( `PRODUCTTYPE`.`PRODUCTTYPE` like 'W%' ) and ( `ORDERDETAIL`.`ORDE RDETAILCODE` > 115000 ) -> group by `PRODUCTTYPE`.`PRODUCTTYPE`; +---------+----+ | C0 | C1 | +---------+----+ | Watches | 5 | | Woods | 4 | +---------+----+ 2 rows in set (0.00 sec) mysql> select T1.C0, T1.C1 from -> ( -> select -> `PRODUCTTYPE`.`PRODUCTTYPE` as `C0` , -> count(distinct `PRODUCT`.`PRODUCTNAME`) as `C1` -> from (`PRODUCTTYPE` `PRODUCTTYPE` INNER JOIN `PRODUCT` `PRODUCT` -> on `PRODUCTTYPE`.`PRODUCTTYPECODE` = `PRODUCT`.`PRODUCTTYPECODE`) -> INNER JOIN `ORDERDETAIL` `ORDERDETAIL` on `PRODUCT`.`PRODUCTNUMBER` = `OR DERDETAIL`.`PRODUCTNUMBER` -> where ( `PRODUCTTYPE`.`PRODUCTTYPE` like 'W%' ) and ( `ORDERDETAIL`.`ORDE RDETAILCODE` > 115000 ) -> group by `PRODUCTTYPE`.`PRODUCTTYPE` -> ) T1 -> ; +---------+----+ | C0 | C1 | +---------+----+ | Watches | 1 | | Woods | 1 | +---------+----+ 2 rows in set (0.00 sec) mysql>
[20 Jul 2015 13:20]
Chiranjeevi Battula
Test results in 5.5 and 5.6 Enter password: ****** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 5.5.45-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use gosales1; Database changed mysql> select -> `PRODUCTTYPE`.`PRODUCTTYPE` as `C0` , -> count(distinct `PRODUCT`.`PRODUCTNAME`) as `C1` -> from (`PRODUCTTYPE` `PRODUCTTYPE` INNER JOIN `PRODUCT` `PRODUCT` -> on `PRODUCTTYPE`.`PRODUCTTYPECODE` = `PRODUCT`.`PRODUCTTYPECODE`) -> INNER JOIN `ORDERDETAIL` `ORDERDETAIL` on `PRODUCT`.`PRODUCTNUMBER` = `ORDERDETAIL`.`PRODUCTNUMBER` -> where ( `PRODUCTTYPE`.`PRODUCTTYPE` like 'W%' ) and ( `ORDERDETAIL`.`ORDERDETAILCODE` > 115000 ) -> group by `PRODUCTTYPE`.`PRODUCTTYPE`; +---------+----+ | C0 | C1 | +---------+----+ | Watches | 5 | | Woods | 4 | +---------+----+ 2 rows in set (0.00 sec) mysql> select T1.C0, T1.C1 from (select -> `PRODUCTTYPE`.`PRODUCTTYPE` as `C0` , -> count(distinct `PRODUCT`.`PRODUCTNAME`) as `C1` -> from (`PRODUCTTYPE` `PRODUCTTYPE` INNER JOIN `PRODUCT` `PRODUCT` -> on `PRODUCTTYPE`.`PRODUCTTYPECODE` = `PRODUCT`.`PRODUCTTYPECODE`) -> INNER JOIN `ORDERDETAIL` `ORDERDETAIL` on `PRODUCT`.`PRODUCTNUMBER` = `ORDERDETAIL`.`PRODUCTNUMBER` -> where ( `PRODUCTTYPE`.`PRODUCTTYPE` like 'W%' ) and ( `ORDERDETAIL`.`ORDERDETAILCODE` > 115000 ) -> group by `PRODUCTTYPE`.`PRODUCTTYPE`) T1; +---------+----+ | C0 | C1 | +---------+----+ | Watches | 5 | | Woods | 4 | +---------+----+ 2 rows in set (0.00 sec) mysql> Enter password: ****** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.6.25-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use gosales1; Database changed mysql> select -> `PRODUCTTYPE`.`PRODUCTTYPE` as `C0` , -> count(distinct `PRODUCT`.`PRODUCTNAME`) as `C1` -> from (`PRODUCTTYPE` `PRODUCTTYPE` INNER JOIN `PRODUCT` `PRODUCT` -> on `PRODUCTTYPE`.`PRODUCTTYPECODE` = `PRODUCT`.`PRODUCTTYPECODE`) -> INNER JOIN `ORDERDETAIL` `ORDERDETAIL` on `PRODUCT`.`PRODUCTNUMBER` = `ORDERDETAIL`.`PRODUCTNUMBER` -> where ( `PRODUCTTYPE`.`PRODUCTTYPE` like 'W%' ) and ( `ORDERDETAIL`.`ORDERDETAILCODE` > 115000 ) -> group by `PRODUCTTYPE`.`PRODUCTTYPE`; +---------+----+ | C0 | C1 | +---------+----+ | Watches | 5 | | Woods | 4 | +---------+----+ 2 rows in set (0.01 sec) mysql> select T1.C0, T1.C1 from (select -> `PRODUCTTYPE`.`PRODUCTTYPE` as `C0` , -> count(distinct `PRODUCT`.`PRODUCTNAME`) as `C1` -> from (`PRODUCTTYPE` `PRODUCTTYPE` INNER JOIN `PRODUCT` `PRODUCT` -> on `PRODUCTTYPE`.`PRODUCTTYPECODE` = `PRODUCT`.`PRODUCTTYPECODE`) -> INNER JOIN `ORDERDETAIL` `ORDERDETAIL` on `PRODUCT`.`PRODUCTNUMBER` = `ORDERDETAIL`.`PRODUCTNUMBER` -> where ( `PRODUCTTYPE`.`PRODUCTTYPE` like 'W%' ) and ( `ORDERDETAIL`.`ORDERDETAILCODE` > 115000 ) -> group by `PRODUCTTYPE`.`PRODUCTTYPE`) T1; +---------+----+ | C0 | C1 | +---------+----+ | Watches | 5 | | Woods | 4 | +---------+----+ 2 rows in set (0.00 sec) mysql>
[10 Aug 2015 13:36]
Tor Didriksen
Posted by developer: This bug is fixed in the most recent version of 5.7
[11 Aug 2015 12:36]
Guilhem Bichot
yes, fixed in 5.7.8 by the patch for Bug#20145024: WRONG RESULT FOR COUNT DISTINCT QUERY IN DERIVED TABLE
[26 Aug 2015 13:29]
Erlend Dahl
Fixed under the heading of Bug #20145024 WRONG RESULT FOR COUNT DISTINCT QUERY IN DERIVED TABLE [7 May 2015 9:35] Paul Dubois Noted in 5.7.8, 5.8.0 changelogs. Use of SELECT COUNT(DISTINCT) in a subquery in the FROM clause could produce incorrect results.