func (af *avgFunction) calculateResult(ctx *ast.AggEvaluateContext) (d types.Datum) { switch ctx.Value.Kind() { case types.KindFloat64: t := ctx.Value.GetFloat64() / float64(ctx.Count) d.SetValue(t) case types.KindMysqlDecimal: x := ctx.Value.GetMysqlDecimal() y := types.NewDecFromInt(ctx.Count) to := new(types.MyDecimal) types.DecimalDiv(x, y, to, types.DivFracIncr) to.Round(to, ctx.Value.Frac()+types.DivFracIncr) d.SetMysqlDecimal(to) } return }
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 types.MyDecimal y.FromUint(uint64(ctx.Count)) types.DecimalDiv(x, &y, &to, types.DivFracIncr) to.Round(&to, ctx.Value.Frac()+types.DivFracIncr) v.SetMysqlDecimal(&to) } ctx.Value = *v.GetDatum() }