code: func (cf *concatFunction) Update(row []types.Datum, groupKey []byte, ectx context.Context) error {
  	ctx := cf.getContext(groupKey)
  	vals := make([]interface{}, 0, len(cf.Args))
  	for _, a := range cf.Args {
  		value, err := a.Eval(row, ectx)
  		if err != nil {
  			return errors.Trace(err)
  		}
  		if value.GetValue() == nil {
  			return nil
  		}
  		vals = append(vals, value.GetValue())
  	}
  	if cf.Distinct {
  		d, err := ctx.DistinctChecker.Check(vals)
  		if err != nil {
  			return errors.Trace(err)
  		}
  		if !d {
  			return nil
  		}
  	}
  	if ctx.Buffer == nil {
  		ctx.Buffer = &bytes.Buffer{}
  	} else {
  		// now use comma separator
  		ctx.Buffer.WriteString(",")
  	}
  	for _, val := range vals {
  		ctx.Buffer.WriteString(fmt.Sprintf("%v", val))
  	}
  	// TODO: if total length is greater than global var group_concat_max_len, truncate it.
  	return nil
  }
docs: // Update implements AggregationFunction interface.