expression: implement vectorized evaluation for builtinFromBase64Sig (#12556)
This commit is contained in:
@ -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 {
|
||||
|
||||
@ -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}}},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user