[MDEV-15654] ADDTIME creates invalid timestamp value near DST changes Created: 2018-03-25 Updated: 2020-08-14 Resolved: 2020-08-14 |
|
| Status: | Closed |
| Project: | MariaDB Server |
| Component/s: | Data types |
| Affects Version/s: | 10.2, 10.3, 10.4, 10.5 |
| Fix Version/s: | N/A |
| Type: | Bug | Priority: | Major |
| Reporter: | Swa F | Assignee: | Sergei Golubchik |
| Resolution: | Not a Bug | Votes: | 0 |
| Labels: | timediff, timezones | ||
| Environment: |
freebsd (from the ports collection) |
||
| Issue Links: |
|
||||||||||||||||||||||||
| Sprint: | 10.4.0-1 | ||||||||||||||||||||||||
| Description |
|
reproducing this is time sensitive. And occurs just once a year ... Server is set to timezone Europe/Brussels 1 hour before this Timezone change I noticed errors inserting records into a table that had a column defined as:
The value inserted was calculated on insert by mariadb itself using ADDTIME(NOW(),'01:00:00') as value for the expires field. Mariadb was using the system Timezones:
Essentially ADDTIME creates invalid dates as it doesn't account for timezone changes.
Actual insert error message (Time ran out, sorry, DST change occurred before I could fully document it) example: Issuing a "set time_zone='+00:00';" before using the database connection from the application worked around the the problem (I don't mind not using local time at all - in fact using localtime only started after a server swap and did go by unnoticed till now). Still if the database insists on valid time, it should also calculate valid time itself. |
| Comments |
| Comment by Daniel Black [ 2018-03-25 ] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
My local timezone has a 2am to 3am jump at beginning of DST as tested here:
So not fixed in 10.3. Notably adddate doesn't doesn't perform the same timezone calculations and results in an invalid time:
| ||||||||||||||||||||||||||||||||||||||||||||||||
| Comment by Daniel Black [ 2018-03-25 ] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
Confirmed still an error in 10.2
adddate still also able to produce invalid values. | ||||||||||||||||||||||||||||||||||||||||||||||||
| Comment by Daniel Black [ 2018-03-25 ] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
Related, addtime jumping over such an intervals neglects that there is a gap.
| ||||||||||||||||||||||||||||||||||||||||||||||||
| Comment by Sergei Golubchik [ 2018-04-02 ] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
This is a combination of issues. First, note the difference between a TIMESTAMP and a DATETIME. TIMESTAMP corresponds to some specific point in time in the local time zone. DATETIME is a combination of 6 numbers (year/month/day/hour/minute/second) and is not associated with any time zone. So, one issue: NOW() returns a datetime, not a timestamp. That is, its result has no time zone information, so 2018-03-25 02:39:34 is a perfectly valid datetime value. It would be logical, I'd say, for NOW() to return a timestamp. I've created MDEV-15751 for this task. But for compatibility reasons we cannot do this change after beta. Second issue: even if NOW() would've returned a timestamp, ADDTIME would return a datetime, and, again, 2018-03-25 02:39:34 would be perfectly valid. I've created MDEV-15750 to change it, but, again, compatibility issues. You get an error when this datetime value is stored in a timestamp column, because not every valid datetime value is a valid timestamp value. Until we fix that all, you can use a workaround. Use from_unixtime(unix_timestamp(now())+3600) — it will correctly move you one hour forward in the local time zone, taking DST into account as needed. | ||||||||||||||||||||||||||||||||||||||||||||||||
| Comment by Sergei Golubchik [ 2020-08-14 ] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
At the moment this behaves as expected, even if not ideally. Various aspects of this behavior will be changed in MDEV-15750 and MDEV-15751 |