polyglot-sql 0.13.2__tar.gz → 0.13.4__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.13.2 → polyglot_sql-0.13.4}/Cargo.lock +6 -6
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/Cargo.toml +1 -1
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/PKG-INFO +1 -1
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/Cargo.toml +2 -2
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/README.md +4 -4
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/clickhouse.rs +3 -2
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/mod.rs +5 -0
- polyglot_sql-0.13.4/crates/polyglot-sql/src/dialects/normalization/duckdb.rs +272 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +2 -1
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/statements.rs +19 -7
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/expressions.rs +11 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/generator.rs +616 -90
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/parser.rs +732 -109
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/query_analysis/column_uses.rs +17 -9
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/scope.rs +95 -4
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/tokens.rs +10 -2
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/deep_nesting_regression.rs +18 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/dialect_matrix.rs +138 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/duckdb_integer_division.rs +211 -6
- polyglot_sql-0.13.4/crates/polyglot-sql/tests/duckdb_json_arrow_context.rs +398 -0
- polyglot_sql-0.13.4/crates/polyglot-sql/tests/duckdb_unreserved_relation_aliases.rs +98 -0
- polyglot_sql-0.13.4/crates/polyglot-sql/tests/is_predicate_precedence.rs +288 -0
- polyglot_sql-0.13.4/crates/polyglot-sql/tests/mod_precedence.rs +176 -0
- polyglot_sql-0.13.4/crates/polyglot-sql/tests/numeric_exponent_boundaries.rs +45 -0
- polyglot_sql-0.13.4/crates/polyglot-sql/tests/query_analysis_regression.rs +418 -0
- polyglot_sql-0.13.4/crates/polyglot-sql/tests/quoted_relation_columns.rs +250 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/README.md +1 -1
- polyglot_sql-0.13.4/crates/polyglot-sql-python/tests/test_duckdb_datafusion_execution.py +102 -0
- polyglot_sql-0.13.2/crates/polyglot-sql/src/dialects/normalization/duckdb.rs +0 -107
- polyglot_sql-0.13.2/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -201
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/README.md +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/common/mod.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/in_list.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/lineage.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/parsing.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/performance_hotspots.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/transpile.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/examples/bench_json.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/ast_children.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/ast_json.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/ast_mutation.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/binding.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/builder/mod.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/builder/plan.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/bigquery.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/duckdb.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/fabric.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/hana.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/collections.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/hana.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/mod.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/operators.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/types.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/vertica.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/presto.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/snowflake.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/vertica.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/diff.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/error.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/format_tokens.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/function_catalog.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/function_registry.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/guard.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/helper.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/lib.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/lineage.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/openlineage.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/annotate_types.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/set_operation_types.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/planner.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/query_analysis.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/resolver.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/schema.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/set_operation.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/time.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/transforms.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/traversal.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/trie.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/validation/semantics.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/validation/tests.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/validation.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/common/known_failures.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/common/mod.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/ddl.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/dml.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/functions.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/identity.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/select.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/types.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/vertica/identity.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/vertica/transpilation.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/vertica/types.json +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/data_type_api.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/duckdb_order_by_all.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/error_handling.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/query_analysis.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/Cargo.toml +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/README.md +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/docs/api.md +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/docs/index.md +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/mkdocs.yml +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/builders.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/dialects.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/diff.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/errors.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/expr.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/format.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/generate.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/helpers.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/lib.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/lineage.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/optimize.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/parse.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/query_analysis.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/transforms.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/transpile.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/types.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/validate.rs +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/conftest.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_builders.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_format.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_parse.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_query_analysis.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_transpile.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_validate.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/uv.lock +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/pyproject.toml +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/python/polyglot_sql/__init__.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/python/polyglot_sql/__init__.pyi +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/python/polyglot_sql/analysis_types.py +0 -0
- {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/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.13.
|
|
608
|
+
version = "0.13.4"
|
|
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.13.
|
|
626
|
+
version = "0.13.4"
|
|
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.13.
|
|
635
|
+
version = "0.13.4"
|
|
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.13.
|
|
645
|
+
version = "0.13.4"
|
|
646
646
|
|
|
647
647
|
[[package]]
|
|
648
648
|
name = "polyglot-sql-python"
|
|
649
|
-
version = "0.13.
|
|
649
|
+
version = "0.13.4"
|
|
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.13.
|
|
660
|
+
version = "0.13.4"
|
|
661
661
|
dependencies = [
|
|
662
662
|
"console_error_panic_hook",
|
|
663
663
|
"js-sys",
|
|
@@ -103,14 +103,14 @@ function-catalog-all-dialects = [
|
|
|
103
103
|
]
|
|
104
104
|
|
|
105
105
|
[dependencies]
|
|
106
|
-
polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.13.
|
|
106
|
+
polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.13.4" }
|
|
107
107
|
serde = { workspace = true }
|
|
108
108
|
serde_json = { workspace = true }
|
|
109
109
|
thiserror = { workspace = true }
|
|
110
110
|
unicode-segmentation = { workspace = true }
|
|
111
111
|
stacker = { version = "0.1", optional = true }
|
|
112
112
|
ts-rs = { version = "12.0", features = ["serde-compat"], optional = true }
|
|
113
|
-
polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.13.
|
|
113
|
+
polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.13.4", optional = true, default-features = false }
|
|
114
114
|
|
|
115
115
|
[dev-dependencies]
|
|
116
116
|
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.13.
|
|
28
|
+
polyglot-sql = { version = "0.13.4", default-features = false }
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
```toml
|
|
32
32
|
polyglot-sql = {
|
|
33
|
-
version = "0.13.
|
|
33
|
+
version = "0.13.4",
|
|
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.13.
|
|
47
|
+
version = "0.13.4",
|
|
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.13.
|
|
54
|
+
version = "0.13.4",
|
|
55
55
|
default-features = false,
|
|
56
56
|
features = ["transpile", "dialect-clickhouse", "dialect-postgresql"],
|
|
57
57
|
}
|
|
@@ -111,6 +111,9 @@ impl DialectImpl for ClickHouseDialect {
|
|
|
111
111
|
|
|
112
112
|
let wrap_not_target = |expr: Expression| -> Expression {
|
|
113
113
|
match expr {
|
|
114
|
+
// The generator emits typed negated LIKE predicates directly.
|
|
115
|
+
// Keep that form stable when reparsing lowered notLike calls.
|
|
116
|
+
Expression::Like(_) | Expression::ILike(_) => expr,
|
|
114
117
|
Expression::Paren(_) => expr,
|
|
115
118
|
Expression::In(_)
|
|
116
119
|
| Expression::Between(_)
|
|
@@ -119,8 +122,6 @@ impl DialectImpl for ClickHouseDialect {
|
|
|
119
122
|
| Expression::IsTrue(_)
|
|
120
123
|
| Expression::IsFalse(_)
|
|
121
124
|
| Expression::IsJson(_)
|
|
122
|
-
| Expression::Like(_)
|
|
123
|
-
| Expression::ILike(_)
|
|
124
125
|
| Expression::SimilarTo(_)
|
|
125
126
|
| Expression::Glob(_)
|
|
126
127
|
| Expression::RegexpLike(_)
|
|
@@ -947,6 +947,8 @@ where
|
|
|
947
947
|
| Expression::BitwiseAnd(_)
|
|
948
948
|
| Expression::BitwiseOr(_)
|
|
949
949
|
| Expression::BitwiseXor(_)
|
|
950
|
+
| Expression::BitwiseLeftShift(_)
|
|
951
|
+
| Expression::BitwiseRightShift(_)
|
|
950
952
|
| Expression::Is(_)
|
|
951
953
|
| Expression::MemberOf(_)
|
|
952
954
|
| Expression::ArrayContainsAll(_)
|
|
@@ -2110,6 +2112,8 @@ where
|
|
|
2110
2112
|
Expression::BitwiseAnd(op) => transform_binary!(BitwiseAnd, *op),
|
|
2111
2113
|
Expression::BitwiseOr(op) => transform_binary!(BitwiseOr, *op),
|
|
2112
2114
|
Expression::BitwiseXor(op) => transform_binary!(BitwiseXor, *op),
|
|
2115
|
+
Expression::BitwiseLeftShift(op) => transform_binary!(BitwiseLeftShift, *op),
|
|
2116
|
+
Expression::BitwiseRightShift(op) => transform_binary!(BitwiseRightShift, *op),
|
|
2113
2117
|
Expression::Is(op) => transform_binary!(Is, *op),
|
|
2114
2118
|
|
|
2115
2119
|
// ===== TryCast / SafeCast =====
|
|
@@ -9201,6 +9205,7 @@ impl Dialect {
|
|
|
9201
9205
|
cross_apply: None,
|
|
9202
9206
|
ordinality: None,
|
|
9203
9207
|
column_aliases: vec![],
|
|
9208
|
+
column_aliases_quoted: vec![],
|
|
9204
9209
|
}));
|
|
9205
9210
|
|
|
9206
9211
|
// Remove the original join and add to FROM expressions
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
//! Preserve DuckDB's type-dependent `//` semantics before target rewrites.
|
|
2
|
+
|
|
3
|
+
use super::scalar::{expression_numeric_kind, NumericKind};
|
|
4
|
+
use super::*;
|
|
5
|
+
use crate::expressions::RoundFunc;
|
|
6
|
+
|
|
7
|
+
fn combine(left: NumericKind, right: NumericKind) -> NumericKind {
|
|
8
|
+
use NumericKind::*;
|
|
9
|
+
match (left, right) {
|
|
10
|
+
(Unknown, _) | (_, Unknown) => Unknown,
|
|
11
|
+
(Float, _) | (_, Float) => Float,
|
|
12
|
+
(Decimal, _) | (_, Decimal) => Decimal,
|
|
13
|
+
(Integer, Integer) => Integer,
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
fn numeric_kind(expr: &Expression) -> NumericKind {
|
|
18
|
+
match expr {
|
|
19
|
+
Expression::Paren(p) => numeric_kind(&p.this),
|
|
20
|
+
Expression::Neg(n) => numeric_kind(&n.this),
|
|
21
|
+
Expression::Alias(a) => numeric_kind(&a.this),
|
|
22
|
+
Expression::Add(b) | Expression::Sub(b) | Expression::Mul(b) | Expression::Mod(b) => {
|
|
23
|
+
combine(numeric_kind(&b.left), numeric_kind(&b.right))
|
|
24
|
+
}
|
|
25
|
+
// The complete bottom-up source pass has already lowered fractional
|
|
26
|
+
// children to Div. Remaining IntDiv children have integer operands.
|
|
27
|
+
Expression::IntDiv(_) => NumericKind::Integer,
|
|
28
|
+
Expression::Div(_) => NumericKind::Float,
|
|
29
|
+
Expression::Function(f) if f.name.eq_ignore_ascii_case("NULLIF") && f.args.len() == 2 => {
|
|
30
|
+
numeric_kind(&f.args[0])
|
|
31
|
+
}
|
|
32
|
+
Expression::NullIf(f) => numeric_kind(&f.this),
|
|
33
|
+
_ => expression_numeric_kind(expr),
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// Classify the rewritten DataFusion expression. Source `/` nodes have already
|
|
38
|
+
/// been made floating, and lowered `//` nodes retain their operands' types.
|
|
39
|
+
/// Never infer provenance from SQL syntax such as a NULLIF divisor.
|
|
40
|
+
fn datafusion_numeric_kind(expr: &Expression) -> NumericKind {
|
|
41
|
+
match expr {
|
|
42
|
+
Expression::Paren(p) => datafusion_numeric_kind(&p.this),
|
|
43
|
+
Expression::Annotated(a) => datafusion_numeric_kind(&a.this),
|
|
44
|
+
Expression::Neg(n) => datafusion_numeric_kind(&n.this),
|
|
45
|
+
Expression::Alias(a) => datafusion_numeric_kind(&a.this),
|
|
46
|
+
Expression::Abs(f) => datafusion_numeric_kind(&f.this),
|
|
47
|
+
Expression::Add(b) | Expression::Sub(b) | Expression::Mul(b) | Expression::Mod(b) => {
|
|
48
|
+
combine(
|
|
49
|
+
datafusion_numeric_kind(&b.left),
|
|
50
|
+
datafusion_numeric_kind(&b.right),
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
Expression::Div(b) => {
|
|
54
|
+
let left = datafusion_numeric_kind(&b.left);
|
|
55
|
+
// Div is already target SQL. Its generated NULLIF follows
|
|
56
|
+
// DataFusion's common-type coercion, including a floating divisor.
|
|
57
|
+
let right = match &b.right {
|
|
58
|
+
Expression::Function(f)
|
|
59
|
+
if f.name.eq_ignore_ascii_case("NULLIF") && f.args.len() == 2 =>
|
|
60
|
+
{
|
|
61
|
+
combine(
|
|
62
|
+
datafusion_numeric_kind(&f.args[0]),
|
|
63
|
+
datafusion_numeric_kind(&f.args[1]),
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
other => datafusion_numeric_kind(other),
|
|
67
|
+
};
|
|
68
|
+
// A source `/` supplies a floating operand even when columns or
|
|
69
|
+
// function return types on the other side are unresolved.
|
|
70
|
+
if left == NumericKind::Float || right == NumericKind::Float {
|
|
71
|
+
NumericKind::Float
|
|
72
|
+
} else {
|
|
73
|
+
combine(left, right)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
Expression::Coalesce(f) => datafusion_branch_kind(f.expressions.iter()),
|
|
77
|
+
Expression::Case(c) => datafusion_branch_kind(
|
|
78
|
+
c.whens
|
|
79
|
+
.iter()
|
|
80
|
+
.map(|(_, result)| result)
|
|
81
|
+
.chain(c.else_.iter()),
|
|
82
|
+
),
|
|
83
|
+
Expression::IfFunc(f) => {
|
|
84
|
+
datafusion_branch_kind(std::iter::once(&f.true_value).chain(f.false_value.iter()))
|
|
85
|
+
}
|
|
86
|
+
Expression::Function(f) if f.name.eq_ignore_ascii_case("NULLIF") && f.args.len() == 2 => {
|
|
87
|
+
datafusion_nullif_kind(&f.args[0], &f.args[1])
|
|
88
|
+
}
|
|
89
|
+
Expression::NullIf(f) => datafusion_nullif_kind(&f.this, &f.expression),
|
|
90
|
+
// Do not assume functions such as ROUND preserve numeric types across
|
|
91
|
+
// dialects: DuckDB ROUND(integer) is integer, DataFusion's is floating.
|
|
92
|
+
_ => expression_numeric_kind(expr),
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
fn datafusion_branch_kind<'a>(branches: impl Iterator<Item = &'a Expression>) -> NumericKind {
|
|
97
|
+
branches
|
|
98
|
+
.filter(|expr| !matches!(expr, Expression::Null(_)))
|
|
99
|
+
.map(datafusion_numeric_kind)
|
|
100
|
+
.reduce(combine)
|
|
101
|
+
.unwrap_or(NumericKind::Unknown)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
fn datafusion_nullif_kind(left: &Expression, right: &Expression) -> NumericKind {
|
|
105
|
+
let left_kind = datafusion_numeric_kind(left);
|
|
106
|
+
// DuckDB preserves the first argument's type, but DataFusion coerces both
|
|
107
|
+
// arguments to a common type. Mixed numeric types need an explicit cast.
|
|
108
|
+
if left_kind == datafusion_numeric_kind(right) || matches!(right, Expression::Null(_)) {
|
|
109
|
+
left_kind
|
|
110
|
+
} else {
|
|
111
|
+
NumericKind::Unknown
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
fn as_double(expr: Expression) -> Expression {
|
|
116
|
+
super::operators::cast_expr(
|
|
117
|
+
expr,
|
|
118
|
+
DataType::Double {
|
|
119
|
+
precision: None,
|
|
120
|
+
scale: None,
|
|
121
|
+
},
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
fn unresolved_division(target: DialectType) -> crate::error::Error {
|
|
126
|
+
crate::error::Error::unsupported(
|
|
127
|
+
"DuckDB // with unresolved operand types; use explicit numeric casts",
|
|
128
|
+
target.to_string(),
|
|
129
|
+
)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
fn prepare_datafusion_division(expr: Expression) -> Result<Expression> {
|
|
133
|
+
// Stop the outer traversal at each outermost IntDiv. Rewrite that complete
|
|
134
|
+
// subtree once, bottom-up, including casts, functions, CASE and subqueries.
|
|
135
|
+
// Replacement nodes are not revisited, so a generated Div cannot be
|
|
136
|
+
// mistaken for a source `/`, even across nested integer divisions.
|
|
137
|
+
crate::traversal::transform_with_dispatch(
|
|
138
|
+
expr,
|
|
139
|
+
&Ok,
|
|
140
|
+
&|expr| !matches!(expr, Expression::IntDiv(_)),
|
|
141
|
+
&|expr, _| {
|
|
142
|
+
crate::traversal::transform_all(expr, &|mut expr| {
|
|
143
|
+
match &mut expr {
|
|
144
|
+
Expression::Div(b) => {
|
|
145
|
+
// Integer, decimal and unresolved source operands need
|
|
146
|
+
// floating arithmetic. Preserve an existing FLOAT operand
|
|
147
|
+
// rather than widening DuckDB's FLOAT/FLOAT division.
|
|
148
|
+
if datafusion_numeric_kind(&b.left) != NumericKind::Float
|
|
149
|
+
&& datafusion_numeric_kind(&b.right) != NumericKind::Float
|
|
150
|
+
{
|
|
151
|
+
b.left =
|
|
152
|
+
as_double(std::mem::replace(&mut b.left, Expression::number(0)));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
Expression::Cast(c) | Expression::TryCast(c) | Expression::SafeCast(c)
|
|
156
|
+
if super::scalar::data_type_numeric_kind(&c.to) == NumericKind::Integer
|
|
157
|
+
&& matches!(
|
|
158
|
+
datafusion_numeric_kind(&c.this),
|
|
159
|
+
NumericKind::Float | NumericKind::Decimal
|
|
160
|
+
) =>
|
|
161
|
+
{
|
|
162
|
+
// DuckDB rounds numeric casts to integers; DataFusion
|
|
163
|
+
// truncates. This also matters after a nested source `/`.
|
|
164
|
+
c.this = Expression::Round(Box::new(RoundFunc {
|
|
165
|
+
this: std::mem::replace(&mut c.this, Expression::number(0)),
|
|
166
|
+
decimals: Some(Expression::number(0)),
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
Expression::IntDiv(_) => {
|
|
170
|
+
let Expression::IntDiv(mut division) = expr else {
|
|
171
|
+
unreachable!()
|
|
172
|
+
};
|
|
173
|
+
let kind = combine(
|
|
174
|
+
datafusion_numeric_kind(&division.this),
|
|
175
|
+
datafusion_numeric_kind(&division.expression),
|
|
176
|
+
);
|
|
177
|
+
if kind == NumericKind::Unknown {
|
|
178
|
+
return Err(unresolved_division(DialectType::DataFusion));
|
|
179
|
+
}
|
|
180
|
+
if kind == NumericKind::Decimal {
|
|
181
|
+
division.this = as_double(division.this);
|
|
182
|
+
}
|
|
183
|
+
return Ok(Expression::Div(Box::new(BinaryOp::new(
|
|
184
|
+
division.this,
|
|
185
|
+
Expression::Function(Box::new(Function::new(
|
|
186
|
+
"NULLIF".to_string(),
|
|
187
|
+
vec![division.expression, Expression::number(0)],
|
|
188
|
+
))),
|
|
189
|
+
))));
|
|
190
|
+
}
|
|
191
|
+
_ => {}
|
|
192
|
+
}
|
|
193
|
+
Ok(expr)
|
|
194
|
+
})
|
|
195
|
+
},
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
pub(in crate::dialects) fn prepare_integer_division(
|
|
200
|
+
expr: Expression,
|
|
201
|
+
source: DialectType,
|
|
202
|
+
target: DialectType,
|
|
203
|
+
) -> Result<Expression> {
|
|
204
|
+
if source != DialectType::DuckDB || target == DialectType::DuckDB {
|
|
205
|
+
return Ok(expr);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if target == DialectType::DataFusion {
|
|
209
|
+
return prepare_datafusion_division(expr);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Visit every physical child, including typed function arguments and both
|
|
213
|
+
// operands of nested IntDiv nodes, before lowering the enclosing operator.
|
|
214
|
+
crate::traversal::transform_all(expr, &|expr| {
|
|
215
|
+
let Expression::IntDiv(mut division) = expr else {
|
|
216
|
+
return Ok(expr);
|
|
217
|
+
};
|
|
218
|
+
let left_kind = numeric_kind(&division.this);
|
|
219
|
+
let right_kind = numeric_kind(&division.expression);
|
|
220
|
+
let kind = combine(left_kind, right_kind);
|
|
221
|
+
|
|
222
|
+
if kind == NumericKind::Unknown {
|
|
223
|
+
return Err(unresolved_division(target));
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// NULLIF evaluates the divisor once and preserves NULL on zero for
|
|
227
|
+
// literals, casts, computed expressions, and values only known at runtime.
|
|
228
|
+
division.expression = Expression::Function(Box::new(Function::new(
|
|
229
|
+
"NULLIF".to_string(),
|
|
230
|
+
vec![division.expression, Expression::number(0)],
|
|
231
|
+
)));
|
|
232
|
+
|
|
233
|
+
if kind != NumericKind::Integer {
|
|
234
|
+
// DuckDB decimal division produces DOUBLE, whereas some targets
|
|
235
|
+
// keep decimal arithmetic (and SQLite may treat DECIMAL as INTEGER).
|
|
236
|
+
// An explicitly floating operand already establishes float division.
|
|
237
|
+
if kind == NumericKind::Decimal {
|
|
238
|
+
division.this = super::operators::cast_expr(
|
|
239
|
+
division.this,
|
|
240
|
+
DataType::Double {
|
|
241
|
+
precision: None,
|
|
242
|
+
scale: None,
|
|
243
|
+
},
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
return Ok(Expression::Div(Box::new(BinaryOp::new(
|
|
247
|
+
division.this,
|
|
248
|
+
division.expression,
|
|
249
|
+
))));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Only use IntDiv where generation has a native or exact lowering.
|
|
253
|
+
// A generic DIV(...) call is invalid in several other targets.
|
|
254
|
+
if !matches!(
|
|
255
|
+
target,
|
|
256
|
+
DialectType::PostgreSQL
|
|
257
|
+
| DialectType::BigQuery
|
|
258
|
+
| DialectType::ClickHouse
|
|
259
|
+
| DialectType::SQLite
|
|
260
|
+
| DialectType::Vertica
|
|
261
|
+
| DialectType::Hive
|
|
262
|
+
| DialectType::Spark
|
|
263
|
+
| DialectType::Databricks
|
|
264
|
+
) {
|
|
265
|
+
return Err(crate::error::Error::unsupported(
|
|
266
|
+
"DuckDB integer // conversion",
|
|
267
|
+
target.to_string(),
|
|
268
|
+
));
|
|
269
|
+
}
|
|
270
|
+
Ok(Expression::IntDiv(division))
|
|
271
|
+
})
|
|
272
|
+
}
|
{polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/scalar.rs
RENAMED
|
@@ -15738,7 +15738,8 @@ pub(super) fn normalize_bigquery_function(
|
|
|
15738
15738
|
| DialectType::Athena
|
|
15739
15739
|
| DialectType::Snowflake
|
|
15740
15740
|
| DialectType::TSQL
|
|
15741
|
-
| DialectType::Fabric
|
|
15741
|
+
| DialectType::Fabric
|
|
15742
|
+
| DialectType::DataFusion => {
|
|
15742
15743
|
let x = args.remove(0);
|
|
15743
15744
|
let y = args.remove(0);
|
|
15744
15745
|
// Wrap complex expressions in parens to preserve precedence
|
|
@@ -233,15 +233,27 @@ pub(super) fn normalize_root(expression: Expression, context: &NormalizationCont
|
|
|
233
233
|
});
|
|
234
234
|
for constraint in &mut ct.constraints {
|
|
235
235
|
if let crate::expressions::TableConstraint::PrimaryKey {
|
|
236
|
-
columns,
|
|
236
|
+
columns,
|
|
237
|
+
key_parts,
|
|
238
|
+
modifiers,
|
|
239
|
+
..
|
|
237
240
|
} = constraint
|
|
238
241
|
{
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
242
|
+
if key_parts.is_empty() {
|
|
243
|
+
// Older ASTs encoded order modifiers in column names.
|
|
244
|
+
for col in columns.iter_mut() {
|
|
245
|
+
if col.name.ends_with(" ASC") {
|
|
246
|
+
col.name = col.name[..col.name.len() - 4].to_string();
|
|
247
|
+
} else if col.name.ends_with(" DESC") {
|
|
248
|
+
col.name = col.name[..col.name.len() - 5].to_string();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
} else {
|
|
252
|
+
// Structured key names are literal; only remove the
|
|
253
|
+
// sort modifiers, including for names ending in DESC.
|
|
254
|
+
for part in key_parts.iter_mut() {
|
|
255
|
+
part.asc = false;
|
|
256
|
+
part.desc = false;
|
|
245
257
|
}
|
|
246
258
|
}
|
|
247
259
|
// Strip TSQL-specific modifiers
|
|
@@ -8505,6 +8505,11 @@ pub enum TableConstraint {
|
|
|
8505
8505
|
PrimaryKey {
|
|
8506
8506
|
name: Option<Identifier>,
|
|
8507
8507
|
columns: Vec<Identifier>,
|
|
8508
|
+
/// Structured quoted, prefixed or ordered keys. When present these are
|
|
8509
|
+
/// authoritative for rendering; `columns` retains the column names.
|
|
8510
|
+
/// Older ASTs can encode prefix/order syntax directly in `columns`.
|
|
8511
|
+
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
|
8512
|
+
key_parts: Vec<IndexKeyPart>,
|
|
8508
8513
|
/// Databricks primary-key columns marked with the TIMESERIES attribute.
|
|
8509
8514
|
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
|
8510
8515
|
timeseries_columns: Vec<Identifier>,
|
|
@@ -8520,6 +8525,9 @@ pub enum TableConstraint {
|
|
|
8520
8525
|
Unique {
|
|
8521
8526
|
name: Option<Identifier>,
|
|
8522
8527
|
columns: Vec<Identifier>,
|
|
8528
|
+
/// Structured quoted, prefixed or ordered keys, as for `PrimaryKey`.
|
|
8529
|
+
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
|
8530
|
+
key_parts: Vec<IndexKeyPart>,
|
|
8523
8531
|
/// Whether columns are parenthesized (false for UNIQUE idx_name without parens)
|
|
8524
8532
|
#[serde(default)]
|
|
8525
8533
|
columns_parenthesized: bool,
|
|
@@ -11676,6 +11684,9 @@ pub struct Lateral {
|
|
|
11676
11684
|
/// Column aliases for the lateral expression (e.g., LATERAL func() AS alias(col1, col2))
|
|
11677
11685
|
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
|
11678
11686
|
pub column_aliases: Vec<String>,
|
|
11687
|
+
/// Quoting of each column alias, parallel to `column_aliases`.
|
|
11688
|
+
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
|
11689
|
+
pub column_aliases_quoted: Vec<bool>,
|
|
11679
11690
|
}
|
|
11680
11691
|
|
|
11681
11692
|
/// TableFromRows
|