Below is the list of changes that have just been committed into a local
5.0 repository of msvensson. When msvensson does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-02-23 17:33:11+01:00, msvensson@stripped +2 -0
Bug#26536 func_time failure on vm-win2003-64-b, occurs every time
- Avoid overflow in sec_since_epoch by shifting the time
back 2 days for times close to the maximum range of my_time_t
- Improve comment about why we need my_time_t
- Patch will also fix timezone2.test
include/my_time.h@stripped, 2007-02-23 17:33:11+01:00, msvensson@stripped +7 -1
Improve comment for my_time_t, especially that we require
it to be at least a 32bit unsigned type
sql/tztime.cc@stripped, 2007-02-23 17:33:11+01:00, msvensson@stripped +20 -3
- Add assert in sec_since_epoch to guard it against broken down time
values that would cause overflow in my_time_t on systems with 32 bit
my_time_t
- Avoid overflow in sec_since_epoch by "shifting" the broken down
time back 2 days for times that are near the max value.c
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: msvensson
# Host: pilot.blaudden
# Root: /home/msvensson/mysql/bug26536/my50-bug26536
--- 1.37/sql/tztime.cc 2006-12-23 20:04:28 +01:00
+++ 1.38/sql/tztime.cc 2007-02-23 17:33:11 +01:00
@@ -780,6 +780,8 @@ gmt_sec_to_TIME(TIME *tmp, my_time_t sec
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
@@ -948,12 +950,12 @@ TIME_to_gmt_sec(const TIME *t, const TIM
*/
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)
@@ -1341,6 +1343,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
@@ -1349,9 +1352,23 @@ Time_zone_offset::TIME_to_gmt_sec(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;
--- 1.18/include/my_time.h 2006-12-30 21:02:04 +01:00
+++ 1.19/include/my_time.h 2007-02-23 17:33:11 +01:00
@@ -30,7 +30,13 @@ extern uchar days_in_month[];
/*
Portable time_t replacement.
- Should be signed and hold seconds for 1902-2038 range.
+ Should be signed and hold seconds for 1902 -- 2038-01-19 range
+ i.e at least a 32bit variable
+
+ Using the system built in time_t is not an option as
+ we rely on the above requirements in the time functions
+
+ For example QNX has an unsigned time_t type
*/
typedef long my_time_t;
| Thread |
|---|
| • bk commit into 5.0 tree (msvensson:1.2440) BUG#26536 | msvensson | 23 Feb |