code: func (b *builtinStringStringTimeDiffSig) evalDuration(row chunk.Row) (d types.Duration, isNull bool, err error) {
  	lhs, isNull, err := b.args[0].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return d, isNull, err
  	}
  
  	rhs, isNull, err := b.args[1].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return d, isNull, err
  	}
  
  	sc := b.ctx.GetSessionVars().StmtCtx
  	fsp := b.tp.Decimal
  	lhsDur, lhsTime, lhsIsDuration, err := convertStringToDuration(sc, lhs, fsp)
  	if err != nil {
  		return d, true, err
  	}
  
  	rhsDur, rhsTime, rhsIsDuration, err := convertStringToDuration(sc, rhs, fsp)
  	if err != nil {
  		return d, true, err
  	}
  
  	if lhsIsDuration != rhsIsDuration {
  		return d, true, nil
  	}
  
  	if lhsIsDuration {
  		d, isNull, err = calculateDurationTimeDiff(b.ctx, lhsDur, rhsDur)
  	} else {
  		d, isNull, err = calculateTimeDiff(sc, lhsTime, rhsTime)
  	}
  
  	return d, isNull, err
  }
docs: // evalDuration evals a builtinStringStringTimeDiffSig.
  // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timediff