polyglot-sql 0.6.3__tar.gz → 0.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/Cargo.lock +6 -6
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/Cargo.toml +1 -1
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/PKG-INFO +14 -1
- {polyglot_sql-0.6.3/crates/polyglot-sql-python → polyglot_sql-0.8.0}/README.md +13 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/Cargo.toml +2 -2
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/README.md +11 -4
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/duckdb.rs +9 -9
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/mod.rs +15 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +67 -15
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/collections.rs +5 -1
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/mod.rs +234 -4
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +351 -57
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/statements.rs +140 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +18 -6
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/oracle.rs +2 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/presto.rs +8 -8
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/error.rs +69 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/expressions.rs +6 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/generator.rs +187 -44
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/lib.rs +12 -3
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/lineage.rs +739 -115
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/openlineage.rs +152 -16
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/parser.rs +355 -56
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/query_analysis.rs +33 -3
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/schema.rs +32 -6
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/tokens.rs +24 -12
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/query_analysis.rs +31 -1
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0/crates/polyglot-sql-python}/README.md +13 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/errors.rs +31 -1
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/lib.rs +4 -0
- polyglot_sql-0.8.0/crates/polyglot-sql-python/src/lineage.rs +222 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_lineage.py +46 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/python/polyglot_sql/__init__.py +10 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/python/polyglot_sql/__init__.pyi +39 -0
- polyglot_sql-0.6.3/crates/polyglot-sql-python/src/lineage.rs +0 -100
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/in_list.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/lineage.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/parsing.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/performance_hotspots.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/transpile.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/examples/bench_json.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/ast_children.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/ast_json.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/builder.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/bigquery.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/clickhouse.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/fabric.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/operators.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/types.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/snowflake.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/diff.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/format_tokens.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/function_catalog.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/function_registry.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/guard.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/helper.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/annotate_types.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/planner.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/resolver.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/scope.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/time.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/transforms.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/traversal.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/trie.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/validation/tests.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/validation.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/common/known_failures.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/common/mod.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/data_type_api.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/deep_nesting_regression.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/dialect_matrix.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/error_handling.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/README.md +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/Cargo.toml +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/docs/api.md +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/docs/index.md +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/mkdocs.yml +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/dialects.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/diff.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/expr.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/format.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/generate.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/helpers.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/optimize.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/parse.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/query_analysis.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/transforms.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/transpile.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/types.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/validate.rs +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/conftest.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_format.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_parse.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_query_analysis.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_transpile.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_validate.py +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/uv.lock +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/pyproject.toml +0 -0
- {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/python/polyglot_sql/py.typed +0 -0
|
@@ -605,7 +605,7 @@ dependencies = [
|
|
|
605
605
|
|
|
606
606
|
[[package]]
|
|
607
607
|
name = "polyglot-sql"
|
|
608
|
-
version = "0.
|
|
608
|
+
version = "0.8.0"
|
|
609
609
|
dependencies = [
|
|
610
610
|
"criterion",
|
|
611
611
|
"once_cell",
|
|
@@ -623,7 +623,7 @@ dependencies = [
|
|
|
623
623
|
|
|
624
624
|
[[package]]
|
|
625
625
|
name = "polyglot-sql-ast-derive"
|
|
626
|
-
version = "0.
|
|
626
|
+
version = "0.8.0"
|
|
627
627
|
dependencies = [
|
|
628
628
|
"proc-macro2",
|
|
629
629
|
"quote",
|
|
@@ -632,7 +632,7 @@ dependencies = [
|
|
|
632
632
|
|
|
633
633
|
[[package]]
|
|
634
634
|
name = "polyglot-sql-ffi"
|
|
635
|
-
version = "0.
|
|
635
|
+
version = "0.8.0"
|
|
636
636
|
dependencies = [
|
|
637
637
|
"cbindgen",
|
|
638
638
|
"polyglot-sql",
|
|
@@ -642,11 +642,11 @@ dependencies = [
|
|
|
642
642
|
|
|
643
643
|
[[package]]
|
|
644
644
|
name = "polyglot-sql-function-catalogs"
|
|
645
|
-
version = "0.
|
|
645
|
+
version = "0.8.0"
|
|
646
646
|
|
|
647
647
|
[[package]]
|
|
648
648
|
name = "polyglot-sql-python"
|
|
649
|
-
version = "0.
|
|
649
|
+
version = "0.8.0"
|
|
650
650
|
dependencies = [
|
|
651
651
|
"polyglot-sql",
|
|
652
652
|
"pyo3",
|
|
@@ -657,7 +657,7 @@ dependencies = [
|
|
|
657
657
|
|
|
658
658
|
[[package]]
|
|
659
659
|
name = "polyglot-sql-wasm"
|
|
660
|
-
version = "0.
|
|
660
|
+
version = "0.8.0"
|
|
661
661
|
dependencies = [
|
|
662
662
|
"console_error_panic_hook",
|
|
663
663
|
"js-sys",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: polyglot-sql
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -177,6 +177,13 @@ Function-like projections may include `transformFunction` with the function
|
|
|
177
177
|
name, literal arguments, and column arguments, for example for
|
|
178
178
|
`DATE_TRUNC('month', created_at)`.
|
|
179
179
|
|
|
180
|
+
Each `analysis["setOperations"][...]["branches"]` entry includes a `role` of
|
|
181
|
+
`"value"` or `"filter"`. Lineage results attach optional `set_branch` metadata
|
|
182
|
+
to immediate set-operation branch roots with the `operator`, original
|
|
183
|
+
zero-based `ordinal`, and `all` flag; omitted branches do not renumber the
|
|
184
|
+
surviving nodes. In OpenLineage output, `EXCEPT` and `INTERSECT` right-hand
|
|
185
|
+
inputs are emitted as indirect `FILTER` dependencies.
|
|
186
|
+
|
|
180
187
|
Validation schema dictionaries use:
|
|
181
188
|
|
|
182
189
|
```python
|
|
@@ -222,6 +229,11 @@ All functions are exported from `polyglot_sql`.
|
|
|
222
229
|
- `validate(sql: str, dialect: str = "generic", *, strict_syntax: bool = False, semantic: bool = False) -> ValidationResult`
|
|
223
230
|
- `optimize(sql: str, dialect: str = "generic") -> str`
|
|
224
231
|
- `lineage(column: str, sql: str, dialect: str = "generic") -> dict`
|
|
232
|
+
- `lineage_at(ordinal: int, sql: str, dialect: str = "generic") -> dict`
|
|
233
|
+
- `lineage_at_with_schema(ordinal: int, sql: str, schema: dict, dialect: str = "generic") -> dict`
|
|
234
|
+
- `lineage_with_schema(column: str, sql: str, schema: dict, dialect: str = "generic") -> dict`
|
|
235
|
+
- `output_columns(sql: str, dialect: str = "generic") -> dict`
|
|
236
|
+
- `output_columns_with_schema(sql: str, schema: dict, dialect: str = "generic") -> dict`
|
|
225
237
|
- `source_tables(column: str, sql: str, dialect: str = "generic") -> list[str]`
|
|
226
238
|
- `analyze_query(sql: str, options: dict | None = None, dialect: str = "generic") -> dict`
|
|
227
239
|
- `openlineage_column_lineage(sql: str, options: dict) -> dict`
|
|
@@ -246,6 +258,7 @@ Exception hierarchy:
|
|
|
246
258
|
- `GenerateError`
|
|
247
259
|
- `TranspileError`
|
|
248
260
|
- `ValidationError`
|
|
261
|
+
- `ColumnResolutionError` (`reason`, `column`, and `ordinal` attributes)
|
|
249
262
|
|
|
250
263
|
Unknown dialect names raise built-in `ValueError`.
|
|
251
264
|
|
|
@@ -150,6 +150,13 @@ Function-like projections may include `transformFunction` with the function
|
|
|
150
150
|
name, literal arguments, and column arguments, for example for
|
|
151
151
|
`DATE_TRUNC('month', created_at)`.
|
|
152
152
|
|
|
153
|
+
Each `analysis["setOperations"][...]["branches"]` entry includes a `role` of
|
|
154
|
+
`"value"` or `"filter"`. Lineage results attach optional `set_branch` metadata
|
|
155
|
+
to immediate set-operation branch roots with the `operator`, original
|
|
156
|
+
zero-based `ordinal`, and `all` flag; omitted branches do not renumber the
|
|
157
|
+
surviving nodes. In OpenLineage output, `EXCEPT` and `INTERSECT` right-hand
|
|
158
|
+
inputs are emitted as indirect `FILTER` dependencies.
|
|
159
|
+
|
|
153
160
|
Validation schema dictionaries use:
|
|
154
161
|
|
|
155
162
|
```python
|
|
@@ -195,6 +202,11 @@ All functions are exported from `polyglot_sql`.
|
|
|
195
202
|
- `validate(sql: str, dialect: str = "generic", *, strict_syntax: bool = False, semantic: bool = False) -> ValidationResult`
|
|
196
203
|
- `optimize(sql: str, dialect: str = "generic") -> str`
|
|
197
204
|
- `lineage(column: str, sql: str, dialect: str = "generic") -> dict`
|
|
205
|
+
- `lineage_at(ordinal: int, sql: str, dialect: str = "generic") -> dict`
|
|
206
|
+
- `lineage_at_with_schema(ordinal: int, sql: str, schema: dict, dialect: str = "generic") -> dict`
|
|
207
|
+
- `lineage_with_schema(column: str, sql: str, schema: dict, dialect: str = "generic") -> dict`
|
|
208
|
+
- `output_columns(sql: str, dialect: str = "generic") -> dict`
|
|
209
|
+
- `output_columns_with_schema(sql: str, schema: dict, dialect: str = "generic") -> dict`
|
|
198
210
|
- `source_tables(column: str, sql: str, dialect: str = "generic") -> list[str]`
|
|
199
211
|
- `analyze_query(sql: str, options: dict | None = None, dialect: str = "generic") -> dict`
|
|
200
212
|
- `openlineage_column_lineage(sql: str, options: dict) -> dict`
|
|
@@ -219,6 +231,7 @@ Exception hierarchy:
|
|
|
219
231
|
- `GenerateError`
|
|
220
232
|
- `TranspileError`
|
|
221
233
|
- `ValidationError`
|
|
234
|
+
- `ColumnResolutionError` (`reason`, `column`, and `ordinal` attributes)
|
|
222
235
|
|
|
223
236
|
Unknown dialect names raise built-in `ValueError`.
|
|
224
237
|
|
|
@@ -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.8.0" }
|
|
104
104
|
serde = { workspace = true }
|
|
105
105
|
serde_json = { workspace = true }
|
|
106
106
|
thiserror = { workspace = true }
|
|
107
107
|
unicode-segmentation = { workspace = true }
|
|
108
108
|
stacker = { version = "0.1", optional = true }
|
|
109
109
|
ts-rs = { version = "12.0", features = ["serde-compat"], optional = true }
|
|
110
|
-
polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.
|
|
110
|
+
polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.8.0", optional = true, default-features = false }
|
|
111
111
|
|
|
112
112
|
[dev-dependencies]
|
|
113
113
|
pretty_assertions = "1.4"
|
|
@@ -25,12 +25,12 @@ By default, `polyglot-sql` enables the full public API. Parser-only consumers ca
|
|
|
25
25
|
disable default features and opt into only the dialect parsers they need:
|
|
26
26
|
|
|
27
27
|
```toml
|
|
28
|
-
polyglot-sql = { version = "0.
|
|
28
|
+
polyglot-sql = { version = "0.8.0", default-features = false }
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
```toml
|
|
32
32
|
polyglot-sql = {
|
|
33
|
-
version = "0.
|
|
33
|
+
version = "0.8.0",
|
|
34
34
|
default-features = false,
|
|
35
35
|
features = ["dialect-clickhouse"],
|
|
36
36
|
}
|
|
@@ -44,14 +44,14 @@ Examples:
|
|
|
44
44
|
```toml
|
|
45
45
|
# Parse and generate SQL for one dialect.
|
|
46
46
|
polyglot-sql = {
|
|
47
|
-
version = "0.
|
|
47
|
+
version = "0.8.0",
|
|
48
48
|
default-features = false,
|
|
49
49
|
features = ["generate", "dialect-clickhouse"],
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
# Cross-dialect transpilation.
|
|
53
53
|
polyglot-sql = {
|
|
54
|
-
version = "0.
|
|
54
|
+
version = "0.8.0",
|
|
55
55
|
default-features = false,
|
|
56
56
|
features = ["transpile", "dialect-clickhouse", "dialect-postgresql"],
|
|
57
57
|
}
|
|
@@ -332,6 +332,13 @@ and CTE output columns. `star_projections` reports the original top-level star
|
|
|
332
332
|
projection index, optional table qualifier, and schema-expanded columns when
|
|
333
333
|
known. Each projection also includes conservative `nullability`:
|
|
334
334
|
`non_null`, `nullable`, or `unknown`.
|
|
335
|
+
Each `set_operations` branch includes a semantic `role`: both `UNION` branches
|
|
336
|
+
are `value`, while the right branch of `EXCEPT` and `INTERSECT` is `filter`.
|
|
337
|
+
|
|
338
|
+
Lineage nodes at immediate set-operation branch roots expose optional
|
|
339
|
+
`set_branch` metadata with the operator, original zero-based branch ordinal,
|
|
340
|
+
and `ALL` flag. The ordinal remains stable when another branch cannot be
|
|
341
|
+
resolved.
|
|
335
342
|
|
|
336
343
|
```rust
|
|
337
344
|
use polyglot_sql::{
|
|
@@ -15,7 +15,7 @@ use crate::expressions::{
|
|
|
15
15
|
AggFunc, Alias, BinaryOp, Case, Cast, CeilFunc, Column, DataType, Expression, Function,
|
|
16
16
|
Identifier, Interval, IntervalUnit, IntervalUnitSpec, IsNull, JSONPath, JSONPathKey,
|
|
17
17
|
JSONPathRoot, JSONPathSubscript, JsonExtractFunc, Literal, Null, Paren, Struct, Subquery,
|
|
18
|
-
SubstringFunc, UnaryFunc, UnaryOp, VarArgFunc, WindowFunction,
|
|
18
|
+
SubstringFunc, UnaryFunc, UnaryOp, Unhex, VarArgFunc, WindowFunction,
|
|
19
19
|
};
|
|
20
20
|
#[cfg(feature = "generate")]
|
|
21
21
|
use crate::generator::GeneratorConfig;
|
|
@@ -1687,6 +1687,14 @@ impl DuckDBDialect {
|
|
|
1687
1687
|
fn transform_function(&self, f: Function) -> Result<Expression> {
|
|
1688
1688
|
let name_upper = f.name.to_uppercase();
|
|
1689
1689
|
match name_upper.as_str() {
|
|
1690
|
+
"FROM_HEX" if f.args.len() == 1 => {
|
|
1691
|
+
let mut args = f.args;
|
|
1692
|
+
Ok(Expression::Unhex(Box::new(Unhex {
|
|
1693
|
+
this: Box::new(args.remove(0)),
|
|
1694
|
+
expression: None,
|
|
1695
|
+
})))
|
|
1696
|
+
}
|
|
1697
|
+
|
|
1690
1698
|
// IFNULL -> COALESCE
|
|
1691
1699
|
"IFNULL" if f.args.len() == 2 => Ok(Expression::Coalesce(Box::new(VarArgFunc {
|
|
1692
1700
|
original_name: None,
|
|
@@ -1968,14 +1976,6 @@ impl DuckDBDialect {
|
|
|
1968
1976
|
f.args,
|
|
1969
1977
|
)))),
|
|
1970
1978
|
|
|
1971
|
-
// NOW -> CURRENT_TIMESTAMP
|
|
1972
|
-
"NOW" => Ok(Expression::CurrentTimestamp(
|
|
1973
|
-
crate::expressions::CurrentTimestamp {
|
|
1974
|
-
precision: None,
|
|
1975
|
-
sysdate: false,
|
|
1976
|
-
},
|
|
1977
|
-
)),
|
|
1978
|
-
|
|
1979
1979
|
// GETDATE -> CURRENT_TIMESTAMP
|
|
1980
1980
|
"GETDATE" => Ok(Expression::CurrentTimestamp(
|
|
1981
1981
|
crate::expressions::CurrentTimestamp {
|
|
@@ -580,6 +580,21 @@ fn presto_to_java_format(fmt: &str) -> String {
|
|
|
580
580
|
.replace("%M", "MMMM")
|
|
581
581
|
}
|
|
582
582
|
|
|
583
|
+
#[cfg(feature = "transpile")]
|
|
584
|
+
fn presto_to_java_parse_format(fmt: &str) -> String {
|
|
585
|
+
fmt.replace("%Y", "yyyy")
|
|
586
|
+
.replace("%m", "M")
|
|
587
|
+
.replace("%d", "d")
|
|
588
|
+
.replace("%H", "H")
|
|
589
|
+
.replace("%i", "m")
|
|
590
|
+
.replace("%S", "s")
|
|
591
|
+
.replace("%s", "s")
|
|
592
|
+
.replace("%y", "yy")
|
|
593
|
+
.replace("%T", "H:m:s")
|
|
594
|
+
.replace("%F", "yyyy-M-d")
|
|
595
|
+
.replace("%M", "MMMM")
|
|
596
|
+
}
|
|
597
|
+
|
|
583
598
|
#[cfg(feature = "transpile")]
|
|
584
599
|
fn normalize_presto_format(fmt: &str) -> String {
|
|
585
600
|
fmt.replace("%H:%i:%S", "%T").replace("%H:%i:%s", "%T")
|
|
@@ -632,12 +632,9 @@ pub(super) fn rewrite(
|
|
|
632
632
|
|
|
633
633
|
Action::ArrayAggToCollectList => {
|
|
634
634
|
// ARRAY_AGG(x ORDER BY ...) -> COLLECT_LIST(x) for Hive/Spark
|
|
635
|
-
// Python sqlglot Hive.arrayagg_sql strips ORDER BY for simple cases
|
|
636
|
-
// but preserves it when DISTINCT/IGNORE NULLS/LIMIT are present
|
|
637
635
|
match e {
|
|
638
636
|
Expression::AggregateFunction(mut af) => {
|
|
639
|
-
let
|
|
640
|
-
!af.distinct && af.ignore_nulls.is_none() && af.limit.is_none();
|
|
637
|
+
let preserves_order = af.limit.is_some();
|
|
641
638
|
let args = if af.args.is_empty() {
|
|
642
639
|
vec![]
|
|
643
640
|
} else {
|
|
@@ -645,24 +642,23 @@ pub(super) fn rewrite(
|
|
|
645
642
|
};
|
|
646
643
|
af.name = "COLLECT_LIST".to_string();
|
|
647
644
|
af.args = args;
|
|
648
|
-
if
|
|
645
|
+
if !preserves_order {
|
|
649
646
|
af.order_by = Vec::new();
|
|
650
647
|
}
|
|
651
648
|
Ok(Expression::AggregateFunction(af))
|
|
652
649
|
}
|
|
653
650
|
Expression::ArrayAgg(agg) => {
|
|
654
|
-
let
|
|
655
|
-
!agg.distinct && agg.ignore_nulls.is_none() && agg.limit.is_none();
|
|
651
|
+
let preserves_order = agg.limit.is_some();
|
|
656
652
|
Ok(Expression::AggregateFunction(Box::new(
|
|
657
653
|
crate::expressions::AggregateFunction {
|
|
658
654
|
name: "COLLECT_LIST".to_string(),
|
|
659
655
|
args: vec![agg.this.clone()],
|
|
660
656
|
distinct: agg.distinct,
|
|
661
657
|
filter: agg.filter.clone(),
|
|
662
|
-
order_by: if
|
|
663
|
-
Vec::new()
|
|
664
|
-
} else {
|
|
658
|
+
order_by: if preserves_order {
|
|
665
659
|
agg.order_by.clone()
|
|
660
|
+
} else {
|
|
661
|
+
Vec::new()
|
|
666
662
|
},
|
|
667
663
|
limit: agg.limit.clone(),
|
|
668
664
|
ignore_nulls: agg.ignore_nulls,
|
|
@@ -716,14 +712,19 @@ pub(super) fn rewrite(
|
|
|
716
712
|
}
|
|
717
713
|
|
|
718
714
|
Action::ArrayAggIgnoreNullsDuckDB => {
|
|
719
|
-
// ARRAY_AGG(x IGNORE NULLS
|
|
720
|
-
//
|
|
715
|
+
// ARRAY_AGG(x IGNORE NULLS ...) -> ARRAY_AGG(x ...) FILTER(WHERE x IS NOT NULL)
|
|
716
|
+
// DuckDB also needs NULLS FIRST on the first inline ordering expression.
|
|
721
717
|
let mut agg = if let Expression::ArrayAgg(a) = e {
|
|
722
718
|
*a
|
|
723
719
|
} else {
|
|
724
720
|
unreachable!("action only triggered for ArrayAgg expressions")
|
|
725
721
|
};
|
|
726
|
-
agg.ignore_nulls = None;
|
|
722
|
+
agg.ignore_nulls = None;
|
|
723
|
+
agg.filter = Some(Expression::IsNull(Box::new(IsNull {
|
|
724
|
+
this: agg.this.clone(),
|
|
725
|
+
not: true,
|
|
726
|
+
postfix_form: false,
|
|
727
|
+
})));
|
|
727
728
|
if !agg.order_by.is_empty() {
|
|
728
729
|
agg.order_by[0].nulls_first = Some(true);
|
|
729
730
|
}
|
|
@@ -858,11 +859,19 @@ pub(super) fn rewrite(
|
|
|
858
859
|
|
|
859
860
|
Action::AggFilterToIff => {
|
|
860
861
|
// AggFunc.filter -> IFF wrapping: AVG(x) FILTER(WHERE cond) -> AVG(IFF(cond, x, NULL))
|
|
862
|
+
let prefix_not_null = |condition: Expression| match condition {
|
|
863
|
+
Expression::IsNull(mut is_null) if is_null.not => {
|
|
864
|
+
is_null.postfix_form = true;
|
|
865
|
+
Expression::IsNull(is_null)
|
|
866
|
+
}
|
|
867
|
+
other => other,
|
|
868
|
+
};
|
|
861
869
|
// Helper macro to handle the common AggFunc case
|
|
862
870
|
macro_rules! handle_agg_filter_to_iff {
|
|
863
871
|
($variant:ident, $agg:expr) => {{
|
|
864
872
|
let mut agg = $agg;
|
|
865
873
|
if let Some(filter_cond) = agg.filter.take() {
|
|
874
|
+
let filter_cond = prefix_not_null(filter_cond);
|
|
866
875
|
let iff_call = Expression::Function(Box::new(Function::new(
|
|
867
876
|
"IFF".to_string(),
|
|
868
877
|
vec![filter_cond, agg.this.clone(), Expression::Null(Null)],
|
|
@@ -878,7 +887,24 @@ pub(super) fn rewrite(
|
|
|
878
887
|
Expression::Sum(agg) => handle_agg_filter_to_iff!(Sum, agg),
|
|
879
888
|
Expression::Min(agg) => handle_agg_filter_to_iff!(Min, agg),
|
|
880
889
|
Expression::Max(agg) => handle_agg_filter_to_iff!(Max, agg),
|
|
881
|
-
Expression::ArrayAgg(agg) =>
|
|
890
|
+
Expression::ArrayAgg(mut agg) => {
|
|
891
|
+
if let Some(filter_cond) = agg.filter.take() {
|
|
892
|
+
let filter_cond = prefix_not_null(filter_cond);
|
|
893
|
+
agg.this = Expression::Function(Box::new(Function::new(
|
|
894
|
+
"IFF".to_string(),
|
|
895
|
+
vec![filter_cond, agg.this, Expression::Null(Null)],
|
|
896
|
+
)));
|
|
897
|
+
}
|
|
898
|
+
if agg.order_by.is_empty() {
|
|
899
|
+
Ok(Expression::ArrayAgg(agg))
|
|
900
|
+
} else {
|
|
901
|
+
let order_by = std::mem::take(&mut agg.order_by);
|
|
902
|
+
Ok(Expression::WithinGroup(Box::new(WithinGroup {
|
|
903
|
+
this: Expression::ArrayAgg(agg),
|
|
904
|
+
order_by,
|
|
905
|
+
})))
|
|
906
|
+
}
|
|
907
|
+
}
|
|
882
908
|
Expression::CountIf(agg) => handle_agg_filter_to_iff!(CountIf, agg),
|
|
883
909
|
Expression::Stddev(agg) => handle_agg_filter_to_iff!(Stddev, agg),
|
|
884
910
|
Expression::StddevPop(agg) => handle_agg_filter_to_iff!(StddevPop, agg),
|
|
@@ -896,7 +922,21 @@ pub(super) fn rewrite(
|
|
|
896
922
|
}
|
|
897
923
|
Expression::Count(mut c) => {
|
|
898
924
|
if let Some(filter_cond) = c.filter.take() {
|
|
899
|
-
|
|
925
|
+
let filter_cond = prefix_not_null(filter_cond);
|
|
926
|
+
let is_star = c.star || matches!(c.this, Some(Expression::Star(_)));
|
|
927
|
+
if is_star {
|
|
928
|
+
return Ok(Expression::CountIf(Box::new(AggFunc {
|
|
929
|
+
this: filter_cond,
|
|
930
|
+
distinct: false,
|
|
931
|
+
filter: None,
|
|
932
|
+
order_by: Vec::new(),
|
|
933
|
+
name: None,
|
|
934
|
+
ignore_nulls: None,
|
|
935
|
+
having_max: None,
|
|
936
|
+
limit: None,
|
|
937
|
+
inferred_type: None,
|
|
938
|
+
})));
|
|
939
|
+
} else if let Some(ref this_expr) = c.this {
|
|
900
940
|
let iff_call = Expression::Function(Box::new(Function::new(
|
|
901
941
|
"IFF".to_string(),
|
|
902
942
|
vec![filter_cond, this_expr.clone(), Expression::Null(Null)],
|
|
@@ -906,6 +946,18 @@ pub(super) fn rewrite(
|
|
|
906
946
|
}
|
|
907
947
|
Ok(Expression::Count(c))
|
|
908
948
|
}
|
|
949
|
+
Expression::AggregateFunction(mut af) => {
|
|
950
|
+
if let Some(filter_cond) = af.filter.take() {
|
|
951
|
+
let filter_cond = prefix_not_null(filter_cond);
|
|
952
|
+
if let Some(first_arg) = af.args.first_mut() {
|
|
953
|
+
*first_arg = Expression::Function(Box::new(Function::new(
|
|
954
|
+
"IFF".to_string(),
|
|
955
|
+
vec![filter_cond, first_arg.clone(), Expression::Null(Null)],
|
|
956
|
+
)));
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
Ok(Expression::AggregateFunction(af))
|
|
960
|
+
}
|
|
909
961
|
other => Ok(other),
|
|
910
962
|
}
|
|
911
963
|
}
|
|
@@ -862,7 +862,11 @@ pub(super) fn rewrite(
|
|
|
862
862
|
}
|
|
863
863
|
|
|
864
864
|
let seq = Expression::Function(Box::new(Function::new(
|
|
865
|
-
|
|
865
|
+
if matches!(target, DialectType::BigQuery) {
|
|
866
|
+
"GENERATE_ARRAY".to_string()
|
|
867
|
+
} else {
|
|
868
|
+
"SEQUENCE".to_string()
|
|
869
|
+
},
|
|
866
870
|
seq_args,
|
|
867
871
|
)));
|
|
868
872
|
|