diff options
author | unknown <msvensson@pilot.blaudden> | 2007-02-23 17:34:19 +0100 |
---|---|---|
committer | unknown <msvensson@pilot.blaudden> | 2007-02-23 17:34:19 +0100 |
commit | 7020d1920a2c13659ec4b8492054c154427e6f31 (patch) | |
tree | c78fe62c081555de415e03927e0e7b92532466ff /sql/tztime.cc | |
parent | 794c55672e7759380c295ecb3bd4312a29c4a89d (diff) | |
parent | d8ba8b8c985d256cf607e6e1a86be6b1fc533673 (diff) | |
download | mariadb-git-7020d1920a2c13659ec4b8492054c154427e6f31.tar.gz |
Merge pilot.blaudden:/home/msvensson/mysql/bug26536/my50-bug26536
into pilot.blaudden:/home/msvensson/mysql/bug26536/my51-bug26536
include/my_time.h:
Auto merged
sql/tztime.cc:
Auto merged
Diffstat (limited to 'sql/tztime.cc')
-rw-r--r-- | sql/tztime.cc | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/sql/tztime.cc b/sql/tztime.cc index 2cdc863565a..c9518bc1ece 100644 --- a/sql/tztime.cc +++ b/sql/tztime.cc @@ -780,6 +780,8 @@ gmt_sec_to_TIME(TIME *tmp, my_time_t sec_in_utc, const TIME_ZONE_INFO *sp) static my_time_t sec_since_epoch(int year, int mon, int mday, int hour, int min ,int sec) { + /* Guard against my_time_t overflow(on system with 32 bit my_time_t) */ + DBUG_ASSERT(!(year == TIMESTAMP_MAX_YEAR && mon == 1 && mday > 17)); #ifndef WE_WANT_TO_HANDLE_UNORMALIZED_DATES /* It turns out that only whenever month is normalized or unnormalized @@ -960,12 +962,12 @@ TIME_to_gmt_sec(const TIME *t, const TIME_ZONE_INFO *sp, */ if (shift) { - if (local_t > (my_time_t) (TIMESTAMP_MAX_VALUE - shift*86400L + + if (local_t > (my_time_t) (TIMESTAMP_MAX_VALUE - shift * SECS_PER_DAY + sp->revtis[i].rt_offset - saved_seconds)) { DBUG_RETURN(0); /* my_time_t overflow */ } - local_t+= shift*86400L; + local_t+= shift * SECS_PER_DAY; } if (sp->revtis[i].rt_type) @@ -1353,6 +1355,7 @@ my_time_t Time_zone_offset::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const { my_time_t local_t; + int shift= 0; /* Check timestamp range.we have to do this as calling function relies on @@ -1361,10 +1364,24 @@ Time_zone_offset::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const if (!validate_timestamp_range(t)) return 0; - local_t= sec_since_epoch(t->year, t->month, t->day, + /* + Do a temporary shift of the boundary dates to avoid + overflow of my_time_t if the time value is near it's + maximum range + */ + if ((t->year == TIMESTAMP_MAX_YEAR) && (t->month == 1) && t->day > 4) + shift= 2; + + local_t= sec_since_epoch(t->year, t->month, (t->day - shift), t->hour, t->minute, t->second) - offset; + if (shift) + { + /* Add back the shifted time */ + local_t+= shift * SECS_PER_DAY; + } + if (local_t >= TIMESTAMP_MIN_VALUE && local_t <= TIMESTAMP_MAX_VALUE) return local_t; |