From ea4cafa547aab1da02be94a5e7eeedb89a5c0e08 Mon Sep 17 00:00:00 2001 From: CWang Date: Tue, 5 Nov 2019 18:59:40 +0800 Subject: [PATCH] implement vectorized evaluation for builtinRightBinarySig (#13144) --- expression/builtin_string_vec.go | 37 +++++++++++++++++++++++++-- expression/builtin_string_vec_test.go | 9 +++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/expression/builtin_string_vec.go b/expression/builtin_string_vec.go index c74d2a8e8715d..6e8d7f95c2bec 100644 --- a/expression/builtin_string_vec.go +++ b/expression/builtin_string_vec.go @@ -1587,11 +1587,44 @@ func (b *builtinFormatSig) vecEvalString(input *chunk.Chunk, result *chunk.Colum } func (b *builtinRightBinarySig) vectorized() bool { - return false + return true } func (b *builtinRightBinarySig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { - return errors.Errorf("not implemented") + n := input.NumRows() + buf, err := b.bufAllocator.get(types.ETString, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + if err := b.args[0].VecEvalString(b.ctx, input, buf); err != nil { + return err + } + buf2, err := b.bufAllocator.get(types.ETInt, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf2) + if err := b.args[1].VecEvalInt(b.ctx, input, buf2); err != nil { + return err + } + right := buf2.Int64s() + result.ReserveString(n) + for i := 0; i < n; i++ { + if buf.IsNull(i) || buf2.IsNull(i) { + result.AppendNull() + continue + } + str, rightLength := buf.GetString(i), int(right[i]) + strLength := len(str) + if rightLength > strLength { + rightLength = strLength + } else if rightLength < 0 { + rightLength = 0 + } + result.AppendString(str[strLength-rightLength:]) + } + return nil } func (b *builtinSubstringBinary3ArgsSig) vectorized() bool { diff --git a/expression/builtin_string_vec_test.go b/expression/builtin_string_vec_test.go index b1748201ca76d..0aab27ea6b1cd 100644 --- a/expression/builtin_string_vec_test.go +++ b/expression/builtin_string_vec_test.go @@ -173,6 +173,15 @@ var vecBuiltinStringCases = map[string][]vecExprBenchCase{ }, ast.Right: { {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETInt}}, + // need to add BinaryFlag for the Binary func + {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETInt}, + childrenFieldTypes: []*types.FieldType{{Tp: mysql.TypeString, Flag: mysql.BinaryFlag, Collate: charset.CollationBin}, + {Tp: mysql.TypeLonglong}}, + geners: []dataGenerator{ + &randLenStrGener{10, 20}, + &rangeInt64Gener{begin: -10, end: 20}, + }, + }, }, ast.Left: { {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETInt}},