polyglot-sql 0.9.2__tar.gz → 0.11.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/Cargo.lock +6 -6
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/Cargo.toml +1 -1
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/PKG-INFO +75 -2
- {polyglot_sql-0.9.2/crates/polyglot-sql-python → polyglot_sql-0.11.0}/README.md +74 -1
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/Cargo.toml +2 -2
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/README.md +9 -4
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/benches/performance_hotspots.rs +1 -0
- polyglot_sql-0.9.2/crates/polyglot-sql/src/builder/engine.rs → polyglot_sql-0.11.0/crates/polyglot-sql/src/ast_mutation.rs +8 -4
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/ast_transforms.rs +1 -1
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/builder/mod.rs +33 -1
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/builder/plan.rs +2 -1
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/bigquery.rs +1 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/clickhouse.rs +1 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/duckdb.rs +150 -13
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/fabric.rs +2 -2
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/mod.rs +3 -2
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/mysql.rs +7 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +1 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/normalization/collections.rs +5 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +18 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/normalization/types.rs +1 -3
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/postgres.rs +2 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/snowflake.rs +9 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/tsql.rs +1 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/error.rs +2 -2
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/expressions.rs +117 -4
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/generator.rs +122 -48
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/guard.rs +48 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/lib.rs +7 -4
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/lineage.rs +138 -9
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/annotate_types.rs +1499 -87
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/mod.rs +24 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +335 -117
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/simplify.rs +24 -6
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/subquery.rs +26 -1
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/parser.rs +2910 -1251
- polyglot_sql-0.11.0/crates/polyglot-sql/src/query_analysis/column_uses.rs +735 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/query_analysis.rs +86 -5
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/resolver.rs +46 -4
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/scope.rs +96 -17
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/tokens.rs +26 -9
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/transforms.rs +2 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/validation/tests.rs +328 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/validation.rs +269 -219
- polyglot_sql-0.11.0/crates/polyglot-sql/tests/data_type_api.rs +251 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/deep_nesting_regression.rs +142 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/query_analysis.rs +949 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/sqlglot_compat.rs +118 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/tsql_regression.rs +20 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-function-catalogs/README.md +1 -1
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0/crates/polyglot-sql-python}/README.md +74 -1
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/lib.rs +1 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/transpile.rs +33 -1
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/types.rs +14 -0
- polyglot_sql-0.11.0/crates/polyglot-sql-python/src/validate.rs +55 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_generate.py +33 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_parse.py +70 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_query_analysis.py +62 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_transpile.py +36 -0
- polyglot_sql-0.11.0/crates/polyglot-sql-python/tests/test_validate.py +173 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/python/polyglot_sql/__init__.py +20 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/python/polyglot_sql/__init__.pyi +56 -3
- polyglot_sql-0.9.2/crates/polyglot-sql/tests/data_type_api.rs +0 -86
- polyglot_sql-0.9.2/crates/polyglot-sql-python/src/validate.rs +0 -23
- polyglot_sql-0.9.2/crates/polyglot-sql-python/tests/test_validate.py +0 -53
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/benches/in_list.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/benches/lineage.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/benches/parsing.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/benches/transpile.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/examples/bench_json.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/ast_children.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/ast_json.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/normalization/mod.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/normalization/operators.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/normalization/statements.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/presto.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/diff.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/format_tokens.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/function_catalog.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/function_registry.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/helper.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/openlineage.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/planner.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/schema.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/set_operation.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/time.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/traversal.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/src/trie.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/common/known_failures.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/common/mod.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/dialect_matrix.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/error_handling.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/Cargo.toml +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/docs/api.md +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/docs/index.md +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/mkdocs.yml +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/builders.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/dialects.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/diff.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/errors.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/expr.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/format.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/generate.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/helpers.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/lineage.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/optimize.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/parse.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/query_analysis.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/src/transforms.rs +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/conftest.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_builders.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_format.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/crates/polyglot-sql-python/uv.lock +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/pyproject.toml +0 -0
- {polyglot_sql-0.9.2 → polyglot_sql-0.11.0}/python/polyglot_sql/py.typed +0 -0
|
@@ -605,7 +605,7 @@ dependencies = [
|
|
|
605
605
|
|
|
606
606
|
[[package]]
|
|
607
607
|
name = "polyglot-sql"
|
|
608
|
-
version = "0.
|
|
608
|
+
version = "0.11.0"
|
|
609
609
|
dependencies = [
|
|
610
610
|
"criterion",
|
|
611
611
|
"once_cell",
|
|
@@ -623,7 +623,7 @@ dependencies = [
|
|
|
623
623
|
|
|
624
624
|
[[package]]
|
|
625
625
|
name = "polyglot-sql-ast-derive"
|
|
626
|
-
version = "0.
|
|
626
|
+
version = "0.11.0"
|
|
627
627
|
dependencies = [
|
|
628
628
|
"proc-macro2",
|
|
629
629
|
"quote",
|
|
@@ -632,7 +632,7 @@ dependencies = [
|
|
|
632
632
|
|
|
633
633
|
[[package]]
|
|
634
634
|
name = "polyglot-sql-ffi"
|
|
635
|
-
version = "0.
|
|
635
|
+
version = "0.11.0"
|
|
636
636
|
dependencies = [
|
|
637
637
|
"cbindgen",
|
|
638
638
|
"polyglot-sql",
|
|
@@ -642,11 +642,11 @@ dependencies = [
|
|
|
642
642
|
|
|
643
643
|
[[package]]
|
|
644
644
|
name = "polyglot-sql-function-catalogs"
|
|
645
|
-
version = "0.
|
|
645
|
+
version = "0.11.0"
|
|
646
646
|
|
|
647
647
|
[[package]]
|
|
648
648
|
name = "polyglot-sql-python"
|
|
649
|
-
version = "0.
|
|
649
|
+
version = "0.11.0"
|
|
650
650
|
dependencies = [
|
|
651
651
|
"polyglot-sql",
|
|
652
652
|
"pyo3",
|
|
@@ -657,7 +657,7 @@ dependencies = [
|
|
|
657
657
|
|
|
658
658
|
[[package]]
|
|
659
659
|
name = "polyglot-sql-wasm"
|
|
660
|
-
version = "0.
|
|
660
|
+
version = "0.11.0"
|
|
661
661
|
dependencies = [
|
|
662
662
|
"console_error_panic_hook",
|
|
663
663
|
"js-sys",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: polyglot-sql
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.11.0
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -110,6 +110,26 @@ polyglot_sql.generate(ast)
|
|
|
110
110
|
# ["SELECT id FROM a UNION ALL SELECT id FROM b ORDER BY id LIMIT 100 OFFSET 10"]
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
+
### Complexity Guard Options
|
|
114
|
+
|
|
115
|
+
`transpile` also accepts `complexity_guard`, a `ComplexityGuardOptions` typed dictionary
|
|
116
|
+
using the shared camelCase keys: `maxParserDepth`, `maxInputBytes`, `maxTokens`,
|
|
117
|
+
`maxAstNodes`, `maxAstDepth`, `maxParenthesisDepth`, and `maxFunctionCallDepth`.
|
|
118
|
+
Omit the argument, pass `None`, or omit a key to use its default. A field-level `None`
|
|
119
|
+
disables that check; a nonnegative integer overrides it. For example:
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
polyglot_sql.transpile(sql, complexity_guard={"maxParserDepth": 128})
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Parser depth defaults to 1024 logical levels on native targets (32 on WASM) and is
|
|
126
|
+
checked during parsing, before an AST exists. Zero rejects parsing descents.
|
|
127
|
+
Other checks remain independent.
|
|
128
|
+
Raising or disabling limits can permit stack exhaustion and process termination,
|
|
129
|
+
even for trusted generated SQL. Increasing a limit does not increase stack space;
|
|
130
|
+
these limits are not general time/memory budgets. Application owners should control
|
|
131
|
+
overrides. Parsing APIs without guard options inherit the default protection.
|
|
132
|
+
|
|
113
133
|
### Format Guard Behavior
|
|
114
134
|
|
|
115
135
|
`format_sql` uses Rust core formatting guards with default limits:
|
|
@@ -150,6 +170,29 @@ if result:
|
|
|
150
170
|
print("valid")
|
|
151
171
|
```
|
|
152
172
|
|
|
173
|
+
Schema-aware validation uses the same Rust validator as the TypeScript SDK:
|
|
174
|
+
|
|
175
|
+
```python
|
|
176
|
+
sql = "SELECT o.order_id FROM orders o WHERE o.missing_column = TRUE"
|
|
177
|
+
schema = {"tables": [{"name": "orders", "columns": [{"name": "order_id", "type": "INT"}]}]}
|
|
178
|
+
result = polyglot_sql.validate_with_schema(
|
|
179
|
+
sql, schema, dialect="snowflake", check_types=True, check_references=True,
|
|
180
|
+
)
|
|
181
|
+
for error in result.errors:
|
|
182
|
+
print(error.code, error.message)
|
|
183
|
+
if error.start is not None and error.end is not None:
|
|
184
|
+
print(sql[error.start:error.end])
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Unknown tables, columns and aliases are checked by default. `check_references`
|
|
188
|
+
also checks ambiguous columns and foreign-key metadata; `check_types` enables
|
|
189
|
+
type checks. `strict` overrides the schema's `strict` value, which defaults to
|
|
190
|
+
`True`; `strict=False` reports reference/type findings as warnings. An empty
|
|
191
|
+
column list or a `*` column denotes an open schema, so unknown columns are not
|
|
192
|
+
rejected solely because their names are absent. Nonempty lists without `*`
|
|
193
|
+
are treated as complete. Options use snake_case keyword arguments, not an
|
|
194
|
+
`options` dictionary. Invalid schemas and unknown dialects raise `ValueError`.
|
|
195
|
+
|
|
153
196
|
```python
|
|
154
197
|
options = {
|
|
155
198
|
"producer": "https://github.com/tobilg/polyglot",
|
|
@@ -195,6 +238,26 @@ print(analysis["baseTables"][0]["name"]) # "orders"
|
|
|
195
238
|
print(analysis["baseTables"][0]["table"]) # "orders"
|
|
196
239
|
```
|
|
197
240
|
|
|
241
|
+
Non-projection uses are available through the same shared Rust analysis:
|
|
242
|
+
|
|
243
|
+
```python
|
|
244
|
+
analysis = polyglot_sql.analyze_query(
|
|
245
|
+
"SELECT o.id FROM orders o WHERE o.amount > 0", dialect="duckdb"
|
|
246
|
+
)
|
|
247
|
+
use = analysis["columnUses"][0]
|
|
248
|
+
print(use["context"]) # "filter"
|
|
249
|
+
print(use["references"][0]["column"]) # "amount"
|
|
250
|
+
print(use["scopePath"]) # "root"
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
`columnUses` groups references by clause expression without changing projection
|
|
254
|
+
lineage. It covers joins, filters, grouping, HAVING/QUALIFY, window keys/frames,
|
|
255
|
+
ordering and set-operation filter inputs. `scopePath`/`expressionPath` identify
|
|
256
|
+
the scope and expression; `expressionSql` is dialect-rendered SQL. Optional
|
|
257
|
+
`span` objects use half-open Unicode-character offsets in the original input.
|
|
258
|
+
Reference spans locate uses, not upstream definitions. Unknown or ambiguous
|
|
259
|
+
sources remain conservative; whole-expression spans are omitted when unavailable.
|
|
260
|
+
|
|
198
261
|
`analysis["relations"]` reports sources visible in the analyzed scope.
|
|
199
262
|
`analysis["baseTables"]` reports deduplicated physical table dependencies across
|
|
200
263
|
nested CTEs, derived tables, subqueries, and set-operation branches. For
|
|
@@ -259,6 +322,7 @@ All functions are exported from `polyglot_sql`.
|
|
|
259
322
|
- `format_sql(sql: str, dialect: str = "generic", *, max_input_bytes: int | None = None, max_tokens: int | None = None, max_ast_nodes: int | None = None, max_set_op_chain: int | None = None) -> str`
|
|
260
323
|
- `format(sql: str, dialect: str = "generic", *, max_input_bytes: int | None = None, max_tokens: int | None = None, max_ast_nodes: int | None = None, max_set_op_chain: int | None = None) -> str` (alias of `format_sql`)
|
|
261
324
|
- `validate(sql: str, dialect: str = "generic", *, strict_syntax: bool = False, semantic: bool = False) -> ValidationResult`
|
|
325
|
+
- `validate_with_schema(sql: str, schema: dict, dialect: str = "generic", *, check_types: bool = False, check_references: bool = False, strict: bool | None = None, semantic: bool = False, strict_syntax: bool = False) -> ValidationResult`
|
|
262
326
|
- `optimize(sql: str, dialect: str = "generic") -> str`
|
|
263
327
|
- `lineage(column: str, sql: str, dialect: str = "generic") -> dict`
|
|
264
328
|
- `lineage_at(ordinal: int, sql: str, dialect: str = "generic") -> dict`
|
|
@@ -294,7 +358,8 @@ Exception hierarchy:
|
|
|
294
358
|
|
|
295
359
|
Unknown dialect names raise built-in `ValueError`.
|
|
296
360
|
|
|
297
|
-
`validate(...)`
|
|
361
|
+
`validate(...)` and `validate_with_schema(...)` return `ValidationResult`:
|
|
362
|
+
|
|
298
363
|
- `result.valid: bool`
|
|
299
364
|
- `result.errors: list[ValidationErrorInfo]`
|
|
300
365
|
- `bool(result)` works (`True` when valid)
|
|
@@ -305,11 +370,19 @@ clause boundaries. `semantic=True` adds warning diagnostics W001-W004 for
|
|
|
305
370
|
`LIMIT` without `ORDER BY`; warnings do not make the result invalid.
|
|
306
371
|
|
|
307
372
|
Each `ValidationErrorInfo` has:
|
|
373
|
+
|
|
308
374
|
- `message: str`
|
|
309
375
|
- `line: int`
|
|
310
376
|
- `col: int`
|
|
311
377
|
- `code: str`
|
|
312
378
|
- `severity: str`
|
|
379
|
+
- `start: int | None` (zero-based Unicode character offset)
|
|
380
|
+
- `end: int | None` (exclusive Unicode character offset)
|
|
381
|
+
|
|
382
|
+
Source ranges refer to the original SQL and support Python string slicing.
|
|
383
|
+
Reference diagnostics point to the offending identifier when available;
|
|
384
|
+
synthetic or schema-only findings have no source range. Existing `line` and
|
|
385
|
+
`col` fields remain integers and use `0` when unavailable.
|
|
313
386
|
|
|
314
387
|
## Performance Note
|
|
315
388
|
|
|
@@ -83,6 +83,26 @@ polyglot_sql.generate(ast)
|
|
|
83
83
|
# ["SELECT id FROM a UNION ALL SELECT id FROM b ORDER BY id LIMIT 100 OFFSET 10"]
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
+
### Complexity Guard Options
|
|
87
|
+
|
|
88
|
+
`transpile` also accepts `complexity_guard`, a `ComplexityGuardOptions` typed dictionary
|
|
89
|
+
using the shared camelCase keys: `maxParserDepth`, `maxInputBytes`, `maxTokens`,
|
|
90
|
+
`maxAstNodes`, `maxAstDepth`, `maxParenthesisDepth`, and `maxFunctionCallDepth`.
|
|
91
|
+
Omit the argument, pass `None`, or omit a key to use its default. A field-level `None`
|
|
92
|
+
disables that check; a nonnegative integer overrides it. For example:
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
polyglot_sql.transpile(sql, complexity_guard={"maxParserDepth": 128})
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Parser depth defaults to 1024 logical levels on native targets (32 on WASM) and is
|
|
99
|
+
checked during parsing, before an AST exists. Zero rejects parsing descents.
|
|
100
|
+
Other checks remain independent.
|
|
101
|
+
Raising or disabling limits can permit stack exhaustion and process termination,
|
|
102
|
+
even for trusted generated SQL. Increasing a limit does not increase stack space;
|
|
103
|
+
these limits are not general time/memory budgets. Application owners should control
|
|
104
|
+
overrides. Parsing APIs without guard options inherit the default protection.
|
|
105
|
+
|
|
86
106
|
### Format Guard Behavior
|
|
87
107
|
|
|
88
108
|
`format_sql` uses Rust core formatting guards with default limits:
|
|
@@ -123,6 +143,29 @@ if result:
|
|
|
123
143
|
print("valid")
|
|
124
144
|
```
|
|
125
145
|
|
|
146
|
+
Schema-aware validation uses the same Rust validator as the TypeScript SDK:
|
|
147
|
+
|
|
148
|
+
```python
|
|
149
|
+
sql = "SELECT o.order_id FROM orders o WHERE o.missing_column = TRUE"
|
|
150
|
+
schema = {"tables": [{"name": "orders", "columns": [{"name": "order_id", "type": "INT"}]}]}
|
|
151
|
+
result = polyglot_sql.validate_with_schema(
|
|
152
|
+
sql, schema, dialect="snowflake", check_types=True, check_references=True,
|
|
153
|
+
)
|
|
154
|
+
for error in result.errors:
|
|
155
|
+
print(error.code, error.message)
|
|
156
|
+
if error.start is not None and error.end is not None:
|
|
157
|
+
print(sql[error.start:error.end])
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Unknown tables, columns and aliases are checked by default. `check_references`
|
|
161
|
+
also checks ambiguous columns and foreign-key metadata; `check_types` enables
|
|
162
|
+
type checks. `strict` overrides the schema's `strict` value, which defaults to
|
|
163
|
+
`True`; `strict=False` reports reference/type findings as warnings. An empty
|
|
164
|
+
column list or a `*` column denotes an open schema, so unknown columns are not
|
|
165
|
+
rejected solely because their names are absent. Nonempty lists without `*`
|
|
166
|
+
are treated as complete. Options use snake_case keyword arguments, not an
|
|
167
|
+
`options` dictionary. Invalid schemas and unknown dialects raise `ValueError`.
|
|
168
|
+
|
|
126
169
|
```python
|
|
127
170
|
options = {
|
|
128
171
|
"producer": "https://github.com/tobilg/polyglot",
|
|
@@ -168,6 +211,26 @@ print(analysis["baseTables"][0]["name"]) # "orders"
|
|
|
168
211
|
print(analysis["baseTables"][0]["table"]) # "orders"
|
|
169
212
|
```
|
|
170
213
|
|
|
214
|
+
Non-projection uses are available through the same shared Rust analysis:
|
|
215
|
+
|
|
216
|
+
```python
|
|
217
|
+
analysis = polyglot_sql.analyze_query(
|
|
218
|
+
"SELECT o.id FROM orders o WHERE o.amount > 0", dialect="duckdb"
|
|
219
|
+
)
|
|
220
|
+
use = analysis["columnUses"][0]
|
|
221
|
+
print(use["context"]) # "filter"
|
|
222
|
+
print(use["references"][0]["column"]) # "amount"
|
|
223
|
+
print(use["scopePath"]) # "root"
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
`columnUses` groups references by clause expression without changing projection
|
|
227
|
+
lineage. It covers joins, filters, grouping, HAVING/QUALIFY, window keys/frames,
|
|
228
|
+
ordering and set-operation filter inputs. `scopePath`/`expressionPath` identify
|
|
229
|
+
the scope and expression; `expressionSql` is dialect-rendered SQL. Optional
|
|
230
|
+
`span` objects use half-open Unicode-character offsets in the original input.
|
|
231
|
+
Reference spans locate uses, not upstream definitions. Unknown or ambiguous
|
|
232
|
+
sources remain conservative; whole-expression spans are omitted when unavailable.
|
|
233
|
+
|
|
171
234
|
`analysis["relations"]` reports sources visible in the analyzed scope.
|
|
172
235
|
`analysis["baseTables"]` reports deduplicated physical table dependencies across
|
|
173
236
|
nested CTEs, derived tables, subqueries, and set-operation branches. For
|
|
@@ -232,6 +295,7 @@ All functions are exported from `polyglot_sql`.
|
|
|
232
295
|
- `format_sql(sql: str, dialect: str = "generic", *, max_input_bytes: int | None = None, max_tokens: int | None = None, max_ast_nodes: int | None = None, max_set_op_chain: int | None = None) -> str`
|
|
233
296
|
- `format(sql: str, dialect: str = "generic", *, max_input_bytes: int | None = None, max_tokens: int | None = None, max_ast_nodes: int | None = None, max_set_op_chain: int | None = None) -> str` (alias of `format_sql`)
|
|
234
297
|
- `validate(sql: str, dialect: str = "generic", *, strict_syntax: bool = False, semantic: bool = False) -> ValidationResult`
|
|
298
|
+
- `validate_with_schema(sql: str, schema: dict, dialect: str = "generic", *, check_types: bool = False, check_references: bool = False, strict: bool | None = None, semantic: bool = False, strict_syntax: bool = False) -> ValidationResult`
|
|
235
299
|
- `optimize(sql: str, dialect: str = "generic") -> str`
|
|
236
300
|
- `lineage(column: str, sql: str, dialect: str = "generic") -> dict`
|
|
237
301
|
- `lineage_at(ordinal: int, sql: str, dialect: str = "generic") -> dict`
|
|
@@ -267,7 +331,8 @@ Exception hierarchy:
|
|
|
267
331
|
|
|
268
332
|
Unknown dialect names raise built-in `ValueError`.
|
|
269
333
|
|
|
270
|
-
`validate(...)`
|
|
334
|
+
`validate(...)` and `validate_with_schema(...)` return `ValidationResult`:
|
|
335
|
+
|
|
271
336
|
- `result.valid: bool`
|
|
272
337
|
- `result.errors: list[ValidationErrorInfo]`
|
|
273
338
|
- `bool(result)` works (`True` when valid)
|
|
@@ -278,11 +343,19 @@ clause boundaries. `semantic=True` adds warning diagnostics W001-W004 for
|
|
|
278
343
|
`LIMIT` without `ORDER BY`; warnings do not make the result invalid.
|
|
279
344
|
|
|
280
345
|
Each `ValidationErrorInfo` has:
|
|
346
|
+
|
|
281
347
|
- `message: str`
|
|
282
348
|
- `line: int`
|
|
283
349
|
- `col: int`
|
|
284
350
|
- `code: str`
|
|
285
351
|
- `severity: str`
|
|
352
|
+
- `start: int | None` (zero-based Unicode character offset)
|
|
353
|
+
- `end: int | None` (exclusive Unicode character offset)
|
|
354
|
+
|
|
355
|
+
Source ranges refer to the original SQL and support Python string slicing.
|
|
356
|
+
Reference diagnostics point to the offending identifier when available;
|
|
357
|
+
synthetic or schema-only findings have no source range. Existing `line` and
|
|
358
|
+
`col` fields remain integers and use `0` when unavailable.
|
|
286
359
|
|
|
287
360
|
## Performance Note
|
|
288
361
|
|
|
@@ -100,14 +100,14 @@ function-catalog-all-dialects = [
|
|
|
100
100
|
]
|
|
101
101
|
|
|
102
102
|
[dependencies]
|
|
103
|
-
polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.
|
|
103
|
+
polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.11.0" }
|
|
104
104
|
serde = { workspace = true }
|
|
105
105
|
serde_json = { workspace = true }
|
|
106
106
|
thiserror = { workspace = true }
|
|
107
107
|
unicode-segmentation = { workspace = true }
|
|
108
108
|
stacker = { version = "0.1", optional = true }
|
|
109
109
|
ts-rs = { version = "12.0", features = ["serde-compat"], optional = true }
|
|
110
|
-
polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.
|
|
110
|
+
polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.11.0", optional = true, default-features = false }
|
|
111
111
|
|
|
112
112
|
[dev-dependencies]
|
|
113
113
|
pretty_assertions = "1.4"
|
|
@@ -25,12 +25,12 @@ By default, `polyglot-sql` enables the full public API. Parser-only consumers ca
|
|
|
25
25
|
disable default features and opt into only the dialect parsers they need:
|
|
26
26
|
|
|
27
27
|
```toml
|
|
28
|
-
polyglot-sql = { version = "0.
|
|
28
|
+
polyglot-sql = { version = "0.11.0", default-features = false }
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
```toml
|
|
32
32
|
polyglot-sql = {
|
|
33
|
-
version = "0.
|
|
33
|
+
version = "0.11.0",
|
|
34
34
|
default-features = false,
|
|
35
35
|
features = ["dialect-clickhouse"],
|
|
36
36
|
}
|
|
@@ -44,14 +44,14 @@ Examples:
|
|
|
44
44
|
```toml
|
|
45
45
|
# Parse and generate SQL for one dialect.
|
|
46
46
|
polyglot-sql = {
|
|
47
|
-
version = "0.
|
|
47
|
+
version = "0.11.0",
|
|
48
48
|
default-features = false,
|
|
49
49
|
features = ["generate", "dialect-clickhouse"],
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
# Cross-dialect transpilation.
|
|
53
53
|
polyglot-sql = {
|
|
54
|
-
version = "0.
|
|
54
|
+
version = "0.11.0",
|
|
55
55
|
default-features = false,
|
|
56
56
|
features = ["transpile", "dialect-clickhouse", "dialect-postgresql"],
|
|
57
57
|
}
|
|
@@ -479,6 +479,11 @@ Athena, BigQuery, ClickHouse, CockroachDB, DataFusion, Databricks, Doris, Dremio
|
|
|
479
479
|
| `time` | Enable time-format conversion helpers |
|
|
480
480
|
| `bindings` | Enable `ts-rs` TypeScript type generation |
|
|
481
481
|
|
|
482
|
+
With `default-features = false`, `ast-tools` and `semantic` can be used without
|
|
483
|
+
enabling `builder` or `generate`. AST transforms reuse the same internal mutation
|
|
484
|
+
primitives as the native and serializable builders, while the public builder APIs
|
|
485
|
+
remain gated by `builder`.
|
|
486
|
+
|
|
482
487
|
## License
|
|
483
488
|
|
|
484
489
|
[MIT](../../LICENSE)
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
//! Canonical AST construction and mutation primitives shared by
|
|
1
|
+
//! Canonical AST construction and mutation primitives shared by AST consumers.
|
|
2
2
|
//!
|
|
3
|
-
//!
|
|
4
|
-
//!
|
|
5
|
-
//!
|
|
3
|
+
//! AST transform helpers, the native fluent builder, and serializable builder
|
|
4
|
+
//! plans delegate their AST edits here so a clause has exactly one implementation.
|
|
5
|
+
//! This module depends only on AST and error types, not the optional public builder
|
|
6
|
+
//! API, SQL generation, serde, or a language binding.
|
|
7
|
+
|
|
8
|
+
// AST-only consumers use a subset of the primitives; builders use the full set.
|
|
9
|
+
#![cfg_attr(not(feature = "builder"), allow(dead_code))]
|
|
6
10
|
|
|
7
11
|
use crate::error::{Error, Result};
|
|
8
12
|
use crate::expressions::*;
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
//! .build();
|
|
56
56
|
//! ```
|
|
57
57
|
|
|
58
|
-
pub(crate) mod engine;
|
|
59
58
|
pub mod plan;
|
|
60
59
|
|
|
60
|
+
use crate::ast_mutation as engine;
|
|
61
61
|
use crate::expressions::*;
|
|
62
62
|
use crate::generator::{Generator, GeneratorConfig, NotInStyle};
|
|
63
63
|
use crate::parser::Parser;
|
|
@@ -552,6 +552,7 @@ pub fn trim(expr: Expr) -> Expr {
|
|
|
552
552
|
position: TrimPosition::Both,
|
|
553
553
|
sql_standard_syntax: false,
|
|
554
554
|
position_explicit: false,
|
|
555
|
+
inferred_type: None,
|
|
555
556
|
})))
|
|
556
557
|
}
|
|
557
558
|
|
|
@@ -2811,6 +2812,37 @@ mod tests {
|
|
|
2811
2812
|
assert_eq!(sql, "SELECT CAST(id AS VARCHAR) FROM users");
|
|
2812
2813
|
}
|
|
2813
2814
|
|
|
2815
|
+
#[test]
|
|
2816
|
+
fn test_cast_int128() {
|
|
2817
|
+
for name in ["HUGEINT", "INT128"] {
|
|
2818
|
+
let Expression::Cast(cast) = col("value").cast(name).0 else {
|
|
2819
|
+
panic!("expected cast");
|
|
2820
|
+
};
|
|
2821
|
+
assert_eq!(cast.to, DataType::Int128);
|
|
2822
|
+
}
|
|
2823
|
+
}
|
|
2824
|
+
|
|
2825
|
+
#[test]
|
|
2826
|
+
fn test_cast_unsigned_integer_types() {
|
|
2827
|
+
for (name, expected) in [
|
|
2828
|
+
("UTINYINT", DataType::UInt8),
|
|
2829
|
+
("UINT8", DataType::UInt8),
|
|
2830
|
+
("USMALLINT", DataType::UInt16),
|
|
2831
|
+
("UINT16", DataType::UInt16),
|
|
2832
|
+
("UINTEGER", DataType::UInt32),
|
|
2833
|
+
("UINT32", DataType::UInt32),
|
|
2834
|
+
("UBIGINT", DataType::UInt64),
|
|
2835
|
+
("UINT64", DataType::UInt64),
|
|
2836
|
+
("UHUGEINT", DataType::UInt128),
|
|
2837
|
+
("UINT128", DataType::UInt128),
|
|
2838
|
+
] {
|
|
2839
|
+
let Expression::Cast(cast) = col("value").cast(name).0 else {
|
|
2840
|
+
panic!("expected cast")
|
|
2841
|
+
};
|
|
2842
|
+
assert_eq!(cast.to, expected, "{name}");
|
|
2843
|
+
}
|
|
2844
|
+
}
|
|
2845
|
+
|
|
2814
2846
|
#[test]
|
|
2815
2847
|
fn test_from_starter() {
|
|
2816
2848
|
let sql = from("users").select_cols(["id", "name"]).to_sql();
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
//! provides a serializable, immutable expression plan so language bindings can
|
|
5
5
|
//! share coercion, parsing, and AST-editing semantics without duplicating them.
|
|
6
6
|
|
|
7
|
-
use crate::
|
|
7
|
+
use crate::ast_mutation as engine;
|
|
8
|
+
use crate::builder::{self, Expr};
|
|
8
9
|
use crate::dialects::Dialect;
|
|
9
10
|
use crate::error::{Error, Result};
|
|
10
11
|
use crate::expressions::*;
|
|
@@ -34,6 +34,7 @@ impl DialectImpl for BigQueryDialect {
|
|
|
34
34
|
// Remove double quote from identifiers (it's in the default config)
|
|
35
35
|
config.identifiers.remove(&'"');
|
|
36
36
|
config.identifiers.insert('`', '`');
|
|
37
|
+
config.identifier_backslash_escapes = true;
|
|
37
38
|
// BigQuery supports double quotes for strings (in addition to single quotes)
|
|
38
39
|
config.quotes.insert("\"".to_string(), "\"".to_string());
|
|
39
40
|
// BigQuery supports triple-quoted strings
|
|
@@ -28,6 +28,7 @@ impl DialectImpl for ClickHouseDialect {
|
|
|
28
28
|
// ClickHouse uses double quotes and backticks for identifiers
|
|
29
29
|
config.identifiers.insert('"', '"');
|
|
30
30
|
config.identifiers.insert('`', '`');
|
|
31
|
+
config.identifier_backslash_escapes = true;
|
|
31
32
|
// ClickHouse supports nested comments
|
|
32
33
|
config.nested_comments = true;
|
|
33
34
|
// ClickHouse allows identifiers to start with digits
|