From 246e0ce1291ce49b8863e03ffa4e8105808513cb Mon Sep 17 00:00:00 2001 From: Sergey Tatarintsev Date: Thu, 2 Nov 2023 12:09:09 +0100 Subject: [PATCH] driver-adapters: conver Decimals to Strings when calling JS When forwarding the input to the driver adapter, we used to convert decimal values to f64. On a large numbers, that lost some precision. Changing this to convert them to strings instead. Fix prisma/team-orm#497 TODO: after this gets to the client, unskip `decimal/presion` test there. --- .../writes/data_types/native_types/mysql.rs | 29 +++++++++++++++++++ .../driver-adapters/src/conversion.rs | 7 ++--- .../src/conversion/postgres.rs | 4 --- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/data_types/native_types/mysql.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/data_types/native_types/mysql.rs index c29b12d5b73..4d3c3137f4a 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/data_types/native_types/mysql.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/data_types/native_types/mysql.rs @@ -198,6 +198,35 @@ mod mysql { Ok(()) } + fn schema_decimal_vitess() -> String { + let schema = indoc! { + r#"model Model { + #id(id, String, @id, @default(cuid())) + decLarge Decimal @test.Decimal(20, 10) + }"# + }; + + schema.to_owned() + } + + #[connector_test(only(Vitess), schema(schema_decimal_vitess))] + async fn native_decimal_vitess_precision(runner: Runner) -> TestResult<()> { + insta::assert_snapshot!( + run_query!(&runner, r#"mutation { + createOneModel( + data: { + decLarge: "131603421.38724228" + } + ) { + decLarge + } + }"#), + @r###"{"data":{"createOneModel":{"decLarge":"131603421.38724228"}}}"### + ); + + Ok(()) + } + fn schema_string() -> String { let schema = indoc! { r#"model Model { diff --git a/query-engine/driver-adapters/src/conversion.rs b/query-engine/driver-adapters/src/conversion.rs index f65cc955fb2..8344464562b 100644 --- a/query-engine/driver-adapters/src/conversion.rs +++ b/query-engine/driver-adapters/src/conversion.rs @@ -75,11 +75,8 @@ pub fn values_to_js_args(values: &[quaint::Value<'_>]) -> serde_json::Result JSArg::Buffer(bytes.to_vec()), None => JsonValue::Null.into(), }, - quaint_value @ quaint::ValueType::Numeric(bd) => match bd { - Some(bd) => match bd.to_string().parse::() { - Ok(double) => JSArg::from(JsonValue::from(double)), - Err(_) => JSArg::from(JsonValue::from(quaint_value.clone())), - }, + quaint::ValueType::Numeric(bd) => match bd { + Some(bd) => JSArg::RawString(bd.to_string()), None => JsonValue::Null.into(), }, quaint::ValueType::Array(Some(items)) => JSArg::Array(values_to_js_args(items)?), diff --git a/query-engine/driver-adapters/src/conversion/postgres.rs b/query-engine/driver-adapters/src/conversion/postgres.rs index 21b1ec6b2fb..abb09a57f37 100644 --- a/query-engine/driver-adapters/src/conversion/postgres.rs +++ b/query-engine/driver-adapters/src/conversion/postgres.rs @@ -37,10 +37,6 @@ pub fn values_to_js_args(values: &[quaint::Value<'_>]) -> serde_json::Result JSArg::Buffer(bytes.to_vec()), None => JsonValue::Null.into(), }, - (quaint::ValueType::Numeric(bd), _) => match bd { - Some(bd) => JSArg::RawString(bd.to_string()), - None => JsonValue::Null.into(), - }, (quaint::ValueType::Array(Some(items)), _) => JSArg::Array(values_to_js_args(items)?), (quaint_value, _) => JSArg::from(JsonValue::from(quaint_value.clone())), };