// like expression expects the target expression and pattern to be a string, if it's not, we add a cast function. func (v *typeInferrer) handleLikeExpr(x *ast.PatternLikeExpr) { x.SetType(types.NewFieldType(mysql.TypeLonglong)) x.Type.Charset = charset.CharsetBin x.Type.Collate = charset.CollationBin x.Expr = v.addCastToString(x.Expr) x.Pattern = v.addCastToString(x.Pattern) }
func (e *Evaluator) patternLike(p *ast.PatternLikeExpr) bool { expr := p.Expr.GetDatum() if expr.IsNull() { p.SetNull() return true } sexpr, err := expr.ToString() if err != nil { e.err = errors.Trace(err) return false } // We need to compile pattern if it has not been compiled or it is not static. var needCompile = len(p.PatChars) == 0 || !ast.IsConstant(p.Pattern) if needCompile { pattern := p.Pattern.GetDatum() if pattern.IsNull() { p.SetNull() return true } spattern, err := pattern.ToString() if err != nil { e.err = errors.Trace(err) return false } p.PatChars, p.PatTypes = compilePattern(spattern, p.Escape) } match := doMatch(sexpr, p.PatChars, p.PatTypes) if p.Not { match = !match } p.SetInt64(boolToInt64(match)) return true }