func getZeroValue(col *model.ColumnInfo) types.Datum { var d types.Datum switch col.Tp { case mysql.TypeTiny, mysql.TypeInt24, mysql.TypeShort, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeYear: if mysql.HasUnsignedFlag(col.Flag) { d.SetUint64(0) } else { d.SetInt64(0) } case mysql.TypeFloat: d.SetFloat32(0) case mysql.TypeDouble: d.SetFloat64(0) case mysql.TypeNewDecimal: d.SetMysqlDecimal(mysql.NewDecimalFromInt(0, 0)) case mysql.TypeString, mysql.TypeVarString, mysql.TypeVarchar: d.SetString("") case mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: d.SetBytes([]byte{}) case mysql.TypeDuration: d.SetMysqlDuration(mysql.ZeroDuration) case mysql.TypeDate, mysql.TypeNewDate: d.SetMysqlTime(mysql.ZeroDate) case mysql.TypeTimestamp: d.SetMysqlTime(mysql.ZeroTimestamp) case mysql.TypeDatetime: d.SetMysqlTime(mysql.ZeroDatetime) case mysql.TypeBit: d.SetMysqlBit(mysql.Bit{Value: 0, Width: mysql.MinBitWidth}) case mysql.TypeSet: d.SetMysqlSet(mysql.Set{}) } return d }
func (s *testEvaluatorSuite) TestFromUnixTime(c *C) { defer testleak.AfterTest(c)() tbl := []struct { isDecimal bool integralPart int64 fractionalPart int64 decimal float64 format string ansLen int }{ {false, 1451606400, 0, 0, "", 19}, {true, 1451606400, 123456000, 1451606400.123456, "", 26}, {true, 1451606400, 999999000, 1451606400.999999, "", 26}, {true, 1451606400, 999999900, 1451606400.9999999, "", 19}, {false, 1451606400, 0, 0, "%Y %D %M %h:%i:%s %x", 19}, {true, 1451606400, 123456000, 1451606400.123456, "%Y %D %M %h:%i:%s %x", 26}, {true, 1451606400, 999999000, 1451606400.999999, "%Y %D %M %h:%i:%s %x", 26}, {true, 1451606400, 999999900, 1451606400.9999999, "%Y %D %M %h:%i:%s %x", 19}, } for _, t := range tbl { var timestamp types.Datum if !t.isDecimal { timestamp.SetInt64(t.integralPart) } else { timestamp.SetFloat64(t.decimal) } // result of from_unixtime() is dependent on specific time zone. unixTime := time.Unix(t.integralPart, t.fractionalPart).Round(time.Microsecond).String()[:t.ansLen] if len(t.format) == 0 { v, err := builtinFromUnixTime([]types.Datum{timestamp}, s.ctx) c.Assert(err, IsNil) ans := v.GetMysqlTime() c.Assert(ans.String(), Equals, unixTime) } else { format := types.NewStringDatum(t.format) v, err := builtinFromUnixTime([]types.Datum{timestamp, format}, s.ctx) c.Assert(err, IsNil) result, err := builtinDateFormat([]types.Datum{types.NewStringDatum(unixTime), format}, s.ctx) c.Assert(err, IsNil) c.Assert(v.GetString(), Equals, result.GetString()) } } v, err := builtinFromUnixTime([]types.Datum{types.NewIntDatum(-12345)}, s.ctx) c.Assert(err, IsNil) c.Assert(v.Kind(), Equals, types.KindNull) _, err = builtinFromUnixTime([]types.Datum{types.NewIntDatum(math.MaxInt32 + 1)}, s.ctx) c.Assert(err, IsNil) c.Assert(v.Kind(), Equals, types.KindNull) }
func (e *Evaluator) evalFloat(val []byte, f32 bool) (types.Datum, error) { var d types.Datum _, f, err := codec.DecodeFloat(val) if err != nil { return d, ErrInvalid.Gen("invalid float % x", val) } if f32 { d.SetFloat32(float32(f)) } else { d.SetFloat64(f) } return d, nil }