Loading configure.in +7 −0 Original line number Diff line number Diff line Loading @@ -1773,6 +1773,13 @@ then AC_MSG_ERROR("MySQL needs a off_t type.") fi dnl dnl check if time_t is unsigned dnl MYSQL_CHECK_TIME_T # do we need #pragma interface/#pragma implementation ? # yes if it's gcc 2.x, and not icc pretending to be gcc, and not cygwin AC_MSG_CHECKING(the need for @%:@pragma interface/implementation) Loading include/my_time.h +32 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,14 @@ typedef long my_time_t; #define MY_TIME_T_MAX LONG_MAX #define MY_TIME_T_MIN LONG_MIN /* Time handling defaults */ #define TIMESTAMP_MAX_YEAR 2038 #define YY_PART_YEAR 70 #define TIMESTAMP_MIN_YEAR (1900 + YY_PART_YEAR - 1) #define TIMESTAMP_MAX_VALUE INT_MAX32 #define TIMESTAMP_MIN_VALUE 1 #define YY_PART_YEAR 70 /* Flags to str_to_datetime */ Loading Loading @@ -68,6 +76,30 @@ uint calc_days_in_year(uint year); void init_time(void); /* Function to check sanity of a TIMESTAMP value DESCRIPTION Check if a given MYSQL_TIME value fits in TIMESTAMP range. This function doesn't make precise check, but rather a rough estimate. RETURN VALUES FALSE The value seems sane TRUE The MYSQL_TIME value is definitely out of range */ static inline bool validate_timestamp_range(const MYSQL_TIME *t) { if ((t->year > TIMESTAMP_MAX_YEAR || t->year < TIMESTAMP_MIN_YEAR) || (t->year == TIMESTAMP_MAX_YEAR && (t->month > 1 || t->day > 19)) || (t->year == TIMESTAMP_MIN_YEAR && (t->month < 12 || t->day < 31))) return FALSE; return TRUE; } my_time_t my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, my_bool *in_dst_time_gap); Loading mysql-test/r/func_time.result +38 −2 Original line number Diff line number Diff line Loading @@ -548,12 +548,48 @@ unix_timestamp('1969-12-01 19:00:01') select from_unixtime(-1); from_unixtime(-1) NULL select from_unixtime(2145916800); from_unixtime(2145916800) select from_unixtime(2147483647); from_unixtime(2147483647) 2038-01-19 06:14:07 select from_unixtime(2147483648); from_unixtime(2147483648) NULL select from_unixtime(0); from_unixtime(0) 1970-01-01 03:00:00 select unix_timestamp(from_unixtime(2147483647)); unix_timestamp(from_unixtime(2147483647)) 2147483647 select unix_timestamp(from_unixtime(2147483648)); unix_timestamp(from_unixtime(2147483648)) NULL select unix_timestamp('2039-01-20 01:00:00'); unix_timestamp('2039-01-20 01:00:00') 0 select unix_timestamp('1968-01-20 01:00:00'); unix_timestamp('1968-01-20 01:00:00') 0 select unix_timestamp('2038-02-10 01:00:00'); unix_timestamp('2038-02-10 01:00:00') 0 select unix_timestamp('1969-11-20 01:00:00'); unix_timestamp('1969-11-20 01:00:00') 0 select unix_timestamp('2038-01-20 01:00:00'); unix_timestamp('2038-01-20 01:00:00') 0 select unix_timestamp('1969-12-30 01:00:00'); unix_timestamp('1969-12-30 01:00:00') 0 select unix_timestamp('2038-01-17 12:00:00'); unix_timestamp('2038-01-17 12:00:00') 2147331600 select unix_timestamp('1970-01-01 03:00:01'); unix_timestamp('1970-01-01 03:00:01') 1 select unix_timestamp('2038-01-19 07:14:07'); unix_timestamp('2038-01-19 07:14:07') 0 CREATE TABLE t1 (datetime datetime, timestamp timestamp, date date, time time); INSERT INTO t1 values ("2001-01-02 03:04:05", "2002-01-02 03:04:05", "2003-01-02", "06:07:08"); SELECT * from t1; Loading mysql-test/r/timezone.result +4 −4 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ Warning 1299 Invalid TIMESTAMP value in column 'ts' at row 2 DROP TABLE t1; select unix_timestamp('1970-01-01 01:00:00'), unix_timestamp('1970-01-01 01:00:01'), unix_timestamp('2038-01-01 00:59:59'), unix_timestamp('2038-01-01 01:00:00'); unix_timestamp('1970-01-01 01:00:00') unix_timestamp('1970-01-01 01:00:01') unix_timestamp('2038-01-01 00:59:59') unix_timestamp('2038-01-01 01:00:00') 0 1 2145916799 0 unix_timestamp('2038-01-19 04:14:07'), unix_timestamp('2038-01-19 04:14:08'); unix_timestamp('1970-01-01 01:00:00') unix_timestamp('1970-01-01 01:00:01') unix_timestamp('2038-01-19 04:14:07') unix_timestamp('2038-01-19 04:14:08') 0 1 2147483647 0 mysql-test/r/timezone2.result +12 −12 Original line number Diff line number Diff line Loading @@ -116,7 +116,7 @@ create table t1 (ts timestamp); set time_zone='UTC'; insert into t1 values ('0000-00-00 00:00:00'),('1969-12-31 23:59:59'), ('1970-01-01 00:00:00'),('1970-01-01 00:00:01'), ('2037-12-31 23:59:59'),('2038-01-01 00:00:00'); ('2038-01-19 03:14:07'),('2038-01-19 03:14:08'); Warnings: Warning 1264 Out of range value adjusted for column 'ts' at row 2 Warning 1264 Out of range value adjusted for column 'ts' at row 3 Loading @@ -127,13 +127,13 @@ ts 0000-00-00 00:00:00 0000-00-00 00:00:00 1970-01-01 00:00:01 2037-12-31 23:59:59 2038-01-19 03:14:07 0000-00-00 00:00:00 delete from t1; set time_zone='MET'; insert into t1 values ('0000-00-00 00:00:00'),('1970-01-01 00:30:00'), ('1970-01-01 01:00:00'),('1970-01-01 01:00:01'), ('2038-01-01 00:59:59'),('2038-01-01 01:00:00'); ('2038-01-19 04:14:07'),('2038-01-19 04:14:08'); Warnings: Warning 1264 Out of range value adjusted for column 'ts' at row 2 Warning 1264 Out of range value adjusted for column 'ts' at row 3 Loading @@ -144,13 +144,13 @@ ts 0000-00-00 00:00:00 0000-00-00 00:00:00 1970-01-01 01:00:01 2038-01-01 00:59:59 2038-01-19 04:14:07 0000-00-00 00:00:00 delete from t1; set time_zone='+01:30'; insert into t1 values ('0000-00-00 00:00:00'),('1970-01-01 01:00:00'), ('1970-01-01 01:30:00'),('1970-01-01 01:30:01'), ('2038-01-01 01:29:59'),('2038-01-01 01:30:00'); ('2038-01-19 04:44:07'),('2038-01-19 04:44:08'); Warnings: Warning 1264 Out of range value adjusted for column 'ts' at row 2 Warning 1264 Out of range value adjusted for column 'ts' at row 3 Loading @@ -161,7 +161,7 @@ ts 0000-00-00 00:00:00 0000-00-00 00:00:00 1970-01-01 01:30:01 2038-01-01 01:29:59 2038-01-19 04:44:07 0000-00-00 00:00:00 drop table t1; show variables like 'time_zone'; Loading Loading @@ -223,12 +223,12 @@ convert_tz('2003-10-26 02:59:59', 'MET', 'UTC') select convert_tz('2003-10-26 04:00:00', 'MET', 'UTC'); convert_tz('2003-10-26 04:00:00', 'MET', 'UTC') 2003-10-26 03:00:00 select convert_tz('2038-01-01 00:59:59', 'MET', 'UTC'); convert_tz('2038-01-01 00:59:59', 'MET', 'UTC') 2037-12-31 23:59:59 select convert_tz('2038-01-01 01:00:00', 'MET', 'UTC'); convert_tz('2038-01-01 01:00:00', 'MET', 'UTC') 2038-01-01 01:00:00 select convert_tz('2038-01-19 04:14:07', 'MET', 'UTC'); convert_tz('2038-01-19 04:14:07', 'MET', 'UTC') 2038-01-19 03:14:07 select convert_tz('2038-01-19 04:14:08', 'MET', 'UTC'); convert_tz('2038-01-19 04:14:08', 'MET', 'UTC') 2038-01-19 04:14:08 select convert_tz('2103-01-01 04:00:00', 'MET', 'UTC'); convert_tz('2103-01-01 04:00:00', 'MET', 'UTC') 2103-01-01 04:00:00 Loading Loading
configure.in +7 −0 Original line number Diff line number Diff line Loading @@ -1773,6 +1773,13 @@ then AC_MSG_ERROR("MySQL needs a off_t type.") fi dnl dnl check if time_t is unsigned dnl MYSQL_CHECK_TIME_T # do we need #pragma interface/#pragma implementation ? # yes if it's gcc 2.x, and not icc pretending to be gcc, and not cygwin AC_MSG_CHECKING(the need for @%:@pragma interface/implementation) Loading
include/my_time.h +32 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,14 @@ typedef long my_time_t; #define MY_TIME_T_MAX LONG_MAX #define MY_TIME_T_MIN LONG_MIN /* Time handling defaults */ #define TIMESTAMP_MAX_YEAR 2038 #define YY_PART_YEAR 70 #define TIMESTAMP_MIN_YEAR (1900 + YY_PART_YEAR - 1) #define TIMESTAMP_MAX_VALUE INT_MAX32 #define TIMESTAMP_MIN_VALUE 1 #define YY_PART_YEAR 70 /* Flags to str_to_datetime */ Loading Loading @@ -68,6 +76,30 @@ uint calc_days_in_year(uint year); void init_time(void); /* Function to check sanity of a TIMESTAMP value DESCRIPTION Check if a given MYSQL_TIME value fits in TIMESTAMP range. This function doesn't make precise check, but rather a rough estimate. RETURN VALUES FALSE The value seems sane TRUE The MYSQL_TIME value is definitely out of range */ static inline bool validate_timestamp_range(const MYSQL_TIME *t) { if ((t->year > TIMESTAMP_MAX_YEAR || t->year < TIMESTAMP_MIN_YEAR) || (t->year == TIMESTAMP_MAX_YEAR && (t->month > 1 || t->day > 19)) || (t->year == TIMESTAMP_MIN_YEAR && (t->month < 12 || t->day < 31))) return FALSE; return TRUE; } my_time_t my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, my_bool *in_dst_time_gap); Loading
mysql-test/r/func_time.result +38 −2 Original line number Diff line number Diff line Loading @@ -548,12 +548,48 @@ unix_timestamp('1969-12-01 19:00:01') select from_unixtime(-1); from_unixtime(-1) NULL select from_unixtime(2145916800); from_unixtime(2145916800) select from_unixtime(2147483647); from_unixtime(2147483647) 2038-01-19 06:14:07 select from_unixtime(2147483648); from_unixtime(2147483648) NULL select from_unixtime(0); from_unixtime(0) 1970-01-01 03:00:00 select unix_timestamp(from_unixtime(2147483647)); unix_timestamp(from_unixtime(2147483647)) 2147483647 select unix_timestamp(from_unixtime(2147483648)); unix_timestamp(from_unixtime(2147483648)) NULL select unix_timestamp('2039-01-20 01:00:00'); unix_timestamp('2039-01-20 01:00:00') 0 select unix_timestamp('1968-01-20 01:00:00'); unix_timestamp('1968-01-20 01:00:00') 0 select unix_timestamp('2038-02-10 01:00:00'); unix_timestamp('2038-02-10 01:00:00') 0 select unix_timestamp('1969-11-20 01:00:00'); unix_timestamp('1969-11-20 01:00:00') 0 select unix_timestamp('2038-01-20 01:00:00'); unix_timestamp('2038-01-20 01:00:00') 0 select unix_timestamp('1969-12-30 01:00:00'); unix_timestamp('1969-12-30 01:00:00') 0 select unix_timestamp('2038-01-17 12:00:00'); unix_timestamp('2038-01-17 12:00:00') 2147331600 select unix_timestamp('1970-01-01 03:00:01'); unix_timestamp('1970-01-01 03:00:01') 1 select unix_timestamp('2038-01-19 07:14:07'); unix_timestamp('2038-01-19 07:14:07') 0 CREATE TABLE t1 (datetime datetime, timestamp timestamp, date date, time time); INSERT INTO t1 values ("2001-01-02 03:04:05", "2002-01-02 03:04:05", "2003-01-02", "06:07:08"); SELECT * from t1; Loading
mysql-test/r/timezone.result +4 −4 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ Warning 1299 Invalid TIMESTAMP value in column 'ts' at row 2 DROP TABLE t1; select unix_timestamp('1970-01-01 01:00:00'), unix_timestamp('1970-01-01 01:00:01'), unix_timestamp('2038-01-01 00:59:59'), unix_timestamp('2038-01-01 01:00:00'); unix_timestamp('1970-01-01 01:00:00') unix_timestamp('1970-01-01 01:00:01') unix_timestamp('2038-01-01 00:59:59') unix_timestamp('2038-01-01 01:00:00') 0 1 2145916799 0 unix_timestamp('2038-01-19 04:14:07'), unix_timestamp('2038-01-19 04:14:08'); unix_timestamp('1970-01-01 01:00:00') unix_timestamp('1970-01-01 01:00:01') unix_timestamp('2038-01-19 04:14:07') unix_timestamp('2038-01-19 04:14:08') 0 1 2147483647 0
mysql-test/r/timezone2.result +12 −12 Original line number Diff line number Diff line Loading @@ -116,7 +116,7 @@ create table t1 (ts timestamp); set time_zone='UTC'; insert into t1 values ('0000-00-00 00:00:00'),('1969-12-31 23:59:59'), ('1970-01-01 00:00:00'),('1970-01-01 00:00:01'), ('2037-12-31 23:59:59'),('2038-01-01 00:00:00'); ('2038-01-19 03:14:07'),('2038-01-19 03:14:08'); Warnings: Warning 1264 Out of range value adjusted for column 'ts' at row 2 Warning 1264 Out of range value adjusted for column 'ts' at row 3 Loading @@ -127,13 +127,13 @@ ts 0000-00-00 00:00:00 0000-00-00 00:00:00 1970-01-01 00:00:01 2037-12-31 23:59:59 2038-01-19 03:14:07 0000-00-00 00:00:00 delete from t1; set time_zone='MET'; insert into t1 values ('0000-00-00 00:00:00'),('1970-01-01 00:30:00'), ('1970-01-01 01:00:00'),('1970-01-01 01:00:01'), ('2038-01-01 00:59:59'),('2038-01-01 01:00:00'); ('2038-01-19 04:14:07'),('2038-01-19 04:14:08'); Warnings: Warning 1264 Out of range value adjusted for column 'ts' at row 2 Warning 1264 Out of range value adjusted for column 'ts' at row 3 Loading @@ -144,13 +144,13 @@ ts 0000-00-00 00:00:00 0000-00-00 00:00:00 1970-01-01 01:00:01 2038-01-01 00:59:59 2038-01-19 04:14:07 0000-00-00 00:00:00 delete from t1; set time_zone='+01:30'; insert into t1 values ('0000-00-00 00:00:00'),('1970-01-01 01:00:00'), ('1970-01-01 01:30:00'),('1970-01-01 01:30:01'), ('2038-01-01 01:29:59'),('2038-01-01 01:30:00'); ('2038-01-19 04:44:07'),('2038-01-19 04:44:08'); Warnings: Warning 1264 Out of range value adjusted for column 'ts' at row 2 Warning 1264 Out of range value adjusted for column 'ts' at row 3 Loading @@ -161,7 +161,7 @@ ts 0000-00-00 00:00:00 0000-00-00 00:00:00 1970-01-01 01:30:01 2038-01-01 01:29:59 2038-01-19 04:44:07 0000-00-00 00:00:00 drop table t1; show variables like 'time_zone'; Loading Loading @@ -223,12 +223,12 @@ convert_tz('2003-10-26 02:59:59', 'MET', 'UTC') select convert_tz('2003-10-26 04:00:00', 'MET', 'UTC'); convert_tz('2003-10-26 04:00:00', 'MET', 'UTC') 2003-10-26 03:00:00 select convert_tz('2038-01-01 00:59:59', 'MET', 'UTC'); convert_tz('2038-01-01 00:59:59', 'MET', 'UTC') 2037-12-31 23:59:59 select convert_tz('2038-01-01 01:00:00', 'MET', 'UTC'); convert_tz('2038-01-01 01:00:00', 'MET', 'UTC') 2038-01-01 01:00:00 select convert_tz('2038-01-19 04:14:07', 'MET', 'UTC'); convert_tz('2038-01-19 04:14:07', 'MET', 'UTC') 2038-01-19 03:14:07 select convert_tz('2038-01-19 04:14:08', 'MET', 'UTC'); convert_tz('2038-01-19 04:14:08', 'MET', 'UTC') 2038-01-19 04:14:08 select convert_tz('2103-01-01 04:00:00', 'MET', 'UTC'); convert_tz('2103-01-01 04:00:00', 'MET', 'UTC') 2103-01-01 04:00:00 Loading