diff --git a/expression/helper.go b/expression/helper.go index 4613c0ea30..5003c2b3ff 100644 --- a/expression/helper.go +++ b/expression/helper.go @@ -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 { diff --git a/expression/helper_test.go b/expression/helper_test.go index 870f983604..34e3b6560b 100644 --- a/expression/helper_test.go +++ b/expression/helper_test.go @@ -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()}) +}