diff --git a/expression/expressions/like.go b/expression/expressions/like.go index 4f7ce4dcc9..3e480d5ef9 100644 --- a/expression/expressions/like.go +++ b/expression/expressions/like.go @@ -103,7 +103,12 @@ func (p *PatternLike) Eval(ctx context.Context, args map[interface{}]interface{} } spattern, ok := pattern.(string) if !ok { - return nil, errors.Errorf("non-string pattern in LIKE: %v (Value of type %T)", pattern, pattern) + bpattern, ok := pattern.([]byte) + if !ok { + return nil, errors.Errorf("non-string pattern in LIKE: %v (Value of type %T)", pattern, pattern) + } + // TODO: BINARY pattern match should be case-insensitive + spattern = string(bpattern) } p.patChars, p.patTypes = compilePattern(spattern) diff --git a/expression/expressions/like_test.go b/expression/expressions/like_test.go index a30e6b1c30..dfdb5c7692 100644 --- a/expression/expressions/like_test.go +++ b/expression/expressions/like_test.go @@ -105,4 +105,20 @@ func (*testLikeSuite) TestEval(c *C) { pattern.Expr = mockExpr{isStatic: false, val: nil} _, err = pattern.Eval(nil, nil) c.Assert(err, IsNil) + + // Testcase for "LIKE BINARY xxx" + pattern = &PatternLike{ + Expr: mockExpr{isStatic: true, val: "slien"}, + Pattern: mockExpr{isStatic: true, val: []byte("%E%")}, + } + v, err := pattern.Eval(nil, nil) + c.Assert(err, IsNil) + c.Assert(v, IsTrue) + pattern = &PatternLike{ + Expr: mockExpr{isStatic: true, val: "slin"}, + Pattern: mockExpr{isStatic: true, val: []byte("%E%")}, + } + v, err = pattern.Eval(nil, nil) + c.Assert(err, IsNil) + c.Assert(v, IsFalse) }