Skip to content

Commit

Permalink
expression: use encode buffer in to_binary, warp encrypt function wit…
Browse files Browse the repository at this point in the history
…h to_binary (#29950)
  • Loading branch information
unconsolable committed Nov 22, 2021
1 parent d711f18 commit e47f0f5
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 197 deletions.
8 changes: 4 additions & 4 deletions cmd/explaintest/r/new_character_set_builtin.result
Original file line number Diff line number Diff line change
Expand Up @@ -201,16 +201,16 @@ NULL NULL NULL
set @@tidb_enable_vectorized_expression = true;
select sha2(a, 0), sha2(b, 0), sha2(c, 0) from t;
sha2(a, 0) sha2(b, 0) sha2(c, 0)
4fc9d8955b6155d931b24a583a6ad872f7d77fd4e4562cf8f619faa9c1a2cdc7 4fc9d8955b6155d931b24a583a6ad872f7d77fd4e4562cf8f619faa9c1a2cdc7 f98670d7ccdf803dfa2f24555cfd733d626dd24f5f2bb0b91e37cc4f54a0f359
4fc9d8955b6155d931b24a583a6ad872f7d77fd4e4562cf8f619faa9c1a2cdc7 b6c1ae1f8d8a07426ddb13fca5124fb0b9f1f0ef1cca6730615099cf198ca8af f98670d7ccdf803dfa2f24555cfd733d626dd24f5f2bb0b91e37cc4f54a0f359
select sha2(a, 224), sha2(b, 224), sha2(c, 224) from t;
sha2(a, 224) sha2(b, 224) sha2(c, 224)
ae47a60dd96e1deed3988d8fff3d662165e0aac7ddf371f244d7c11e ae47a60dd96e1deed3988d8fff3d662165e0aac7ddf371f244d7c11e eb0de82dfada1205f65ac4aa6e4778d2f7730144f31688d42a316b9c
ae47a60dd96e1deed3988d8fff3d662165e0aac7ddf371f244d7c11e 2362f577783f6cd6cc10b0308f946f479fef868a39d6339b5d74cc6d eb0de82dfada1205f65ac4aa6e4778d2f7730144f31688d42a316b9c
select sha2(a, 256), sha2(b, 256), sha2(c, 256) from t;
sha2(a, 256) sha2(b, 256) sha2(c, 256)
4fc9d8955b6155d931b24a583a6ad872f7d77fd4e4562cf8f619faa9c1a2cdc7 4fc9d8955b6155d931b24a583a6ad872f7d77fd4e4562cf8f619faa9c1a2cdc7 f98670d7ccdf803dfa2f24555cfd733d626dd24f5f2bb0b91e37cc4f54a0f359
4fc9d8955b6155d931b24a583a6ad872f7d77fd4e4562cf8f619faa9c1a2cdc7 b6c1ae1f8d8a07426ddb13fca5124fb0b9f1f0ef1cca6730615099cf198ca8af f98670d7ccdf803dfa2f24555cfd733d626dd24f5f2bb0b91e37cc4f54a0f359
select sha2(a, 384), sha2(b, 384), sha2(c, 384) from t;
sha2(a, 384) sha2(b, 384) sha2(c, 384)
cdb9c8d3e2579d021116ebe9d7d7bb4f5b3a489cae84768f7b3348c9b8d716897a409ea96fd92bfb95e3fd8aa91ffc74 cdb9c8d3e2579d021116ebe9d7d7bb4f5b3a489cae84768f7b3348c9b8d716897a409ea96fd92bfb95e3fd8aa91ffc74 1b526bf926dbc53609628f145a6efe2b17eb29754ba2c6e0e33673dbd79d62ea50bbfc233252f06ba27712f8bd406963
cdb9c8d3e2579d021116ebe9d7d7bb4f5b3a489cae84768f7b3348c9b8d716897a409ea96fd92bfb95e3fd8aa91ffc74 54e75070f1faab03e7ce808ca2824ed4614ad1d58ee1409d8c1e4fd72ecab12c92ac3a2f919721c2aa09b23e5f3cc8aa 1b526bf926dbc53609628f145a6efe2b17eb29754ba2c6e0e33673dbd79d62ea50bbfc233252f06ba27712f8bd406963
select sha2(a, 514), sha2(b, 514), sha2(c, 514) from t;
sha2(a, 514) sha2(b, 514) sha2(c, 514)
NULL NULL NULL
Expand Down
11 changes: 6 additions & 5 deletions expression/builtin_convert_charset.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,26 +92,27 @@ func (b *builtinInternalToBinarySig) vecEvalString(input *chunk.Chunk, result *c
}
enc := charset.NewEncoding(b.args[0].GetType().Charset)
result.ReserveString(n)
var encodedBuf []byte
for i := 0; i < n; i++ {
var str string
if buf.IsNull(i) {
result.AppendNull()
continue
}
str = buf.GetString(i)
str, err = enc.EncodeString(str)
strBytes, err := enc.Encode(encodedBuf, buf.GetBytes(i))
if err != nil {
return err
}
result.AppendString(str)
result.AppendBytes(strBytes)
}
return nil
}

// toBinaryMap contains the builtin functions which arguments need to be converted to the correct charset.
var toBinaryMap = map[string]struct{}{
ast.Hex: {}, ast.Length: {}, ast.OctetLength: {}, ast.ASCII: {},
ast.ToBase64: {},
ast.ToBase64: {}, ast.AesDecrypt: {}, ast.Decode: {}, ast.Encode: {},
ast.PasswordFunc: {}, ast.MD5: {}, ast.SHA: {}, ast.SHA1: {},
ast.SHA2: {}, ast.Compress: {},
}

// WrapWithToBinary wraps `expr` with to_binary sig.
Expand Down
72 changes: 4 additions & 68 deletions expression/builtin_encryption.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ import (

"github.com/pingcap/errors"
"github.com/pingcap/tidb/parser/auth"
"github.com/pingcap/tidb/parser/charset"
"github.com/pingcap/tidb/parser/mysql"
"github.com/pingcap/tidb/sessionctx"
"github.com/pingcap/tidb/sessionctx/variable"
Expand Down Expand Up @@ -159,18 +158,10 @@ func (b *builtinAesDecryptSig) evalString(row chunk.Row) (string, bool, error) {
if isNull || err != nil {
return "", true, err
}
cryptStr, err = charset.NewEncoding(b.args[0].GetType().Charset).EncodeString(cryptStr)
if err != nil {
return "", false, err
}
keyStr, isNull, err := b.args[1].EvalString(b.ctx, row)
if isNull || err != nil {
return "", true, err
}
keyStr, err = charset.NewEncoding(b.args[1].GetType().Charset).EncodeString(keyStr)
if err != nil {
return "", false, err
}
if !b.ivRequired && len(b.args) == 3 {
// For modes that do not require init_vector, it is ignored and a warning is generated if it is specified.
b.ctx.GetSessionVars().StmtCtx.AppendWarning(errWarnOptionIgnored.GenWithStackByArgs("IV"))
Expand Down Expand Up @@ -210,28 +201,16 @@ func (b *builtinAesDecryptIVSig) evalString(row chunk.Row) (string, bool, error)
if isNull || err != nil {
return "", true, err
}
cryptStr, err = charset.NewEncoding(b.args[0].GetType().Charset).EncodeString(cryptStr)
if err != nil {
return "", false, err
}

keyStr, isNull, err := b.args[1].EvalString(b.ctx, row)
if isNull || err != nil {
return "", true, err
}
keyStr, err = charset.NewEncoding(b.args[1].GetType().Charset).EncodeString(keyStr)
if err != nil {
return "", false, err
}

iv, isNull, err := b.args[2].EvalString(b.ctx, row)
if isNull || err != nil {
return "", true, err
}
iv, err = charset.NewEncoding(b.args[2].GetType().Charset).EncodeString(iv)
if err != nil {
return "", false, err
}
if len(iv) < aes.BlockSize {
return "", true, errIncorrectArgs.GenWithStack("The initialization vector supplied to aes_decrypt is too short. Must be at least %d bytes long", aes.BlockSize)
}
Expand Down Expand Up @@ -427,21 +406,11 @@ func (b *builtinDecodeSig) evalString(row chunk.Row) (string, bool, error) {
if isNull || err != nil {
return "", true, err
}
dataTp := b.args[0].GetType()
dataStr, err = charset.NewEncoding(dataTp.Charset).EncodeString(dataStr)
if err != nil {
return "", false, err
}

passwordStr, isNull, err := b.args[1].EvalString(b.ctx, row)
if isNull || err != nil {
return "", true, err
}
passwordTp := b.args[1].GetType()
passwordStr, err = charset.NewEncoding(passwordTp.Charset).EncodeString(passwordStr)
if err != nil {
return "", false, err
}

decodeStr, err := encrypt.SQLDecode(dataStr, passwordStr)
return decodeStr, false, err
Expand Down Expand Up @@ -500,21 +469,11 @@ func (b *builtinEncodeSig) evalString(row chunk.Row) (string, bool, error) {
if isNull || err != nil {
return "", true, err
}
decodeTp := b.args[0].GetType()
decodeStr, err = charset.NewEncoding(decodeTp.Charset).EncodeString(decodeStr)
if err != nil {
return "", false, err
}

passwordStr, isNull, err := b.args[1].EvalString(b.ctx, row)
if isNull || err != nil {
return "", true, err
}
passwordTp := b.args[1].GetType()
passwordStr, err = charset.NewEncoding(passwordTp.Charset).EncodeString(passwordStr)
if err != nil {
return "", false, err
}

dataStr, err := encrypt.SQLEncode(decodeStr, passwordStr)
return dataStr, false, err
Expand Down Expand Up @@ -576,16 +535,11 @@ func (b *builtinPasswordSig) evalString(row chunk.Row) (d string, isNull bool, e
return "", false, nil
}

dStr, err := charset.NewEncoding(b.args[0].GetType().Charset).EncodeString(pass)
if err != nil {
return "", false, err
}

// We should append a warning here because function "PASSWORD" is deprecated since MySQL 5.7.6.
// See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_password
b.ctx.GetSessionVars().StmtCtx.AppendWarning(errDeprecatedSyntaxNoReplacement.GenWithStackByArgs("PASSWORD"))

return auth.EncodePassword(dStr), false, nil
return auth.EncodePassword(pass), false, nil
}

type randomBytesFunctionClass struct {
Expand Down Expand Up @@ -671,12 +625,7 @@ func (b *builtinMD5Sig) evalString(row chunk.Row) (string, bool, error) {
if isNull || err != nil {
return "", isNull, err
}
var sum [16]byte
dBytes, err := charset.NewEncoding(b.args[0].GetType().Charset).Encode(nil, []byte(arg))
if err != nil {
return "", false, err
}
sum = md5.Sum(dBytes) // #nosec G401
sum := md5.Sum([]byte(arg)) // #nosec G401
hexStr := fmt.Sprintf("%x", sum)
return hexStr, false, nil
}
Expand Down Expand Up @@ -718,12 +667,8 @@ func (b *builtinSHA1Sig) evalString(row chunk.Row) (string, bool, error) {
if isNull || err != nil {
return "", isNull, err
}
bytes, err := charset.NewEncoding(b.args[0].GetType().Charset).Encode(nil, []byte(str))
if err != nil {
return "", false, err
}
hasher := sha1.New() // #nosec G401
_, err = hasher.Write(bytes)
_, err = hasher.Write([]byte(str))
if err != nil {
return "", true, err
}
Expand Down Expand Up @@ -775,10 +720,6 @@ func (b *builtinSHA2Sig) evalString(row chunk.Row) (string, bool, error) {
if isNull || err != nil {
return "", isNull, err
}
bytes, err := charset.NewEncoding(b.args[0].GetType().Charset).Encode(nil, []byte(str))
if err != nil {
return "", false, err
}
hashLength, isNull, err := b.args[1].EvalInt(b.ctx, row)
if isNull || err != nil {
return "", isNull, err
Expand All @@ -799,7 +740,7 @@ func (b *builtinSHA2Sig) evalString(row chunk.Row) (string, bool, error) {
return "", true, nil
}

_, err = hasher.Write(bytes)
_, err = hasher.Write([]byte(str))
if err != nil {
return "", true, err
}
Expand Down Expand Up @@ -876,11 +817,6 @@ func (b *builtinCompressSig) evalString(row chunk.Row) (string, bool, error) {
if isNull || err != nil {
return "", true, err
}
strTp := b.args[0].GetType()
str, err = charset.NewEncoding(strTp.Charset).EncodeString(str)
if err != nil {
return "", false, err
}

// According to doc: Empty strings are stored as empty strings.
if len(str) == 0 {
Expand Down
Loading

0 comments on commit e47f0f5

Please sign in to comment.