From 2e423a483a5d9788af64540daee64b7d77809944 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Wed, 22 Jul 2026 14:02:24 +1000 Subject: [PATCH] MDEV-40467 [to-squash] Improve Y2038/2106 problem error message When nearing the end times TIMESTAMP_MAX_VALUE, auto-partition creation may encounter overflow when calculating new partition range. This patch improves the message of such an overflow --- .../main/partition_range_interval.result | 69 +++++++++++++++++++ mysql-test/main/partition_range_interval.test | 45 ++++++++++++ sql/sql_partition_auto_interval.cc | 8 +++ 3 files changed, 122 insertions(+) diff --git a/mysql-test/main/partition_range_interval.result b/mysql-test/main/partition_range_interval.result index 6f7abf6d6be1f..d7481de8ce944 100644 --- a/mysql-test/main/partition_range_interval.result +++ b/mysql-test/main/partition_range_interval.result @@ -2557,3 +2557,72 @@ INTERVAL "hello" DAY PARTITION p0 VALUES LESS THAN ('2026-04-20') ); ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'INTERVAL' +# +# MDEV-40467 Auto-partition fails when using maximum timestamp +# +SET time_zone='+00:00'; +set timestamp=4294967295; +## out of range with TIMESTAMP +create table t1 (c timestamp) engine=innodb +PARTITION BY RANGE COLUMNS (c) +INTERVAL 1 day +( +PARTITION p0 VALUES LESS THAN ('2106-02-01') +); +insert into t1 values ('2026-04-20'); +ERROR 22003: timestamp value is out of range in 'INTERVAL' +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci + PARTITION BY RANGE COLUMNS(`c`) INTERVAL 1 DAY +(PARTITION `p0` VALUES LESS THAN ('2106-02-01') ENGINE = InnoDB) +drop table t1; +## fine with DATE type +create table t1 (c date) engine=innodb +PARTITION BY RANGE COLUMNS (c) +INTERVAL 1 day +( +PARTITION p0 VALUES LESS THAN ('2106-02-01') +); +insert into t1 values ('2026-04-20'); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c` date DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci + PARTITION BY RANGE COLUMNS(`c`) INTERVAL 1 DAY +(PARTITION `p0` VALUES LESS THAN ('2106-02-01') ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN ('2106-02-02') ENGINE = InnoDB, + PARTITION `p2` VALUES LESS THAN ('2106-02-03') ENGINE = InnoDB, + PARTITION `p3` VALUES LESS THAN ('2106-02-04') ENGINE = InnoDB, + PARTITION `p4` VALUES LESS THAN ('2106-02-05') ENGINE = InnoDB, + PARTITION `p5` VALUES LESS THAN ('2106-02-06') ENGINE = InnoDB, + PARTITION `p6` VALUES LESS THAN ('2106-02-07') ENGINE = InnoDB, + PARTITION `p7` VALUES LESS THAN ('2106-02-08') ENGINE = InnoDB) +drop table t1; +## fine with DATETIME type +create table t1 (c datetime) engine=innodb +PARTITION BY RANGE COLUMNS (c) +INTERVAL 1 day +( +PARTITION p0 VALUES LESS THAN ('2106-02-01') +); +insert into t1 values ('2026-04-20'); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c` datetime DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci + PARTITION BY RANGE COLUMNS(`c`) INTERVAL 1 DAY +(PARTITION `p0` VALUES LESS THAN ('2106-02-01') ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN ('2106-02-02 00:00:00') ENGINE = InnoDB, + PARTITION `p2` VALUES LESS THAN ('2106-02-03 00:00:00') ENGINE = InnoDB, + PARTITION `p3` VALUES LESS THAN ('2106-02-04 00:00:00') ENGINE = InnoDB, + PARTITION `p4` VALUES LESS THAN ('2106-02-05 00:00:00') ENGINE = InnoDB, + PARTITION `p5` VALUES LESS THAN ('2106-02-06 00:00:00') ENGINE = InnoDB, + PARTITION `p6` VALUES LESS THAN ('2106-02-07 00:00:00') ENGINE = InnoDB, + PARTITION `p7` VALUES LESS THAN ('2106-02-08 00:00:00') ENGINE = InnoDB) +drop table t1; +SET time_zone=default; diff --git a/mysql-test/main/partition_range_interval.test b/mysql-test/main/partition_range_interval.test index a911fe9a34413..d6f3e03d44c02 100644 --- a/mysql-test/main/partition_range_interval.test +++ b/mysql-test/main/partition_range_interval.test @@ -1032,3 +1032,48 @@ INTERVAL "hello" DAY ( PARTITION p0 VALUES LESS THAN ('2026-04-20') ); + +--echo # +--echo # MDEV-40467 Auto-partition fails when using maximum timestamp +--echo # + +SET time_zone='+00:00'; +set timestamp=4294967295; + +--echo ## out of range with TIMESTAMP +create table t1 (c timestamp) engine=innodb +PARTITION BY RANGE COLUMNS (c) +INTERVAL 1 day +( +PARTITION p0 VALUES LESS THAN ('2106-02-01') +); + +--error ER_DATA_OUT_OF_RANGE +insert into t1 values ('2026-04-20'); +show create table t1; +drop table t1; + +--echo ## fine with DATE type +create table t1 (c date) engine=innodb +PARTITION BY RANGE COLUMNS (c) +INTERVAL 1 day +( +PARTITION p0 VALUES LESS THAN ('2106-02-01') +); + +insert into t1 values ('2026-04-20'); +show create table t1; +drop table t1; + +--echo ## fine with DATETIME type +create table t1 (c datetime) engine=innodb +PARTITION BY RANGE COLUMNS (c) +INTERVAL 1 day +( +PARTITION p0 VALUES LESS THAN ('2106-02-01') +); + +insert into t1 values ('2026-04-20'); +show create table t1; +drop table t1; +SET time_zone=default; diff --git a/sql/sql_partition_auto_interval.cc b/sql/sql_partition_auto_interval.cc index 5411f3e80669c..2f599e64539e6 100644 --- a/sql/sql_partition_auto_interval.cc +++ b/sql/sql_partition_auto_interval.cc @@ -203,6 +203,14 @@ bool check_range_interval_constants(THD *thd, partition_info *part_info) column_item= new (thd->mem_root) Item_datetime_literal(thd, &dt, dec); break; case MYSQL_TYPE_TIMESTAMP: + /* Likely Year 2038/2106 Problem */ + if (error) + { + my_error(ER_DATA_OUT_OF_RANGE, MYF(0), + part_info->part_field_array[0]->type_handler()->name().ptr(), + "INTERVAL"); + return TRUE; + } column_item= new (thd->mem_root) Item_timestamp_literal(thd, ts, dec); break; default: