polyglot-sql 0.11.0__tar.gz → 0.12.1__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.11.0 → polyglot_sql-0.12.1}/Cargo.lock +6 -6
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/Cargo.toml +1 -1
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/PKG-INFO +57 -6
- {polyglot_sql-0.11.0/crates/polyglot-sql-python → polyglot_sql-0.12.1}/README.md +56 -5
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/Cargo.toml +2 -2
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/README.md +30 -4
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/performance_hotspots.rs +61 -1
- polyglot_sql-0.12.1/crates/polyglot-sql/src/binding.rs +519 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/duckdb.rs +227 -57
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/fabric.rs +2 -1
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/mod.rs +41 -5
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +25 -5
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/mod.rs +24 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/operators.rs +76 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/presto.rs +12 -22
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/snowflake.rs +77 -96
- polyglot_sql-0.12.1/crates/polyglot-sql/src/format_tokens.rs +167 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/function_catalog.rs +56 -2
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/generator.rs +549 -246
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/guard.rs +9 -1
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/lib.rs +137 -24
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/lineage.rs +8 -18
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/annotate_types.rs +563 -57
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/mod.rs +2 -0
- polyglot_sql-0.12.1/crates/polyglot-sql/src/optimizer/set_operation_types.rs +1182 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/parser.rs +498 -24
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/query_analysis/column_uses.rs +20 -18
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/query_analysis.rs +652 -152
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/schema.rs +16 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/scope.rs +6 -9
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/set_operation.rs +1 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/transforms.rs +5 -0
- polyglot_sql-0.12.1/crates/polyglot-sql/src/validation/semantics.rs +534 -0
- polyglot_sql-0.12.1/crates/polyglot-sql/src/validation/tests.rs +2444 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/validation.rs +849 -565
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/common/known_failures.rs +30 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +7 -7
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/data_type_api.rs +146 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/deep_nesting_regression.rs +102 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/dialect_matrix.rs +67 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/query_analysis.rs +563 -4
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/snowflake_regression_test.rs +96 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/README.md +1 -1
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1/crates/polyglot-sql-python}/README.md +56 -5
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/helpers.rs +48 -5
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/parse.rs +25 -9
- polyglot_sql-0.12.1/crates/polyglot-sql-python/src/query_analysis.rs +54 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/transpile.rs +4 -29
- polyglot_sql-0.12.1/crates/polyglot-sql-python/src/validate.rs +89 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_format.py +26 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_parse.py +44 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_query_analysis.py +93 -1
- polyglot_sql-0.12.1/crates/polyglot-sql-python/tests/test_validate.py +448 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/python/polyglot_sql/__init__.py +59 -2
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/python/polyglot_sql/__init__.pyi +52 -6
- polyglot_sql-0.12.1/python/polyglot_sql/analysis_types.py +171 -0
- polyglot_sql-0.11.0/crates/polyglot-sql/src/format_tokens.rs +0 -87
- polyglot_sql-0.11.0/crates/polyglot-sql/src/validation/tests.rs +0 -1417
- polyglot_sql-0.11.0/crates/polyglot-sql-python/src/query_analysis.rs +0 -33
- polyglot_sql-0.11.0/crates/polyglot-sql-python/src/validate.rs +0 -55
- polyglot_sql-0.11.0/crates/polyglot-sql-python/tests/test_validate.py +0 -173
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/in_list.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/lineage.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/parsing.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/transpile.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/examples/bench_json.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/ast_children.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/ast_json.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/ast_mutation.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/builder/mod.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/builder/plan.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/bigquery.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/clickhouse.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/collections.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/statements.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/types.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/diff.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/error.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/expressions.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/function_registry.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/helper.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/openlineage.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/planner.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/resolver.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/time.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/tokens.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/traversal.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/trie.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/common/mod.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/error_handling.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/Cargo.toml +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/docs/api.md +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/docs/index.md +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/mkdocs.yml +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/builders.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/dialects.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/diff.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/errors.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/expr.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/format.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/generate.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/lib.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/lineage.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/optimize.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/transforms.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/types.rs +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/conftest.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_builders.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_transpile.py +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/uv.lock +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/pyproject.toml +0 -0
- {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/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.1"
|
|
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.1"
|
|
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.1"
|
|
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.1"
|
|
646
646
|
|
|
647
647
|
[[package]]
|
|
648
648
|
name = "polyglot-sql-python"
|
|
649
|
-
version = "0.
|
|
649
|
+
version = "0.12.1"
|
|
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.1"
|
|
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.1
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -112,7 +112,9 @@ polyglot_sql.generate(ast)
|
|
|
112
112
|
|
|
113
113
|
### Complexity Guard Options
|
|
114
114
|
|
|
115
|
-
`
|
|
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
|
|
116
118
|
using the shared camelCase keys: `maxParserDepth`, `maxInputBytes`, `maxTokens`,
|
|
117
119
|
`maxAstNodes`, `maxAstDepth`, `maxParenthesisDepth`, and `maxFunctionCallDepth`.
|
|
118
120
|
Omit the argument, pass `None`, or omit a key to use its default. A field-level `None`
|
|
@@ -120,15 +122,26 @@ disables that check; a nonnegative integer overrides it. For example:
|
|
|
120
122
|
|
|
121
123
|
```python
|
|
122
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})
|
|
123
127
|
```
|
|
124
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
|
+
|
|
125
137
|
Parser depth defaults to 1024 logical levels on native targets (32 on WASM) and is
|
|
126
138
|
checked during parsing, before an AST exists. Zero rejects parsing descents.
|
|
127
139
|
Other checks remain independent.
|
|
128
140
|
Raising or disabling limits can permit stack exhaustion and process termination,
|
|
129
141
|
even for trusted generated SQL. Increasing a limit does not increase stack space;
|
|
130
142
|
these limits are not general time/memory budgets. Application owners should control
|
|
131
|
-
overrides.
|
|
143
|
+
overrides. Other SQL-consuming helpers, including lineage and optimization,
|
|
144
|
+
continue to inherit default protection.
|
|
132
145
|
|
|
133
146
|
### Format Guard Behavior
|
|
134
147
|
|
|
@@ -365,9 +378,47 @@ Unknown dialect names raise built-in `ValueError`.
|
|
|
365
378
|
- `bool(result)` works (`True` when valid)
|
|
366
379
|
|
|
367
380
|
`strict_syntax=True` rejects compatibility forms such as trailing commas before
|
|
368
|
-
clause boundaries. `semantic=True`
|
|
369
|
-
|
|
370
|
-
`
|
|
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.
|
|
371
422
|
|
|
372
423
|
Each `ValidationErrorInfo` has:
|
|
373
424
|
|
|
@@ -85,7 +85,9 @@ polyglot_sql.generate(ast)
|
|
|
85
85
|
|
|
86
86
|
### Complexity Guard Options
|
|
87
87
|
|
|
88
|
-
`
|
|
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
|
|
89
91
|
using the shared camelCase keys: `maxParserDepth`, `maxInputBytes`, `maxTokens`,
|
|
90
92
|
`maxAstNodes`, `maxAstDepth`, `maxParenthesisDepth`, and `maxFunctionCallDepth`.
|
|
91
93
|
Omit the argument, pass `None`, or omit a key to use its default. A field-level `None`
|
|
@@ -93,15 +95,26 @@ disables that check; a nonnegative integer overrides it. For example:
|
|
|
93
95
|
|
|
94
96
|
```python
|
|
95
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})
|
|
96
100
|
```
|
|
97
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
|
+
|
|
98
110
|
Parser depth defaults to 1024 logical levels on native targets (32 on WASM) and is
|
|
99
111
|
checked during parsing, before an AST exists. Zero rejects parsing descents.
|
|
100
112
|
Other checks remain independent.
|
|
101
113
|
Raising or disabling limits can permit stack exhaustion and process termination,
|
|
102
114
|
even for trusted generated SQL. Increasing a limit does not increase stack space;
|
|
103
115
|
these limits are not general time/memory budgets. Application owners should control
|
|
104
|
-
overrides.
|
|
116
|
+
overrides. Other SQL-consuming helpers, including lineage and optimization,
|
|
117
|
+
continue to inherit default protection.
|
|
105
118
|
|
|
106
119
|
### Format Guard Behavior
|
|
107
120
|
|
|
@@ -338,9 +351,47 @@ Unknown dialect names raise built-in `ValueError`.
|
|
|
338
351
|
- `bool(result)` works (`True` when valid)
|
|
339
352
|
|
|
340
353
|
`strict_syntax=True` rejects compatibility forms such as trailing commas before
|
|
341
|
-
clause boundaries. `semantic=True`
|
|
342
|
-
|
|
343
|
-
`
|
|
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.
|
|
344
395
|
|
|
345
396
|
Each `ValidationErrorInfo` has:
|
|
346
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.1" }
|
|
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.1", 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.1", default-features = false }
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
```toml
|
|
32
32
|
polyglot-sql = {
|
|
33
|
-
version = "0.
|
|
33
|
+
version = "0.12.1",
|
|
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.1",
|
|
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.1",
|
|
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.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/performance_hotspots.rs
RENAMED
|
@@ -210,10 +210,70 @@ fn bench_tokenize_and_parse(c: &mut Criterion) {
|
|
|
210
210
|
guards.finish();
|
|
211
211
|
}
|
|
212
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
|
+
|
|
213
272
|
criterion_group!(
|
|
214
273
|
benches,
|
|
215
274
|
bench_dialect_construction,
|
|
216
275
|
bench_fresh_vs_reused_dialect,
|
|
217
|
-
bench_tokenize_and_parse
|
|
276
|
+
bench_tokenize_and_parse,
|
|
277
|
+
bench_validation_and_analysis
|
|
218
278
|
);
|
|
219
279
|
criterion_main!(benches);
|