// Eval evaluates an expression to a datum. func Eval(ctx context.Context, expr ast.ExprNode) (d types.Datum, err error) { if ast.IsEvaluated(expr) { return *expr.GetDatum(), nil } e := &Evaluator{ctx: ctx} expr.Accept(e) if e.err != nil { return d, errors.Trace(e.err) } if ast.IsPreEvaluable(expr) && (expr.GetFlag()&ast.FlagHasFunc == 0) { expr.SetFlag(expr.GetFlag() | ast.FlagPreEvaluated) } return *expr.GetDatum(), nil }