code: func (b *builtinAesEncryptIVSig) evalString(row chunk.Row) (string, bool, error) {
  	// According to doc: If either function argument is NULL, the function returns NULL.
  	str, 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
  	}
  
  	iv, isNull, err := b.args[2].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return "", true, err
  	}
  	if len(iv) < aes.BlockSize {
  		return "", true, errIncorrectArgs.GenWithStack("The initialization vector supplied to aes_encrypt is too short. Must be at least %d bytes long", aes.BlockSize)
  	}
  	// init_vector must be 16 bytes or longer (bytes in excess of 16 are ignored)
  	iv = iv[0:aes.BlockSize]
  
  	key := encrypt.DeriveKeyMySQL([]byte(keyStr), b.keySize)
  	var cipherText []byte
  	switch b.modeName {
  	case "cbc":
  		cipherText, err = encrypt.AESEncryptWithCBC([]byte(str), key, []byte(iv))
  	case "ofb":
  		cipherText, err = encrypt.AESEncryptWithOFB([]byte(str), key, []byte(iv))
  	case "cfb":
  		cipherText, err = encrypt.AESEncryptWithCFB([]byte(str), key, []byte(iv))
  	default:
  		return "", true, errors.Errorf("unsupported block encryption mode - %v", b.modeName)
  	}
  	if err != nil {
  		return "", true, nil
  	}
  	return string(cipherText), false, nil
  }
docs: // evalString evals AES_ENCRYPT(str, key_str, iv).
  // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-decrypt