@@ -25,13 +25,13 @@ impl TryFrom<PgNumeric> for Decimal {
25
25
type Error = BoxDynError ;
26
26
27
27
fn try_from ( numeric : PgNumeric ) -> Result < Self , BoxDynError > {
28
- let ( digits, sign, mut weight) = match numeric {
28
+ let ( digits, sign, mut weight, scale ) = match numeric {
29
29
PgNumeric :: Number {
30
30
digits,
31
31
sign,
32
32
weight,
33
- ..
34
- } => ( digits, sign, weight) ,
33
+ scale ,
34
+ } => ( digits, sign, weight, scale ) ,
35
35
36
36
PgNumeric :: NotANumber => {
37
37
return Err ( "Decimal does not support NaN values" . into ( ) ) ;
@@ -65,6 +65,8 @@ impl TryFrom<PgNumeric> for Decimal {
65
65
PgNumericSign :: Negative => value. set_sign_negative ( true ) ,
66
66
}
67
67
68
+ value. rescale ( scale as u32 ) ;
69
+
68
70
Ok ( value)
69
71
}
70
72
}
@@ -311,29 +313,38 @@ mod decimal_to_pgnumeric {
311
313
#[ test]
312
314
fn decimal_4 ( ) {
313
315
let decimal: Decimal = "12345.67890" . parse ( ) . unwrap ( ) ;
314
- assert_eq ! (
315
- PgNumeric :: try_from( & decimal) . unwrap( ) ,
316
- PgNumeric :: Number {
317
- sign: PgNumericSign :: Positive ,
318
- scale: 5 ,
319
- weight: 1 ,
320
- digits: vec![ 1 , 2345 , 6789 ]
321
- }
322
- ) ;
316
+ let expected_numeric = PgNumeric :: Number {
317
+ sign : PgNumericSign :: Positive ,
318
+ scale : 5 ,
319
+ weight : 1 ,
320
+ digits : vec ! [ 1 , 2345 , 6789 ] ,
321
+ } ;
322
+ assert_eq ! ( PgNumeric :: try_from( & decimal) . unwrap( ) , expected_numeric) ;
323
+
324
+ let actual_decimal = Decimal :: try_from ( expected_numeric) . unwrap ( ) ;
325
+ assert_eq ! ( actual_decimal, decimal) ;
326
+ assert_eq ! ( actual_decimal. mantissa( ) , 1234567890 ) ;
327
+ assert_eq ! ( actual_decimal. scale( ) , 5 ) ;
323
328
}
324
329
325
330
#[ test]
326
331
fn one_digit_decimal ( ) {
327
332
let one_digit_decimal: Decimal = "0.00001234" . parse ( ) . unwrap ( ) ;
333
+ let expected_numeric = PgNumeric :: Number {
334
+ sign : PgNumericSign :: Positive ,
335
+ scale : 8 ,
336
+ weight : -2 ,
337
+ digits : vec ! [ 1234 ] ,
338
+ } ;
328
339
assert_eq ! (
329
340
PgNumeric :: try_from( & one_digit_decimal) . unwrap( ) ,
330
- PgNumeric :: Number {
331
- sign: PgNumericSign :: Positive ,
332
- scale: 8 ,
333
- weight: -2 ,
334
- digits: vec![ 1234 ]
335
- }
341
+ expected_numeric
336
342
) ;
343
+
344
+ let actual_decimal = Decimal :: try_from ( expected_numeric) . unwrap ( ) ;
345
+ assert_eq ! ( actual_decimal, one_digit_decimal) ;
346
+ assert_eq ! ( actual_decimal. mantissa( ) , 1234 ) ;
347
+ assert_eq ! ( actual_decimal. scale( ) , 8 ) ;
337
348
}
338
349
339
350
#[ test]
@@ -396,6 +407,24 @@ mod decimal_to_pgnumeric {
396
407
) ;
397
408
}
398
409
410
+ #[ test]
411
+ fn issue_2247_trailing_zeros ( ) {
412
+ // This is a regression test for https://github.com/launchbadge/sqlx/issues/2247
413
+ let one_hundred: Decimal = "100.00" . parse ( ) . unwrap ( ) ;
414
+ let expected_numeric = PgNumeric :: Number {
415
+ sign : PgNumericSign :: Positive ,
416
+ scale : 2 ,
417
+ weight : 0 ,
418
+ digits : vec ! [ 100 ] ,
419
+ } ;
420
+ assert_eq ! ( PgNumeric :: try_from( & one_hundred) . unwrap( ) , expected_numeric) ;
421
+
422
+ let actual_decimal = Decimal :: try_from ( expected_numeric) . unwrap ( ) ;
423
+ assert_eq ! ( actual_decimal, one_hundred) ;
424
+ assert_eq ! ( actual_decimal. mantissa( ) , 10000 ) ;
425
+ assert_eq ! ( actual_decimal. scale( ) , 2 ) ;
426
+ }
427
+
399
428
#[ test]
400
429
fn issue_666_trailing_zeroes_at_max_precision ( ) { }
401
430
}
0 commit comments