From 3a698bfa79ad95898e6bff3e83de812c7fc7158d Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Mon, 8 Dec 2025 23:22:18 +0100 Subject: [PATCH] Support default ducklake/datatable main in parser --- .../windmill-parser-py/src/asset_parser.rs | 2 +- .../windmill-parser-sql/src/asset_parser.rs | 21 +++++++++++++++++-- .../windmill-parser-ts/src/asset_parser.rs | 6 ++++-- .../windmill-parser/src/asset_parser.rs | 8 +++++-- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/backend/parsers/windmill-parser-py/src/asset_parser.rs b/backend/parsers/windmill-parser-py/src/asset_parser.rs index 17a898655b..e351c180b2 100644 --- a/backend/parsers/windmill-parser-py/src/asset_parser.rs +++ b/backend/parsers/windmill-parser-py/src/asset_parser.rs @@ -108,7 +108,7 @@ impl Visitor for AssetsFinder { if let Expr::Constant(ExprConstant { value: Constant::Str(s), .. }) = &keyword.value { - if let Some((kind, path)) = parse_asset_syntax(s) { + if let Some((kind, path)) = parse_asset_syntax(s, false) { self.assets.push(ParseAssetsResult { kind, path: path.to_string(), diff --git a/backend/parsers/windmill-parser-sql/src/asset_parser.rs b/backend/parsers/windmill-parser-sql/src/asset_parser.rs index 7dc7f3b15e..316f41fe13 100644 --- a/backend/parsers/windmill-parser-sql/src/asset_parser.rs +++ b/backend/parsers/windmill-parser-sql/src/asset_parser.rs @@ -88,7 +88,7 @@ impl AssetCollector { fn handle_string_literal(&mut self, s: &str) { // Check if the string matches our asset syntax patterns - if let Some((kind, path)) = parse_asset_syntax(s) { + if let Some((kind, path)) = parse_asset_syntax(s, false) { if kind == AssetKind::S3Object { self.assets.push(ParseAssetsResult { kind, @@ -191,7 +191,7 @@ impl Visitor for AssetCollector { database_alias, .. } => { - if let Some((kind, path)) = parse_asset_syntax(&database_path.value) { + if let Some((kind, path)) = parse_asset_syntax(&database_path.value, true) { if kind == AssetKind::Ducklake || kind == AssetKind::DataTable || kind == AssetKind::Resource @@ -414,4 +414,21 @@ mod tests { },]) ); } + + #[test] + fn test_sql_asset_parser_default_main() { + let input = r#" + ATTACH 'datatable' AS dl; + INSERT INTO dl.table1 VALUES ('test'); + "#; + let s = parse_assets(input); + assert_eq!( + s.map_err(|e| e.to_string()), + Ok(vec![ParseAssetsResult { + kind: AssetKind::DataTable, + path: "main".to_string(), + access_type: Some(W) + },]) + ); + } } diff --git a/backend/parsers/windmill-parser-ts/src/asset_parser.rs b/backend/parsers/windmill-parser-ts/src/asset_parser.rs index 6ac4c4dd17..2bb910c530 100644 --- a/backend/parsers/windmill-parser-ts/src/asset_parser.rs +++ b/backend/parsers/windmill-parser-ts/src/asset_parser.rs @@ -58,7 +58,7 @@ impl Visit for AssetsFinder { fn visit_lit(&mut self, node: &swc_ecma_ast::Lit) { match node { swc_ecma_ast::Lit::Str(str) => { - if let Some((kind, path)) = parse_asset_syntax(str.value.as_str()) { + if let Some((kind, path)) = parse_asset_syntax(str.value.as_str(), false) { self.assets.push(ParseAssetsResult { kind, path: path.to_string(), @@ -221,7 +221,9 @@ impl AssetsFinder { match arg_value.map(|e| e.expr.as_ref()) { Some(Expr::Lit(Lit::Str(Str { value, .. }))) => { - let path = parse_asset_syntax(&value).map(|(_, p)| p).unwrap_or(&value); + let path = parse_asset_syntax(&value, false) + .map(|(_, p)| p) + .unwrap_or(&value); self.assets .push(ParseAssetsResult { kind, path: path.to_string(), access_type }); } diff --git a/backend/parsers/windmill-parser/src/asset_parser.rs b/backend/parsers/windmill-parser/src/asset_parser.rs index bfde29eb48..f4312902bb 100644 --- a/backend/parsers/windmill-parser/src/asset_parser.rs +++ b/backend/parsers/windmill-parser/src/asset_parser.rs @@ -58,8 +58,12 @@ pub fn merge_assets>(assets: Vec>) -> Vec Option<(AssetKind, &str)> { - if s.starts_with("s3://") { +pub fn parse_asset_syntax(s: &str, enable_default_syntax: bool) -> Option<(AssetKind, &str)> { + if enable_default_syntax && s == "datatable" { + Some((AssetKind::DataTable, "main")) + } else if enable_default_syntax && s == "ducklake" { + Some((AssetKind::Ducklake, "main")) + } else if s.starts_with("s3://") { Some((AssetKind::S3Object, &s[5..])) } else if s.starts_with("res://") { Some((AssetKind::Resource, &s[6..]))