windmill-labs/windmill · error
Invalid S3 mode format: {}
Error message
Invalid S3 mode format: {} What it means
windmill-parser-sql parses S3 mode options passed to SQL scripts (e.g. `s3://...?prefix=x&storage=y&format=csv` style key-value pairs). parse_s3_mode accepts only format values json, parquet, or csv; any other format value makes the parser fail fast with this message so the invalid S3 config never reaches job execution.
Source
Thrown at backend/parsers/windmill-parser-sql/src/lib.rs:188
let mut prefix = None;
let mut storage = None;
let mut format = S3ModeFormat::Json;
for kv in args_str.split(' ').map(|kv| kv.trim()) {
if kv.is_empty() {
continue;
}
let mut it = kv.split('=');
let (Some(key), Some(value)) = (it.next(), it.next()) else {
return Err(anyhow!("Invalid S3 mode argument: {}", kv));
};
match (key.trim(), value.trim()) {
("prefix", _) => prefix = Some(value.to_string()),
("storage", _) => storage = Some(value.to_string()),
("format", "json") => format = S3ModeFormat::Json,
("format", "parquet") => format = S3ModeFormat::Parquet,
("format", "csv") => format = S3ModeFormat::Csv,
("format", format) => return Err(anyhow!("Invalid S3 mode format: {}", format)),
(_, _) => return Err(anyhow!("Invalid S3 mode argument: {}", kv)),
}
}
Ok(Some(S3ModeArgs { prefix, storage, format }))
}
pub fn parse_sql_blocks(code: &str, track_dollar_quotes: bool) -> Vec<&str> {
let mut blocks = vec![];
let mut last_idx = 0;
run_on_sql_statement_matches(
code,
track_dollar_quotes,
|char, _| char == ';',
|idx, _| {
blocks.push(&code[last_idx..=idx]);
last_idx = idx + 1;View on GitHub (pinned to e474e8803c)
Solutions
- Change the format value to one of json, parquet, or csv
- Check for case mismatches — the match is lowercase-exact
- If you need another format, it is unsupported by the parser; use one of the three supported ones
Example fix
// before s3mode=prefix=/data,storage=s3,format=avro // after s3mode=prefix=/data,storage=s3,format=parquet
Defensive patterns
Strategy: validation
Validate before calling
const SUPPORTED = new Set(['json', 'parquet', 'csv']);
function validateS3ModeFormat(format) {
if (!SUPPORTED.has(format)) throw new Error(`Invalid S3 mode format: ${format}. Use json, parquet, or csv.`);
}
validateS3ModeFormat('parquet'); // call before deploy/parse Type guard
function isS3ModeFormat(v) { return v === 'json' || v === 'parquet' || v === 'csv'; } Try / catch
try {
parseSqlWithS3Mode(script);
} catch (e) {
if (String(e).includes('Invalid S3 mode format')) {
// surface a config-validation message to the user
} else throw e;
} Prevention
- Keep format values lowercase and in {json,parquet,csv}
- Validate S3 mode strings in the editor before deploying
- Copy configs only from documented examples
When it happens
Trigger: Calling any SQL parse entrypoint (do_bigquery, do_mssql, do_mysql, do_oracledb, do_postgresql, do_snowflake) with an S3 mode argument whose `format` key has a value outside {json, parquet, csv}, e.g. `format=avro` or `format=JSON` (case-sensitive).
Common situations: Typos in format names, uppercase/lowercase mismatch, copying configs from other tools that support more formats (avro, orc), or hand-editing a script's S3 settings in the UI YAML.
Related errors
- Invalid AI agent provider configuration: ${errors.join('\n')
- API key or resource path is required
- Missing a model to test
- Cannot test API key for Custom AI, only resource path is sup
- deleteS3File: s3 key is required
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/b6f7fb973d5f22d7.
Report an issue: GitHub.