static absl::Status ConvertTimestampInterval()

in sql_utils/public/functions/date_time_util.cc [615:654]


static absl::Status ConvertTimestampInterval(int64_t interval,
                                             TimestampScale interval_scale,
                                             TimestampScale output_scale,
                                             int64_t* output) {
  if (interval_scale == output_scale) {
    *output = interval;
    return absl::OkStatus();
  }

#define FCT(scale1, scale2) (scale1 * 10 + scale2)

  switch (FCT(interval_scale, output_scale)) {
    case FCT(kSeconds, kMilliseconds):
    case FCT(kSeconds, kMicroseconds):
    case FCT(kSeconds, kNanoseconds):
    case FCT(kMilliseconds, kMicroseconds):
    case FCT(kMilliseconds, kNanoseconds):
    case FCT(kMicroseconds, kNanoseconds):
      if (Multiply<int64_t>(interval,
                            powers_of_ten[output_scale - interval_scale],
                            output, kNoError)) {
        return absl::OkStatus();
      }
      break;
    case FCT(kNanoseconds, kMicroseconds):
    case FCT(kNanoseconds, kMilliseconds):
    case FCT(kNanoseconds, kSeconds):
    case FCT(kMicroseconds, kMilliseconds):
    case FCT(kMicroseconds, kSeconds):
    case FCT(kMilliseconds, kSeconds):
      *output = interval / powers_of_ten[interval_scale - output_scale];
      return absl::OkStatus();
    default:
      break;
  }
  return MakeEvalError() << "Converting timestamp interval " << interval
                         << " at " << TimestampScale_Name(interval_scale)
                         << " scale to " << TimestampScale_Name(output_scale)
                         << " scale causes overflow";
}