// AddCastToString adds a cast function to string type if the expr charset is not UTF8. func (v *typeInferrer) addCastToString(expr ast.ExprNode) ast.ExprNode { if !mysql.IsUTF8Charset(expr.GetType().Charset) { castTp := types.NewFieldType(mysql.TypeString) castTp.Charset, castTp.Collate = types.DefaultCharsetForType(mysql.TypeString) if val, ok := expr.(*ast.ValueExpr); ok { newVal, err := val.Datum.ConvertTo(v.sc, castTp) if err != nil { v.err = errors.Trace(err) } expr.SetDatum(newVal) } else { castFunc := &ast.FuncCastExpr{ Expr: expr, Tp: castTp, FunctionType: ast.CastFunction, } expr = castFunc } expr.SetType(castTp) } return expr }