Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
5.5.43, 5.5(EOL), 10.0(EOL), 10.1(EOL)
-
Ubuntu 12
-
5.5.55
Description
There appears to be a problem with the results returned from a query when DISTINCT, LEFT JOIN and a subquery which contains a constant value are combined.
I've boiled down the problem into a simple example of how it fails:
SELECT DISTINCT realtable.id AS realid, virtualtable.id AS virtualid, virtualtable.recordexists |
FROM realtable |
LEFT JOIN (SELECT realtable.id, "yes" AS recordexists FROM realtable) virtualtable |
ON realtable.id = virtualtable.id |
If you create a table called "realtable" with columns int "id" and string "data", insert two records (1, "yes") and (2, "yes") and run the query then you'll get:
realid, virtualid, recordexists
|
1, 1, null
|
2, 2, null
|
which is incorrect. The value "yes" should be returned in the recordexists column. Obviously the "virtual" records are being joined correctly to the "real" records, because the virtualid returns the correct value, but the constant "yes" is missing. If you remove DISTINCT, change LEFT JOIN to just JOIN, or change "yes" to realtable.data then you get the correct results:
realid, virtualid, recordexists
|
1, 1, yes
|
2, 2, yes
|
I also confirmed that this is NOT caused by using the same table in both the main and sub queries.
I've got a query structured like this which is working in Postgress and MySQL, and when delivered to a client who tried it in MariaDB it started failing. This could probably be considered a data loss bug.