expression: default value from "timestamp" session variable is in UTC timezone (#3544)
This commit is contained in:
@ -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 {
|
||||
|
||||
@ -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()})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user