code: func (b *builtinCompressSig) evalString(row chunk.Row) (string, bool, error) {
  	str, isNull, err := b.args[0].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return "", true, err
  	}
  
  	// According to doc: Empty strings are stored as empty strings.
  	if len(str) == 0 {
  		return "", false, nil
  	}
  
  	compressed, err := deflate([]byte(str))
  	if err != nil {
  		return "", true, nil
  	}
  
  	resultLength := 4 + len(compressed)
  
  	// append "." if ends with space
  	shouldAppendSuffix := compressed[len(compressed)-1] == 32
  	if shouldAppendSuffix {
  		resultLength++
  	}
  
  	buffer := make([]byte, resultLength)
  	binary.LittleEndian.PutUint32(buffer, uint32(len(str)))
  	copy(buffer[4:], compressed)
  
  	if shouldAppendSuffix {
  		buffer[len(buffer)-1] = '.'
  	}
  
  	return string(buffer), false, nil
  }
docs: // evalString evals COMPRESS(str).
  // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_compress