polyglot-sql 0.10.0__tar.gz → 0.12.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.10.0 → polyglot_sql-0.12.0}/Cargo.lock +6 -6
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/Cargo.toml +1 -1
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/PKG-INFO +75 -4
- {polyglot_sql-0.10.0/crates/polyglot-sql-python → polyglot_sql-0.12.0}/README.md +74 -3
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/Cargo.toml +2 -2
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/README.md +30 -4
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/performance_hotspots.rs +62 -1
- polyglot_sql-0.12.0/crates/polyglot-sql/src/binding.rs +519 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/bigquery.rs +1 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/clickhouse.rs +1 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/duckdb.rs +56 -57
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/fabric.rs +2 -1
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/mod.rs +41 -5
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/presto.rs +12 -22
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/snowflake.rs +77 -96
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/expressions.rs +13 -0
- polyglot_sql-0.12.0/crates/polyglot-sql/src/format_tokens.rs +167 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/function_catalog.rs +56 -2
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/generator.rs +626 -293
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/guard.rs +57 -1
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/lib.rs +137 -24
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/lineage.rs +32 -24
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/annotate_types.rs +332 -64
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +333 -104
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/parser.rs +2269 -789
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/query_analysis/column_uses.rs +20 -18
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/query_analysis.rs +609 -155
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/resolver.rs +46 -4
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/schema.rs +16 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/scope.rs +15 -9
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/set_operation.rs +1 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/tokens.rs +14 -5
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/transforms.rs +5 -0
- polyglot_sql-0.12.0/crates/polyglot-sql/src/validation/semantics.rs +534 -0
- polyglot_sql-0.12.0/crates/polyglot-sql/src/validation/tests.rs +2444 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/validation.rs +849 -565
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/common/known_failures.rs +18 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +7 -7
- polyglot_sql-0.12.0/crates/polyglot-sql/tests/data_type_api.rs +397 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/deep_nesting_regression.rs +243 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/dialect_matrix.rs +67 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/query_analysis.rs +508 -3
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/snowflake_regression_test.rs +96 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/README.md +1 -1
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0/crates/polyglot-sql-python}/README.md +74 -3
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/helpers.rs +48 -5
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/parse.rs +25 -9
- polyglot_sql-0.12.0/crates/polyglot-sql-python/src/query_analysis.rs +54 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/transpile.rs +9 -2
- polyglot_sql-0.12.0/crates/polyglot-sql-python/src/validate.rs +89 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_format.py +26 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_generate.py +33 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_parse.py +44 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_query_analysis.py +95 -1
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_transpile.py +36 -0
- polyglot_sql-0.12.0/crates/polyglot-sql-python/tests/test_validate.py +448 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/python/polyglot_sql/__init__.py +77 -2
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/python/polyglot_sql/__init__.pyi +66 -7
- polyglot_sql-0.12.0/python/polyglot_sql/analysis_types.py +171 -0
- polyglot_sql-0.10.0/crates/polyglot-sql/src/format_tokens.rs +0 -87
- polyglot_sql-0.10.0/crates/polyglot-sql/src/validation/tests.rs +0 -1417
- polyglot_sql-0.10.0/crates/polyglot-sql/tests/data_type_api.rs +0 -86
- polyglot_sql-0.10.0/crates/polyglot-sql-python/src/query_analysis.rs +0 -33
- polyglot_sql-0.10.0/crates/polyglot-sql-python/src/validate.rs +0 -55
- polyglot_sql-0.10.0/crates/polyglot-sql-python/tests/test_validate.py +0 -173
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/in_list.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/lineage.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/parsing.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/transpile.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/examples/bench_json.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/ast_children.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/ast_json.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/ast_mutation.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/builder/mod.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/builder/plan.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/collections.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/mod.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/operators.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/statements.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/types.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/diff.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/error.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/function_registry.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/helper.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/openlineage.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/planner.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/time.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/traversal.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/trie.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/common/mod.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/error_handling.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/Cargo.toml +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/docs/api.md +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/docs/index.md +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/mkdocs.yml +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/builders.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/dialects.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/diff.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/errors.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/expr.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/format.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/generate.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/lib.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/lineage.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/optimize.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/transforms.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/types.rs +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/conftest.py +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_builders.py +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/uv.lock +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/pyproject.toml +0 -0
- {polyglot_sql-0.10.0 → polyglot_sql-0.12.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.12.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.12.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.12.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.12.0"
|
|
646
646
|
|
|
647
647
|
[[package]]
|
|
648
648
|
name = "polyglot-sql-python"
|
|
649
|
-
version = "0.
|
|
649
|
+
version = "0.12.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.12.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.12.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,39 @@ 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
|
+
`parse`, `parse_one` (including `into=DataType`), `parse_data_type`, `validate`,
|
|
116
|
+
`validate_with_schema`, `analyze_query`, and `transpile` accept the keyword-only
|
|
117
|
+
`complexity_guard`, a `ComplexityGuardOptions` typed dictionary
|
|
118
|
+
using the shared camelCase keys: `maxParserDepth`, `maxInputBytes`, `maxTokens`,
|
|
119
|
+
`maxAstNodes`, `maxAstDepth`, `maxParenthesisDepth`, and `maxFunctionCallDepth`.
|
|
120
|
+
Omit the argument, pass `None`, or omit a key to use its default. A field-level `None`
|
|
121
|
+
disables that check; a nonnegative integer overrides it. For example:
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
polyglot_sql.transpile(sql, complexity_guard={"maxParserDepth": 128})
|
|
125
|
+
polyglot_sql.validate(sql, dialect="snowflake", complexity_guard={"maxFunctionCallDepth": 128})
|
|
126
|
+
polyglot_sql.parse_one(sql, dialect="snowflake", complexity_guard={"maxFunctionCallDepth": None})
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
`analyze_query` also accepts `options={"complexityGuard": {...}}`; do not supply
|
|
130
|
+
both forms in one call. Limits must be nonnegative integers or `None`; booleans,
|
|
131
|
+
floats, out-of-range integers, and unknown guard keys are rejected.
|
|
132
|
+
Omitting the entire guard preserves dialect-specific defaults (including
|
|
133
|
+
ClickHouse's higher function-nesting limit). A supplied dictionary uses the
|
|
134
|
+
shared Rust defaults for omitted fields. Validation reports guard exhaustion
|
|
135
|
+
as diagnostics; parsing and analysis raise `ParseError`.
|
|
136
|
+
|
|
137
|
+
Parser depth defaults to 1024 logical levels on native targets (32 on WASM) and is
|
|
138
|
+
checked during parsing, before an AST exists. Zero rejects parsing descents.
|
|
139
|
+
Other checks remain independent.
|
|
140
|
+
Raising or disabling limits can permit stack exhaustion and process termination,
|
|
141
|
+
even for trusted generated SQL. Increasing a limit does not increase stack space;
|
|
142
|
+
these limits are not general time/memory budgets. Application owners should control
|
|
143
|
+
overrides. Other SQL-consuming helpers, including lineage and optimization,
|
|
144
|
+
continue to inherit default protection.
|
|
145
|
+
|
|
113
146
|
### Format Guard Behavior
|
|
114
147
|
|
|
115
148
|
`format_sql` uses Rust core formatting guards with default limits:
|
|
@@ -345,9 +378,47 @@ Unknown dialect names raise built-in `ValueError`.
|
|
|
345
378
|
- `bool(result)` works (`True` when valid)
|
|
346
379
|
|
|
347
380
|
`strict_syntax=True` rejects compatibility forms such as trailing commas before
|
|
348
|
-
clause boundaries. `semantic=True`
|
|
349
|
-
|
|
350
|
-
`
|
|
381
|
+
clause boundaries. `semantic=True` checks every query scope and reports errors
|
|
382
|
+
for invalid grouping (`E230`), aggregate placement/nesting (`E231`), and window
|
|
383
|
+
placement/nesting (`E232`). These errors make the result invalid, including with
|
|
384
|
+
`strict=False`. Quality hints remain warnings: `SELECT *` (`W001`), uncertain
|
|
385
|
+
grouping (`W002`), `DISTINCT` with `ORDER BY` (`W003`), and unordered `LIMIT`
|
|
386
|
+
(`W004`). Default validation remains syntax-only.
|
|
387
|
+
|
|
388
|
+
Schema validation always checks DML targets and references, independently of
|
|
389
|
+
`check_types`. Type checks use lexical query scopes and name-aligned set-operation
|
|
390
|
+
outputs. An empty column list or `*` denotes an open schema; validation is not a
|
|
391
|
+
database execution check and cannot prove runtime/session-dependent behavior.
|
|
392
|
+
|
|
393
|
+
Analysis options and schemas reject unknown keys, including nested metadata.
|
|
394
|
+
Public `TypedDict` models such as `AnalyzeQueryOptions`, `ValidationSchema`,
|
|
395
|
+
`QueryAnalysis`, and `FunctionCatalogSpec` describe their dictionary payloads.
|
|
396
|
+
Analysis retains best-effort references for missing columns but marks them
|
|
397
|
+
`unknown`, not `resolved`. Lambda-local parameters are not physical dependencies.
|
|
398
|
+
|
|
399
|
+
Python also accepts a declarative function catalog (Rust offers
|
|
400
|
+
`FunctionCatalogSpec::build` and the existing `FunctionCatalog` trait):
|
|
401
|
+
|
|
402
|
+
```python
|
|
403
|
+
catalog: polyglot_sql.FunctionCatalogSpec = {
|
|
404
|
+
"functions": [{
|
|
405
|
+
"name": "my_udf",
|
|
406
|
+
"signatures": [{"minArity": 1, "maxArity": 2}],
|
|
407
|
+
}],
|
|
408
|
+
}
|
|
409
|
+
result = polyglot_sql.validate_with_schema(
|
|
410
|
+
"SELECT my_udf(1)", {"tables": []}, check_types=True,
|
|
411
|
+
function_catalog=catalog,
|
|
412
|
+
)
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
The catalog **replaces** the embedded function name/arity catalog; it does not
|
|
416
|
+
activate `check_types` automatically. Overloads are supported; omitted/null
|
|
417
|
+
`maxArity` means variadic. `nameCase` is `insensitive` by default, or `sensitive`,
|
|
418
|
+
and can be overridden per function. Native typed-function checks remain active.
|
|
419
|
+
Blank names, empty signature lists, negative/noninteger arities, reversed bounds,
|
|
420
|
+
conflicting case overrides, and unknown fields are rejected. Other SDKs do not
|
|
421
|
+
expose this catalog option.
|
|
351
422
|
|
|
352
423
|
Each `ValidationErrorInfo` has:
|
|
353
424
|
|
|
@@ -83,6 +83,39 @@ 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
|
+
`parse`, `parse_one` (including `into=DataType`), `parse_data_type`, `validate`,
|
|
89
|
+
`validate_with_schema`, `analyze_query`, and `transpile` accept the keyword-only
|
|
90
|
+
`complexity_guard`, a `ComplexityGuardOptions` typed dictionary
|
|
91
|
+
using the shared camelCase keys: `maxParserDepth`, `maxInputBytes`, `maxTokens`,
|
|
92
|
+
`maxAstNodes`, `maxAstDepth`, `maxParenthesisDepth`, and `maxFunctionCallDepth`.
|
|
93
|
+
Omit the argument, pass `None`, or omit a key to use its default. A field-level `None`
|
|
94
|
+
disables that check; a nonnegative integer overrides it. For example:
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
polyglot_sql.transpile(sql, complexity_guard={"maxParserDepth": 128})
|
|
98
|
+
polyglot_sql.validate(sql, dialect="snowflake", complexity_guard={"maxFunctionCallDepth": 128})
|
|
99
|
+
polyglot_sql.parse_one(sql, dialect="snowflake", complexity_guard={"maxFunctionCallDepth": None})
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`analyze_query` also accepts `options={"complexityGuard": {...}}`; do not supply
|
|
103
|
+
both forms in one call. Limits must be nonnegative integers or `None`; booleans,
|
|
104
|
+
floats, out-of-range integers, and unknown guard keys are rejected.
|
|
105
|
+
Omitting the entire guard preserves dialect-specific defaults (including
|
|
106
|
+
ClickHouse's higher function-nesting limit). A supplied dictionary uses the
|
|
107
|
+
shared Rust defaults for omitted fields. Validation reports guard exhaustion
|
|
108
|
+
as diagnostics; parsing and analysis raise `ParseError`.
|
|
109
|
+
|
|
110
|
+
Parser depth defaults to 1024 logical levels on native targets (32 on WASM) and is
|
|
111
|
+
checked during parsing, before an AST exists. Zero rejects parsing descents.
|
|
112
|
+
Other checks remain independent.
|
|
113
|
+
Raising or disabling limits can permit stack exhaustion and process termination,
|
|
114
|
+
even for trusted generated SQL. Increasing a limit does not increase stack space;
|
|
115
|
+
these limits are not general time/memory budgets. Application owners should control
|
|
116
|
+
overrides. Other SQL-consuming helpers, including lineage and optimization,
|
|
117
|
+
continue to inherit default protection.
|
|
118
|
+
|
|
86
119
|
### Format Guard Behavior
|
|
87
120
|
|
|
88
121
|
`format_sql` uses Rust core formatting guards with default limits:
|
|
@@ -318,9 +351,47 @@ Unknown dialect names raise built-in `ValueError`.
|
|
|
318
351
|
- `bool(result)` works (`True` when valid)
|
|
319
352
|
|
|
320
353
|
`strict_syntax=True` rejects compatibility forms such as trailing commas before
|
|
321
|
-
clause boundaries. `semantic=True`
|
|
322
|
-
|
|
323
|
-
`
|
|
354
|
+
clause boundaries. `semantic=True` checks every query scope and reports errors
|
|
355
|
+
for invalid grouping (`E230`), aggregate placement/nesting (`E231`), and window
|
|
356
|
+
placement/nesting (`E232`). These errors make the result invalid, including with
|
|
357
|
+
`strict=False`. Quality hints remain warnings: `SELECT *` (`W001`), uncertain
|
|
358
|
+
grouping (`W002`), `DISTINCT` with `ORDER BY` (`W003`), and unordered `LIMIT`
|
|
359
|
+
(`W004`). Default validation remains syntax-only.
|
|
360
|
+
|
|
361
|
+
Schema validation always checks DML targets and references, independently of
|
|
362
|
+
`check_types`. Type checks use lexical query scopes and name-aligned set-operation
|
|
363
|
+
outputs. An empty column list or `*` denotes an open schema; validation is not a
|
|
364
|
+
database execution check and cannot prove runtime/session-dependent behavior.
|
|
365
|
+
|
|
366
|
+
Analysis options and schemas reject unknown keys, including nested metadata.
|
|
367
|
+
Public `TypedDict` models such as `AnalyzeQueryOptions`, `ValidationSchema`,
|
|
368
|
+
`QueryAnalysis`, and `FunctionCatalogSpec` describe their dictionary payloads.
|
|
369
|
+
Analysis retains best-effort references for missing columns but marks them
|
|
370
|
+
`unknown`, not `resolved`. Lambda-local parameters are not physical dependencies.
|
|
371
|
+
|
|
372
|
+
Python also accepts a declarative function catalog (Rust offers
|
|
373
|
+
`FunctionCatalogSpec::build` and the existing `FunctionCatalog` trait):
|
|
374
|
+
|
|
375
|
+
```python
|
|
376
|
+
catalog: polyglot_sql.FunctionCatalogSpec = {
|
|
377
|
+
"functions": [{
|
|
378
|
+
"name": "my_udf",
|
|
379
|
+
"signatures": [{"minArity": 1, "maxArity": 2}],
|
|
380
|
+
}],
|
|
381
|
+
}
|
|
382
|
+
result = polyglot_sql.validate_with_schema(
|
|
383
|
+
"SELECT my_udf(1)", {"tables": []}, check_types=True,
|
|
384
|
+
function_catalog=catalog,
|
|
385
|
+
)
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
The catalog **replaces** the embedded function name/arity catalog; it does not
|
|
389
|
+
activate `check_types` automatically. Overloads are supported; omitted/null
|
|
390
|
+
`maxArity` means variadic. `nameCase` is `insensitive` by default, or `sensitive`,
|
|
391
|
+
and can be overridden per function. Native typed-function checks remain active.
|
|
392
|
+
Blank names, empty signature lists, negative/noninteger arities, reversed bounds,
|
|
393
|
+
conflicting case overrides, and unknown fields are rejected. Other SDKs do not
|
|
394
|
+
expose this catalog option.
|
|
324
395
|
|
|
325
396
|
Each `ValidationErrorInfo` has:
|
|
326
397
|
|
|
@@ -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.12.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.12.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.12.0", default-features = false }
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
```toml
|
|
32
32
|
polyglot-sql = {
|
|
33
|
-
version = "0.
|
|
33
|
+
version = "0.12.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.12.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.12.0",
|
|
55
55
|
default-features = false,
|
|
56
56
|
features = ["transpile", "dialect-clickhouse", "dialect-postgresql"],
|
|
57
57
|
}
|
|
@@ -244,6 +244,29 @@ let tables = get_tables(&ast[0]);
|
|
|
244
244
|
|
|
245
245
|
### Validation
|
|
246
246
|
|
|
247
|
+
Parsing, validation, and query analysis accept per-call `ComplexityGuardOptions`.
|
|
248
|
+
Existing entry points retain their defaults; parsing adds `parse_with_options`,
|
|
249
|
+
`parse_one_with_options`, and `parse_data_type_with_options` (and corresponding
|
|
250
|
+
`Dialect` parsing methods). For example:
|
|
251
|
+
|
|
252
|
+
```rust
|
|
253
|
+
use polyglot_sql::{parse_one_with_options, ComplexityGuardOptions, DialectType, ParseOptions};
|
|
254
|
+
|
|
255
|
+
let options = ParseOptions {
|
|
256
|
+
complexity_guard: Some(ComplexityGuardOptions {
|
|
257
|
+
max_function_call_depth: Some(128),
|
|
258
|
+
..Default::default()
|
|
259
|
+
}),
|
|
260
|
+
};
|
|
261
|
+
let expression = parse_one_with_options("SELECT COALESCE(value, 0) FROM records", DialectType::Snowflake, &options)?;
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
`ValidationOptions`, `SchemaValidationOptions`, and `AnalyzeQueryOptions` expose
|
|
265
|
+
the same optional `complexity_guard`. An absent guard preserves dialect-specific
|
|
266
|
+
defaults; `None` on an individual limit disables only that check. Raising or
|
|
267
|
+
disabling limits can permit stack exhaustion; these are not general runtime or
|
|
268
|
+
memory budgets. Use `..Default::default()` when constructing extended options.
|
|
269
|
+
|
|
247
270
|
```rust
|
|
248
271
|
use polyglot_sql::{validate_with_options, DialectType, ValidationOptions};
|
|
249
272
|
|
|
@@ -253,6 +276,7 @@ let result = validate_with_options(
|
|
|
253
276
|
&ValidationOptions {
|
|
254
277
|
strict_syntax: false,
|
|
255
278
|
semantic: true,
|
|
279
|
+
..Default::default()
|
|
256
280
|
},
|
|
257
281
|
);
|
|
258
282
|
// W001 and W004 are warnings, so result.valid remains true.
|
|
@@ -301,6 +325,7 @@ let opts = SchemaValidationOptions {
|
|
|
301
325
|
check_references: true,
|
|
302
326
|
strict: None,
|
|
303
327
|
semantic: true,
|
|
328
|
+
..Default::default()
|
|
304
329
|
};
|
|
305
330
|
|
|
306
331
|
let result = validate_with_schema(
|
|
@@ -360,6 +385,7 @@ let analysis = analyze_query(
|
|
|
360
385
|
AnalyzeQueryOptions {
|
|
361
386
|
dialect: DialectType::Generic,
|
|
362
387
|
schema: Some(schema),
|
|
388
|
+
..Default::default()
|
|
363
389
|
},
|
|
364
390
|
).unwrap();
|
|
365
391
|
|
{polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/performance_hotspots.rs
RENAMED
|
@@ -81,6 +81,7 @@ fn many_numbers() -> String {
|
|
|
81
81
|
|
|
82
82
|
fn disabled_guards() -> ComplexityGuardOptions {
|
|
83
83
|
ComplexityGuardOptions {
|
|
84
|
+
max_parser_depth: None,
|
|
84
85
|
max_input_bytes: None,
|
|
85
86
|
max_tokens: None,
|
|
86
87
|
max_ast_nodes: None,
|
|
@@ -209,10 +210,70 @@ fn bench_tokenize_and_parse(c: &mut Criterion) {
|
|
|
209
210
|
guards.finish();
|
|
210
211
|
}
|
|
211
212
|
|
|
213
|
+
fn bench_validation_and_analysis(c: &mut Criterion) {
|
|
214
|
+
#[cfg(all(feature = "semantic", feature = "generate"))]
|
|
215
|
+
{
|
|
216
|
+
use polyglot_sql::{
|
|
217
|
+
analyze_query, validate_with_schema, AnalyzeQueryOptions, SchemaValidationOptions,
|
|
218
|
+
ValidationSchema,
|
|
219
|
+
};
|
|
220
|
+
let schema: ValidationSchema = serde_json::from_value(
|
|
221
|
+
serde_json::json!({"tables": [{"name":"t", "columns":[{"name":"x", "type":"INT"}]}]}),
|
|
222
|
+
)
|
|
223
|
+
.unwrap();
|
|
224
|
+
let mut group = c.benchmark_group("validation_analysis");
|
|
225
|
+
group.sample_size(10);
|
|
226
|
+
for width in [100, 200, 400] {
|
|
227
|
+
let sql = format!(
|
|
228
|
+
"SELECT {} FROM t",
|
|
229
|
+
(0..width)
|
|
230
|
+
.map(|i| format!("x + {i} AS c{i}"))
|
|
231
|
+
.collect::<Vec<_>>()
|
|
232
|
+
.join(", ")
|
|
233
|
+
);
|
|
234
|
+
group.bench_with_input(BenchmarkId::new("analysis_width", width), &sql, |b, sql| {
|
|
235
|
+
b.iter(|| {
|
|
236
|
+
analyze_query(
|
|
237
|
+
black_box(sql),
|
|
238
|
+
AnalyzeQueryOptions {
|
|
239
|
+
schema: Some(schema.clone()),
|
|
240
|
+
dialect: DialectType::PostgreSQL,
|
|
241
|
+
..Default::default()
|
|
242
|
+
},
|
|
243
|
+
)
|
|
244
|
+
.unwrap()
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
group.bench_with_input(
|
|
248
|
+
BenchmarkId::new("validation_width", width),
|
|
249
|
+
&sql,
|
|
250
|
+
|b, sql| {
|
|
251
|
+
b.iter(|| {
|
|
252
|
+
validate_with_schema(
|
|
253
|
+
black_box(sql),
|
|
254
|
+
DialectType::PostgreSQL,
|
|
255
|
+
&schema,
|
|
256
|
+
&SchemaValidationOptions {
|
|
257
|
+
check_types: true,
|
|
258
|
+
semantic: true,
|
|
259
|
+
..Default::default()
|
|
260
|
+
},
|
|
261
|
+
)
|
|
262
|
+
});
|
|
263
|
+
},
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
group.finish();
|
|
267
|
+
}
|
|
268
|
+
#[cfg(not(all(feature = "semantic", feature = "generate")))]
|
|
269
|
+
let _ = c;
|
|
270
|
+
}
|
|
271
|
+
|
|
212
272
|
criterion_group!(
|
|
213
273
|
benches,
|
|
214
274
|
bench_dialect_construction,
|
|
215
275
|
bench_fresh_vs_reused_dialect,
|
|
216
|
-
bench_tokenize_and_parse
|
|
276
|
+
bench_tokenize_and_parse,
|
|
277
|
+
bench_validation_and_analysis
|
|
217
278
|
);
|
|
218
279
|
criterion_main!(benches);
|