{"record":{"id":"45d8ac152ceb397a","repo":"databendlabs/databend","slug":"failed-to-build-jsonb-object-from-map","errorCode":null,"errorMessage":"failed to build jsonb object from map","messagePattern":"failed to build jsonb object from map","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/query/expression/src/types/variant.rs","lineNumber":337,"sourceCode":"            let kv_col = KvPair::<AnyType, AnyType>::try_downcast_column(&col).unwrap();\n            let mut kvs = BTreeMap::new();\n            for (k, v) in kv_col.iter() {\n                let key = match k {\n                    ScalarRef::String(v) => v.to_string(),\n                    ScalarRef::Number(v) => v.to_string(),\n                    ScalarRef::Decimal(v) => v.to_string(),\n                    ScalarRef::Boolean(v) => v.to_string(),\n                    ScalarRef::Timestamp(v) => timestamp_to_string(v, tz).to_string(),\n                    ScalarRef::Date(v) => date_to_string(v).to_string(),\n                    _ => unreachable!(),\n                };\n                let mut val = vec![];\n                cast_scalar_to_variant(v, tz, &mut val, typ.as_ref());\n                kvs.insert(key, val);\n            }\n            let owned_jsonb =\n                OwnedJsonb::build_object(kvs.iter().map(|(k, v)| (k, RawJsonb::new(&v[..]))))\n                    .expect(\"failed to build jsonb object from map\");\n            buf.extend_from_slice(owned_jsonb.as_ref());\n            return;\n        }\n        ScalarRef::Bitmap(b) => {\n            jsonb::Value::Array(\n                deserialize_bitmap(b)\n                    .unwrap()\n                    .iter()\n                    .map(|x| x.into())\n                    .collect(),\n            )\n            .write_to_vec(buf);\n            return;\n        }\n        ScalarRef::Tuple(fields) => {\n            let owned_jsonb = match table_data_type {\n                Some(TableDataType::Tuple {\n                    fields_name,","sourceCodeStart":319,"sourceCodeEnd":355,"githubUrl":"https://github.com/databendlabs/databend/blob/288d84d76e20a2f8f7173bda9691eb6ece301aa9/src/query/expression/src/types/variant.rs#L319-L355","documentation":"cast_scalar_to_variant converts a Map scalar into a jsonb object by collecting key/value pairs and calling OwnedJsonb::build_object, expecting object construction to succeed. The panic fires when jsonb's build_object errors — typically when the resulting object exceeds jsonb format size limits or encoding fails internally.","triggerScenarios":"Casting a MAP scalar whose serialized size (keys plus values) exceeds jsonb build limits, or containing items that fail jsonb encoding; maps built from very large or deeply nested values.","commonSituations":"Casting large MAP(...) results or map_agg outputs to VARIANT/JSON in queries; wide maps from aggregation hitting the jsonb document size cap.","solutions":["Reduce map size before casting to VARIANT.","Replace expect with error propagation returning a proper ErrorCode for map-to-jsonb build failures.","Enforce a key/value size limit on maps destined for VARIANT conversion."],"exampleFix":"// before\nlet owned_jsonb = OwnedJsonb::build_object(kvs.iter().map(|(k, v)| (k, RawJsonb::new(&v[..]))))\n    .expect(\"failed to build jsonb object from map\");\n// after\nlet owned_jsonb = OwnedJsonb::build_object(kvs.iter().map(|(k, v)| (k, RawJsonb::new(&v[..]))))\n    .map_err(|e| ErrorCode::BadArguments(format!(\"failed to build jsonb object: {e}\")))?;","handlingStrategy":"fallback","validationCode":"if serialized_size(kvs) > MAX_JSONB_OBJECT_SIZE {\n    return Err(ErrorCode::BadArguments(\"map too large to cast to VARIANT\"));\n}","typeGuard":null,"tryCatchPattern":"// Catch panics around cast if it cannot be changed:\nlet result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {\n    cast_scalar_to_variant(v, tz, &mut buf, typ.as_ref());\n}));\nif result.is_err() { /* fail query gracefully or emit NULL variant */ }","preventionTips":["Cap map size before VARIANT casts in queries.","Return a build failure ErrorCode instead of expect when jsonb build_object errors."],"tags":["panic","jsonb","variant","map"],"backgroundTag":"json-serialization-failed","analyzedSha":"288d84d76e20a2f8f7173bda9691eb6ece301aa9","analyzedAt":"2026-09-11T11:29:36.208Z","contentChangedAt":"2026-09-11T11:29:36.208Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}