[MDEV-10902] Inconsistant date behaviour and wrong comparison with '0000-00-00' date Created: 2016-09-26  Updated: 2022-09-08

Status: Open
Project: MariaDB Server
Component/s: Data types
Affects Version/s: 10.0, 10.1
Fix Version/s: 10.1

Type: Bug Priority: Major
Reporter: jocelyn fournier Assignee: Unassigned
Resolution: Unresolved Votes: 1
Labels: None

Epic Link: Data type cleanups

 Description   

Hi,

While comparing the date behaviour between MySQL 5.5 and MariaDB 10.x, I found some strange behaviours with date :

SET SQL_MODE='';
SELECT CAST('' AS DATE);
+------------------+
| CAST('' AS DATE) |
+------------------+
| NULL             |
+------------------+
 
SELECT CAST('' AS DATE)='0000-00-00';
+-------------------------------+
| CAST('' AS DATE)='0000-00-00' |
+-------------------------------+
|                             1 |
+-------------------------------+

NULL = '0000-00-00' ??

SET SQL_MODE='NO_ZERO_DATE';
Query OK, 0 rows affected (0.00 sec)
 
SELECT CAST('' AS DATE)='0000-00-00';
+-------------------------------+
| CAST('' AS DATE)='0000-00-00' |
+-------------------------------+
|                          NULL |
+-------------------------------+
1 row in set, 2 warnings (0.01 sec)

Why SQL_MODE is impacting the result here ?

SELECT NOW() - INTERVAL '736598' DAY;
+-------------------------------+
| NOW() - INTERVAL '736598' DAY |
+-------------------------------+
| NULL                          |
+-------------------------------+
1 row in set, 1 warning (0.00 sec)
 
SHOW WARNINGS;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1441 | Datetime function: datetime field overflow |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)

=> Ok, overflow

SELECT NOW() - INTERVAL '3212121' DAY;
+--------------------------------+
| NOW() - INTERVAL '3212121' DAY |
+--------------------------------+
| 6777-10-01 04:01:55            |
+--------------------------------+
1 row in set (0.00 sec)

=> no overflow ??

DROP TABLE IF EXISTS test_datetime;
CREATE TABLE test_datetime (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `last_open_date` date NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB;
INSERT INTO test_datetime (last_open_date) VALUES ('0000-00-00');
SELECT COUNT(*) FROM test_datetime WHERE last_open_date='121';
+----------+
| COUNT(*) |
+----------+
|        1 |
+----------+
1 row in set, 1 warning (0.00 sec)
MariaDB [test]> SHOW WARNINGS;
+---------+------+---------------------------------+
| Level   | Code | Message                         |
+---------+------+---------------------------------+
| Warning | 1292 | Incorrect datetime value: '121' |
+---------+------+---------------------------------+
1 row in set (0.00 sec)
MariaDB [test]> SELECT COUNT(*) FROM test_datetime WHERE last_open_date=CAST('121' AS date);
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+
1 row in set, 1 warning (0.00 sec)
 
MariaDB [test]> SELECT CAST('121' AS date);
+---------------------+
| CAST('121' AS date) |
+---------------------+
| NULL                |
+---------------------+
1 row in set, 1 warning (0.00 sec)
 
MariaDB [test]> SELECT * FROM test_datetime WHERE last_open_date IS NULL;
+----+----------------+
| id | last_open_date |
+----+----------------+
|  1 | 0000-00-00     |
+----+----------------+
1 row in set (0.00 sec)

Note because of this issue, we had to switch back to percona 5.6 which doesn't have this behaviour.

Thanks and regards,
Jocelyn Fournier



 Comments   
Comment by jocelyn fournier [ 2016-11-24 ]

Any update on this issue?

Generated at Thu Feb 08 07:45:48 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.