From ba822f9b99473197f875451efe7e34941bac0790 Mon Sep 17 00:00:00 2001 From: YangKeao Date: Thu, 15 Dec 2022 16:09:55 +0800 Subject: [PATCH] fix cast json as string with shorter length Signed-off-by: YangKeao --- expression/builtin_cast.go | 6 +++++- expression/builtin_cast_test.go | 9 +++++++++ expression/builtin_cast_vec.go | 6 +++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/expression/builtin_cast.go b/expression/builtin_cast.go index 0dd7e20cce24e..ee66669e638d6 100644 --- a/expression/builtin_cast.go +++ b/expression/builtin_cast.go @@ -1722,7 +1722,11 @@ func (b *builtinCastJSONAsStringSig) evalString(row chunk.Row) (res string, isNu if isNull || err != nil { return res, isNull, err } - return val.String(), false, nil + s, err := types.ProduceStrWithSpecifiedTp(val.String(), b.tp, b.ctx.GetSessionVars().StmtCtx, false) + if err != nil { + return res, false, err + } + return s, false, nil } type builtinCastJSONAsTimeSig struct { diff --git a/expression/builtin_cast_test.go b/expression/builtin_cast_test.go index f8e789a527620..e670aad1e35ae 100644 --- a/expression/builtin_cast_test.go +++ b/expression/builtin_cast_test.go @@ -719,6 +719,13 @@ func TestCastFuncSig(t *testing.T) { 3, chunk.MutRowFromDatums([]types.Datum{types.NewStringDatum("你好world")}), }, + // cast json as string + { + &Column{RetType: types.NewFieldType(mysql.TypeJSON), Index: 0}, + fmt.Sprintf(`"%s`, curTimeString[:2]), + 3, + chunk.MutRowFromDatums([]types.Datum{jsonTime}), + }, } for i, c := range castToStringCases2 { args := []Expression{c.before} @@ -741,6 +748,8 @@ func TestCastFuncSig(t *testing.T) { case 5: stringFunc.tp.SetCharset(charset.CharsetUTF8) sig = &builtinCastStringAsStringSig{stringFunc} + case 6: + sig = &builtinCastJSONAsStringSig{stringFunc} } res, isNull, err := sig.evalString(c.row.ToRow()) require.False(t, isNull) diff --git a/expression/builtin_cast_vec.go b/expression/builtin_cast_vec.go index 8b82d86b776e5..2b8a029c4b03b 100644 --- a/expression/builtin_cast_vec.go +++ b/expression/builtin_cast_vec.go @@ -1186,7 +1186,11 @@ func (b *builtinCastJSONAsStringSig) vecEvalString(input *chunk.Chunk, result *c result.AppendNull() continue } - result.AppendString(buf.GetJSON(i).String()) + s, err := types.ProduceStrWithSpecifiedTp(buf.GetJSON(i).String(), b.tp, b.ctx.GetSessionVars().StmtCtx, false) + if err != nil { + return err + } + result.AppendString(s) } return nil }