@@ -196,20 +196,13 @@ object IntervalUtils {
196196 UnitName .day -> (0 , Integer .MAX_VALUE , Math .multiplyExact(_, DateTimeUtils .MICROS_PER_DAY ))
197197 )
198198
199- private val signRe = " (?<sign>[+|-])? "
200- private val dayRe = " ((?<day>\\ d+)\\ s+)? "
199+ private val signRe = " (?<sign>[+|-])"
200+ private val dayRe = " ((?<day>\\ d+)\\ s+)"
201201 private val hourRe = " (?<hour>\\ d{1,2}+)"
202202 private val minuteRe = " (?<minute>\\ d{1,2}+)"
203203 private val secondRe = " (?<second>(\\ d{1,2}+)(\\ .(\\ d{1,9}+))?)"
204-
205- private val dayTimeRe = Map (
206- (UnitName .minute, UnitName .second) -> (s " ^ $signRe$minuteRe: $secondRe$$ " ).r,
207- (UnitName .hour, UnitName .minute) -> (s " ^ $signRe$hourRe: $minuteRe$$ " ).r,
208- (UnitName .hour, UnitName .second) -> (s " ^ $signRe$hourRe: $minuteRe: $secondRe$$ " ).r,
209- (UnitName .day, UnitName .hour) -> (s " ^ $signRe$dayRe$hourRe$$ " ).r,
210- (UnitName .day, UnitName .minute) -> (s " ^ $signRe$dayRe$hourRe: $minuteRe$$ " ).r,
211- (UnitName .day, UnitName .second) -> (s " ^ $signRe$dayRe$hourRe: $minuteRe: $secondRe$$ " ).r
212- )
204+ private val minsecRe = (s " ^ $signRe? $dayRe?( $hourRe:)? $minuteRe: $secondRe$$ " ).r
205+ private val daysecRe = (s " ^ $signRe? $dayRe? $hourRe(: $minuteRe(: $secondRe)?)? $$ " ).r
213206
214207 private def unitsRange (start : UnitName .Value , end : UnitName .Value ): Seq [UnitName .Value ] = {
215208 (start.id to end.id).map(UnitName (_))
@@ -230,9 +223,10 @@ object IntervalUtils {
230223 to : UnitName .Value ): CalendarInterval = {
231224 require(input != null , " Interval day-time string must be not null" )
232225 assert(input.length == input.trim.length)
233- require(dayTimeRe.contains(from -> to),
234- s " Cannot support (interval ' $input' $from to $to) expression " )
235- val pattern = dayTimeRe(from, to).pattern
226+ val pattern = (from, to) match {
227+ case (UnitName .minute, UnitName .second) => minsecRe.pattern
228+ case _ => daysecRe.pattern
229+ }
236230 val m = pattern.matcher(input)
237231 require(m.matches, s " Interval string must match day-time format of ' $pattern': $input" )
238232
@@ -327,6 +321,7 @@ object IntervalUtils {
327321 Long .MaxValue / DateTimeUtils .MICROS_PER_SECOND ) * DateTimeUtils .MICROS_PER_SECOND
328322 }
329323
324+ if (secondNano == null ) return 0L
330325 secondNano.split(" \\ ." ) match {
331326 case Array (secondsStr) => parseSeconds(secondsStr)
332327 case Array (" " , nanosStr) => parseNanos(nanosStr, false )
0 commit comments