Loading mysql-test/r/timezone3.result +8 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ insert into t1 values insert into t1 values (unix_timestamp('1981-07-01 03:59:59'),'1981-07-01 03:59:59'), (unix_timestamp('1981-07-01 04:00:00'),'1981-07-01 04:00:00'); insert into t1 values (unix_timestamp('2009-01-01 02:59:59'),'2009-01-01 02:59:59'), (unix_timestamp('2009-01-01 03:00:00'),'2009-01-01 03:00:00'); select i, from_unixtime(i), c from t1; i from_unixtime(i) c 1072904422 2004-01-01 00:00:00 2004-01-01 00:00:00 Loading @@ -31,6 +34,8 @@ i from_unixtime(i) c 1099180821 2004-10-31 02:59:59 2004-10-31 02:59:59 362793608 1981-07-01 03:59:59 1981-07-01 03:59:59 362793610 1981-07-01 04:00:00 1981-07-01 04:00:00 1230768022 2009-01-01 02:59:59 2009-01-01 02:59:59 1230768024 2009-01-01 03:00:00 2009-01-01 03:00:00 drop table t1; create table t1 (ts timestamp); insert into t1 values (19730101235900), (20040101235900); Loading @@ -39,3 +44,6 @@ ts 1973-01-01 23:59:00 2004-01-01 23:59:00 drop table t1; SELECT FROM_UNIXTIME(1230768022), FROM_UNIXTIME(1230768023), FROM_UNIXTIME(1230768024); FROM_UNIXTIME(1230768022) FROM_UNIXTIME(1230768023) FROM_UNIXTIME(1230768024) 2009-01-01 02:59:59 2009-01-01 02:59:59 2009-01-01 03:00:00 mysql-test/std_data/Moscow_leap +1.64 KiB (2.61 KiB) File changed.No diff preview for this file type. View original file View changed file mysql-test/t/timezone3.test +12 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,10 @@ insert into t1 values (unix_timestamp('1981-07-01 03:59:59'),'1981-07-01 03:59:59'), (unix_timestamp('1981-07-01 04:00:00'),'1981-07-01 04:00:00'); insert into t1 values (unix_timestamp('2009-01-01 02:59:59'),'2009-01-01 02:59:59'), (unix_timestamp('2009-01-01 03:00:00'),'2009-01-01 03:00:00'); select i, from_unixtime(i), c from t1; drop table t1; Loading @@ -58,4 +62,12 @@ insert into t1 values (19730101235900), (20040101235900); select * from t1; drop table t1; # # Test Bug #39920: MySQL cannot deal with Leap Second expression in string # literal # # 2009-01-01 02:59:59, 2009-01-01 02:59:60 and 2009-01-01 03:00:00 SELECT FROM_UNIXTIME(1230768022), FROM_UNIXTIME(1230768023), FROM_UNIXTIME(1230768024); # End of 4.1 tests sql/tztime.cc +22 −0 Original line number Diff line number Diff line Loading @@ -1073,6 +1073,7 @@ Time_zone_system::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const localtime_r(&tmp_t, &tmp_tm); localtime_to_TIME(tmp, &tmp_tm); tmp->time_type= MYSQL_TIMESTAMP_DATETIME; adjust_leap_second(tmp); } Loading Loading @@ -1157,6 +1158,7 @@ Time_zone_utc::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const gmtime_r(&tmp_t, &tmp_tm); localtime_to_TIME(tmp, &tmp_tm); tmp->time_type= MYSQL_TIMESTAMP_DATETIME; adjust_leap_second(tmp); } Loading Loading @@ -1260,6 +1262,7 @@ void Time_zone_db::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const { ::gmt_sec_to_TIME(tmp, t, tz_info); adjust_leap_second(tmp); } Loading Loading @@ -2373,6 +2376,25 @@ Time_zone *my_tz_find_with_opening_tz_tables(THD *thd, const String *name) DBUG_RETURN(tz); } /** Convert leap seconds into non-leap This function will convert the leap seconds added by the OS to non-leap seconds, e.g. 23:59:59, 23:59:60 -> 23:59:59, 00:00:01 ... This check is not checking for years on purpose : although it's not a complete check this way it doesn't require looking (and having installed) the leap seconds table. @param[in,out] broken down time structure as filled in by the OS */ void Time_zone::adjust_leap_second(MYSQL_TIME *t) { if (t->second == 60 || t->second == 61) t->second= 59; } #endif /* !defined(TESTTIME) && !defined(TZINFO2SQL) */ Loading sql/tztime.h +3 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,9 @@ class Time_zone: public Sql_alloc allocated on MEM_ROOT and should not require destruction. */ virtual ~Time_zone() {}; protected: static inline void adjust_leap_second(MYSQL_TIME *t); }; extern Time_zone * my_tz_UTC; Loading Loading
mysql-test/r/timezone3.result +8 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ insert into t1 values insert into t1 values (unix_timestamp('1981-07-01 03:59:59'),'1981-07-01 03:59:59'), (unix_timestamp('1981-07-01 04:00:00'),'1981-07-01 04:00:00'); insert into t1 values (unix_timestamp('2009-01-01 02:59:59'),'2009-01-01 02:59:59'), (unix_timestamp('2009-01-01 03:00:00'),'2009-01-01 03:00:00'); select i, from_unixtime(i), c from t1; i from_unixtime(i) c 1072904422 2004-01-01 00:00:00 2004-01-01 00:00:00 Loading @@ -31,6 +34,8 @@ i from_unixtime(i) c 1099180821 2004-10-31 02:59:59 2004-10-31 02:59:59 362793608 1981-07-01 03:59:59 1981-07-01 03:59:59 362793610 1981-07-01 04:00:00 1981-07-01 04:00:00 1230768022 2009-01-01 02:59:59 2009-01-01 02:59:59 1230768024 2009-01-01 03:00:00 2009-01-01 03:00:00 drop table t1; create table t1 (ts timestamp); insert into t1 values (19730101235900), (20040101235900); Loading @@ -39,3 +44,6 @@ ts 1973-01-01 23:59:00 2004-01-01 23:59:00 drop table t1; SELECT FROM_UNIXTIME(1230768022), FROM_UNIXTIME(1230768023), FROM_UNIXTIME(1230768024); FROM_UNIXTIME(1230768022) FROM_UNIXTIME(1230768023) FROM_UNIXTIME(1230768024) 2009-01-01 02:59:59 2009-01-01 02:59:59 2009-01-01 03:00:00
mysql-test/std_data/Moscow_leap +1.64 KiB (2.61 KiB) File changed.No diff preview for this file type. View original file View changed file
mysql-test/t/timezone3.test +12 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,10 @@ insert into t1 values (unix_timestamp('1981-07-01 03:59:59'),'1981-07-01 03:59:59'), (unix_timestamp('1981-07-01 04:00:00'),'1981-07-01 04:00:00'); insert into t1 values (unix_timestamp('2009-01-01 02:59:59'),'2009-01-01 02:59:59'), (unix_timestamp('2009-01-01 03:00:00'),'2009-01-01 03:00:00'); select i, from_unixtime(i), c from t1; drop table t1; Loading @@ -58,4 +62,12 @@ insert into t1 values (19730101235900), (20040101235900); select * from t1; drop table t1; # # Test Bug #39920: MySQL cannot deal with Leap Second expression in string # literal # # 2009-01-01 02:59:59, 2009-01-01 02:59:60 and 2009-01-01 03:00:00 SELECT FROM_UNIXTIME(1230768022), FROM_UNIXTIME(1230768023), FROM_UNIXTIME(1230768024); # End of 4.1 tests
sql/tztime.cc +22 −0 Original line number Diff line number Diff line Loading @@ -1073,6 +1073,7 @@ Time_zone_system::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const localtime_r(&tmp_t, &tmp_tm); localtime_to_TIME(tmp, &tmp_tm); tmp->time_type= MYSQL_TIMESTAMP_DATETIME; adjust_leap_second(tmp); } Loading Loading @@ -1157,6 +1158,7 @@ Time_zone_utc::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const gmtime_r(&tmp_t, &tmp_tm); localtime_to_TIME(tmp, &tmp_tm); tmp->time_type= MYSQL_TIMESTAMP_DATETIME; adjust_leap_second(tmp); } Loading Loading @@ -1260,6 +1262,7 @@ void Time_zone_db::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const { ::gmt_sec_to_TIME(tmp, t, tz_info); adjust_leap_second(tmp); } Loading Loading @@ -2373,6 +2376,25 @@ Time_zone *my_tz_find_with_opening_tz_tables(THD *thd, const String *name) DBUG_RETURN(tz); } /** Convert leap seconds into non-leap This function will convert the leap seconds added by the OS to non-leap seconds, e.g. 23:59:59, 23:59:60 -> 23:59:59, 00:00:01 ... This check is not checking for years on purpose : although it's not a complete check this way it doesn't require looking (and having installed) the leap seconds table. @param[in,out] broken down time structure as filled in by the OS */ void Time_zone::adjust_leap_second(MYSQL_TIME *t) { if (t->second == 60 || t->second == 61) t->second= 59; } #endif /* !defined(TESTTIME) && !defined(TZINFO2SQL) */ Loading
sql/tztime.h +3 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,9 @@ class Time_zone: public Sql_alloc allocated on MEM_ROOT and should not require destruction. */ virtual ~Time_zone() {}; protected: static inline void adjust_leap_second(MYSQL_TIME *t); }; extern Time_zone * my_tz_UTC; Loading