Description:
A query using a VIEW and an equivalent query using a CTE return different results. Both results appear to be wrong.
The VIEW query returns only 0000, while the CTE query returns an empty result set. Based on the semantics of YEAR(), UNION, and EXISTS, the expected result should contain both 3651 and 0000.
This looks like a wrong-result bug involving YEAR(), UNION, VIEW/CTE handling, and an uncorrelated EXISTS subquery.
How to repeat:
mysql> select version();
+-----------+
| version() |
+-----------+
| 9.6.0 |
+-----------+
DROP DATABASE IF EXISTS dd;
CREATE DATABASE dd;
USE dd;
CREATE TABLE a (b DATE);
INSERT INTO a VALUES ('3651-04-29');
CREATE VIEW v0 AS
SELECT YEAR(b) AS g
FROM a
UNION
SELECT YEAR(0);
SELECT g
FROM v0
WHERE EXISTS (
SELECT 0
FROM v0
WHERE g
);
WITH cte AS (
SELECT YEAR(b) AS g
FROM a
UNION
SELECT YEAR(0)
)
SELECT g
FROM cte
WHERE EXISTS (
SELECT 0
FROM cte
WHERE g
);
Actual result:
The VIEW query returns:
+------+
| g |
+------+
| 0000 |
+------+
The equivalent CTE query returns:
Empty set
Expected result:
Both queries should return:
+------+
| g |
+------+
| 3651 |
| 0000 |
+------+
Description: A query using a VIEW and an equivalent query using a CTE return different results. Both results appear to be wrong. The VIEW query returns only 0000, while the CTE query returns an empty result set. Based on the semantics of YEAR(), UNION, and EXISTS, the expected result should contain both 3651 and 0000. This looks like a wrong-result bug involving YEAR(), UNION, VIEW/CTE handling, and an uncorrelated EXISTS subquery. How to repeat: mysql> select version(); +-----------+ | version() | +-----------+ | 9.6.0 | +-----------+ DROP DATABASE IF EXISTS dd; CREATE DATABASE dd; USE dd; CREATE TABLE a (b DATE); INSERT INTO a VALUES ('3651-04-29'); CREATE VIEW v0 AS SELECT YEAR(b) AS g FROM a UNION SELECT YEAR(0); SELECT g FROM v0 WHERE EXISTS ( SELECT 0 FROM v0 WHERE g ); WITH cte AS ( SELECT YEAR(b) AS g FROM a UNION SELECT YEAR(0) ) SELECT g FROM cte WHERE EXISTS ( SELECT 0 FROM cte WHERE g ); Actual result: The VIEW query returns: +------+ | g | +------+ | 0000 | +------+ The equivalent CTE query returns: Empty set Expected result: Both queries should return: +------+ | g | +------+ | 3651 | | 0000 | +------+