From fd2d26e12d7944c15dfe70ec79e5af7adb82e3d1 Mon Sep 17 00:00:00 2001 From: VersBinarii Date: Fri, 11 Feb 2022 21:28:07 +0100 Subject: [PATCH] Fix power calculation when encoding the BigDecimal into NUMERIC (#1692) * Show failing test 0.002 will be encoded as 0.02 * The power calculation should depend on the offset of the digits --- sqlx-core/src/postgres/types/bigdecimal.rs | 2 +- tests/postgres/types.rs | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/sqlx-core/src/postgres/types/bigdecimal.rs b/sqlx-core/src/postgres/types/bigdecimal.rs index 54cbf9e320..f7958bab17 100644 --- a/sqlx-core/src/postgres/types/bigdecimal.rs +++ b/sqlx-core/src/postgres/types/bigdecimal.rs @@ -115,7 +115,7 @@ impl TryFrom<&'_ BigDecimal> for PgNumeric { digits.push(base_10_to_10000(first)); } } else if offset != 0 { - digits.push(base_10_to_10000(&base_10) * 10i16.pow(3 - base_10.len() as u32)); + digits.push(base_10_to_10000(&base_10) * 10i16.pow((offset - base_10.len()) as u32)); } if let Some(rest) = base_10.get(offset..) { diff --git a/tests/postgres/types.rs b/tests/postgres/types.rs index 7b39de8596..0b58421448 100644 --- a/tests/postgres/types.rs +++ b/tests/postgres/types.rs @@ -421,6 +421,12 @@ test_type!(bigdecimal(Postgres, "0.01234567::numeric" == "0.01234567".parse::().unwrap(), "0.012345678::numeric" == "0.012345678".parse::().unwrap(), "0.0123456789::numeric" == "0.0123456789".parse::().unwrap(), + "0.002::numeric" == "0.002".parse::().unwrap(), + "0.0002::numeric" == "0.0002".parse::().unwrap(), + "0.00002::numeric" == "0.00002".parse::().unwrap(), + "0.000002::numeric" == "0.000002".parse::().unwrap(), + "0.0000002::numeric" == "0.0000002".parse::().unwrap(), + "0.00000002::numeric" == "0.00000002".parse::().unwrap(), "12.34::numeric" == "12.34".parse::().unwrap(), "12345.6789::numeric" == "12345.6789".parse::().unwrap(), ));