polyglot-sql-chio 0.9.2__tar.gz → 0.9.3__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_chio-0.9.2 → polyglot_sql_chio-0.9.3}/Cargo.lock +6 -6
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/Cargo.toml +1 -1
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/PKG-INFO +1 -1
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/Cargo.toml +2 -2
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/README.md +1 -1
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/validation/tests.rs +300 -26
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/validation.rs +145 -10
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/README.md +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/in_list.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/lineage.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/parsing.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/performance_hotspots.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/transpile.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/examples/bench_json.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/ast_children.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/ast_json.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/builder/engine.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/builder/mod.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/builder/plan.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/bigquery.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/clickhouse.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/duckdb.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/fabric.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/mod.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/collections.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/mod.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/operators.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/statements.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/types.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/presto.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/snowflake.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/diff.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/error.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/expressions.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/format_tokens.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/function_catalog.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/function_registry.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/generator.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/guard.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/helper.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/lib.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/lineage.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/openlineage.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/annotate_types.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/parser.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/planner.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/query_analysis.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/resolver.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/schema.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/scope.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/set_operation.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/time.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/tokens.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/transforms.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/traversal.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/trie.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/common/known_failures.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/common/mod.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/data_type_api.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/deep_nesting_regression.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/dialect_matrix.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/error_handling.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/query_analysis.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/README.md +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/Cargo.toml +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/README.md +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/docs/api.md +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/docs/index.md +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/mkdocs.yml +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/builders.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/dialects.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/diff.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/errors.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/expr.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/format.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/generate.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/helpers.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/lib.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/lineage.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/optimize.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/parse.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/query_analysis.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/transforms.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/transpile.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/types.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/validate.rs +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/conftest.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_builders.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_format.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_parse.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_query_analysis.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_transpile.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_validate.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/uv.lock +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/pyproject.toml +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/python/polyglot_sql/__init__.py +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/python/polyglot_sql/__init__.pyi +0 -0
- {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/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.9.
|
|
608
|
+
version = "0.9.3"
|
|
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.9.
|
|
626
|
+
version = "0.9.3"
|
|
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.9.
|
|
635
|
+
version = "0.9.3"
|
|
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.9.
|
|
645
|
+
version = "0.9.3"
|
|
646
646
|
|
|
647
647
|
[[package]]
|
|
648
648
|
name = "polyglot-sql-python"
|
|
649
|
-
version = "0.9.
|
|
649
|
+
version = "0.9.3"
|
|
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.9.
|
|
660
|
+
version = "0.9.3"
|
|
661
661
|
dependencies = [
|
|
662
662
|
"console_error_panic_hook",
|
|
663
663
|
"js-sys",
|
|
@@ -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.9.
|
|
103
|
+
polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.9.3" }
|
|
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.9.
|
|
110
|
+
polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.9.3", optional = true, default-features = false }
|
|
111
111
|
|
|
112
112
|
[dev-dependencies]
|
|
113
113
|
pretty_assertions = "1.4"
|
|
@@ -25,7 +25,7 @@ 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.9.
|
|
28
|
+
polyglot-sql = { version = "0.9.3", default-features = false }
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
```toml
|
{polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/validation/tests.rs
RENAMED
|
@@ -166,6 +166,18 @@ fn test_function_catalog() -> Arc<HashMapFunctionCatalog> {
|
|
|
166
166
|
Arc::new(catalog)
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
+
fn schema_validation_dialects() -> [DialectType; 7] {
|
|
170
|
+
[
|
|
171
|
+
DialectType::Generic,
|
|
172
|
+
DialectType::Snowflake,
|
|
173
|
+
DialectType::DuckDB,
|
|
174
|
+
DialectType::BigQuery,
|
|
175
|
+
DialectType::Databricks,
|
|
176
|
+
DialectType::PostgreSQL,
|
|
177
|
+
DialectType::TSQL,
|
|
178
|
+
]
|
|
179
|
+
}
|
|
180
|
+
|
|
169
181
|
#[test]
|
|
170
182
|
fn test_validate_with_schema_known_table_column() {
|
|
171
183
|
let schema = base_schema();
|
|
@@ -182,36 +194,205 @@ fn test_validate_with_schema_known_table_column() {
|
|
|
182
194
|
|
|
183
195
|
#[test]
|
|
184
196
|
fn test_validate_with_schema_qualified_cte_column_is_not_ambiguous() {
|
|
197
|
+
let schema = base_schema();
|
|
198
|
+
let opts = SchemaValidationOptions {
|
|
199
|
+
check_references: true,
|
|
200
|
+
..Default::default()
|
|
201
|
+
};
|
|
202
|
+
for dialect in schema_validation_dialects() {
|
|
203
|
+
let result = validate_with_schema(
|
|
204
|
+
"WITH selected_users AS (SELECT id FROM users), \
|
|
205
|
+
selected_orders AS (SELECT id FROM orders) \
|
|
206
|
+
SELECT selected_users.id FROM selected_users \
|
|
207
|
+
JOIN selected_orders ON selected_users.id = selected_orders.id",
|
|
208
|
+
dialect,
|
|
209
|
+
&schema,
|
|
210
|
+
&opts,
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
assert!(result.valid, "{dialect}: {:#?}", result.errors);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
#[test]
|
|
218
|
+
fn test_validate_with_schema_correlated_subquery_resolves_outer_alias() {
|
|
219
|
+
let schema = base_schema();
|
|
220
|
+
let opts = SchemaValidationOptions {
|
|
221
|
+
check_references: true,
|
|
222
|
+
..Default::default()
|
|
223
|
+
};
|
|
224
|
+
for dialect in schema_validation_dialects() {
|
|
225
|
+
let result = validate_with_schema(
|
|
226
|
+
"SELECT outer_users.id FROM users outer_users \
|
|
227
|
+
WHERE EXISTS (SELECT 1 FROM orders inner_orders \
|
|
228
|
+
WHERE inner_orders.user_id = outer_users.id)",
|
|
229
|
+
dialect,
|
|
230
|
+
&schema,
|
|
231
|
+
&opts,
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
assert!(result.valid, "{dialect}: {:#?}", result.errors);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
#[test]
|
|
239
|
+
fn test_validate_with_schema_correlated_subquery_prefers_inner_unqualified_column() {
|
|
240
|
+
let schema = base_schema();
|
|
241
|
+
let opts = SchemaValidationOptions {
|
|
242
|
+
check_references: true,
|
|
243
|
+
..Default::default()
|
|
244
|
+
};
|
|
245
|
+
for dialect in schema_validation_dialects() {
|
|
246
|
+
let result = validate_with_schema(
|
|
247
|
+
"SELECT outer_users.id FROM users outer_users \
|
|
248
|
+
WHERE EXISTS (SELECT 1 FROM orders inner_orders \
|
|
249
|
+
WHERE id = outer_users.id)",
|
|
250
|
+
dialect,
|
|
251
|
+
&schema,
|
|
252
|
+
&opts,
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
assert!(result.valid, "{dialect}: {:#?}", result.errors);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
#[test]
|
|
260
|
+
fn test_validate_with_schema_subsequent_cte_resolves_prior_projection() {
|
|
261
|
+
let schema = base_schema();
|
|
262
|
+
let opts = SchemaValidationOptions {
|
|
263
|
+
check_references: true,
|
|
264
|
+
..Default::default()
|
|
265
|
+
};
|
|
266
|
+
for dialect in schema_validation_dialects() {
|
|
267
|
+
let result = validate_with_schema(
|
|
268
|
+
"WITH derived AS (SELECT total AS derived_total FROM orders), \
|
|
269
|
+
next AS (SELECT derived_total FROM derived) \
|
|
270
|
+
SELECT derived_total FROM next",
|
|
271
|
+
dialect,
|
|
272
|
+
&schema,
|
|
273
|
+
&opts,
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
assert!(result.valid, "{dialect}: {:#?}", result.errors);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
#[test]
|
|
281
|
+
fn test_validate_with_schema_window_resolves_prior_cte_projection() {
|
|
282
|
+
let schema = base_schema();
|
|
283
|
+
let opts = SchemaValidationOptions {
|
|
284
|
+
check_references: true,
|
|
285
|
+
..Default::default()
|
|
286
|
+
};
|
|
287
|
+
for dialect in schema_validation_dialects() {
|
|
288
|
+
let result = validate_with_schema(
|
|
289
|
+
"WITH scored AS (SELECT user_id, total AS order_total FROM orders), \
|
|
290
|
+
ranked AS (SELECT user_id, ROW_NUMBER() OVER ( \
|
|
291
|
+
PARTITION BY user_id ORDER BY order_total DESC) AS row_number FROM scored) \
|
|
292
|
+
SELECT user_id FROM ranked",
|
|
293
|
+
dialect,
|
|
294
|
+
&schema,
|
|
295
|
+
&opts,
|
|
296
|
+
);
|
|
297
|
+
assert!(result.valid, "{dialect}: {:#?}", result.errors);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
#[test]
|
|
302
|
+
fn test_validate_with_schema_joined_cte_projection_preserves_scope() {
|
|
303
|
+
let schema = base_schema();
|
|
304
|
+
let opts = SchemaValidationOptions {
|
|
305
|
+
check_references: true,
|
|
306
|
+
..Default::default()
|
|
307
|
+
};
|
|
308
|
+
for dialect in schema_validation_dialects() {
|
|
309
|
+
let result = validate_with_schema(
|
|
310
|
+
"WITH selected_users AS (SELECT id, name FROM users), \
|
|
311
|
+
selected_orders AS (SELECT id, user_id, total FROM orders), \
|
|
312
|
+
combined AS (SELECT selected_users.*, selected_orders.total \
|
|
313
|
+
FROM selected_users JOIN selected_orders \
|
|
314
|
+
ON selected_users.id = selected_orders.user_id) \
|
|
315
|
+
SELECT id, name, total FROM combined",
|
|
316
|
+
dialect,
|
|
317
|
+
&schema,
|
|
318
|
+
&opts,
|
|
319
|
+
);
|
|
320
|
+
|
|
321
|
+
assert!(result.valid, "{dialect}: {:#?}", result.errors);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
#[test]
|
|
326
|
+
fn test_validate_with_schema_chained_star_projection_preserves_aliases() {
|
|
327
|
+
let schema = base_schema();
|
|
328
|
+
let opts = SchemaValidationOptions {
|
|
329
|
+
check_references: true,
|
|
330
|
+
..Default::default()
|
|
331
|
+
};
|
|
332
|
+
for dialect in schema_validation_dialects() {
|
|
333
|
+
let result = validate_with_schema(
|
|
334
|
+
"WITH totals AS (SELECT user_id, total AS order_total FROM orders), \
|
|
335
|
+
copied AS (SELECT * FROM totals), \
|
|
336
|
+
scored AS (SELECT *, order_total + 1 AS adjusted_total FROM copied) \
|
|
337
|
+
SELECT user_id, order_total, adjusted_total FROM scored",
|
|
338
|
+
dialect,
|
|
339
|
+
&schema,
|
|
340
|
+
&opts,
|
|
341
|
+
);
|
|
342
|
+
|
|
343
|
+
assert!(result.valid, "{dialect}: {:#?}", result.errors);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
#[test]
|
|
348
|
+
fn test_validate_with_schema_snowflake_qualify_resolves_projection_columns() {
|
|
185
349
|
let schema = base_schema();
|
|
186
350
|
let opts = SchemaValidationOptions {
|
|
187
351
|
check_references: true,
|
|
188
352
|
..Default::default()
|
|
189
353
|
};
|
|
190
354
|
let result = validate_with_schema(
|
|
191
|
-
"WITH
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
DialectType::
|
|
355
|
+
"WITH ranked AS (SELECT user_id, total, \
|
|
356
|
+
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY total DESC) AS row_number \
|
|
357
|
+
FROM orders QUALIFY row_number = 1) \
|
|
358
|
+
SELECT user_id, total FROM ranked",
|
|
359
|
+
DialectType::Snowflake,
|
|
196
360
|
&schema,
|
|
197
361
|
&opts,
|
|
198
362
|
);
|
|
363
|
+
assert!(result.valid, "{:#?}", result.errors);
|
|
364
|
+
}
|
|
199
365
|
|
|
366
|
+
#[test]
|
|
367
|
+
fn test_validate_with_schema_snowflake_union_by_name_preserves_projection() {
|
|
368
|
+
let schema = base_schema();
|
|
369
|
+
let opts = SchemaValidationOptions {
|
|
370
|
+
check_references: true,
|
|
371
|
+
..Default::default()
|
|
372
|
+
};
|
|
373
|
+
let result = validate_with_schema(
|
|
374
|
+
"WITH records AS (SELECT id, name FROM users \
|
|
375
|
+
UNION ALL BY NAME SELECT id, CAST(total AS VARCHAR) AS name FROM orders) \
|
|
376
|
+
SELECT id, name FROM records",
|
|
377
|
+
DialectType::Snowflake,
|
|
378
|
+
&schema,
|
|
379
|
+
&opts,
|
|
380
|
+
);
|
|
200
381
|
assert!(result.valid, "{:#?}", result.errors);
|
|
201
382
|
}
|
|
202
383
|
|
|
203
384
|
#[test]
|
|
204
|
-
fn
|
|
385
|
+
fn test_validate_with_schema_snowflake_join_using_resolves_cte_column() {
|
|
205
386
|
let schema = base_schema();
|
|
206
387
|
let opts = SchemaValidationOptions {
|
|
207
388
|
check_references: true,
|
|
208
389
|
..Default::default()
|
|
209
390
|
};
|
|
210
391
|
let result = validate_with_schema(
|
|
211
|
-
"SELECT
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
DialectType::
|
|
392
|
+
"WITH selected_users AS (SELECT id, name FROM users) \
|
|
393
|
+
SELECT orders.id, selected_users.name FROM orders \
|
|
394
|
+
INNER JOIN selected_users USING (id)",
|
|
395
|
+
DialectType::Snowflake,
|
|
215
396
|
&schema,
|
|
216
397
|
&opts,
|
|
217
398
|
);
|
|
@@ -220,17 +401,18 @@ fn test_validate_with_schema_correlated_subquery_resolves_outer_alias() {
|
|
|
220
401
|
}
|
|
221
402
|
|
|
222
403
|
#[test]
|
|
223
|
-
fn
|
|
404
|
+
fn test_validate_with_schema_snowflake_join_using_cte_from_same_table() {
|
|
224
405
|
let schema = base_schema();
|
|
225
406
|
let opts = SchemaValidationOptions {
|
|
226
407
|
check_references: true,
|
|
227
408
|
..Default::default()
|
|
228
409
|
};
|
|
229
410
|
let result = validate_with_schema(
|
|
230
|
-
"SELECT
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
411
|
+
"WITH selected_users AS (SELECT id FROM users WHERE age >= 18), \
|
|
412
|
+
combined AS (SELECT users.* FROM users \
|
|
413
|
+
INNER JOIN selected_users USING (id)) \
|
|
414
|
+
SELECT id, name FROM combined",
|
|
415
|
+
DialectType::Snowflake,
|
|
234
416
|
&schema,
|
|
235
417
|
&opts,
|
|
236
418
|
);
|
|
@@ -239,17 +421,18 @@ fn test_validate_with_schema_correlated_subquery_prefers_inner_unqualified_colum
|
|
|
239
421
|
}
|
|
240
422
|
|
|
241
423
|
#[test]
|
|
242
|
-
fn
|
|
424
|
+
fn test_validate_with_schema_snowflake_nested_qualify_resolves_cte_projection() {
|
|
243
425
|
let schema = base_schema();
|
|
244
426
|
let opts = SchemaValidationOptions {
|
|
245
427
|
check_references: true,
|
|
246
428
|
..Default::default()
|
|
247
429
|
};
|
|
248
430
|
let result = validate_with_schema(
|
|
249
|
-
"WITH
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
431
|
+
"WITH customer_orders AS (SELECT user_id, id AS order_id, total FROM orders), \
|
|
432
|
+
deduplicated AS (SELECT * FROM (SELECT user_id, order_id, total \
|
|
433
|
+
FROM customer_orders QUALIFY ROW_NUMBER() OVER (PARTITION BY user_id \
|
|
434
|
+
ORDER BY order_id) = 1)) SELECT user_id, order_id, total FROM deduplicated",
|
|
435
|
+
DialectType::Snowflake,
|
|
253
436
|
&schema,
|
|
254
437
|
&opts,
|
|
255
438
|
);
|
|
@@ -258,18 +441,19 @@ fn test_validate_with_schema_subsequent_cte_resolves_prior_projection() {
|
|
|
258
441
|
}
|
|
259
442
|
|
|
260
443
|
#[test]
|
|
261
|
-
fn
|
|
444
|
+
fn test_validate_with_schema_snowflake_deep_nested_qualify_resolves_cte_projection() {
|
|
262
445
|
let schema = base_schema();
|
|
263
446
|
let opts = SchemaValidationOptions {
|
|
264
447
|
check_references: true,
|
|
265
448
|
..Default::default()
|
|
266
449
|
};
|
|
267
450
|
let result = validate_with_schema(
|
|
268
|
-
"WITH
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
451
|
+
"WITH base AS (SELECT id AS user_id, name, age FROM users), \
|
|
452
|
+
flags AS (SELECT user_id FROM (SELECT user_id FROM ( \
|
|
453
|
+
SELECT user_id, name, age FROM base \
|
|
454
|
+
QUALIFY ROW_NUMBER() OVER (PARTITION BY user_id, name ORDER BY age) = 1))) \
|
|
455
|
+
SELECT user_id FROM flags",
|
|
456
|
+
DialectType::Snowflake,
|
|
273
457
|
&schema,
|
|
274
458
|
&opts,
|
|
275
459
|
);
|
|
@@ -277,6 +461,96 @@ fn test_validate_with_schema_window_resolves_prior_cte_projection() {
|
|
|
277
461
|
assert!(result.valid, "{:#?}", result.errors);
|
|
278
462
|
}
|
|
279
463
|
|
|
464
|
+
#[test]
|
|
465
|
+
fn test_validate_with_schema_deep_star_chain_preserves_computed_alias() {
|
|
466
|
+
let schema = base_schema();
|
|
467
|
+
let opts = SchemaValidationOptions {
|
|
468
|
+
check_references: true,
|
|
469
|
+
..Default::default()
|
|
470
|
+
};
|
|
471
|
+
for dialect in schema_validation_dialects() {
|
|
472
|
+
let result = validate_with_schema(
|
|
473
|
+
"WITH base AS (SELECT user_id, total FROM orders), \
|
|
474
|
+
first_copy AS (SELECT *, total + 1 AS adjusted_total FROM base), \
|
|
475
|
+
second_copy AS (SELECT * FROM first_copy), \
|
|
476
|
+
third_copy AS (SELECT * FROM second_copy), \
|
|
477
|
+
fourth_copy AS (SELECT *, adjusted_total * 2 AS score FROM third_copy) \
|
|
478
|
+
SELECT user_id, adjusted_total, score FROM fourth_copy",
|
|
479
|
+
dialect,
|
|
480
|
+
&schema,
|
|
481
|
+
&opts,
|
|
482
|
+
);
|
|
483
|
+
|
|
484
|
+
assert!(result.valid, "{dialect}: {:#?}", result.errors);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
#[test]
|
|
489
|
+
fn test_validate_with_schema_nested_scalar_subquery_resolves_outer_column() {
|
|
490
|
+
let schema = base_schema();
|
|
491
|
+
let opts = SchemaValidationOptions {
|
|
492
|
+
check_references: true,
|
|
493
|
+
..Default::default()
|
|
494
|
+
};
|
|
495
|
+
for dialect in schema_validation_dialects() {
|
|
496
|
+
let result = validate_with_schema(
|
|
497
|
+
"WITH metrics AS (SELECT user_id, total AS score FROM orders), \
|
|
498
|
+
adjusted AS (SELECT score, CASE WHEN score IS NULL THEN NULL ELSE ( \
|
|
499
|
+
SELECT adjusted_score FROM (SELECT score + 1 AS adjusted_score)) END AS result \
|
|
500
|
+
FROM metrics) SELECT score, result FROM adjusted",
|
|
501
|
+
dialect,
|
|
502
|
+
&schema,
|
|
503
|
+
&opts,
|
|
504
|
+
);
|
|
505
|
+
|
|
506
|
+
assert!(result.valid, "{dialect}: {:#?}", result.errors);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
#[test]
|
|
511
|
+
fn test_validate_with_schema_ambiguous_outer_column_stays_invalid() {
|
|
512
|
+
let schema = base_schema();
|
|
513
|
+
let opts = SchemaValidationOptions {
|
|
514
|
+
check_references: true,
|
|
515
|
+
..Default::default()
|
|
516
|
+
};
|
|
517
|
+
let result = validate_with_schema(
|
|
518
|
+
"SELECT users.id FROM users JOIN orders ON users.id = orders.user_id \
|
|
519
|
+
WHERE EXISTS (SELECT 1 WHERE id > 0)",
|
|
520
|
+
DialectType::Generic,
|
|
521
|
+
&schema,
|
|
522
|
+
&opts,
|
|
523
|
+
);
|
|
524
|
+
|
|
525
|
+
assert!(!result.valid);
|
|
526
|
+
assert!(result.errors.iter().any(|error| {
|
|
527
|
+
error.code == validation_codes::E_AMBIGUOUS_COLUMN_REFERENCE
|
|
528
|
+
&& error.message.contains("outer sources")
|
|
529
|
+
}));
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
#[test]
|
|
533
|
+
fn test_validate_with_schema_unknown_column_after_cte_projection_stays_invalid() {
|
|
534
|
+
let schema = base_schema();
|
|
535
|
+
let opts = SchemaValidationOptions {
|
|
536
|
+
check_references: true,
|
|
537
|
+
..Default::default()
|
|
538
|
+
};
|
|
539
|
+
let result = validate_with_schema(
|
|
540
|
+
"WITH selected_users AS (SELECT id, name FROM users) \
|
|
541
|
+
SELECT missing_column FROM selected_users",
|
|
542
|
+
DialectType::Generic,
|
|
543
|
+
&schema,
|
|
544
|
+
&opts,
|
|
545
|
+
);
|
|
546
|
+
|
|
547
|
+
assert!(!result.valid);
|
|
548
|
+
assert!(result
|
|
549
|
+
.errors
|
|
550
|
+
.iter()
|
|
551
|
+
.any(|error| error.code == validation_codes::E_UNKNOWN_COLUMN));
|
|
552
|
+
}
|
|
553
|
+
|
|
280
554
|
#[test]
|
|
281
555
|
fn test_validate_with_schema_unknown_column_in_derived_table() {
|
|
282
556
|
let schema = base_schema();
|