From 115a373b889e51cbb3d17e665da28f2308e1b0cc Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Wed, 3 Apr 2013 04:54:02 -0700 Subject: [PATCH] Fixed a problem in index.test failures when run in a non-Paris time zone. This fix also revealed wrong result recorded in fix.result. modified: mysql-test/suite/connect/r/fix.result storage/connect/value.cpp modified: mysql-test/suite/connect/r/bin.result mysql-test/suite/connect/r/fix.result mysql-test/suite/connect/t/bin.test storage/connect/value.cpp --- mysql-test/suite/connect/r/bin.result | 1 + mysql-test/suite/connect/r/fix.result | 8 ++-- mysql-test/suite/connect/t/bin.test | 2 +- storage/connect/value.cpp | 54 +++++++++++++++++++++++---- 4 files changed, 52 insertions(+), 13 deletions(-) diff --git a/mysql-test/suite/connect/r/bin.result b/mysql-test/suite/connect/r/bin.result index 6a76f832184..8939bb10d9a 100644 --- a/mysql-test/suite/connect/r/bin.result +++ b/mysql-test/suite/connect/r/bin.result @@ -89,6 +89,7 @@ ID Warnings: Warning 1105 Open(rb) error 2 on DATADIR/test/nonexistent.txt: No such file or directory DROP TABLE t1; +SET time_zone='+00:00'; CREATE TABLE t1 ( fig INT(4) NOT NULL FIELD_FORMAT='C', diff --git a/mysql-test/suite/connect/r/fix.result b/mysql-test/suite/connect/r/fix.result index 567b96f7db0..73ea0e7a702 100644 --- a/mysql-test/suite/connect/r/fix.result +++ b/mysql-test/suite/connect/r/fix.result @@ -159,7 +159,7 @@ SELECT * FROM t1; name city birth hired John Boston 2 1986-01-05 2010-06-02 Henry Boston 0 1987-06-07 2008-04-01 -George San Jose 1 1981-07-31 2010-06-02 +George San Jose 1 1981-08-01 2010-06-02 Sam Chicago 2 1979-11-02 2007-10-10 James Dallas 1 1992-05-03 2009-12-14 Bill Boston 1 1986-09-01 2008-02-10 @@ -175,7 +175,7 @@ SELECT * FROM t1; name city birth hired John Boston 2 1986-01-05 2010-06-02 Henry Boston 0 1987-06-07 2008-04-01 -George San Jose 1 1981-07-31 2010-06-02 +George San Jose 1 1981-08-01 2010-06-02 Sam Chicago 2 1979-11-02 2007-10-10 James Dallas 1 1992-05-03 2009-12-14 Bill Boston 1 1986-09-01 2008-02-10 @@ -191,7 +191,7 @@ SELECT * FROM t1; name city birth hired John Boston 2 1986-01-05 2010-06-02 Henry Boston 0 1987-06-07 2008-04-01 -George San Jose 1 1981-07-31 2010-06-02 +George San Jose 1 1981-08-01 2010-06-02 Sam Chicago 2 1979-11-02 2007-10-10 James Dallas 1 1992-05-03 2009-12-14 Bill Boston 1 1986-09-01 2008-02-10 @@ -207,7 +207,7 @@ SELECT * FROM t1; name city birth hired John Boston 2 1986-01-05 2010-06-02 Henry Boston 0 1987-06-07 2008-04-01 -George San Jose 1 1981-07-31 2010-06-02 +George San Jose 1 1981-08-01 2010-06-02 Sam Chicago 2 1979-11-02 2007-10-10 James Dallas 1 1992-05-03 2009-12-14 Bill Boston 1 1986-09-01 2008-02-10 diff --git a/mysql-test/suite/connect/t/bin.test b/mysql-test/suite/connect/t/bin.test index b16c284beed..e9becec3092 100644 --- a/mysql-test/suite/connect/t/bin.test +++ b/mysql-test/suite/connect/t/bin.test @@ -19,7 +19,7 @@ CREATE TABLE t1 SELECT * FROM t1; DROP TABLE t1; - +SET time_zone='+00:00'; CREATE TABLE t1 ( fig INT(4) NOT NULL FIELD_FORMAT='C', diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index e21ba4fc396..c88c22dc3db 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -1261,8 +1261,36 @@ void DTVAL::SetTimeShift(void) /* though the gmtime C function. The purpose of this function is to */ /* extend the range of valid dates by accepting negative time values. */ /***********************************************************************/ +#define MYSQL_SERVER 1 +#include "tztime.h" +#include "sql_priv.h" +#include "sql_class.h" +#include "sql_time.h" + +static void TIME_to_localtime(struct tm *tm, const MYSQL_TIME *ltime) +{ + bzero(tm, sizeof(*tm)); + tm->tm_year= ltime->year - 1900; + tm->tm_mon= ltime->month - 1; + tm->tm_mday= ltime->day; + tm->tm_hour= ltime->hour; + tm->tm_min= ltime->minute; + tm->tm_sec= ltime->second; +} + + +static struct tm *gmtime_mysql(const time_t *timep, struct tm *tm) +{ + MYSQL_TIME ltime; + current_thd->variables.time_zone->gmt_sec_to_TIME(<ime, (my_time_t) *timep); + TIME_to_localtime(tm, <ime); + return tm; +} + + struct tm *DTVAL::GetGmTime(void) { + static struct tm tm_static; /* TODO: Move as a parameter to GetGmTime() */ struct tm *datm; time_t t = (time_t)Tval; @@ -1272,13 +1300,13 @@ struct tm *DTVAL::GetGmTime(void) for (n = 0; t < 0; n += 4) t += FOURYEARS; - datm = gmtime(&t); + datm = gmtime_mysql(&t, &tm_static); if (datm) datm->tm_year -= n; } else - datm = gmtime((const time_t *)&t); + datm = gmtime_mysql(&t, &tm_static); return datm; } // end of GetGmTime @@ -1288,10 +1316,21 @@ struct tm *DTVAL::GetGmTime(void) /* mktime C function. The purpose of this function is to extend the */ /* range of valid dates by accepting to set negative time values. */ /***********************************************************************/ + +static time_t mktime_mysql(struct tm *ptm) +{ + MYSQL_TIME ltime; + localtime_to_TIME(<ime, ptm); + ltime.time_type= MYSQL_TIMESTAMP_DATETIME; + uint error_code; + time_t t= TIME_to_timestamp(current_thd, <ime, &error_code); + return error_code ? (time_t) -1 : t; +} + bool DTVAL::MakeTime(struct tm *ptm) { int n, y = ptm->tm_year; - time_t t = mktime(ptm); + time_t t = mktime_mysql(ptm); if (trace) htrc("MakeTime from (%d,%d,%d,%d,%d,%d)\n", @@ -1304,18 +1343,17 @@ bool DTVAL::MakeTime(struct tm *ptm) for (n = 0; t == -1 && n < 20; n++) { ptm->tm_year += 4; - t = mktime(ptm); + t = mktime_mysql(ptm); } // endfor t if (t == -1) return true; - if ((t -= (n * FOURYEARS + Shift)) > 2000000000) + if ((t -= (n * FOURYEARS)) > 2000000000) return true; - Tval = (int)t; - } else - Tval = (int)t - Shift; + } + Tval= (int) t; if (trace) htrc("MakeTime Ival=%d\n", Tval);