code: func (b *builtinAesDecryptSig) evalString(row chunk.Row) (string, bool, error) {
  	// According to doc: If either function argument is NULL, the function returns NULL.
  	cryptStr, isNull, err := b.args[0].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return "", true, err
  	}
  	keyStr, isNull, err := b.args[1].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return "", true, 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"))
  	}
  
  	key := encrypt.DeriveKeyMySQL([]byte(keyStr), b.keySize)
  	var plainText []byte
  	switch b.modeName {
  	case "ecb":
  		plainText, err = encrypt.AESDecryptWithECB([]byte(cryptStr), key)
  	default:
  		return "", true, errors.Errorf("unsupported block encryption mode - %v", b.modeName)
  	}
  	if err != nil {
  		return "", true, nil
  	}
  	return string(plainText), false, nil
  }
docs: // evalString evals AES_DECRYPT(crypt_str, key_key).
  // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-decrypt