From fefbc3ce69079272ca5a8bfe074bad3f86409f66 Mon Sep 17 00:00:00 2001 From: Jian Zhang Date: Thu, 13 Jul 2017 18:44:41 +0800 Subject: [PATCH] expression: UPPER and LOWER should return a binary string when input is a binary string (#3744) --- expression/builtin_string.go | 12 ++++++++++-- plan/typeinfer_test.go | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/expression/builtin_string.go b/expression/builtin_string.go index 64c9cae597..1222b14304 100644 --- a/expression/builtin_string.go +++ b/expression/builtin_string.go @@ -446,7 +446,11 @@ func (c *lowerFunctionClass) getFunction(args []Expression, ctx context.Context) if err != nil { return nil, errors.Trace(err) } - bf.tp.Flen = args[0].GetType().Flen + argTp := args[0].GetType() + bf.tp.Flen = argTp.Flen + if mysql.HasBinaryFlag(argTp.Flag) { + types.SetBinChsClnFlag(bf.tp) + } sig := &builtinLowerSig{baseStringBuiltinFunc{bf}} return sig.setSelf(sig), errors.Trace(c.verifyArgs(args)) } @@ -549,7 +553,11 @@ func (c *upperFunctionClass) getFunction(args []Expression, ctx context.Context) if err != nil { return nil, errors.Trace(err) } - bf.tp.Flen = args[0].GetType().Flen + argTp := args[0].GetType() + bf.tp.Flen = argTp.Flen + if mysql.HasBinaryFlag(argTp.Flag) { + types.SetBinChsClnFlag(bf.tp) + } sig := &builtinUpperSig{baseStringBuiltinFunc{bf}} return sig.setSelf(sig), errors.Trace(c.verifyArgs(args)) } diff --git a/plan/typeinfer_test.go b/plan/typeinfer_test.go index 53e1a2fe69..342a4dcc9a 100644 --- a/plan/typeinfer_test.go +++ b/plan/typeinfer_test.go @@ -93,7 +93,9 @@ func (s *testPlanSuite) TestInferType(c *C) { {"left(c_int, c_int)", mysql.TypeVarString, charset.CharsetUTF8, 0, 11, types.UnspecifiedLength}, {"right(c_int, c_int)", mysql.TypeVarString, charset.CharsetUTF8, 0, 11, types.UnspecifiedLength}, {"lower(c_int)", mysql.TypeVarString, charset.CharsetUTF8, 0, 11, types.UnspecifiedLength}, + {"lower(c_binary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, {"upper(c_int)", mysql.TypeVarString, charset.CharsetUTF8, 0, 11, types.UnspecifiedLength}, + {"upper(c_binary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, {"replace(1234, 2, 55)", mysql.TypeVarString, charset.CharsetUTF8, 0, 8, types.UnspecifiedLength}, {"replace(c_binary, 1, 2)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, {"to_base64(c_binary)", mysql.TypeVarString, charset.CharsetUTF8, 0, 28, types.UnspecifiedLength},