Bug #84445 | select distinct with constant value for left join mysql 5.7.16 | ||
---|---|---|---|
Submitted: | 9 Jan 2017 9:29 | Modified: | 25 Sep 2018 22:51 |
Reporter: | SANGHATI GHOSH | Email Updates: | |
Status: | Duplicate | Impact on me: | |
Category: | MySQL Server: DML | Severity: | S1 (Critical) |
Version: | 5.7.16, 5.7.17 | OS: | Linux |
Assigned to: | CPU Architecture: | Any | |
Tags: | distinct, join, left, MySQL |
[9 Jan 2017 9:29]
SANGHATI GHOSH
[9 Jan 2017 10:38]
MySQL Verification Team
Hello SANGHATI, Thank you for the report and test case. Thanks, Umesh
[9 Jan 2017 10:39]
MySQL Verification Team
-- 5.7.17 [umshastr@hod03]/export/umesh/server/binaries/GABuilds/mysql-5.7.17: bin/mysql -uroot -S /tmp/mysql.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.17-log MySQL Community Server (GPL) Copyright (c) 2000, 2016, 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. root@localhost [(none)]> use test Database changed root@localhost [test]> drop table if exists t; Query OK, 0 rows affected, 1 warning (0.00 sec) root@localhost [test]> create table t(id int); Query OK, 0 rows affected (0.00 sec) root@localhost [test]> insert into t values(1),(2),(2),(2); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 root@localhost [test]> root@localhost [test]> select a.id,b.const_field -> from (select id from t where id=2 ) a -> left join (select 'a' as const_field, id from t where 1=2 ) b -> on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | | 2 | NULL | | 2 | NULL | +------+-------------+ 3 rows in set (0.00 sec) root@localhost [test]> select distinct a.id,b.const_field -> from (select id from t where id=2 ) a -> left join (select 'a' as const_field, id from t where 1=2 ) b -> on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | a | +------+-------------+ 1 row in set (0.01 sec)
[9 Jan 2017 10:41]
MySQL Verification Team
-- 5.6.35 [umshastr@hod03]/export/umesh/server/binaries/GABuilds/mysql-5.6.35: bin/mysql -uroot -S /tmp/mysql_ushastry.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.35-enterprise-commercial-advanced MySQL Enterprise Server - Advanced Edition (Commercial) Copyright (c) 2000, 2016, 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. root@localhost [(none)]> use test Database changed root@localhost [test]> drop table if exists t; Query OK, 0 rows affected, 1 warning (0.00 sec) root@localhost [test]> create table t(id int); Query OK, 0 rows affected (0.01 sec) root@localhost [test]> insert into t values(1),(2),(2),(2); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 root@localhost [test]> root@localhost [test]> select a.id,b.const_field -> from (select id from t where id=2 ) a -> left join (select 'a' as const_field, id from t where 1=2 ) b -> on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | | 2 | NULL | | 2 | NULL | +------+-------------+ 3 rows in set (0.00 sec) root@localhost [test]> select distinct a.id,b.const_field -> from (select id from t where id=2 ) a -> left join (select 'a' as const_field, id from t where 1=2 ) b -> on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | +------+-------------+ 1 row in set (0.00 sec) -- 5.5.54 [umshastr@hod03]/export/umesh/server/binaries/GABuilds/mysql-5.5.54: bin/mysql -uroot -S /tmp/mysql_ushastry.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.54-enterprise-commercial-advanced MySQL Enterprise Server - Advanced Edition (Commercial) Copyright (c) 2000, 2016, 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. root@localhost [(none)]> use test Database changed root@localhost [test]> drop table if exists t; Query OK, 0 rows affected, 1 warning (0.00 sec) root@localhost [test]> create table t(id int); Query OK, 0 rows affected (0.00 sec) root@localhost [test]> insert into t values(1),(2),(2),(2); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 root@localhost [test]> root@localhost [test]> select a.id,b.const_field -> from (select id from t where id=2 ) a -> left join (select 'a' as const_field, id from t where 1=2 ) b -> on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | | 2 | NULL | | 2 | NULL | +------+-------------+ 3 rows in set (0.02 sec) root@localhost [test]> select distinct a.id,b.const_field -> from (select id from t where id=2 ) a -> left join (select 'a' as const_field, id from t where 1=2 ) b -> on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | +------+-------------+ 1 row in set (0.01 sec) root@localhost [test]>
[12 Jan 2017 10:22]
SANGHATI GHOSH
Please update us ASAP. This is an urgent production issue.
[12 Jan 2017 11:34]
Øystein Grøvlen
Posted by developer: Work-around is to turn off optimizer_switch derived_merge: mysql> set optimizer_switch='derived_merge=off'; Query OK, 0 rows affected (0,00 sec) mysql> select distinct a.id,b.const_field from (select id from t where id=2 ) a left join (select 'a' as const_field, id from t where 1=2 ) b on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | +------+-------------+ 1 row in set (0,00 sec)
[1 Aug 2017 3:20]
ashe sun
mysql-5.7.18 repeat it mysql> select @@version; +------------------+ | @@version | +------------------+ | 5.7.18-debug-log | +------------------+ 1 row in set (0.00 sec) mysql> drop table if exists t; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> create table t(id int); Query OK, 0 rows affected (0.02 sec) mysql> insert into t values(1),(2),(2),(2); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select a.id,b.const_field -> from (select id from t where id=2 ) a -> left join (select 'a' as const_field, id from t where 1=2 ) b -> on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | | 2 | NULL | | 2 | NULL | +------+-------------+ 3 rows in set (0.00 sec) mysql> select a.id,b.const_field -> from (select id from t where id=2 ) a -> left join (select 'a' as const_field, id from t where 1=2 ) b -> on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | | 2 | NULL | | 2 | NULL | +------+-------------+ 3 rows in set (0.00 sec) mysql> select distinct a.id,b.const_field -> from (select id from t where id=2 ) a -> left join (select 'a' as const_field, id from t where 1=2 ) b -> on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | a | +------+-------------+ 1 row in set (0.00 sec) mysql> set optimizer_switch='derived_merge=off'; Query OK, 0 rows affected (0.00 sec) mysql> select distinct a.id,b.const_field from (select id from t where id=2 ) a left join (select 'a' as const_field, id from t where 1=2 ) b on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | +------+-------------+ 1 row in set (0.00 sec) mysql> select a.id,b.const_field from (select id from t where id=2 ) a left join (select 'a' as const_field, id from t where 1=2 ) b on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | | 2 | NULL | | 2 | NULL | +------+-------------+ 3 rows in set (0.00 sec)
[7 Sep 2018 11:48]
Sveta Smirnova
Not repeatable with 5.7.21 and 8.0.12: sveta@delly:~/build/mysql-8.0/mysql-test$ mysqlmtr -P 13010 test Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.12-debug Source distribution Copyright (c) 2000, 2018, 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> drop table if exists t; Query OK, 0 rows affected, 1 warning (0.02 sec) mysql> create table t(id int); Query OK, 0 rows affected (0.14 sec) mysql> insert into t values(1),(2),(2),(2); Query OK, 4 rows affected (0.04 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select a.id,b.const_field -> from (select id from t where id=2 ) a -> left join (select 'a' as const_field, id from t where 1=2 ) b -> on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | | 2 | NULL | | 2 | NULL | +------+-------------+ 3 rows in set (0.01 sec) mysql> select distinct a.id,b.const_field -> from (select id from t where id=2 ) a -> left join (select 'a' as const_field, id from t where 1=2 ) b -> on a.id = b.id; +------+-------------+ | id | const_field | +------+-------------+ | 2 | NULL | +------+-------------+ 1 row in set (0.00 sec) mysql>
[25 Sep 2018 22:51]
Roy Lyseng
This is probably a duplicate of bug#26627181, which was fixed in 5.7.21 and 8.0.4.
[12 Mar 2021 5:37]
Евгений Орешин
I have a similar problem on Windows, MySQL 8.0.21 create table t(id int); insert into t values(1),(2),(2),(2); SELECT a.id,b.const_field from (select id from t where id=2 ) a left join (select 'a' as const_field, id + 1 as id from t) b on a.id = b.id; This select prints 3 rows with const_field = "a" id const_field "2" "a" "2" "a" "2" "a" But with distinct I get an empty const_field: SELECT distinct a.id,b.const_field from (select id from t where id=2 ) a left join (select 'a' as const_field, id + 1 as id from t) b on a.id = b.id; id const_field "2" (NULL)