Bug #117468 Logical upgrade path: a dump containing 0000-00-00 should error when NO_ZERO_DATE is active
Submitted: 14 Feb 12:43 Modified: 18 Feb 6:45
Reporter: Mirco Babin Email Updates:
Status: Not a Bug Impact on me:
None 
Category:MySQL Server Severity:S3 (Non-critical)
Version:8.4.4 OS:Windows (11)
Assigned to: MySQL Verification Team CPU Architecture:x86

[14 Feb 12:43] Mirco Babin
Description:
Hello MySql Team,

I'm using the logical upgrade path to upgrade from MySql 8.0.32 to MySql 8.4.4 ( see https://dev.mysql.com/doc/refman/8.4/en/upgrade-binary-package.html#upgrade-procedure-logi... ).

The old MySql 8.0.32 allows ZERO_DATE, by excluding NO_ZERO_DATE from the @@sql_mode. And has a table with '0000-00-00 00:00:00' in a timestamp column.

Restoring this dump in MySql 8.4.4 with default @@sql_mode (NO_ZERO_DATE active) does not error and happily imports '0000-00-00 00:00:00' while this is not allowed according to @@sql_mode.

Kind regards,
Mirco Babin

How to repeat:
The reproduction consists of 3 steps.

1) On MySql 8.0.32:

mysql> select @@sql_mode;
+----------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                               |
+----------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------------------------+

Create a dump using mysqldump cli tool:
mysqldump --result-file="touopdrlog.sql" --user root --password --events --routines --triggers --lock-tables=false --single-transaction=true --hex-blob=true --databases trip_portaalbeta --tables touopdrlog

+++ [BEGIN] contents dumped of touopdrlog.sql +++
-- MySQL dump 10.13  Distrib 8.0.32, for Win64 (x86_64)
--
-- Host: localhost    Database: trip_portaalbeta
-- ------------------------------------------------------
-- Server version	8.0.32

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `touopdrlog`
--

DROP TABLE IF EXISTS `touopdrlog`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `touopdrlog` (
  `Id` int NOT NULL AUTO_INCREMENT,
  `LastUpdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `CreationDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `UpdateBy` int DEFAULT NULL,
  `Opdrachtnr` int DEFAULT NULL,
  `Logboekcode` varchar(5) DEFAULT NULL,
  `Logonkey` varchar(20) DEFAULT NULL,
  `Omschrijving` varchar(255) DEFAULT NULL,
  `AgendaId` int DEFAULT '0',
  `EmailId` int DEFAULT '0',
  PRIMARY KEY (`Id`),
  KEY `k1` (`Opdrachtnr`,`CreationDate`,`Logboekcode`),
  KEY `k2` (`CreationDate`,`Logboekcode`,`Opdrachtnr`)
) ENGINE=InnoDB AUTO_INCREMENT=4805 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `touopdrlog`
--

LOCK TABLES `touopdrlog` WRITE;
/*!40000 ALTER TABLE `touopdrlog` DISABLE KEYS */;
INSERT INTO `touopdrlog` VALUES (99999,'0000-00-00 00:00:00','2006-07-21 07:30:15',19,20,'','test','test',0,0);
/*!40000 ALTER TABLE `touopdrlog` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Dumping events for database 'trip_portaalbeta'
--

--
-- Dumping routines for database 'trip_portaalbeta'
--
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2025-02-14 13:12:44
+++ [END] contents dumped of touopdrlog.sql +++

2) On MySql 8.4.4 restore the dump via mysql cli tool.

mysql -u root -p

mysql> 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_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> drop database if exists `mytest`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create database `mytest`;
Query OK, 1 row affected (0.01 sec)

mysql> use `mytest`;
Database changed
mysql> source touopdrlog.sql;
... Query OK, 0 rows affected (0.00 sec) ...

mysql> select * from touopdrlog;
+-------+---------------------+---------------------+----------+------------+-------------+----------+--------------+----------+---------+
| Id    | LastUpdate          | CreationDate        | UpdateBy | Opdrachtnr | Logboekcode | Logonkey | Omschrijving | AgendaId | EmailId |
+-------+---------------------+---------------------+----------+------------+-------------+----------+--------------+----------+---------+
| 99999 | 0000-00-00 00:00:00 | 2006-07-21 09:30:15 |       19 |         20 |             | test     | test         |        0 |       0 |
+-------+---------------------+---------------------+----------+------------+-------------+----------+--------------+----------+---------+
1 row in set (0.00 sec)

mysql> 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_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

3) Observe the '0000-00-00 00:00:00' value is imported, while @@sql_mode NO_ZERO_DATE forbids this.
[14 Feb 12:52] Mirco Babin
P.S. inserting a '0000-00-00 00:00:00' value in MySql 8.4.4 does error as expected.

mysql> insert into `touopdrlog` (`CreationDate`) VALUES('0000-00-00 00:00:00');
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'CreationDate' at row 1
[18 Feb 6:45] MySQL Verification Team
Hi,

This is not a bug.

If you look at the SQL file you can see that new SQL_MODE is set overwriting the one you have set yourself.

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

Thanks for using MySQL Server