code: func (b *builtinConcatWSSig) evalString(row chunk.Row) (string, bool, error) {
  	args := b.getArgs()
  	strs := make([]string, 0, len(args))
  	var sep string
  	for i, arg := range args {
  		val, isNull, err := arg.EvalString(b.ctx, row)
  		if err != nil {
  			return val, isNull, err
  		}
  
  		if isNull {
  			// If the separator is NULL, the result is NULL.
  			if i == 0 {
  				return val, isNull, nil
  			}
  			// CONCAT_WS() does not skip empty strings. However,
  			// it does skip any NULL values after the separator argument.
  			continue
  		}
  
  		if i == 0 {
  			sep = val
  			continue
  		}
  		strs = append(strs, val)
  	}
  
  	// TODO: check whether the length of result is larger than Flen
  	return strings.Join(strs, sep), false, nil
  }
docs: // evalString evals a builtinConcatWSSig.
  // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat-ws