From 979dbc4b330701de9a7279a7369a0b28fd3a2ebc Mon Sep 17 00:00:00 2001 From: ZheFox <77232781+zhefox@users.noreply.github.com> Date: Thu, 3 Sep 2026 14:37:10 +0800 Subject: [PATCH] fix(data): preserve jsonb numbers for metadata CAS --- Cargo.toml | 2 +- .../adapters/postgres/src/provider_catalog.rs | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index ae184e1cb..34bd0926f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -125,7 +125,7 @@ regex = "1" rustls = { version = "0.23", features = ["ring"] } semver = "1" serde = { version = "1", features = ["derive"] } -serde_json = { version = "1", features = ["preserve_order"] } +serde_json = { version = "1", features = ["arbitrary_precision", "preserve_order"] } serde_path_to_error = "0.1" sha2 = "0.10" socket2 = "0.6" diff --git a/crates/aether-data/adapters/postgres/src/provider_catalog.rs b/crates/aether-data/adapters/postgres/src/provider_catalog.rs index 85704aef4..3c68881b5 100644 --- a/crates/aether-data/adapters/postgres/src/provider_catalog.rs +++ b/crates/aether-data/adapters/postgres/src/provider_catalog.rs @@ -3671,6 +3671,17 @@ mod tests { assert!(!sql.contains("is_active")); } + #[test] + fn runtime_metadata_cas_preserves_postgres_jsonb_numeric_lexemes() { + // PostgreSQL jsonb keeps the exact decimal value. Losing that lexeme while + // decoding into serde_json::Value makes a subsequent namespace CAS compare + // a nearby-but-different number and report a false conflict. + let postgres_json = r#"{"used_percent":9.373679999999995}"#; + let decoded: serde_json::Value = serde_json::from_str(postgres_json).unwrap(); + + assert_eq!(serde_json::to_string(&decoded).unwrap(), postgres_json); + } + #[test] fn ordinary_key_update_does_not_own_runtime_observation_fields() { let sql = super::KEY_UPDATE_SQL.to_ascii_lowercase();