// regexp expression expects the target expression and pattern to be a string, if it's not, we add a cast function. func (v *typeInferrer) handleRegexpExpr(x *ast.PatternRegexpExpr) { 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) patternRegexp(p *ast.PatternRegexpExpr) bool { var sexpr string if p.Sexpr != nil { sexpr = *p.Sexpr } else { expr := p.Expr.GetDatum() if expr.IsNull() { p.SetNull() return true } var err error sexpr, err = expr.ToString() if err != nil { e.err = errors.Errorf("non-string Expression in LIKE: %v (Value of type %T)", expr, expr) return false } if ast.IsConstant(p.Expr) { p.Sexpr = new(string) *p.Sexpr = sexpr } } re := p.Re if re == nil { pattern := p.Pattern.GetDatum() if pattern.IsNull() { p.SetNull() return true } spattern, err := pattern.ToString() if err != nil { e.err = errors.Errorf("non-string pattern in LIKE: %v (Value of type %T)", pattern, pattern) return false } if re, err = regexp.Compile(spattern); err != nil { e.err = errors.Trace(err) return false } if ast.IsConstant(p.Pattern) { p.Re = re } } match := re.MatchString(sexpr) if p.Not { match = !match } p.SetInt64(boolToInt64(match)) return true }