Bug #67866 | typical subquery does not work properly ! | ||
---|---|---|---|
Submitted: | 10 Dec 2012 20:31 | Modified: | 18 Jan 2013 11:10 |
Reporter: | Bez Pek | Email Updates: | |
Status: | Duplicate | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S1 (Critical) |
Version: | 5.5.28, 5.5.30 | OS: | Linux |
Assigned to: | CPU Architecture: | Any | |
Tags: | regression |
[10 Dec 2012 20:31]
Bez Pek
[10 Dec 2012 22:09]
Bez Pek
faulting query: (fix) ---------------------- select (select id from __test1 t1 where t1.a=t.a and t1.b=1 order by t1.c desc limit 1) from (select 1 as a) as t
[11 Dec 2012 8:15]
Valeriy Kravchuk
mysql> select version(); +-----------+ | version() | +-----------+ | 5.5.28 | +-----------+ 1 row in set (0.00 sec) mysql> create table __test1 -> ( id int not null auto_increment, -> a int, -> b int, -> c int, -> primary key (id), -> key idx_a (a), -> key idx_b (b), -> key idx_c (c) -> ); Query OK, 0 rows affected (2.65 sec) mysql> insert into __test1 -> (id,a,b,c) -> values (1,1,1,1),(2,1,1,2),(3,1,1,3); Query OK, 3 rows affected (0.35 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select -> (select id from __test1 t1 -> where t1.a=1 and t1.b=1 -> order by t1.c desc -> limit 1) -> from (select 1 as a) as t; +------------------------------------------------------------------------------- ----+ | (select id from __test1 t1 where t1.a=1 and t1.b=1 order by t1.c desc limit 1) | +------------------------------------------------------------------------------- ----+ | 3 | +------------------------------------------------------------------------------- ----+ 1 row in set (0.27 sec) The above is correct, now let's join instead to a single row outer table created on the fly: mysql> select -> (select id from __test1 t1 -> where t1.a=t.a and t1.b=1 -> order by t1.c desc -> limit 1) -> from (select 1 as a) as t; +------------------------------------------------------------------------------- ------+ | (select id from __test1 t1 where t1.a=t.a and t1.b=1 order by t1.c desc limit 1) | +------------------------------------------------------------------------------- ------+ | 1 | +------------------------------------------------------------------------------- ------+ 1 row in set (0.04 sec) mysql> explain extended select -> (select id from __test1 t1 -> where t1.a=t.a and t1.b=1 -> order by t1.c desc -> limit 1) -> from (select 1 as a) as t; +----+--------------------+------------+--------+---------------+-------+------- --+------+------+----------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_le n | ref | rows | filtered | Extra | +----+--------------------+------------+--------+---------------+-------+------- --+------+------+----------+-----------------------------+ | 1 | PRIMARY | <derived3> | system | NULL | NULL | NULL | NULL | 1 | 100.00 | | | 3 | DERIVED | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used | | 2 | DEPENDENT SUBQUERY | t1 | range | idx_a,idx_b | idx_a | 5 | NULL | 3 | 100.00 | Using where; Using filesort | +----+--------------------+------------+--------+---------------+-------+------- --+------+------+----------+-----------------------------+ 3 rows in set, 2 warnings (0.16 sec) mysql> show warnings\G *************************** 1. row *************************** Level: Note Code: 1276 Message: Field or reference 't.a' of SELECT #2 was resolved in SELECT #1 *************************** 2. row *************************** Level: Note Code: 1003 Message: select (select `test`.`t1`.`id` from `test`.`__test1` `t1` where ((`tes t`.`t1`.`b` = 1) and (`test`.`t1`.`a` = '1')) order by `test`.`t1`.`c` desc limi t 1) AS `(select id from __test1 t1 where t1.a=t.a and t1.b=1 order by t1.c desc limit 1)` from dual 2 rows in set (0.00 sec) Surely, rewritten SELECT from show warnings above works correctly: mysql> select (select `test`.`t1`.`id` from `test`.`__test1` `t1` where ((`test` .`t1`.`b` = 1) and (`test`.`t1`.`a` = '1')) order by `test`.`t1`.`c` desc limit 1) AS `something` from dual -> ; +-----------+ | something | +-----------+ | 3 | +-----------+ 1 row in set (0.00 sec)
[11 Dec 2012 9:43]
Bez Pek
try only please: ---------------- select (select id from __test1 t1 where t1.a=t.a and t1.b=1 order by t1.c desc limit 1) from (select 1 as a) as t this is query demonstrating bug i am sorry for initial mismatch query with 't1.a=1' is only for test with ok result
[13 Dec 2012 12:56]
Sveta Smirnova
Thank you for the report. Verified as described with query: select (select id from __test1 t1 where t1.a=t.a and t1.b=1 order by t1.c desc limit 1) from (select 1 as a) as t; Only 5.5 series is affected: earlier versions and trunk work fine.
[13 Dec 2012 12:56]
Sveta Smirnova
test case for MTR
Attachment: bug67866.test (application/octet-stream, text), 436 bytes.
[21 Dec 2012 17:03]
MySQL Verification Team
related or even a duplicate of this is: http://bugs.mysql.com/bug.php?id=67958
[7 Jan 2013 14:39]
Olav Sandstå
This is caused by the same issue as reported in Bug#66845.
[18 Jan 2013 11:10]
Olav Sandstå
Closing this as duplicate of Bug#66845.