{"record":{"id":"b0d2fd28187d994c","repo":"windmill-labs/windmill","slug":"parquet-s3-input-requires-the-parquet-feature-to","errorCode":null,"errorMessage":"Parquet S3 input requires the `parquet` feature to be enabled on this build","messagePattern":"Parquet S3 input requires the `parquet` feature to be enabled on this build","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/windmill-object-store/src/lib.rs","lineNumber":1612,"sourceCode":"        let reader = builder.build().map_err(to_anyhow)?;\n\n        let mut out: Vec<u8> = Vec::new();\n        let mut writer = json::Writer::<_, JsonArray>::new(&mut out);\n        for batch in reader {\n            let batch = batch.map_err(to_anyhow)?;\n            writer.write(&batch).map_err(to_anyhow)?;\n        }\n        writer.finish().map_err(to_anyhow)?;\n        drop(writer);\n        String::from_utf8(out).map_err(to_anyhow)\n    })\n    .await\n    .map_err(to_anyhow)?\n}\n\n#[cfg(not(feature = \"parquet\"))]\npub async fn decode_parquet_bytes_to_json_array(_bytes: bytes::Bytes) -> anyhow::Result<String> {\n    anyhow::bail!(\"Parquet S3 input requires the `parquet` feature to be enabled on this build\")\n}\n\n/// Decode the bytes of a CSV file into a JSON array text using the first row as headers.\n/// Same blocking-thread pattern as the parquet decoder.\n#[cfg(feature = \"parquet\")]\npub async fn decode_csv_bytes_to_json_array(bytes: bytes::Bytes) -> anyhow::Result<String> {\n    use datafusion::arrow::csv::ReaderBuilder;\n    use std::io::Cursor;\n\n    task::spawn_blocking(move || {\n        let cursor = Cursor::new(bytes);\n        // Two-pass: infer schema from the bytes, then build the reader. The infer step\n        // rewinds the underlying reader for us.\n        let (schema, _) = datafusion::arrow::csv::reader::Format::default()\n            .with_header(true)\n            .infer_schema(Cursor::new(&cursor.get_ref()[..]), Some(1024))\n            .map_err(to_anyhow)?;\n","sourceCodeStart":1594,"sourceCodeEnd":1630,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/backend/windmill-object-store/src/lib.rs#L1594-L1630","documentation":"The S3 object-store integration can decode Parquet input files into JSON arrays, but the decoder exists only when the backend is built with the `parquet` cargo feature. The feature-gated stub bails with this message when S3 file inputs of Parquet type are processed without the feature.","triggerScenarios":"Processing an S3 input file in Parquet format (decode_parquet_bytes_to_json_array) on a backend built without `--features parquet`.","commonSituations":"Self-compiled backends using S3 resource file inputs in Parquet format; official images include the feature, source builds may not.","solutions":["Rebuild the backend with the parquet feature enabled (e.g. `cargo build --features parquet, ...`)","Use the official Windmill image which ships the parquet feature","Convert the input file to CSV or JSON and use that input type instead"],"exampleFix":"// before\ncargo build\n// after\ncargo build --features parquet","handlingStrategy":"validation","validationCode":"// check the file type before choosing the S3 input path\nif file_extension == \"parquet\" && !cfg!(feature = \"parquet\") {\n  return Err(anyhow!(\"parquet input unsupported in this build\"));\n}","typeGuard":null,"tryCatchPattern":"match decode_parquet_bytes_to_json_array(bytes).await {\n  Err(e) if e.to_string().contains(\"parquet` feature\") =>\n    eprintln!(\"use a parquet-enabled build or convert to CSV/JSON\"),\n  Err(e) => return Err(e.into()),\n  Ok(json) => json,\n}","preventionTips":["Enable the parquet cargo feature when using S3 file inputs","Convert inputs to CSV/JSON if the build lacks parquet","Verify build features match the file formats your flows consume"],"tags":["s3","parquet","feature-flag","object-store"],"backgroundTag":"missing-cargo-feature","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}