From ec5e85f73cb7bfbb9293cacacc8dc68d4287f02a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BA=84=E5=A4=A9=E7=BF=BC?= Date: Tue, 12 Nov 2019 12:29:26 +0800 Subject: [PATCH] =?UTF-8?q?expression:=20implement=20vectorized=20evaluati?= =?UTF-8?q?on=20for=20`builtinTrunca=E2=80=A6=20(#13317)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- expression/builtin_math_vec.go | 30 +++++++++++++++++++++++++++-- expression/builtin_math_vec_test.go | 1 + 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/expression/builtin_math_vec.go b/expression/builtin_math_vec.go index 118c17fd9d..3764a16cdd 100644 --- a/expression/builtin_math_vec.go +++ b/expression/builtin_math_vec.go @@ -865,11 +865,37 @@ func (b *builtinFloorDecToDecSig) vecEvalDecimal(input *chunk.Chunk, result *chu } func (b *builtinTruncateDecimalSig) vectorized() bool { - return false + return true } func (b *builtinTruncateDecimalSig) vecEvalDecimal(input *chunk.Chunk, result *chunk.Column) error { - return errors.Errorf("not implemented") + n := input.NumRows() + if err := b.args[0].VecEvalDecimal(b.ctx, input, result); err != nil { + return err + } + buf, err := b.bufAllocator.get(types.ETInt, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + if err := b.args[1].VecEvalInt(b.ctx, input, buf); err != nil { + return err + } + result.MergeNulls(buf) + ds := result.Decimals() + i64s := buf.Int64s() + ft := b.getRetTp().Decimal + for i := 0; i < n; i++ { + if result.IsNull(i) { + continue + } + result := new(types.MyDecimal) + if err := ds[i].Round(result, mathutil.Min(int(i64s[i]), ft), types.ModeTruncate); err != nil { + return err + } + ds[i] = *result + } + return nil } func (b *builtinRoundWithFracDecSig) vectorized() bool { diff --git a/expression/builtin_math_vec_test.go b/expression/builtin_math_vec_test.go index 8449972e87..19bb2bfc1e 100644 --- a/expression/builtin_math_vec_test.go +++ b/expression/builtin_math_vec_test.go @@ -109,6 +109,7 @@ var vecBuiltinMathCases = map[string][]vecExprBenchCase{ {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETReal, types.ETInt}, geners: []dataGenerator{nil, &rangeInt64Gener{-10, 10}}}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETInt, types.ETInt}, geners: []dataGenerator{nil, &rangeInt64Gener{-10, 10}}}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETInt, types.ETInt}, childrenFieldTypes: []*types.FieldType{{Tp: mysql.TypeInt24, Flag: mysql.UnsignedFlag}}, geners: []dataGenerator{nil, &rangeInt64Gener{-10, 10}}}, + {retEvalType: types.ETDecimal, childrenTypes: []types.EvalType{types.ETDecimal, types.ETInt}}, }, ast.Rand: { {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETInt}, geners: []dataGenerator{&defaultGener{0, types.ETInt}}},