Bug #95416 ZERO Date is both NULL and NOT NULL
| Submitted: | 20 May 2019 0:33 | Modified: | 20 May 2019 7:00 |
|---|---|---|---|
| Reporter: | Morgan Tocker | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S2 (Serious) |
| Version: | 5.7.25,8.0.15, 5.6.44, 5.7.26, 8.0.16 | OS: | Any |
| Assigned to: | CPU Architecture: | Any |
[20 May 2019 0:36]
Morgan Tocker
See also this test-case:
mysql [localhost:5725] {msandbox} (test) > select a is null, a is not null from t1;
+-----------+---------------+
| a is null | a is not null |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
1 row in set (0.00 sec)
[20 May 2019 5:17]
MySQL Verification Team
Hello Morgan, Thank you for the report and test case. regards, Umesh
[20 May 2019 5:23]
MySQL Verification Team
- Found legacy issue Bug #940 zero date is both null and not null in where clause Leaving it for Dev's to take a call on this, if this is not going to be fixed then maybe document as Morgan suggested? Thank you.
[20 May 2019 6:57]
Tsubasa Tanaka
I found this in documentation. --- For DATE and DATETIME columns that are declared as NOT NULL, you can find the special date '0000-00-00' by using a statement like this: SELECT * FROM tbl_name WHERE date_column IS NULL This is needed to get some ODBC applications to work because ODBC does not support a '0000-00-00' date value. --- https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_is-null
[20 May 2019 7:00]
Morgan Tocker
Thanks Tanaka-san, I read this, but I didn't understand it on first pass :-) This explains that the feature is intended.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.041 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: I was not aware of this behavior previously, and it is not clearly documented as such: a ZERO date compares to both NULL and NOT NULL. How to repeat: drop table if exists t1; create table t1(a date not null); insert ignore into t1 values (0); select * from t1 where a is null; select * from t1 where a is not null; mysql [localhost:5725] {msandbox} (test) > create table t1(a date not null); Query OK, 0 rows affected (0.01 sec) mysql [localhost:5725] {msandbox} (test) > insert ignore into t1 values (0); Query OK, 1 row affected, 1 warning (0.00 sec) mysql [localhost:5725] {msandbox} (test) > select * from t1 where a is null; +------------+ | a | +------------+ | 0000-00-00 | +------------+ 1 row in set (0.00 sec) mysql [localhost:5725] {msandbox} (test) > select * from t1 where a is not null; +------------+ | a | +------------+ | 0000-00-00 | +------------+ 1 row in set (0.00 sec) Confirmed in MySQL 5.7.25 and 8.0.15. SQL mode was the default: mysql [localhost:5725] {msandbox} (test) > select @@sql_mode; +-------------------------------------------------------------------------------------------------------------------------------------------+ | @@sql_mode | +-------------------------------------------------------------------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) Suggested fix: If this intentional, please recategorize as a documentation bug. But it seems like a very strange behavior. I am hoping it is a bug, and the zero date is one of NULL or NOT NULL.