expression: implement vectorized evaluation for builtinFromBase64Sig (#12556)

This commit is contained in:
baishen
2019-10-09 16:48:13 +08:00
committed by Yuanjia Zhang
parent 3e13b51686
commit c2b7982cfb
2 changed files with 45 additions and 4 deletions

View File

@ -983,11 +983,50 @@ func (b *builtinFieldIntSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column
}
func (b *builtinFromBase64Sig) vectorized() bool {
return false
return true
}
// vecEvalString evals FROM_BASE64(str).
// See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_from-base64
func (b *builtinFromBase64Sig) 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
}
result.ReserveString(n)
for i := 0; i < n; i++ {
if buf.IsNull(i) {
result.AppendNull()
continue
}
str := buf.GetString(i)
needDecodeLen := base64NeededDecodedLength(len(str))
if needDecodeLen == -1 {
result.AppendNull()
continue
} else if needDecodeLen > int(b.maxAllowedPacket) {
b.ctx.GetSessionVars().StmtCtx.AppendWarning(errWarnAllowedPacketOverflowed.GenWithStackByArgs("from_base64", b.maxAllowedPacket))
result.AppendNull()
continue
}
str = strings.Replace(str, "\t", "", -1)
str = strings.Replace(str, " ", "", -1)
newStr, err := base64.StdEncoding.DecodeString(str)
if err != nil {
// When error happens, take `from_base64("asc")` as an example, we should return NULL.
result.AppendNull()
continue
}
result.AppendString(string(newStr))
}
return nil
}
func (b *builtinCharLengthSig) vectorized() bool {

View File

@ -54,8 +54,10 @@ var vecBuiltinStringCases = map[string][]vecExprBenchCase{
ast.ToBase64: {
{retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString}, geners: []dataGenerator{&randLenStrGener{0, 10}}},
},
ast.FromBase64: {},
ast.ExportSet: {},
ast.FromBase64: {
{retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString}, geners: []dataGenerator{&randLenStrGener{10, 100}}},
},
ast.ExportSet: {},
ast.Repeat: {
{retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETInt}, geners: []dataGenerator{&randLenStrGener{10, 20}, &rangeInt64Gener{-10, 10}}},
},