fix: handle sqlglot OptimizeError for DuckDB unnest with JSON access #8083
+46
−7
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
📝 Summary
Closes #8080
🔍 Description of Changes
Problem: Marimo's SQL static analysis fails with
sqlglot.errors.OptimizeError: Alias already usedwhen parsing valid DuckDB syntax usingunnestwith JSON access (e.g.,SELECT unnest([1,2,3])->>'$' FROM (SELECT 1)).Root Cause: The
build_scope()function from sqlglot's optimizer raises anOptimizeErrorwhen SQL contains duplicate aliases. This occurs with:unnestexpressions with JSON access that generate identical internal aliasesSELECT * FROM (SELECT 1 as x), (SELECT 2 as x))This is valid DuckDB syntax but not handled by sqlglot's scope optimizer.
Solution: Wrap the
build_scope()call infind_sql_refs()with a try-except block. WhenOptimizeErroris caught, fall back to extracting table references directly usingexpression.find_all(exp.Table)without scope analysis.Changes:
marimo/_ast/sql_visitor.py: Added error handling forOptimizeErrorwith fallback to direct table extractiontests/_ast/test_sql_visitor.py: Added 3 test cases covering the regression and fallback behavior📋 Checklist