// EvalDatum evaluates an expression to a datum. func EvalDatum(ctx context.Context, expr ast.ExprNode) (d types.Datum, err error) { e := &Evaluator{ctx: ctx} expr.Accept(e) if e.err != nil { return d, errors.Trace(e.err) } return *expr.GetDatum(), nil }
// 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 }
// exprToPBExpr converts an ast.ExprNode to a tipb.Expr, if not supported, nil will be returned. func (b *executorBuilder) exprToPBExpr(client kv.Client, expr ast.ExprNode, tn *ast.TableName) *tipb.Expr { switch x := expr.(type) { case *ast.ValueExpr, *ast.ParamMarkerExpr: return b.datumToPBExpr(client, *expr.GetDatum()) case *ast.ColumnNameExpr: return b.columnNameToPBExpr(client, x, tn) case *ast.BinaryOperationExpr: return b.binopToPBExpr(client, x, tn) case *ast.ParenthesesExpr: return b.exprToPBExpr(client, x.Expr, tn) case *ast.PatternLikeExpr: return b.likeToPBExpr(client, x, tn) case *ast.UnaryOperationExpr: return b.unaryToPBExpr(client, x, tn) case *ast.PatternInExpr: return b.patternInToPBExpr(client, x, tn) case *ast.SubqueryExpr: return b.subqueryToPBExpr(client, x) case *ast.AggregateFuncExpr: return b.aggFuncToPBExpr(client, x, tn) default: return nil } }