From 4735b2dd86dfed3b67ea0b3f10ff3918072620c2 Mon Sep 17 00:00:00 2001 From: Anton Titovets Date: Mon, 10 Feb 2025 11:21:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D1=8B=20MySQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/addins/postgre/src/component/methods.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/addins/postgre/src/component/methods.rs b/src/addins/postgre/src/component/methods.rs index 4cd75bc9f9..8f1cc8f540 100644 --- a/src/addins/postgre/src/component/methods.rs +++ b/src/addins/postgre/src/component/methods.rs @@ -188,10 +188,18 @@ fn rows_to_json(rows: Vec) -> String { .map(|v| Value::Number(v.into())) .unwrap_or(Value::Null), "float4" | "real" => row.get::<_, Option>(column_name) - .map(|v| serde_json::Number::from_f64(v as f64).map(Value::Number).unwrap_or(Value::Null)) + .map(|v| match v { + v if v.is_nan() => Value::String("NaN".to_string()), + v if v.is_infinite() => Value::String("Infinity".to_string()), + _ => serde_json::Number::from_f64(v as f64).map(Value::Number).unwrap_or(Value::Null), + }) .unwrap_or(Value::Null), "float8" | "double precision" => row.get::<_, Option>(column_name) - .map(|v| serde_json::Number::from_f64(v).map(Value::Number).unwrap_or(Value::Null)) + .map(|v| match v { + v if v.is_nan() => Value::String("NaN".to_string()), + v if v.is_infinite() => Value::String("Infinity".to_string()), + _ => serde_json::Number::from_f64(v).map(Value::Number).unwrap_or(Value::Null), + }) .unwrap_or(Value::Null), "varchar" | "text" | "char" | "citext" | "name" | "unknown" => row.get::<_, Option>(column_name) .map(Value::String) @@ -211,12 +219,13 @@ fn rows_to_json(rows: Vec) -> String { "timestamp" | "timestamptz" => row.get::<_, Option>(column_name) .map(|time| { match time.duration_since(SystemTime::UNIX_EPOCH) { - Ok(d) => Value::Number(d.as_secs().into()), + Ok(d) => Value::Number(d.as_secs().into()), // Положительное значение для времени после UNIX_EPOCH Err(_) => match SystemTime::UNIX_EPOCH.duration_since(time) { - Ok(d) => Value::Number(-(d.as_secs() as i64).into()), // Отрицательное значение для даты до UNIX_EPOCH + Ok(d) => Value::Number((-(d.as_secs() as i64)).into()), // Отрицательное значение для даты до UNIX_EPOCH Err(_) => Value::Null, // Это вообще не должно произойти }, } + }) .unwrap_or(Value::Null), "inet" => row.get::<_, Option>(column_name)