diff options
author | petr/cps@mysql.com/owlet.local <> | 2006-11-01 16:47:40 +0300 |
---|---|---|
committer | petr/cps@mysql.com/owlet.local <> | 2006-11-01 16:47:40 +0300 |
commit | 3ec542dfbdd08c13a6c33b07f7ddd9650c0e0ad8 (patch) | |
tree | e2642512c7a6f4cbdaa661730aca0413380e045e /sql/time.cc | |
parent | acaa584c5523753cab5b3a50ed3c95672b462541 (diff) | |
download | mariadb-git-3ec542dfbdd08c13a6c33b07f7ddd9650c0e0ad8.tar.gz |
Fix Bug #9191 "TIMESTAMP/from_unixtime() no longer accepts 2^31-1"
(4.1 version, with post-review fixes)
The fix for another Bug (6439) limited FROM_UNIXTIME() to
TIMESTAMP_MAX_VALUE which is 2145916799 or 2037-12-01 23:59:59 GMT,
however unix timestamp in general is not considered to be limited
by this value. All dates up to power(2,31)-1 are valid.
This patch extends allowed TIMESTAMP range so, that max
TIMESTAMP value is power(2,31)-1. It also corrects
FROM_UNIXTIME() and UNIX_TIMESTAMP() functions, so that
max allowed UNIX_TIMESTAMP() is power(2,31)-1. FROM_UNIXTIME()
is fixed accordingly to allow conversion of dates up to
2038-01-19 03:14:07 UTC. The patch also fixes CONVERT_TZ()
function to allow extended range of dates.
The main problem solved in the patch is possible overflows
of variables, used in broken-time representation to time_t
conversion (required for UNIX_TIMESTAMP).
Diffstat (limited to 'sql/time.cc')
-rw-r--r-- | sql/time.cc | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/sql/time.cc b/sql/time.cc index ef832ac5a70..0e428e8bc40 100644 --- a/sql/time.cc +++ b/sql/time.cc @@ -230,14 +230,11 @@ my_time_t TIME_to_timestamp(THD *thd, const TIME *t, bool *in_dst_time_gap) *in_dst_time_gap= 0; - if (t->year < TIMESTAMP_MAX_YEAR && t->year > TIMESTAMP_MIN_YEAR || - t->year == TIMESTAMP_MAX_YEAR && t->month == 1 && t->day == 1 || - t->year == TIMESTAMP_MIN_YEAR && t->month == 12 && t->day == 31) + timestamp= thd->variables.time_zone->TIME_to_gmt_sec(t, in_dst_time_gap); + if (timestamp) { thd->time_zone_used= 1; - timestamp= thd->variables.time_zone->TIME_to_gmt_sec(t, in_dst_time_gap); - if (timestamp >= TIMESTAMP_MIN_VALUE && timestamp <= TIMESTAMP_MAX_VALUE) - return timestamp; + return timestamp; } /* If we are here we have range error. */ |