Loading acinclude.m4 +24 −0 Original line number Diff line number Diff line Loading @@ -1835,6 +1835,30 @@ dnl END OF MYSQL_CHECK_NDBCLUSTER SECTION dnl --------------------------------------------------------------------------- dnl dnl Macro to check time_t range: according to C standard dnl array index myst be greater then 0 => if time_t is signed dnl the code in the macros below won't compile. dnl AC_DEFUN([MYSQL_CHECK_TIME_T],[ AC_MSG_CHECKING(if time_t is unsigned) AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[ #include <time.h> ]], [[ int array[(((time_t)-1) > 0) ? 1 : -1]; ]] ) ], [ AC_DEFINE([TIME_T_UNSIGNED], 1, [Define to 1 if time_t is unsigned]) AC_MSG_RESULT(yes) ], [AC_MSG_RESULT(no)] ) ]) dnl By default, many hosts won't let programs access large files; dnl one must use special compiler options to get large-file access to work. dnl For more details about this brain damage please see: Loading configure.in +7 −0 Original line number Diff line number Diff line Loading @@ -1824,6 +1824,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 @@ -67,6 +75,30 @@ long calc_daynr(uint year,uint month,uint day); 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, bool *in_dst_time_gap); Loading mysql-test/r/func_time.result +38 −2 Original line number Diff line number Diff line Loading @@ -485,12 +485,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/rename.result +1 −0 Original line number Diff line number Diff line Loading @@ -54,3 +54,4 @@ Tables_in_test t2 t4 drop table t2, t4; End of 4.1 tests Loading
acinclude.m4 +24 −0 Original line number Diff line number Diff line Loading @@ -1835,6 +1835,30 @@ dnl END OF MYSQL_CHECK_NDBCLUSTER SECTION dnl --------------------------------------------------------------------------- dnl dnl Macro to check time_t range: according to C standard dnl array index myst be greater then 0 => if time_t is signed dnl the code in the macros below won't compile. dnl AC_DEFUN([MYSQL_CHECK_TIME_T],[ AC_MSG_CHECKING(if time_t is unsigned) AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[ #include <time.h> ]], [[ int array[(((time_t)-1) > 0) ? 1 : -1]; ]] ) ], [ AC_DEFINE([TIME_T_UNSIGNED], 1, [Define to 1 if time_t is unsigned]) AC_MSG_RESULT(yes) ], [AC_MSG_RESULT(no)] ) ]) dnl By default, many hosts won't let programs access large files; dnl one must use special compiler options to get large-file access to work. dnl For more details about this brain damage please see: Loading
configure.in +7 −0 Original line number Diff line number Diff line Loading @@ -1824,6 +1824,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 @@ -67,6 +75,30 @@ long calc_daynr(uint year,uint month,uint day); 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, bool *in_dst_time_gap); Loading
mysql-test/r/func_time.result +38 −2 Original line number Diff line number Diff line Loading @@ -485,12 +485,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/rename.result +1 −0 Original line number Diff line number Diff line Loading @@ -54,3 +54,4 @@ Tables_in_test t2 t4 drop table t2, t4; End of 4.1 tests