expression: default value from "timestamp" session variable is in UTC timezone (#3544)

This commit is contained in:
tiancaiamao
2017-06-27 15:07:42 +08:00
committed by GitHub
parent 8aa1a632ea
commit ea05bf088d
2 changed files with 31 additions and 0 deletions

View File

@ -70,6 +70,12 @@ func getTimeValue(ctx context.Context, v interface{}, tp byte, fsp int) (d types
upperX := strings.ToUpper(x)
if upperX == CurrentTimestamp {
value.Time = types.FromGoTime(defaultTime)
if tp == mysql.TypeTimestamp {
err := value.ConvertTimeZone(time.Local, ctx.GetSessionVars().GetTimeZone())
if err != nil {
return d, errors.Trace(err)
}
}
} else if upperX == ZeroTimestamp {
value, _ = types.ParseTimeFromNum(0, tp, fsp)
} else {

View File

@ -113,3 +113,28 @@ func (s *testExpressionSuite) TestIsCurrentTimeExpr(c *C) {
v = IsCurrentTimeExpr(&ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")})
c.Assert(v, IsTrue)
}
func (s *testExpressionSuite) TestCurrentTimestampTimeZone(c *C) {
defer testleak.AfterTest(c)()
ctx := mock.NewContext()
sessionVars := ctx.GetSessionVars()
varsutil.SetSessionSystemVar(sessionVars, "timestamp", types.NewStringDatum("1234"))
varsutil.SetSessionSystemVar(sessionVars, "time_zone", types.NewStringDatum("+00:00"))
v, err := GetTimeValue(ctx, CurrentTimestamp, mysql.TypeTimestamp, types.MinFsp)
c.Assert(err, IsNil)
c.Assert(v.GetMysqlTime(), DeepEquals, types.Time{
Time: types.FromDate(1970, 1, 1, 0, 20, 34, 0),
Type: mysql.TypeTimestamp,
TimeZone: sessionVars.GetTimeZone()})
// CurrentTimestamp from "timestamp" session variable is based on UTC, so change timezone
// would get different value.
varsutil.SetSessionSystemVar(sessionVars, "time_zone", types.NewStringDatum("+08:00"))
v, err = GetTimeValue(ctx, CurrentTimestamp, mysql.TypeTimestamp, types.MinFsp)
c.Assert(err, IsNil)
c.Assert(v.GetMysqlTime(), DeepEquals, types.Time{
Time: types.FromDate(1970, 1, 1, 8, 20, 34, 0),
Type: mysql.TypeTimestamp,
TimeZone: sessionVars.GetTimeZone()})
}