From eeef19b4e7d91d8972dae99d1c0ffb4b8e17f202 Mon Sep 17 00:00:00 2001 From: Catror Date: Tue, 19 Nov 2019 11:31:23 +0800 Subject: [PATCH] expression: implement vectorized evaluation for `builtinCastDecimalAsDecimalSig` (#13471) --- expression/builtin_cast_vec.go | 26 ++++++++++++++++++++++++-- expression/builtin_cast_vec_test.go | 1 + 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/expression/builtin_cast_vec.go b/expression/builtin_cast_vec.go index 79dd3afa6a..6f45047108 100644 --- a/expression/builtin_cast_vec.go +++ b/expression/builtin_cast_vec.go @@ -530,11 +530,33 @@ func (b *builtinCastRealAsTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk } func (b *builtinCastDecimalAsDecimalSig) vectorized() bool { - return false + return true } func (b *builtinCastDecimalAsDecimalSig) vecEvalDecimal(input *chunk.Chunk, result *chunk.Column) error { - return errors.Errorf("not implemented") + if err := b.args[0].VecEvalDecimal(b.ctx, input, result); err != nil { + return err + } + + n := input.NumRows() + decs := result.Decimals() + sc := b.ctx.GetSessionVars().StmtCtx + conditionUnionAndUnsigned := b.inUnion && mysql.HasUnsignedFlag(b.tp.Flag) + for i := 0; i < n; i++ { + if result.IsNull(i) { + continue + } + dec := &types.MyDecimal{} + if !(conditionUnionAndUnsigned && decs[i].IsNegative()) { + *dec = decs[i] + } + dec, err := types.ProduceDecWithSpecifiedTp(dec, b.tp, sc) + if err != nil { + return err + } + decs[i] = *dec + } + return nil } func (b *builtinCastDurationAsTimeSig) vectorized() bool { diff --git a/expression/builtin_cast_vec_test.go b/expression/builtin_cast_vec_test.go index 213f3a659a..14a9df1bdf 100644 --- a/expression/builtin_cast_vec_test.go +++ b/expression/builtin_cast_vec_test.go @@ -81,6 +81,7 @@ var vecBuiltinCastCases = map[string][]vecExprBenchCase{ geners: []dataGenerator{ &jsonTimeGener{}, }}, + {retEvalType: types.ETDecimal, childrenTypes: []types.EvalType{types.ETDecimal}}, }, }