@@ -31,7 +31,7 @@ impl Interval {
3131 if x == 'P' {
3232 continue ;
3333 }
34- if x == 'T' {
34+ if x == 'T' && date_part {
3535 date_part = false ;
3636 continue ;
3737 }
@@ -84,7 +84,11 @@ impl Interval {
8484 }
8585 }
8686 }
87- interval_norm. try_into_interval ( )
87+ if number != "" {
88+ Err ( ParseError :: from_invalid_interval ( "Invalid format could not parse whole interval." ) )
89+ } else {
90+ interval_norm. try_into_interval ( )
91+ }
8892 }
8993 }
9094}
@@ -124,7 +128,8 @@ fn scale_date(val: f64, scale: i32) -> (i32, i32) {
124128 return ( val. trunc ( ) as i32 , 0 )
125129 } else {
126130 // matches postgres implementation of just truncating.
127- let sub_value = ( val. fract ( ) * scale as f64 ) as i32 ;
131+ println ! ( "val: {}, adjusted: {} scale: {}" , val, ( val. fract( ) * scale as f64 ) , val. fract( ) ) ;
132+ let sub_value = ( val. fract ( ) * scale as f64 ) . round ( ) as i32 ;
128133 ( val. trunc ( ) as i32 , sub_value)
129134 }
130135}
@@ -134,7 +139,7 @@ fn scale_time(val: f64, scale: i32) -> (i64, i64) {
134139 return ( val. trunc ( ) as i64 , 0 )
135140 } else {
136141 // matches postgres implementation of just truncating.
137- let sub_value = ( val. fract ( ) * scale as f64 ) as i64 ;
142+ let sub_value = ( val. fract ( ) * scale as f64 ) . round ( ) as i64 ;
138143 ( val. trunc ( ) as i64 , sub_value)
139144 }
140145}
@@ -275,4 +280,38 @@ mod tests {
275280 let interval_exp = Interval :: new ( 0 , 0 , -4215000000 ) ;
276281 assert_eq ! ( interval, interval_exp) ;
277282 }
283+
284+
285+ #[ test]
286+ fn test_from_8601_19 ( ) {
287+ let interval = Interval :: from_iso ( "PTT" ) ;
288+ assert_eq ! ( interval. is_err( ) , true ) ;
289+ }
290+
291+ #[ test]
292+ fn test_from_8601_20 ( ) {
293+ let interval = Interval :: from_iso ( "PT-" ) ;
294+ assert_eq ! ( interval. is_err( ) , true ) ;
295+ }
296+
297+ #[ test]
298+ fn test_from_8601_21 ( ) {
299+ let interval = Interval :: from_iso ( "PT10" ) ;
300+ assert_eq ! ( interval. is_err( ) , true ) ;
301+ }
302+
303+ #[ test]
304+ fn test_from_8601_22 ( ) {
305+ let interval = Interval :: from_iso ( "P1.2YT0S" ) . unwrap ( ) ;
306+ let interval_exp = Interval :: new ( 14 , 0 , 0 ) ;
307+ assert_eq ! ( interval, interval_exp) ;
308+ }
309+
310+ #[ test]
311+ fn test_from_8601_23 ( ) {
312+ let interval = Interval :: from_iso ( "P1.2MT0S" ) . unwrap ( ) ;
313+ let interval_exp = Interval :: new ( 1 , 6 , 0 ) ;
314+ assert_eq ! ( interval, interval_exp) ;
315+ }
316+
278317}
0 commit comments