windmill-labs/windmill · error

CSV S3 input requires the `parquet` feature to be enabled on

Error message

CSV S3 input requires the `parquet` feature to be enabled on this build

What it means

Like the Parquet decoder, the CSV-to-JSON-array decoder for S3 file inputs lives behind the `parquet` cargo feature (it shares the blocking-thread decode infrastructure). Builds without the feature stub it out and bail with this message.

Source

Thrown at backend/windmill-object-store/src/lib.rs:1652

            .map_err(to_anyhow)?;

        let mut out: Vec<u8> = Vec::new();
        let mut writer = json::Writer::<_, JsonArray>::new(&mut out);
        for batch in reader {
            let batch = batch.map_err(to_anyhow)?;
            writer.write(&batch).map_err(to_anyhow)?;
        }
        writer.finish().map_err(to_anyhow)?;
        drop(writer);
        String::from_utf8(out).map_err(to_anyhow)
    })
    .await
    .map_err(to_anyhow)?
}

#[cfg(not(feature = "parquet"))]
pub async fn decode_csv_bytes_to_json_array(_bytes: bytes::Bytes) -> anyhow::Result<String> {
    anyhow::bail!("CSV S3 input requires the `parquet` feature to be enabled on this build")
}

lazy_static::lazy_static! {
    pub static ref S3_PROXY_LAST_ERRORS_CACHE: Cache<String, String> = Cache::new(4);
}

#[cfg(feature = "parquet")]
pub async fn get_logs_from_store(
    log_offset: i32,
    logs: &str,
    log_file_index: &Option<Vec<String>>,
) -> Option<impl futures::Stream<Item = Result<bytes::Bytes, object_store::Error>>> {
    if log_offset > 0 {
        if let Some(file_index) = log_file_index.clone() {
            if file_index.iter().any(|p| !is_safe_log_file_path(p)) {
                return None;
            }
            if let Some(os) = get_object_store().await {

View on GitHub (pinned to e474e8803c)

Solutions

  1. Rebuild the backend with the parquet feature enabled
  2. Use the official Windmill image with the feature included
  3. Fetch and parse the CSV inside the script (e.g. via HTTP/S3 client) instead of using S3 file inputs

Example fix

// before
cargo build
// after
cargo build --features parquet
Defensive patterns

Strategy: validation

Validate before calling

// guard CSV S3 inputs on feature-less builds
if file_extension == "csv" && !cfg!(feature = "parquet") {
  return Err(anyhow!("csv s3 input needs the parquet feature in this build"));
}

Try / catch

match decode_csv_bytes_to_json_array(bytes).await {
  Err(e) if e.to_string().contains("CSV S3 input") =>
    eprintln!("rebuild with --features parquet or parse CSV in-script"),
  Err(e) => return Err(e.into()),
  Ok(json) => json,
}

Prevention

When it happens

Trigger: Processing an S3 input CSV file via decode_csv_bytes_to_json_array on a backend built without the `parquet` feature.

Common situations: Source-compiled backends handling S3 CSV inputs; the CSV path is gated together with parquet, which surprises users who expect plain CSV support.

Related errors


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/308f7ea8132ae9c7. Report an issue: GitHub.