{"record":{"id":"17eefc982117510d","repo":"risingwavelabs/risingwave","slug":"message","errorCode":null,"errorMessage":"{message}","messagePattern":"\\{message\\}","errorType":"exception","errorClass":"AccessError","httpStatus":null,"severity":"error","filePath":"src/connector/codec/src/decoder/mod.rs","lineNumber":54,"sourceCode":"    #[error(\"Unsupported data type `{ty}`\")]\n    UnsupportedType { ty: String },\n\n    /// CDC auto schema change specific error that may include table context\n    #[error(\"CDC auto schema change error: unsupported data type `{ty}` in table `{table_name}`\")]\n    CdcAutoSchemaChangeError { ty: String, table_name: String },\n\n    #[error(\"Unsupported additional column `{name}`\")]\n    UnsupportedAdditionalColumn { name: String },\n\n    #[error(\"Fail to convert protobuf Any into jsonb: {0}\")]\n    ProtobufAnyToJson(#[source] serde_json::Error),\n\n    /// Parquet parser specific errors\n    #[error(\"Parquet parser error: {message}\")]\n    ParquetParser { message: String },\n\n    /// Errors that are not categorized into variants above.\n    #[error(\"{message}\")]\n    Uncategorized { message: String },\n\n    #[error(transparent)]\n    NotImplemented(#[from] NotImplemented),\n    // NOTE: We intentionally don't embed `anyhow::Error` in `AccessError` since it happens\n    // in record-level and it might be too heavy to capture the backtrace\n    // when creating a new `anyhow::Error`.\n}\n\npub type AccessResult<T = Datum> = std::result::Result<T, AccessError>;\n\n/// Access to a field in the data structure. Created by `AccessBuilder`.\n///\n/// It's the `ENCODE ...` part in `FORMAT ... ENCODE ...`\npub trait Access {\n    /// Accesses `path` in the data structure (*parsed* Avro/JSON/Protobuf data),\n    /// and then converts it to RisingWave `Datum`.\n    ///","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/codec/src/decoder/mod.rs#L36-L72","documentation":"A wrapper variant of the record decoder's AccessError used for Parquet-format parse failures, plus an Uncategorized variant for errors that fit no other variant. RisingWave throws it when a Parquet file's data cannot be decoded or mapped into the expected schema at record level. Backtraces are intentionally not captured to keep per-record error overhead low.","triggerScenarios":"Decoding a Parquet record in a source whose format is Parquet and the underlying parquet crate returns an error: mismatched column types, missing fields with no default, corrupt row groups, or schema drift between the file and the declared RW schema.","commonSituations":"Files written by a producer with a newer/older schema version than the table's columns; Parquet logical types (e.g. decimal, timestamp) that don't match the SQL column types; truncated or partially uploaded files in object storage.","solutions":["Compare the Parquet file schema with the source's declared columns (USE iste what the reader expects) and align column names/types","Add or fix the row schema so missing fields have defaults or are nullable","Re-ingest a non-corrupt version of the file / check producer write completion","If it is genuinely a new error class, check whether upstream risingwave has a dedicated variant; otherwise report with the message"],"exampleFix":"// before: source columns declare fs.pay_time as TIMESTAMP but Parquet stores INT96 string\nCREATE SOURCE t (...) FORMAT PLAIN ENCODE PARQUET;\n// after: align types with file schema\nCREATE SOURCE t (pay_time TIMESTAMP) ... ENCODE PARQUET;","handlingStrategy":"validation","validationCode":"// Before ingesting, verify Parquet schema matches declared columns\nuse parquet::file::reader::{FileReader, SerializedFileReader};\nlet reader = SerializedFileReader::new(file)?;\nlet schema = reader.metadata().file_metadata().schema();\nassert_eq!(schema.get_fields().len(), expected_cols.len(), \"Parquet schema drift\");","typeGuard":null,"tryCatchPattern":"match res {\n    Err(e) if e.to_string().contains(\"Parquet parser error\") => {\n        log::warn!(\"skipping bad record: {e}\");\n        // route to dead-letter / retry ingest with corrected schema\n    }\n    other => other?,\n}","preventionTips":["Pin producer schema versions and validate files against the declared RW schema before loading","Make optional/evolving columns nullable with defaults","Monitor producer schema registry changes and bump the RW source schema in step"],"tags":["parquet","decoder","schema"],"backgroundTag":"schema-validation-failed","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}