{"record":{"id":"bdfded76713f7093","repo":"windmill-labs/windmill","slug":"unsupported-asset-kind-for-sql-parsing","errorCode":null,"errorMessage":"Unsupported asset kind for SQL parsing","messagePattern":"Unsupported asset kind for SQL parsing","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/parsers/windmill-parser-sql-asset/src/asset_parser_utils.rs","lineNumber":13,"sourceCode":"use windmill_parser::asset_parser::{AssetKind, ParseAssetsResult};\n\n// Parse assets from sql snippets inside e.g sql`SELECT * FROM my_table`\npub fn parse_wmill_sdk_sql_assets(\n    kind: AssetKind,\n    asset_name: &str,\n    schema: Option<&str>,\n    sql: &str,\n) -> anyhow::Result<Option<Vec<ParseAssetsResult>>> {\n    let duckdb_conn_prefix = match kind {\n        AssetKind::DataTable => \"datatable\",\n        AssetKind::Ducklake => \"ducklake\",\n        _ => return Err(anyhow::anyhow!(\"Unsupported asset kind for SQL parsing\")),\n    };\n    let sql_with_attach =\n        format!(\"ATTACH '{duckdb_conn_prefix}://{asset_name}' AS dt; USE dt; {sql}\");\n\n    // We use the SQL parser to detect if it's a read or write query\n    match crate::parse_assets(&sql_with_attach) {\n        Ok(mut sql_assets) => {\n            if let Some(schema) = schema {\n                for asset in &mut sql_assets.assets {\n                    if asset.kind == kind && asset.path.starts_with(asset_name) {\n                        asset.path = format!(\n                            \"{}/{}.{}\",\n                            asset_name,\n                            schema,\n                            &asset.path[asset_name.len() + 1..]\n                        );\n                    }\n                }","sourceCodeStart":1,"sourceCodeEnd":31,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/backend/parsers/windmill-parser-sql-asset/src/asset_parser_utils.rs#L1-L31","documentation":"The SQL asset parser (`windmill-parser-sql-asset`) only knows how to parse SQL assets that reference DuckDB-backed connection kinds: DataTable and Ducklake. `parse_wmill_sdk_sql_assets` rejects any other `AssetKind` with this message. It is a deliberate guard, not a parse failure: those other asset kinds don't map to a DuckDB `ATTACH` prefix.","triggerScenarios":"Calling `parse_wmill_sdk_sql_assets` (directly or via the asset-parsing pipeline) with `kind` set to any AssetKind variant other than `DataTable` or `Ducklake` — e.g. an S3 bucket, warehouse table, or any newly added AssetKind variant that hasn't been wired into this match arm.","commonSituations":"A contributor adds a new AssetKind variant and forgets to extend the match in asset_parser_utils.rs; a caller iterates over all assets of a script without filtering by kind first; a refactor re-routes a non-DuckDB asset kind into the SQL asset parser by mistake.","solutions":["Filter assets to `AssetKind::DataTable` and `AssetKind::Ducklake` before calling `parse_wmill_sdk_sql_assets`.","If a new AssetKind must be supported, add a `duckdb_conn_prefix` arm for it in the match at asset_parser_utils.rs:13 and rebuild.","For non-SQL asset kinds, use the asset kind's own parser instead of the SQL one."],"exampleFix":"// before\nparse_wmill_sdk_sql_assets(AssetKind::S3Bucket, &asset_name, schema, sql)?\n\n// after\nmatch kind {\n    AssetKind::DataTable | AssetKind::Ducklake => {\n        parse_wmill_sdk_sql_assets(kind, &asset_name, schema, sql)?\n    }\n    _ => Ok(None), // handled elsewhere\n}","handlingStrategy":"type-guard","validationCode":"// Rust: filter to supported kinds before the call\nfn sql_asset_parseable(kind: AssetKind) -> bool {\n    matches!(kind, AssetKind::DataTable | AssetKind::Ducklake)\n}","typeGuard":"fn is_sql_parseable_asset(kind: &AssetKind) -> bool {\n    matches!(kind, AssetKind::DataTable | AssetKind::Ducklake)\n}","tryCatchPattern":"// Rust\nmatch parse_wmill_sdk_sql_assets(kind, &name, schema, sql) {\n    Ok(assets) => assets,\n    Err(e) if e.to_string().contains(\"Unsupported asset kind\") => {\n        log::debug!(\"asset kind {kind:?} not SQL-parseable, skipping\");\n        None\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Route assets to the SQL parser only after checking kind in {DataTable, Ducklake}.","When adding a new AssetKind variant, run a match-exhaustiveness check and update this parser in the same PR.","Treat non-DuckDB asset kinds with their own parsers, never the SQL one."],"tags":["sql","duckdb","assets","unsupported-kind","parsing"],"backgroundTag":"unsupported-asset-kind","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"}