code: func evalAstExpr(expr ast.ExprNode, ctx context.Context) (types.Datum, error) {
  	if val, ok := expr.(*ast.ValueExpr); ok {
  		return val.Datum, nil
  	}
  	b := &planBuilder{
  		ctx:       ctx,
  		allocator: new(idAllocator),
  		colMapper: make(map[*ast.ColumnNameExpr]int),
  	}
  	if ctx.GetSessionVars().TxnCtx.InfoSchema != nil {
  		b.is = ctx.GetSessionVars().TxnCtx.InfoSchema.(infoschema.InfoSchema)
  	}
  	newExpr, _, err := b.rewrite(expr, nil, nil, true)
  	if err != nil {
  		return types.Datum{}, errors.Trace(err)
  	}
  	return newExpr.Eval(nil, ctx)
  }
docs: // evalAstExpr evaluates ast expression directly.