diff --git a/expression/builtin_time_vec.go b/expression/builtin_time_vec.go index fa8aba206f..555de11f0c 100644 --- a/expression/builtin_time_vec.go +++ b/expression/builtin_time_vec.go @@ -581,11 +581,42 @@ func (b *builtinSubTimeDateTimeNullSig) vecEvalTime(input *chunk.Chunk, result * } func (b *builtinToSecondsSig) vectorized() bool { - return false + return true } +// evalInt evals a builtinToSecondsSig. +// See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_to-seconds func (b *builtinToSecondsSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { - return errors.Errorf("not implemented") + n := input.NumRows() + buf, err := b.bufAllocator.get(types.ETDatetime, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + if err := b.args[0].VecEvalTime(b.ctx, input, buf); err != nil { + return err + } + + result.ResizeInt64(n, false) + result.MergeNulls(buf) + i64s := result.Int64s() + ds := buf.Times() + for i := 0; i < n; i++ { + if result.IsNull(i) { + continue + } + arg := ds[i] + ret := types.TimestampDiff("SECOND", types.ZeroDate, arg) + if ret == 0 { + if err := handleInvalidTimeError(b.ctx, types.ErrIncorrectDatetimeValue.GenWithStackByArgs(arg.String())); err != nil { + return err + } + result.SetNull(i, true) + continue + } + i64s[i] = ret + } + return nil } func (b *builtinSubDurationAndStringSig) vectorized() bool { diff --git a/expression/builtin_time_vec_test.go b/expression/builtin_time_vec_test.go index 5411169c06..2f8f33a3ad 100644 --- a/expression/builtin_time_vec_test.go +++ b/expression/builtin_time_vec_test.go @@ -38,6 +38,9 @@ var vecBuiltinTimeCases = map[string][]vecExprBenchCase{ ast.Second: { {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDuration}, geners: []dataGenerator{&rangeDurationGener{0.2}}}, }, + ast.ToSeconds: { + {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDatetime}}, + }, ast.MicroSecond: {}, ast.Now: {}, ast.DayOfWeek: {