{"record":{"id":"0b3e6d07b88dc536","repo":"risingwavelabs/risingwave","slug":"unsupported-json-number-v","errorCode":null,"errorMessage":"unsupported JSON number: {v}","messagePattern":"unsupported JSON number: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/common/src/types/variant.rs","lineNumber":624,"sourceCode":"    Ok(())\n}\n\nfn append_json_value(\n    json: &serde_json::Value,\n    builder: &mut impl VariantBuilderExt,\n) -> anyhow::Result<()> {\n    match json {\n        serde_json::Value::Null => builder.append_value(ParquetVariant::Null),\n        serde_json::Value::Bool(v) => builder.append_value(*v),\n        serde_json::Value::Number(v) => {\n            if let Some(v) = v.as_i64() {\n                builder.append_value(v);\n            } else if let Some(v) = v.as_u64() {\n                builder.append_value(v);\n            } else if let Some(v) = v.as_f64() {\n                append_float64(v, builder);\n            } else {\n                bail!(\"unsupported JSON number: {v}\");\n            }\n        }\n        serde_json::Value::String(v) => builder.append_value(v.as_str()),\n        serde_json::Value::Array(values) => {\n            let mut list = builder\n                .try_new_list()\n                .context(\"failed to create variant list\")?;\n            for value in values {\n                append_json_value(value, &mut list)?;\n            }\n            list.finish();\n        }\n        serde_json::Value::Object(fields) => {\n            let mut object = builder\n                .try_new_object()\n                .context(\"failed to create variant object\")?;\n            for (field, value) in fields.iter().sorted_by(|a, b| a.0.cmp(b.0)) {\n                let mut field_builder = ObjectFieldBuilder::new(field.as_str(), &mut object);","sourceCodeStart":606,"sourceCodeEnd":642,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/common/src/types/variant.rs#L606-L642","documentation":"append_json_value converts a serde_json::Value into a Variant builder. For numbers it accepts i64/u64 and f64; any other JSON number form cannot be represented and the conversion bails with this message. `v` is formatted with the JSON value's Display.","triggerScenarios":"Passing serde_json::Value::Number values that are neither as_i64, as_u64 nor as_f64 — in practice JSON numbers like arbitrary-precision/1e999 or NaN-like constructs, or calling from_json_value/append_datum_value on JSON parsed with the `arbitrary_precision` feature where as_* conversions fail.","commonSituations":"Ingesting JSON with huge integers (beyond u64) or extreme floats (inf) from Kafka/HTTP sources, or JSON parsed in arbitrary-precision mode.","solutions":["Ensure JSON numbers fit in i64/u64/f64 before conversion","Pre-normalize oversized numbers to strings in the upstream JSON","Round extreme values with serde_json's Number::from_f64 before appending"],"exampleFix":"// before\nbuilder_from(n.clone())?; // may bail on big numbers\n// after\nif let Some(f) = n.as_f64() {\n    if f.is_finite() { append_float64(f, builder); }\n}","handlingStrategy":"validation","validationCode":"fn json_number_supported(n: &serde_json::Number) -> bool {\n    n.as_i64().is_some() || n.as_u64().is_some() || n.as_f64().map(|f| f.is_finite()).unwrap_or(false)\n}","typeGuard":"fn is_supported_number(n: &serde_json::Number) -> bool {\n    n.as_i64().is_some() || n.as_u64().is_some() || n.as_f64().is_some()\n}","tryCatchPattern":"match append_json_value(&mut builder, &value, ty) {\n    Ok(()) => (),\n    Err(e) if e.to_string().starts_with(\"unsupported JSON number\") => {\n        builder.append_value(value.to_string().as_str()); // fall back to string\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Avoid serde_json arbitrary_precision when feeding variant conversion","Sanitize infinities/NaN and huge numbers before conversion","Encode oversized numbers as strings upstream"],"tags":["rust","json","variant","number"],"backgroundTag":"unsupported-operation","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}