func (e *Evaluator) evalAggGroupConcat(v *ast.AggregateFuncExpr) { ctx := v.GetContext() if ctx.Buffer != nil { v.SetValue(ctx.Buffer.String()) } else { v.SetValue(nil) } }
func (e *Evaluator) evalAggAvg(v *ast.AggregateFuncExpr) { ctx := v.GetContext() switch x := ctx.Value.(type) { case float64: ctx.Value = x / float64(ctx.Count) case mysql.Decimal: ctx.Value = x.Div(mysql.NewDecimalFromUint(uint64(ctx.Count), 0)) } v.SetValue(ctx.Value) }
func (e *Evaluator) aggregateFunc(v *ast.AggregateFuncExpr) bool { idx := e.aggregateMap[v] aggr := e.aggregators[idx] if e.aggregateDone { v.SetValue(aggr.Output()) return true } // TODO: currently only single argument aggregate functions are supported. e.err = aggr.Input(v.Args[0].GetValue()) return e.err == nil }
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() t := x.Div(mysql.NewDecimalFromUint(uint64(ctx.Count), 0)) v.SetMysqlDecimal(t) } ctx.Value = *v.GetDatum() }
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() }
func (e *Evaluator) evalAggFirstRow(v *ast.AggregateFuncExpr) { ctx := v.GetContext() v.SetValue(ctx.Value) }
func (e *Evaluator) evalAggCount(v *ast.AggregateFuncExpr) { ctx := v.GetContext() v.SetValue(ctx.Count) }