// ConvertDatumToDecimal converts datum to decimal. func ConvertDatumToDecimal(d Datum) (*mysql.MyDecimal, error) { dec := new(mysql.MyDecimal) var err error switch d.Kind() { case KindInt64: dec.FromInt(d.GetInt64()) case KindUint64: dec.FromUint(d.GetUint64()) case KindFloat32: err = dec.FromFloat64(float64(d.GetFloat32())) case KindFloat64: err = dec.FromFloat64(d.GetFloat64()) case KindString: err = dec.FromString(d.GetBytes()) case KindMysqlDecimal: *dec = *d.GetMysqlDecimal() case KindMysqlHex: dec.FromInt(d.GetMysqlHex().Value) case KindMysqlBit: dec.FromUint(d.GetMysqlBit().Value) case KindMysqlEnum: dec.FromUint(d.GetMysqlEnum().Value) case KindMysqlSet: dec.FromUint(d.GetMysqlSet().Value) default: err = fmt.Errorf("can't convert %v to decimal", d.GetValue()) } return dec, err }
func (e *Evaluator) evalAggAvg(v *ast.AggregateFuncExpr) { ctx := v.GetContext() switch ctx.Value.Kind() { case types.KindFloat64: t := ctx.Value.GetFloat64() / float64(ctx.Count) v.SetValue(t) case types.KindMysqlDecimal: x := ctx.Value.GetMysqlDecimal() var y, to mysql.MyDecimal y.FromUint(uint64(ctx.Count)) mysql.DecimalDiv(x, &y, &to, mysql.DivFracIncr) to.Round(&to, ctx.Value.Frac()+mysql.DivFracIncr) v.SetMysqlDecimal(&to) } ctx.Value = *v.GetDatum() }