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";
}