polyglot-sql 0.4.0__tar.gz → 0.4.2__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.4.0 → polyglot_sql-0.4.2}/Cargo.lock +5 -5
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/Cargo.toml +1 -1
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/PKG-INFO +1 -1
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/Cargo.toml +2 -2
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/bigquery.rs +32 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/expressions.rs +2 -2
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/generator.rs +10 -1
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/lineage.rs +91 -5
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/openlineage.rs +53 -1
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/subquery.rs +19 -3
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/parser.rs +70 -26
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/identity_roundtrip.rs +1 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_compat.rs +16 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/README.md +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/README.md +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/benches/in_list.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/benches/parsing.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/benches/transpile.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/examples/bench_json.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/builder.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/clickhouse.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/duckdb.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/fabric.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/mod.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/presto.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/snowflake.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/diff.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/error.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/function_catalog.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/function_registry.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/helper.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/lib.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/annotate_types.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/planner.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/resolver.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/schema.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/scope.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/time.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/tokens.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/transforms.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/traversal.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/trie.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/validation/tests.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/validation.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/common/known_failures.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/common/mod.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/deep_nesting_regression.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/dialect_matrix.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/error_handling.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/issue201_regression_test.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/README.md +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/Cargo.toml +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/README.md +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/docs/api.md +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/docs/index.md +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/mkdocs.yml +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/dialects.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/diff.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/errors.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/expr.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/format.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/generate.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/helpers.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/lib.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/lineage.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/optimize.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/parse.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/transforms.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/transpile.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/types.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/validate.rs +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/conftest.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_format.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_parse.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_transpile.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_validate.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/uv.lock +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/pyproject.toml +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/python/polyglot_sql/__init__.py +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/python/polyglot_sql/__init__.pyi +0 -0
- {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/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.4.
|
|
608
|
+
version = "0.4.2"
|
|
609
609
|
dependencies = [
|
|
610
610
|
"criterion",
|
|
611
611
|
"once_cell",
|
|
@@ -621,7 +621,7 @@ dependencies = [
|
|
|
621
621
|
|
|
622
622
|
[[package]]
|
|
623
623
|
name = "polyglot-sql-ffi"
|
|
624
|
-
version = "0.4.
|
|
624
|
+
version = "0.4.2"
|
|
625
625
|
dependencies = [
|
|
626
626
|
"cbindgen",
|
|
627
627
|
"polyglot-sql",
|
|
@@ -631,11 +631,11 @@ dependencies = [
|
|
|
631
631
|
|
|
632
632
|
[[package]]
|
|
633
633
|
name = "polyglot-sql-function-catalogs"
|
|
634
|
-
version = "0.4.
|
|
634
|
+
version = "0.4.2"
|
|
635
635
|
|
|
636
636
|
[[package]]
|
|
637
637
|
name = "polyglot-sql-python"
|
|
638
|
-
version = "0.4.
|
|
638
|
+
version = "0.4.2"
|
|
639
639
|
dependencies = [
|
|
640
640
|
"polyglot-sql",
|
|
641
641
|
"pyo3",
|
|
@@ -646,7 +646,7 @@ dependencies = [
|
|
|
646
646
|
|
|
647
647
|
[[package]]
|
|
648
648
|
name = "polyglot-sql-wasm"
|
|
649
|
-
version = "0.4.
|
|
649
|
+
version = "0.4.2"
|
|
650
650
|
dependencies = [
|
|
651
651
|
"console_error_panic_hook",
|
|
652
652
|
"js-sys",
|
|
@@ -28,7 +28,7 @@ generate = []
|
|
|
28
28
|
transpile = ["generate"]
|
|
29
29
|
builder = ["generate"]
|
|
30
30
|
ast-tools = []
|
|
31
|
-
semantic = ["
|
|
31
|
+
semantic = ["ast-tools"]
|
|
32
32
|
openlineage = ["semantic"]
|
|
33
33
|
diff = ["generate"]
|
|
34
34
|
planner = []
|
|
@@ -106,7 +106,7 @@ thiserror = { workspace = true }
|
|
|
106
106
|
unicode-segmentation = { workspace = true }
|
|
107
107
|
stacker = { version = "0.1", optional = true }
|
|
108
108
|
ts-rs = { version = "12.0", features = ["serde-compat"], optional = true }
|
|
109
|
-
polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.4.
|
|
109
|
+
polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.4.2", optional = true, default-features = false }
|
|
110
110
|
|
|
111
111
|
[dev-dependencies]
|
|
112
112
|
pretty_assertions = "1.4"
|
|
@@ -1587,6 +1587,38 @@ mod tests {
|
|
|
1587
1587
|
assert_eq!(result, expected, "SQL: {}", sql);
|
|
1588
1588
|
}
|
|
1589
1589
|
|
|
1590
|
+
#[test]
|
|
1591
|
+
fn test_safe_namespace_parses_as_function() {
|
|
1592
|
+
let expr = parse_one(
|
|
1593
|
+
"SELECT SAFE.PARSE_JSON(data) AS json_data FROM t",
|
|
1594
|
+
DialectType::BigQuery,
|
|
1595
|
+
)
|
|
1596
|
+
.expect("parse");
|
|
1597
|
+
|
|
1598
|
+
let Expression::Select(select) = expr else {
|
|
1599
|
+
panic!("expected SELECT");
|
|
1600
|
+
};
|
|
1601
|
+
let Expression::Alias(alias) = &select.expressions[0] else {
|
|
1602
|
+
panic!("expected alias");
|
|
1603
|
+
};
|
|
1604
|
+
let Expression::Function(function) = &alias.this else {
|
|
1605
|
+
panic!("expected SAFE namespace call to parse as Function");
|
|
1606
|
+
};
|
|
1607
|
+
|
|
1608
|
+
assert_eq!(function.name, "SAFE.PARSE_JSON");
|
|
1609
|
+
assert_eq!(function.args.len(), 1);
|
|
1610
|
+
}
|
|
1611
|
+
|
|
1612
|
+
#[test]
|
|
1613
|
+
fn test_safe_namespace_identity() {
|
|
1614
|
+
bigquery_identity("SAFE.PARSE_JSON(data)", "SAFE.PARSE_JSON(data)");
|
|
1615
|
+
bigquery_identity(
|
|
1616
|
+
"SAFE.PARSE_DATE('%Y-%m-%d', date_col)",
|
|
1617
|
+
"SAFE.PARSE_DATE('%F', date_col)",
|
|
1618
|
+
);
|
|
1619
|
+
bigquery_identity("SAFE.DIVIDE(a, b)", "SAFE.DIVIDE(a, b)");
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1590
1622
|
#[test]
|
|
1591
1623
|
fn test_cast_char_to_string() {
|
|
1592
1624
|
bigquery_identity("CAST(x AS CHAR)", "CAST(x AS STRING)");
|
|
@@ -8346,7 +8346,7 @@ pub struct IndexColumn {
|
|
|
8346
8346
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
|
8347
8347
|
#[cfg_attr(feature = "bindings", derive(TS))]
|
|
8348
8348
|
pub struct DropIndex {
|
|
8349
|
-
pub name:
|
|
8349
|
+
pub name: TableRef,
|
|
8350
8350
|
pub table: Option<TableRef>,
|
|
8351
8351
|
pub if_exists: bool,
|
|
8352
8352
|
/// PostgreSQL CONCURRENTLY modifier
|
|
@@ -8357,7 +8357,7 @@ pub struct DropIndex {
|
|
|
8357
8357
|
impl DropIndex {
|
|
8358
8358
|
pub fn new(name: impl Into<String>) -> Self {
|
|
8359
8359
|
Self {
|
|
8360
|
-
name:
|
|
8360
|
+
name: TableRef::new(name),
|
|
8361
8361
|
table: None,
|
|
8362
8362
|
if_exists: false,
|
|
8363
8363
|
concurrently: false,
|
|
@@ -11108,7 +11108,7 @@ impl Generator {
|
|
|
11108
11108
|
}
|
|
11109
11109
|
|
|
11110
11110
|
self.write_space();
|
|
11111
|
-
self.
|
|
11111
|
+
self.generate_table(&di.name)?;
|
|
11112
11112
|
|
|
11113
11113
|
if let Some(ref table) = di.table {
|
|
11114
11114
|
self.write_space();
|
|
@@ -38852,6 +38852,15 @@ mod tests {
|
|
|
38852
38852
|
fn test_drop_index() {
|
|
38853
38853
|
let result = roundtrip("DROP INDEX idx_name");
|
|
38854
38854
|
assert_eq!(result, "DROP INDEX idx_name");
|
|
38855
|
+
|
|
38856
|
+
let result = roundtrip(r#"DROP INDEX IF EXISTS "idx_tokenKey__pb_users_auth_""#);
|
|
38857
|
+
assert_eq!(
|
|
38858
|
+
result,
|
|
38859
|
+
r#"DROP INDEX IF EXISTS "idx_tokenKey__pb_users_auth_""#
|
|
38860
|
+
);
|
|
38861
|
+
|
|
38862
|
+
let result = roundtrip(r#"DROP INDEX "public"."IdxMixed""#);
|
|
38863
|
+
assert_eq!(result, r#"DROP INDEX "public"."IdxMixed""#);
|
|
38855
38864
|
}
|
|
38856
38865
|
|
|
38857
38866
|
#[test]
|
|
@@ -714,7 +714,7 @@ fn to_node_inner(
|
|
|
714
714
|
}
|
|
715
715
|
|
|
716
716
|
// 7. Column references — trace each column to its source
|
|
717
|
-
let col_refs = find_column_refs_in_expr(&select_expr);
|
|
717
|
+
let col_refs = find_column_refs_in_expr(&select_expr, dialect);
|
|
718
718
|
for col_ref in col_refs {
|
|
719
719
|
let col_name = &col_ref.column;
|
|
720
720
|
if let Some(ref table_id) = col_ref.table {
|
|
@@ -1265,13 +1265,30 @@ struct SimpleColumnRef {
|
|
|
1265
1265
|
}
|
|
1266
1266
|
|
|
1267
1267
|
/// Find all column references in an expression (does not recurse into subqueries).
|
|
1268
|
-
fn find_column_refs_in_expr(
|
|
1268
|
+
fn find_column_refs_in_expr(
|
|
1269
|
+
expr: &Expression,
|
|
1270
|
+
dialect: Option<DialectType>,
|
|
1271
|
+
) -> Vec<SimpleColumnRef> {
|
|
1269
1272
|
let mut refs = Vec::new();
|
|
1270
|
-
collect_column_refs(expr, &mut refs);
|
|
1273
|
+
collect_column_refs(expr, dialect, &mut refs);
|
|
1271
1274
|
refs
|
|
1272
1275
|
}
|
|
1273
1276
|
|
|
1274
|
-
fn
|
|
1277
|
+
fn is_bigquery_safe_namespace_receiver(expr: &Expression) -> bool {
|
|
1278
|
+
match expr {
|
|
1279
|
+
Expression::Column(col) => {
|
|
1280
|
+
col.table.is_none() && !col.name.quoted && col.name.name.eq_ignore_ascii_case("SAFE")
|
|
1281
|
+
}
|
|
1282
|
+
Expression::Identifier(id) => !id.quoted && id.name.eq_ignore_ascii_case("SAFE"),
|
|
1283
|
+
_ => false,
|
|
1284
|
+
}
|
|
1285
|
+
}
|
|
1286
|
+
|
|
1287
|
+
fn collect_column_refs(
|
|
1288
|
+
expr: &Expression,
|
|
1289
|
+
dialect: Option<DialectType>,
|
|
1290
|
+
refs: &mut Vec<SimpleColumnRef>,
|
|
1291
|
+
) {
|
|
1275
1292
|
let mut stack: Vec<&Expression> = vec![expr];
|
|
1276
1293
|
|
|
1277
1294
|
while let Some(current) = stack.pop() {
|
|
@@ -1638,7 +1655,11 @@ fn collect_column_refs(expr: &Expression, refs: &mut Vec<SimpleColumnRef>) {
|
|
|
1638
1655
|
stack.push(&d.this);
|
|
1639
1656
|
}
|
|
1640
1657
|
Expression::MethodCall(m) => {
|
|
1641
|
-
|
|
1658
|
+
if !matches!(dialect, Some(DialectType::BigQuery))
|
|
1659
|
+
|| !is_bigquery_safe_namespace_receiver(&m.this)
|
|
1660
|
+
{
|
|
1661
|
+
stack.push(&m.this);
|
|
1662
|
+
}
|
|
1642
1663
|
for arg in &m.args {
|
|
1643
1664
|
stack.push(arg);
|
|
1644
1665
|
}
|
|
@@ -2989,6 +3010,71 @@ mod tests {
|
|
|
2989
3010
|
);
|
|
2990
3011
|
}
|
|
2991
3012
|
|
|
3013
|
+
#[test]
|
|
3014
|
+
fn test_lineage_bigquery_safe_namespace_issue207() {
|
|
3015
|
+
let query = r#"
|
|
3016
|
+
WITH import_cte AS (
|
|
3017
|
+
SELECT timestamp, data, operation
|
|
3018
|
+
FROM `project`.`dataset`.`source_table`
|
|
3019
|
+
),
|
|
3020
|
+
transform_cte AS (
|
|
3021
|
+
SELECT
|
|
3022
|
+
timestamp,
|
|
3023
|
+
SAFE.PARSE_JSON(data) AS json_data
|
|
3024
|
+
FROM import_cte
|
|
3025
|
+
)
|
|
3026
|
+
SELECT json_data FROM transform_cte
|
|
3027
|
+
"#;
|
|
3028
|
+
let expr = parse_one(query, DialectType::BigQuery).expect("parse");
|
|
3029
|
+
let node = lineage("json_data", &expr, Some(DialectType::BigQuery), false)
|
|
3030
|
+
.expect("lineage should resolve SAFE.PARSE_JSON arguments");
|
|
3031
|
+
let names: Vec<_> = node.walk().map(|n| n.name.clone()).collect();
|
|
3032
|
+
|
|
3033
|
+
assert!(
|
|
3034
|
+
names.iter().any(|name| name == "source_table.data"),
|
|
3035
|
+
"expected source_table.data in lineage, got {names:?}"
|
|
3036
|
+
);
|
|
3037
|
+
assert!(
|
|
3038
|
+
!names
|
|
3039
|
+
.iter()
|
|
3040
|
+
.any(|name| name.eq_ignore_ascii_case("import_cte.safe")),
|
|
3041
|
+
"did not expect SAFE namespace receiver in lineage, got {names:?}"
|
|
3042
|
+
);
|
|
3043
|
+
}
|
|
3044
|
+
|
|
3045
|
+
#[test]
|
|
3046
|
+
fn test_lineage_bigquery_safe_namespace_method_call_guard() {
|
|
3047
|
+
let expr = parse("SELECT SAFE.PARSE_JSON(data) AS json_data FROM t");
|
|
3048
|
+
let node = lineage("json_data", &expr, Some(DialectType::BigQuery), false)
|
|
3049
|
+
.expect("lineage should resolve SAFE.PARSE_JSON arguments");
|
|
3050
|
+
let names: Vec<_> = node.walk().map(|n| n.name.clone()).collect();
|
|
3051
|
+
|
|
3052
|
+
assert!(
|
|
3053
|
+
names.iter().any(|name| name == "t.data"),
|
|
3054
|
+
"expected t.data in lineage, got {names:?}"
|
|
3055
|
+
);
|
|
3056
|
+
assert!(
|
|
3057
|
+
!names.iter().any(|name| name.eq_ignore_ascii_case("t.safe")),
|
|
3058
|
+
"did not expect SAFE namespace receiver in lineage, got {names:?}"
|
|
3059
|
+
);
|
|
3060
|
+
}
|
|
3061
|
+
|
|
3062
|
+
#[test]
|
|
3063
|
+
fn test_lineage_method_call_receiver_control() {
|
|
3064
|
+
let expr = parse("SELECT obj.METHOD(arg) AS out FROM t");
|
|
3065
|
+
let node = lineage("out", &expr, None, false).expect("lineage");
|
|
3066
|
+
let names: Vec<_> = node.walk().map(|n| n.name.clone()).collect();
|
|
3067
|
+
|
|
3068
|
+
assert!(
|
|
3069
|
+
names.iter().any(|name| name == "t.obj"),
|
|
3070
|
+
"expected ordinary method receiver to remain in lineage, got {names:?}"
|
|
3071
|
+
);
|
|
3072
|
+
assert!(
|
|
3073
|
+
names.iter().any(|name| name == "t.arg"),
|
|
3074
|
+
"expected method argument in lineage, got {names:?}"
|
|
3075
|
+
);
|
|
3076
|
+
}
|
|
3077
|
+
|
|
2992
3078
|
#[test]
|
|
2993
3079
|
fn test_lineage_upper_function() {
|
|
2994
3080
|
let expr = parse("SELECT UPPER(name) AS upper_name FROM users");
|
|
@@ -550,11 +550,24 @@ fn input_fields_for_output(
|
|
|
550
550
|
let description = output_field
|
|
551
551
|
.expression
|
|
552
552
|
.as_ref()
|
|
553
|
-
.
|
|
553
|
+
.and_then(|expr| transformation_description(expr, options.dialect));
|
|
554
554
|
|
|
555
555
|
terminal_fields_to_openlineage(terminals, subtype, description, options, warnings)
|
|
556
556
|
}
|
|
557
557
|
|
|
558
|
+
fn transformation_description(expr: &Expression, dialect: DialectType) -> Option<String> {
|
|
559
|
+
#[cfg(feature = "generate")]
|
|
560
|
+
{
|
|
561
|
+
Some(expr.sql_for(dialect))
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
#[cfg(not(feature = "generate"))]
|
|
565
|
+
{
|
|
566
|
+
let _ = (expr, dialect);
|
|
567
|
+
None
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
558
571
|
fn terminal_fields_to_openlineage(
|
|
559
572
|
terminals: Vec<TerminalField>,
|
|
560
573
|
subtype: &str,
|
|
@@ -1113,6 +1126,45 @@ mod tests {
|
|
|
1113
1126
|
.all(|f| f.transformations[0].subtype == "TRANSFORMATION"));
|
|
1114
1127
|
}
|
|
1115
1128
|
|
|
1129
|
+
#[test]
|
|
1130
|
+
fn omits_bigquery_safe_namespace_from_column_lineage_issue207() {
|
|
1131
|
+
let mut opts = options();
|
|
1132
|
+
opts.dialect = DialectType::BigQuery;
|
|
1133
|
+
|
|
1134
|
+
let result = openlineage_column_lineage(
|
|
1135
|
+
r#"
|
|
1136
|
+
WITH import_cte AS (
|
|
1137
|
+
SELECT timestamp, data, operation
|
|
1138
|
+
FROM `project`.`dataset`.`source_table`
|
|
1139
|
+
),
|
|
1140
|
+
transform_cte AS (
|
|
1141
|
+
SELECT
|
|
1142
|
+
timestamp,
|
|
1143
|
+
SAFE.PARSE_JSON(data) AS json_data
|
|
1144
|
+
FROM import_cte
|
|
1145
|
+
)
|
|
1146
|
+
SELECT json_data FROM transform_cte
|
|
1147
|
+
"#,
|
|
1148
|
+
&opts,
|
|
1149
|
+
)
|
|
1150
|
+
.expect("lineage");
|
|
1151
|
+
let field = result.facet.fields.get("json_data").expect("json_data");
|
|
1152
|
+
|
|
1153
|
+
assert!(
|
|
1154
|
+
field.input_fields.iter().any(|input| input.field == "data"),
|
|
1155
|
+
"expected data input field, got {:?}",
|
|
1156
|
+
field.input_fields
|
|
1157
|
+
);
|
|
1158
|
+
assert!(
|
|
1159
|
+
!field
|
|
1160
|
+
.input_fields
|
|
1161
|
+
.iter()
|
|
1162
|
+
.any(|input| input.field.eq_ignore_ascii_case("safe")),
|
|
1163
|
+
"did not expect SAFE namespace as input field, got {:?}",
|
|
1164
|
+
field.input_fields
|
|
1165
|
+
);
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1116
1168
|
#[test]
|
|
1117
1169
|
fn emits_aggregation_column_lineage() {
|
|
1118
1170
|
let result =
|
|
@@ -1176,7 +1176,7 @@ fn extract_subquery_to_cte(
|
|
|
1176
1176
|
) -> Expression {
|
|
1177
1177
|
match source {
|
|
1178
1178
|
Expression::Subquery(sub) => {
|
|
1179
|
-
let
|
|
1179
|
+
let subquery_key = subquery_identity_key(&sub.this);
|
|
1180
1180
|
let alias_name = sub
|
|
1181
1181
|
.alias
|
|
1182
1182
|
.as_ref()
|
|
@@ -1184,7 +1184,7 @@ fn extract_subquery_to_cte(
|
|
|
1184
1184
|
.unwrap_or_default();
|
|
1185
1185
|
|
|
1186
1186
|
// Check for duplicate subquery (reuse existing CTE)
|
|
1187
|
-
if let Some(existing_name) = seen_sql.get(&
|
|
1187
|
+
if let Some(existing_name) = seen_sql.get(&subquery_key) {
|
|
1188
1188
|
let mut tref = TableRef::new(existing_name.as_str());
|
|
1189
1189
|
if !alias_name.is_empty() {
|
|
1190
1190
|
tref.alias = Some(Identifier::new(&alias_name));
|
|
@@ -1199,7 +1199,7 @@ fn extract_subquery_to_cte(
|
|
|
1199
1199
|
find_new_name(taken, "_cte")
|
|
1200
1200
|
};
|
|
1201
1201
|
taken.insert(cte_name.clone());
|
|
1202
|
-
seen_sql.insert(
|
|
1202
|
+
seen_sql.insert(subquery_key, cte_name.clone());
|
|
1203
1203
|
|
|
1204
1204
|
// Create CTE
|
|
1205
1205
|
new_ctes.push(Cte {
|
|
@@ -1223,6 +1223,22 @@ fn extract_subquery_to_cte(
|
|
|
1223
1223
|
}
|
|
1224
1224
|
}
|
|
1225
1225
|
|
|
1226
|
+
fn subquery_identity_key(expr: &Expression) -> String {
|
|
1227
|
+
#[cfg(feature = "generate")]
|
|
1228
|
+
{
|
|
1229
|
+
crate::generator::Generator::sql(expr).unwrap_or_else(|_| structural_subquery_key(expr))
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
#[cfg(not(feature = "generate"))]
|
|
1233
|
+
{
|
|
1234
|
+
structural_subquery_key(expr)
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
fn structural_subquery_key(expr: &Expression) -> String {
|
|
1239
|
+
serde_json::to_string(expr).unwrap_or_else(|_| format!("{expr:?}"))
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1226
1242
|
/// Unnest correlated subqueries where possible.
|
|
1227
1243
|
///
|
|
1228
1244
|
/// This transforms correlated subqueries into JOINs for better performance.
|
|
@@ -619,6 +619,39 @@ impl Parser {
|
|
|
619
619
|
parser.parse()
|
|
620
620
|
}
|
|
621
621
|
|
|
622
|
+
fn is_bigquery_safe_namespace_receiver(expr: &Expression) -> bool {
|
|
623
|
+
match expr {
|
|
624
|
+
Expression::Column(col) => {
|
|
625
|
+
col.table.is_none()
|
|
626
|
+
&& !col.name.quoted
|
|
627
|
+
&& col.name.name.eq_ignore_ascii_case("SAFE")
|
|
628
|
+
}
|
|
629
|
+
Expression::Identifier(id) => !id.quoted && id.name.eq_ignore_ascii_case("SAFE"),
|
|
630
|
+
_ => false,
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
fn parse_method_call_expression(
|
|
635
|
+
&self,
|
|
636
|
+
this: Expression,
|
|
637
|
+
method: Identifier,
|
|
638
|
+
args: Vec<Expression>,
|
|
639
|
+
) -> Expression {
|
|
640
|
+
if matches!(
|
|
641
|
+
self.config.dialect,
|
|
642
|
+
Some(crate::dialects::DialectType::BigQuery)
|
|
643
|
+
) && Self::is_bigquery_safe_namespace_receiver(&this)
|
|
644
|
+
&& !method.quoted
|
|
645
|
+
{
|
|
646
|
+
return Expression::Function(Box::new(Function::new(
|
|
647
|
+
format!("SAFE.{}", method.name),
|
|
648
|
+
args,
|
|
649
|
+
)));
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
Expression::MethodCall(Box::new(MethodCall { this, method, args }))
|
|
653
|
+
}
|
|
654
|
+
|
|
622
655
|
/// Parse all remaining statements from the token stream.
|
|
623
656
|
///
|
|
624
657
|
/// Consumes tokens until the end of input, splitting on semicolons.
|
|
@@ -18529,12 +18562,9 @@ impl Parser {
|
|
|
18529
18562
|
|
|
18530
18563
|
let if_exists = self.match_keywords(&[TokenType::If, TokenType::Exists]);
|
|
18531
18564
|
|
|
18532
|
-
// Parse potentially qualified index name (a.b.c)
|
|
18533
|
-
|
|
18534
|
-
|
|
18535
|
-
name_parts.push(self.expect_identifier()?);
|
|
18536
|
-
}
|
|
18537
|
-
let name = Identifier::new(name_parts.join("."));
|
|
18565
|
+
// Parse potentially qualified index name (a.b.c), preserving quoted
|
|
18566
|
+
// state independently for every part.
|
|
18567
|
+
let name = self.parse_table_ref()?;
|
|
18538
18568
|
|
|
18539
18569
|
// Optional ON table
|
|
18540
18570
|
let table = if self.match_token(TokenType::On) {
|
|
@@ -30474,18 +30504,15 @@ impl Parser {
|
|
|
30474
30504
|
self.parse_function_arguments()?
|
|
30475
30505
|
};
|
|
30476
30506
|
self.expect(TokenType::RParen)?;
|
|
30477
|
-
let
|
|
30478
|
-
|
|
30479
|
-
|
|
30480
|
-
|
|
30481
|
-
|
|
30482
|
-
|
|
30483
|
-
|
|
30484
|
-
|
|
30485
|
-
|
|
30486
|
-
method: col_ident,
|
|
30487
|
-
args,
|
|
30488
|
-
}));
|
|
30507
|
+
let this = Expression::boxed_column(Column {
|
|
30508
|
+
name: ident.clone(),
|
|
30509
|
+
table: None,
|
|
30510
|
+
join_mark: false,
|
|
30511
|
+
trailing_comments: Vec::new(),
|
|
30512
|
+
span: None,
|
|
30513
|
+
inferred_type: None,
|
|
30514
|
+
});
|
|
30515
|
+
let method_call = self.parse_method_call_expression(this, col_ident, args);
|
|
30489
30516
|
return self.maybe_parse_subscript(method_call);
|
|
30490
30517
|
}
|
|
30491
30518
|
|
|
@@ -32324,11 +32351,11 @@ impl Parser {
|
|
|
32324
32351
|
self.parse_expression_list()?
|
|
32325
32352
|
};
|
|
32326
32353
|
self.expect(TokenType::RParen)?;
|
|
32327
|
-
let method_call =
|
|
32328
|
-
|
|
32329
|
-
|
|
32354
|
+
let method_call = self.parse_method_call_expression(
|
|
32355
|
+
Expression::Identifier(Identifier::new(name)),
|
|
32356
|
+
col_ident,
|
|
32330
32357
|
args,
|
|
32331
|
-
|
|
32358
|
+
);
|
|
32332
32359
|
return self.maybe_parse_subscript(method_call);
|
|
32333
32360
|
}
|
|
32334
32361
|
|
|
@@ -37834,11 +37861,11 @@ impl Parser {
|
|
|
37834
37861
|
};
|
|
37835
37862
|
self.expect(TokenType::RParen)?;
|
|
37836
37863
|
// Create a method call expression (DotAccess with function call)
|
|
37837
|
-
expr =
|
|
37838
|
-
|
|
37839
|
-
|
|
37864
|
+
expr = self.parse_method_call_expression(
|
|
37865
|
+
expr,
|
|
37866
|
+
Identifier::new(field_name),
|
|
37840
37867
|
args,
|
|
37841
|
-
|
|
37868
|
+
);
|
|
37842
37869
|
} else {
|
|
37843
37870
|
let mut ident = Identifier::new(field_name);
|
|
37844
37871
|
if is_quoted {
|
|
@@ -60646,10 +60673,27 @@ OPTIONS (
|
|
|
60646
60673
|
|
|
60647
60674
|
if let Expression::DropIndex(di) = &result[0] {
|
|
60648
60675
|
assert!(di.if_exists);
|
|
60676
|
+
assert_eq!(di.name.name.name, "idx_email");
|
|
60677
|
+
assert!(!di.name.name.quoted);
|
|
60649
60678
|
assert!(di.table.is_some());
|
|
60650
60679
|
}
|
|
60651
60680
|
}
|
|
60652
60681
|
|
|
60682
|
+
#[test]
|
|
60683
|
+
fn test_parse_drop_index_preserves_qualified_quoted_name() {
|
|
60684
|
+
let result = Parser::parse_sql(r#"DROP INDEX IF EXISTS "public"."IdxEmail""#).unwrap();
|
|
60685
|
+
|
|
60686
|
+
if let Expression::DropIndex(di) = &result[0] {
|
|
60687
|
+
let schema = di.name.schema.as_ref().expect("schema");
|
|
60688
|
+
assert_eq!(schema.name, "public");
|
|
60689
|
+
assert!(schema.quoted);
|
|
60690
|
+
assert_eq!(di.name.name.name, "IdxEmail");
|
|
60691
|
+
assert!(di.name.name.quoted);
|
|
60692
|
+
} else {
|
|
60693
|
+
panic!("Expected DropIndex");
|
|
60694
|
+
}
|
|
60695
|
+
}
|
|
60696
|
+
|
|
60653
60697
|
#[test]
|
|
60654
60698
|
fn test_parse_create_view() {
|
|
60655
60699
|
let result =
|
|
@@ -330,6 +330,22 @@ mod ddl_tests {
|
|
|
330
330
|
roundtrip("DROP INDEX IF EXISTS idx"),
|
|
331
331
|
"DROP INDEX IF EXISTS idx"
|
|
332
332
|
);
|
|
333
|
+
assert_eq!(
|
|
334
|
+
transpile(
|
|
335
|
+
r#"DROP INDEX IF EXISTS "idx_tokenKey__pb_users_auth_""#,
|
|
336
|
+
DialectType::PostgreSQL,
|
|
337
|
+
DialectType::PostgreSQL
|
|
338
|
+
),
|
|
339
|
+
r#"DROP INDEX IF EXISTS "idx_tokenKey__pb_users_auth_""#
|
|
340
|
+
);
|
|
341
|
+
assert_eq!(
|
|
342
|
+
transpile(
|
|
343
|
+
"DROP INDEX IF EXISTS `idx_tokenKey__pb_users_auth_`",
|
|
344
|
+
DialectType::SQLite,
|
|
345
|
+
DialectType::PostgreSQL
|
|
346
|
+
),
|
|
347
|
+
r#"DROP INDEX IF EXISTS "idx_tokenKey__pb_users_auth_""#
|
|
348
|
+
);
|
|
333
349
|
}
|
|
334
350
|
|
|
335
351
|
#[test]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|