Skip to content

Commit ee73c84

Browse files
authored
Fixed (#2838)
fmt
1 parent ee3b94d commit ee73c84

File tree

1 file changed

+47
-18
lines changed

1 file changed

+47
-18
lines changed

sqlx-postgres/src/types/rust_decimal.rs

+47-18
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ impl TryFrom<PgNumeric> for Decimal {
2525
type Error = BoxDynError;
2626

2727
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 {
2929
PgNumeric::Number {
3030
digits,
3131
sign,
3232
weight,
33-
..
34-
} => (digits, sign, weight),
33+
scale,
34+
} => (digits, sign, weight, scale),
3535

3636
PgNumeric::NotANumber => {
3737
return Err("Decimal does not support NaN values".into());
@@ -65,6 +65,8 @@ impl TryFrom<PgNumeric> for Decimal {
6565
PgNumericSign::Negative => value.set_sign_negative(true),
6666
}
6767

68+
value.rescale(scale as u32);
69+
6870
Ok(value)
6971
}
7072
}
@@ -311,29 +313,38 @@ mod decimal_to_pgnumeric {
311313
#[test]
312314
fn decimal_4() {
313315
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);
323328
}
324329

325330
#[test]
326331
fn one_digit_decimal() {
327332
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+
};
328339
assert_eq!(
329340
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
336342
);
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);
337348
}
338349

339350
#[test]
@@ -396,6 +407,24 @@ mod decimal_to_pgnumeric {
396407
);
397408
}
398409

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+
399428
#[test]
400429
fn issue_666_trailing_zeroes_at_max_precision() {}
401430
}

0 commit comments

Comments
 (0)