Commit 47f92e34 authored by unknown's avatar unknown
Browse files

Merge pilot.blaudden:/home/msvensson/mysql/bug26536/my51-bug26536

into  pilot.blaudden:/home/msvensson/mysql/mysql-5.1-new-maint

parents 22715094 7f723d53
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -30,15 +30,15 @@ extern uchar days_in_month[];

/*
  Portable time_t replacement.
  Should be signed and hold seconds for 1902-2038 range.
*/
#if defined(_WIN64) || defined(WIN64)
/* on Win64 long is still 4 bytes (not 8!) */
typedef LONG64 my_time_t;
#else
typedef time_t my_time_t;
  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

#endif
  For example QNX has an unsigned time_t type
*/
typedef long my_time_t;

#define MY_TIME_T_MAX LONG_MAX
#define MY_TIME_T_MIN LONG_MIN
+20 −3
Original line number Diff line number Diff line
@@ -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;