mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
f56e43ce52
Updated MySQL time handling code to react correctly on UTC leap second additions. MySQL functions that return the OS current time, like e.g. CURDATE(), NOW() etc will return :59:59 instead of :59:60 or 59:61. As a result the reader will receive :59:59 for 2 or 3 consecutive seconds during the leap second. This fix will not affect the values returned by UNIX_TIMESTAMP() for leap seconds. But note that when converting the value returned by UNIX_TIMESTAMP() to broken down time the correction of leap seconds will still be applied. Note that this fix will make a difference *only* if the OS is specially configured to return leap seconds from the OS time calls or when using a MySQL time zone defintion that has leap seconds. Even after this change date/time literals (or other broken down time representations) with leap seconds (ending on :59:60 or 59:61) will still be considered illegal and discarded by the server with an error or a warning depending on the sql mode. Added a test case to demonstrate the effect of the fix. mysql-test/r/timezone3.result: Bug #39920: test case mysql-test/std_data/Moscow_leap: Bug #39920: updated the Moscow time zone to Dr. Olson's tzdata 2008i to accomodate for the 2008 leap second mysql-test/t/timezone3.test: Bug #39920: test case sql/tztime.cc: Bug #39920: adjust leap seconds (:60 or :61) to :59 sql/tztime.h: Bug #39920: adjust leap seconds (:60 or :61) to :59
49 lines
2.2 KiB
Text
49 lines
2.2 KiB
Text
drop table if exists t1;
|
|
create table t1 (i int, c varchar(20));
|
|
insert into t1 values
|
|
(unix_timestamp("2004-01-01 00:00:00"), "2004-01-01 00:00:00");
|
|
insert into t1 values
|
|
(unix_timestamp("2004-03-28 01:59:59"), "2004-03-28 01:59:59"),
|
|
(unix_timestamp("2004-03-28 02:30:00"), "2004-03-28 02:30:00"),
|
|
(unix_timestamp("2004-03-28 03:00:00"), "2004-03-28 03:00:00");
|
|
insert into t1 values
|
|
(unix_timestamp('2004-05-01 00:00:00'),'2004-05-01 00:00:00');
|
|
insert into t1 values
|
|
(unix_timestamp('2004-10-31 01:00:00'),'2004-10-31 01:00:00'),
|
|
(unix_timestamp('2004-10-31 02:00:00'),'2004-10-31 02:00:00'),
|
|
(unix_timestamp('2004-10-31 02:59:59'),'2004-10-31 02:59:59'),
|
|
(unix_timestamp('2004-10-31 04:00:00'),'2004-10-31 04:00:00'),
|
|
(unix_timestamp('2004-10-31 02:59:59'),'2004-10-31 02:59:59');
|
|
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
|
|
1080428421 2004-03-28 01:59:59 2004-03-28 01:59:59
|
|
1080428422 2004-03-28 03:00:00 2004-03-28 02:30:00
|
|
1080428422 2004-03-28 03:00:00 2004-03-28 03:00:00
|
|
1083355222 2004-05-01 00:00:00 2004-05-01 00:00:00
|
|
1099170022 2004-10-31 01:00:00 2004-10-31 01:00:00
|
|
1099177222 2004-10-31 02:00:00 2004-10-31 02:00:00
|
|
1099180821 2004-10-31 02:59:59 2004-10-31 02:59:59
|
|
1099184422 2004-10-31 04:00:00 2004-10-31 04:00:00
|
|
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);
|
|
select * from t1;
|
|
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
|