code: func (b *builtinSubStringAndStringSig) evalString(row chunk.Row) (result string, isNull bool, err error) {
  	var (
  		s, arg0 string
  		arg1    types.Duration
  	)
  	arg0, isNull, err = b.args[0].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return "", isNull, err
  	}
  	arg1Type := b.args[1].GetType()
  	if mysql.HasBinaryFlag(arg1Type.Flag) {
  		return "", true, nil
  	}
  	s, isNull, err = b.args[1].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return "", isNull, err
  	}
  	arg1, err = types.ParseDuration(b.ctx.GetSessionVars().StmtCtx, s, getFsp4TimeAddSub(s))
  	if err != nil {
  		return "", true, err
  	}
  	sc := b.ctx.GetSessionVars().StmtCtx
  	if isDuration(arg0) {
  		result, err = strDurationSubDuration(sc, arg0, arg1)
  		if err != nil {
  			return "", true, err
  		}
  		return result, false, nil
  	}
  	result, err = strDatetimeSubDuration(sc, arg0, arg1)
  	return result, err != nil, err
  }
docs: // evalString evals a builtinSubStringAndStringSig.
  // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime