code: func (b *builtinSubDatetimeAndStringSig) evalTime(row chunk.Row) (types.Time, bool, error) {
  	arg0, isNull, err := b.args[0].EvalTime(b.ctx, row)
  	if isNull || err != nil {
  		return types.ZeroDatetime, isNull, err
  	}
  	s, isNull, err := b.args[1].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return types.ZeroDatetime, isNull, err
  	}
  	if err != nil {
  		return types.ZeroDatetime, true, err
  	}
  	if !isDuration(s) {
  		return types.ZeroDatetime, true, nil
  	}
  	sc := b.ctx.GetSessionVars().StmtCtx
  	arg1, err := types.ParseDuration(sc, s, types.GetFsp(s))
  	if err != nil {
  		return types.ZeroDatetime, true, err
  	}
  	arg1time, err := arg1.ConvertToTime(sc, mysql.TypeDatetime)
  	if err != nil {
  		return types.ZeroDatetime, true, err
  	}
  	tmpDuration := arg0.Sub(sc, &arg1time)
  	result, err := tmpDuration.ConvertToTime(sc, mysql.TypeDatetime)
  	return result, err != nil, err
  }
docs: // evalTime evals a builtinSubDatetimeAndStringSig.
  // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime