From 5e2f3883aec016a1dd5b346f7e2e178d178fa4b1 Mon Sep 17 00:00:00 2001 From: Brooks Liu Date: Tue, 8 Oct 2019 15:02:15 +0800 Subject: [PATCH] expression: implement vectorized evaluation for `builtinRealIsTrueSig` (#12517) --- expression/builtin_op_vec.go | 24 ++++++++++++++++++++++-- expression/builtin_op_vec_test.go | 1 + 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/expression/builtin_op_vec.go b/expression/builtin_op_vec.go index 002aa0b9a2..c752acde41 100644 --- a/expression/builtin_op_vec.go +++ b/expression/builtin_op_vec.go @@ -408,11 +408,31 @@ func (b *builtinRightShiftSig) vecEvalInt(input *chunk.Chunk, result *chunk.Colu } func (b *builtinRealIsTrueSig) vectorized() bool { - return false + return true } func (b *builtinRealIsTrueSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { - return errors.Errorf("not implemented") + numRows := input.NumRows() + buf, err := b.bufAllocator.get(types.ETReal, numRows) + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + + if err := b.args[0].VecEvalReal(b.ctx, input, buf); err != nil { + return err + } + result.ResizeInt64(numRows, false) + f64s := buf.Float64s() + i64s := result.Int64s() + for i := 0; i < numRows; i++ { + if buf.IsNull(i) || f64s[i] == 0 { + i64s[i] = 0 + } else { + i64s[i] = 1 + } + } + return nil } func (b *builtinDecimalIsTrueSig) vectorized() bool { diff --git a/expression/builtin_op_vec_test.go b/expression/builtin_op_vec_test.go index a36a83f40f..9b47bb8e8b 100644 --- a/expression/builtin_op_vec_test.go +++ b/expression/builtin_op_vec_test.go @@ -23,6 +23,7 @@ import ( var vecBuiltinOpCases = map[string][]vecExprBenchCase{ ast.IsTruth: { + {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETReal}, geners: []dataGenerator{&defaultGener{0.2, types.ETReal}}}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDecimal}, geners: []dataGenerator{&defaultGener{0.2, types.ETDecimal}}}, }, ast.IsFalsity: {