code: func (b *builtinTimestamp2ArgsSig) evalTime(row chunk.Row) (types.Time, bool, error) {
  	arg0, isNull, err := b.args[0].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return types.Time{}, isNull, err
  	}
  	var tm types.Time
  	sc := b.ctx.GetSessionVars().StmtCtx
  	if b.isFloat {
  		tm, err = types.ParseTimeFromFloatString(sc, arg0, mysql.TypeDatetime, types.GetFsp(arg0))
  	} else {
  		tm, err = types.ParseTime(sc, arg0, mysql.TypeDatetime, types.GetFsp(arg0))
  	}
  	if err != nil {
  		return types.Time{}, true, handleInvalidTimeError(b.ctx, err)
  	}
  	arg1, isNull, err := b.args[1].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return types.Time{}, isNull, err
  	}
  	if !isDuration(arg1) {
  		return types.Time{}, true, nil
  	}
  	duration, err := types.ParseDuration(sc, arg1, types.GetFsp(arg1))
  	if err != nil {
  		return types.Time{}, true, handleInvalidTimeError(b.ctx, err)
  	}
  	tmp, err := tm.Add(sc, duration)
  	if err != nil {
  		return types.Time{}, true, err
  	}
  	return tmp, false, nil
  }
docs: // evalTime evals a builtinTimestamp2ArgsSig.
  // See https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timestamp