{"record":{"id":"42f7ab7736fba7fb","repo":"risingwavelabs/risingwave","slug":"schema-id-should-be-a-u64","errorCode":null,"errorMessage":"schema_id should be a u64","messagePattern":"schema_id should be a u64","errorType":"exception","errorClass":"SinkError::Iceberg","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/iceberg/commit.rs","lineNumber":84,"sourceCode":"\n        Self::try_from_serialized_bytes(&value.metadata)\n    }\n\n    pub fn try_from_serialized_bytes(value: &[u8]) -> Result<Self> {\n        let mut values = if let serde_json::Value::Object(value) =\n            serde_json::from_slice::<serde_json::Value>(value)\n                .context(\"Can't parse iceberg sink metadata\")?\n        {\n            value\n        } else {\n            bail!(\"iceberg sink metadata should be an object\");\n        };\n\n        let schema_id;\n        if let Some(serde_json::Value::Number(value)) = values.remove(SCHEMA_ID) {\n            schema_id = value\n                .as_u64()\n                .ok_or_else(|| anyhow!(\"schema_id should be a u64\"))?;\n        } else {\n            bail!(\"iceberg sink metadata should have schema_id\");\n        }\n\n        let partition_spec_id;\n        if let Some(serde_json::Value::Number(value)) = values.remove(PARTITION_SPEC_ID) {\n            partition_spec_id = value\n                .as_u64()\n                .ok_or_else(|| anyhow!(\"partition_spec_id should be a u64\"))?;\n        } else {\n            bail!(\"iceberg sink metadata should have partition_spec_id\");\n        }\n\n        let data_files: Vec<SerializedDataFile>;\n        if let serde_json::Value::Array(values) = values\n            .remove(DATA_FILES)\n            .ok_or_else(|| anyhow!(\"iceberg sink metadata should have data_files object\"))?\n        {","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/iceberg/commit.rs#L66-L102","documentation":"Iceberg sink metadata JSON must contain a `schema_id` key holding an unsigned 64-bit integer. If the `schema_id` key exists but its JSON number cannot be represented as u64 (negative or fractional), `try_from_serialized_bytes` bails with this error.","triggerScenarios":"Metadata JSON contains `schema_id` as a negative number or a float (e.g. -1, 1.5), so `serde_json::Number::as_u64()` returns None during Iceberg sink commit.","commonSituations":"Hand-crafted or corrupted metadata JSON; serialization produced by a buggy/older writer; schema_id overflow when converted from another numeric type upstream.","solutions":["Fix the metadata JSON so schema_id is a non-negative integer matching the table's schema id","Check the writer version that produced the metadata for known serialization bugs","Re-commit from regenerated metadata or recreate the sink if metadata is unrecoverable","Validate schema_id values upstream before serializing into sink metadata"],"exampleFix":"// before (metadata JSON)\n{\"schema_id\": -1, ...}\n// after\n{\"schema_id\": 3, ...}","handlingStrategy":"validation","validationCode":"if let Some(n) = json_obj.get(\"schema_id\") {\n    if n.as_u64().is_none() {\n        return Err(\"schema_id must be a non-negative integer\".into());\n    }\n}","typeGuard":"fn valid_schema_id(v: &serde_json::Value) -> Option<u64> {\n    v.get(\"schema_id\").and_then(|n| n.as_u64())\n}","tryCatchPattern":"match result {\n    Err(e) if e.to_string().contains(\"schema_id should be a u64\") => {\n        // regenerate metadata or correct schema_id in stored JSON\n    }\n    other => other?,\n}","preventionTips":["Serialize schema_id as a plain non-negative integer","Validate metadata JSON keys before persisting","Guard against schema_id overflow/negativity upstream"],"tags":["sink","iceberg","json","metadata","type-mismatch"],"backgroundTag":"invalid-argument-value","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"}