{"record":{"id":"f55796e7e6d90638","repo":"databendlabs/databend","slug":"failed-to-build-jsonb-array","errorCode":null,"errorMessage":"failed to build jsonb array","messagePattern":"failed to build jsonb array","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/query/expression/src/types/variant.rs","lineNumber":308,"sourceCode":"        }),\n        ScalarRef::Date(d) => jsonb::Value::Date(jsonb::Date { value: d }),\n        ScalarRef::Interval(i) => {\n            let interval = jsonb::Interval {\n                months: i.months(),\n                days: i.days(),\n                micros: i.microseconds(),\n            };\n            jsonb::Value::Interval(interval)\n        }\n        ScalarRef::Array(col) => {\n            let typ = if let Some(TableDataType::Array(typ)) = table_data_type {\n                Some(typ.remove_nullable())\n            } else {\n                None\n            };\n            let items = cast_scalars_to_variants(col.iter(), tz, typ.as_ref());\n            let owned_jsonb = OwnedJsonb::build_array(items.iter().map(RawJsonb::new))\n                .expect(\"failed to build jsonb array\");\n            buf.extend_from_slice(owned_jsonb.as_ref());\n            return;\n        }\n        ScalarRef::Map(col) => {\n            let typ = if let Some(TableDataType::Map(typ)) = table_data_type {\n                Some(typ.remove_nullable())\n            } else {\n                None\n            };\n\n            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(),","sourceCodeStart":290,"sourceCodeEnd":326,"githubUrl":"https://github.com/databendlabs/databend/blob/288d84d76e20a2f8f7173bda9691eb6ece301aa9/src/query/expression/src/types/variant.rs#L290-L326","documentation":"cast_scalar_to_variant converts an Array scalar into a jsonb value; it collects per-element variants and calls OwnedJsonb::build_array, expecting array construction to succeed. The panic fires when jsonb's build_array returns an error — typically because the accumulated document exceeds jsonb size limits (depth/size constraints of the jsonb format), or an internal jsonb encoding failure.","triggerScenarios":"Casting an ARRAY scalar with a very large number of elements or very large encoded items such that the built jsonb exceeds internal size limits; recursive cast_scalar_to_variant → cast_scalars_to_variants on deeply nested arrays.","commonSituations":"Queries constructing huge arrays via ARRAY(...) or array_agg then casting to VARIANT/JSON; deeply nested array literals blowing jsonb depth limits during expression evaluation.","solutions":["Reduce array size/nesting before casting to VARIANT.","Replace expect with error propagation returning ErrorCode (e.g. jsonb build failure) to fail the query gracefully.","Check jsonb crate limits and enforce an application-level limit on array length in cast functions."],"exampleFix":"// before\nlet owned_jsonb = OwnedJsonb::build_array(items.iter().map(RawJsonb::new))\n    .expect(\"failed to build jsonb array\");\n// after\nlet owned_jsonb = OwnedJsonb::build_array(items.iter().map(RawJsonb::new))\n    .map_err(|e| ErrorCode::BadArguments(format!(\"failed to build jsonb array: {e}\")))?;","handlingStrategy":"fallback","validationCode":"if items.len() > MAX_JSONB_ARRAY_ITEMS {\n    return Err(ErrorCode::BadArguments(\"array 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(scalar, tz, &mut buf, table_data_type);\n}));\nif result.is_err() { /* fail query gracefully or emit NULL variant */ }","preventionTips":["Cap array size/nesting before VARIANT casts in queries.","Prefer explicit size-limit errors over reaching jsonb build limits."],"tags":["panic","jsonb","variant","array"],"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"}