func setSnapshotTS(s *variable.SessionVars, sVal string) error { if sVal == "" { s.SnapshotTS = 0 return nil } t, err := types.ParseTime(sVal, mysql.TypeTimestamp, types.MaxFsp) if err != nil { return errors.Trace(err) } t1, err := t.Time.GoTime() ts := (t1.UnixNano() / int64(time.Millisecond)) << epochShiftBits s.SnapshotTS = uint64(ts) return errors.Trace(err) }
func getTimeValue(ctx context.Context, v interface{}, tp byte, fsp int) (d types.Datum, err error) { value := types.Time{ Type: tp, Fsp: fsp, } defaultTime, err := getSystemTimestamp(ctx) if err != nil { return d, errors.Trace(err) } switch x := v.(type) { case string: upperX := strings.ToUpper(x) if upperX == CurrentTimestamp { value.Time = types.FromGoTime(defaultTime) } else if upperX == ZeroTimestamp { value, _ = types.ParseTimeFromNum(0, tp, fsp) } else { value, err = types.ParseTime(x, tp, fsp) if err != nil { return d, errors.Trace(err) } } case *ast.ValueExpr: switch x.Kind() { case types.KindString: value, err = types.ParseTime(x.GetString(), tp, fsp) if err != nil { return d, errors.Trace(err) } case types.KindInt64: value, err = types.ParseTimeFromNum(x.GetInt64(), tp, fsp) if err != nil { return d, errors.Trace(err) } case types.KindNull: return d, nil default: return d, errors.Trace(errDefaultValue) } case *ast.FuncCallExpr: if x.FnName.L == currentTimestampL { d.SetString(CurrentTimestamp) return d, nil } return d, errors.Trace(errDefaultValue) case *ast.UnaryOperationExpr: // support some expression, like `-1` v, err := Eval(ctx, x) if err != nil { return d, errors.Trace(err) } ft := types.NewFieldType(mysql.TypeLonglong) xval, err := v.ConvertTo(ctx.GetSessionVars().StmtCtx, ft) if err != nil { return d, errors.Trace(err) } value, err = types.ParseTimeFromNum(xval.GetInt64(), tp, fsp) if err != nil { return d, errors.Trace(err) } default: return d, nil } d.SetMysqlTime(value) return d, nil }
func parseTime(c *C, s string) types.Time { m, err := types.ParseTime(s, mysql.TypeDatetime, types.DefaultFsp) c.Assert(err, IsNil) return m }