From 607fc153939fd6314dcde60d565cfd20676a01f9 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Fri, 20 Sep 2024 14:10:27 +0400 Subject: [PATCH] MDEV-31302 Assertion `mon > 0 && mon < 13' failed in my_time_t sec_since_epoch(int, int, int, int, int, int) The code erroneously called sec_since_epoch() for dates with zeros, e.g. '2024-00-01'. Fixi: adding a test that the date does not have zeros before calling TIME_to_native(). --- mysql-test/main/func_time.result | 11 +++++++++++ mysql-test/main/func_time.test | 11 +++++++++++ sql/sql_type.cc | 1 + 3 files changed, 23 insertions(+) diff --git a/mysql-test/main/func_time.result b/mysql-test/main/func_time.result index eaf30f5f925..3982342b4c5 100644 --- a/mysql-test/main/func_time.result +++ b/mysql-test/main/func_time.result @@ -6425,5 +6425,16 @@ Warning 1292 Truncated incorrect time value: '8390000' Warning 1292 Truncated incorrect time value: '8390000' SET @@timestamp= DEFAULT; # +# MDEV-31302 Assertion `mon > 0 && mon < 13' failed in my_time_t sec_since_epoch(int, int, int, int, int, int) +# +CREATE TABLE t1 (a DATE); +SET @@time_zone='+1:00'; +INSERT INTO t1 VALUES ('2024-00-01'); +SELECT UNIX_TIMESTAMP(MAX(a)) AS a FROM t1; +a +NULL +SET @@time_zone=DEFAULT; +DROP TABLE t1; +# # End of 10.5 tests # diff --git a/mysql-test/main/func_time.test b/mysql-test/main/func_time.test index 51b2722d7a0..25a7e31b54d 100644 --- a/mysql-test/main/func_time.test +++ b/mysql-test/main/func_time.test @@ -3262,6 +3262,17 @@ SELECT SET @@timestamp= DEFAULT; +--echo # +--echo # MDEV-31302 Assertion `mon > 0 && mon < 13' failed in my_time_t sec_since_epoch(int, int, int, int, int, int) +--echo # + +CREATE TABLE t1 (a DATE); +SET @@time_zone='+1:00'; +INSERT INTO t1 VALUES ('2024-00-01'); +SELECT UNIX_TIMESTAMP(MAX(a)) AS a FROM t1; +SET @@time_zone=DEFAULT; +DROP TABLE t1; + --echo # --echo # End of 10.5 tests --echo # diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 44475e29bcc..98abf154db4 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -9182,6 +9182,7 @@ Type_handler_timestamp_common::Item_val_native_with_conversion(THD *thd, Datetime dt(thd, item, Datetime::Options(TIME_NO_ZERO_IN_DATE, thd)); return !dt.is_valid_datetime() || + dt.check_date(TIME_NO_ZERO_IN_DATE | TIME_NO_ZERO_DATE) || TIME_to_native(thd, dt.get_mysql_time(), to, item->datetime_precision(thd)); }