sqlglot 30.3.0__tar.gz → 30.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.
- {sqlglot-30.3.0 → sqlglot-30.4.2}/CHANGELOG.md +60 -0
- {sqlglot-30.3.0/sqlglot.egg-info → sqlglot-30.4.2}/PKG-INFO +3 -3
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/_version.py +3 -3
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generator.py +11 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/duckdb.py +49 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/snowflake.py +1 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parser.py +5 -1
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/schema.py +2 -8
- {sqlglot-30.3.0 → sqlglot-30.4.2/sqlglot.egg-info}/PKG-INFO +3 -3
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot.egg-info/requires.txt +2 -2
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_dialect.py +2 -2
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_snowflake.py +4 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_tsql.py +1 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/.gitignore +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/.gitmodules +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/.gitpod.yml +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/.pre-commit-config.yaml +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/AGENTS.md +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/CLAUDE.md +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/CONTRIBUTING.md +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/LICENSE +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/MANIFEST.in +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/Makefile +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/README.md +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/pyproject.toml +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/setup.cfg +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/setup.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/__init__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/__main__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/_typing.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/__init__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/athena.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/bigquery.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/clickhouse.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/databricks.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/dialect.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/doris.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/dremio.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/drill.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/druid.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/duckdb.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/dune.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/exasol.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/fabric.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/hive.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/materialize.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/mysql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/oracle.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/postgres.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/presto.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/prql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/redshift.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/risingwave.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/singlestore.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/snowflake.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/solr.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/spark.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/spark2.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/sqlite.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/starrocks.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/tableau.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/teradata.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/trino.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/tsql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/diff.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/errors.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/executor/__init__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/executor/context.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/executor/env.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/executor/python.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/executor/table.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/__init__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/aggregate.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/array.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/builders.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/constraints.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/core.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/datatypes.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/ddl.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/dml.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/functions.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/json.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/math.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/properties.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/query.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/string.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/temporal.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/__init__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/athena.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/bigquery.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/clickhouse.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/databricks.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/doris.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/dremio.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/drill.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/druid.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/dune.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/exasol.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/fabric.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/hive.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/materialize.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/mysql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/oracle.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/postgres.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/presto.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/prql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/redshift.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/risingwave.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/singlestore.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/solr.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/spark.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/spark2.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/sqlite.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/starrocks.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/tableau.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/teradata.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/trino.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/tsql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/helper.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/jsonpath.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/lineage.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/__init__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/annotate_types.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/canonicalize.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/eliminate_ctes.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/eliminate_joins.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/isolate_table_selects.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/merge_subqueries.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/normalize.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/normalize_identifiers.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/optimize_joins.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/optimizer.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/pushdown_predicates.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/pushdown_projections.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/qualify.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/qualify_columns.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/qualify_tables.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/resolver.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/scope.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/simplify.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/unnest_subqueries.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/__init__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/athena.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/base.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/bigquery.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/clickhouse.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/databricks.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/doris.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/dremio.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/drill.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/druid.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/duckdb.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/dune.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/exasol.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/fabric.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/hive.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/materialize.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/mysql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/oracle.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/postgres.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/presto.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/prql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/redshift.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/risingwave.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/singlestore.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/snowflake.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/solr.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/spark.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/spark2.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/sqlite.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/starrocks.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/tableau.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/teradata.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/trino.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/tsql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/planner.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/py.typed +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/serde.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/time.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/tokenizer_core.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/tokens.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/transforms.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/trie.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/__init__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/bigquery.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/clickhouse.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/duckdb.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/hive.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/mysql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/presto.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/redshift.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/snowflake.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/spark.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/spark2.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/tsql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot.egg-info/SOURCES.txt +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot.egg-info/dependency_links.txt +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot.egg-info/top_level.txt +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot.png +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglotc/MANIFEST.in +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglotc/pyproject.toml +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglotc/setup.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/__init__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/__init__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_athena.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_bigquery.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_clickhouse.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_databricks.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_doris.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_dremio.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_drill.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_druid.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_duckdb.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_dune.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_exasol.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_fabric.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_hive.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_materialize.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_mysql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_oracle.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_pipe_syntax.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_postgres.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_presto.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_prql.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_redshift.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_risingwave.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_singlestore.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_solr.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_spark.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_sqlite.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_starrocks.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_tableau.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_teradata.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_trino.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/identity.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/jsonpath/LICENSE +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/jsonpath/cts.json +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/annotate_functions.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/annotate_types.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/canonicalize.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/normalize.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/optimizer.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/simplify.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/partial.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/pretty.sql +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/gen_fixtures.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/helpers.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/sqlglot/__init__.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_build.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_dialect_entry_points.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_dialect_imports.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_diff.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_docs.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_errors.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_executor.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_expressions.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_generator.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_helper.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_integration_loader.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_jsonpath.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_lineage.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_optimizer.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_parser.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_schema.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_serde.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_time.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_tokens.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_transforms.py +0 -0
- {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_transpile.py +0 -0
|
@@ -1,6 +1,64 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
## [v30.4.0] - 2026-04-08
|
|
5
|
+
### :sparkles: New Features
|
|
6
|
+
- [`24ff8bb`](https://github.com/tobymao/sqlglot/commit/24ff8bb6c1d94a03f6611d4353e210108c25a6a6) - **duckdb**: Add transpilation support for COLLATE function *(PR [#7461](https://github.com/tobymao/sqlglot/pull/7461) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
7
|
+
- [`6717634`](https://github.com/tobymao/sqlglot/commit/67176343b150dd0121c7537e1b828bfde5a7a176) - **snowflake**: transpilation support for CONCAT_WS NULL semantics when transpiling to DuckDB *(PR [#7464](https://github.com/tobymao/sqlglot/pull/7464) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
8
|
+
- [`00970d8`](https://github.com/tobymao/sqlglot/commit/00970d85aaac2ca40c967c6fd4ad03dbc5f0367d) - **duckdb**: Add transpilation support for RTRIMMED_LENGTH function *(PR [#7468](https://github.com/tobymao/sqlglot/pull/7468) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
9
|
+
|
|
10
|
+
### :bug: Bug Fixes
|
|
11
|
+
- [`d3c2eeb`](https://github.com/tobymao/sqlglot/commit/d3c2eeb724c548913352369743ddefb78494417f) - **tsql**: improve `SELECT TOP` parsing *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
12
|
+
- [`800c0c4`](https://github.com/tobymao/sqlglot/commit/800c0c44bb3a2f209be9118ba71b993a99d63e3a) - **snowflake**: emit proper `HANDLER` property syntax *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## [v30.3.0] - 2026-04-07
|
|
16
|
+
### :boom: BREAKING CHANGES
|
|
17
|
+
- due to [`d044414`](https://github.com/tobymao/sqlglot/commit/d0444141c2d5888bddfb8301d5c643f87ab1a054) - support transpilation of function LEFT from Snowflake … *(PR [#7419](https://github.com/tobymao/sqlglot/pull/7419) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*:
|
|
18
|
+
|
|
19
|
+
support transpilation of function LEFT from Snowflake … (#7419)
|
|
20
|
+
|
|
21
|
+
- due to [`61bb18c`](https://github.com/tobymao/sqlglot/commit/61bb18cc00a1749f8945e56ff4e83e4c809bd6df) - Transpilation support for TO_DECIMAL, TO_NUMBER,NUMERIC *(PR [#7315](https://github.com/tobymao/sqlglot/pull/7315) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*:
|
|
22
|
+
|
|
23
|
+
Transpilation support for TO_DECIMAL, TO_NUMBER,NUMERIC (#7315)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### :sparkles: New Features
|
|
27
|
+
- [`d044414`](https://github.com/tobymao/sqlglot/commit/d0444141c2d5888bddfb8301d5c643f87ab1a054) - **duckdb**: support transpilation of function LEFT from Snowflake … *(PR [#7419](https://github.com/tobymao/sqlglot/pull/7419) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
28
|
+
- [`11e0dab`](https://github.com/tobymao/sqlglot/commit/11e0dabb47a6d761f3166bd98999f461ac3e7146) - add `Expr.pipe` and `Expr.apply` methods *(PR [#7442](https://github.com/tobymao/sqlglot/pull/7442) by [@OutSquareCapital](https://github.com/OutSquareCapital))*
|
|
29
|
+
- [`21f4ecc`](https://github.com/tobymao/sqlglot/commit/21f4ecc7f319ad50cdfb59f7fd7cc29eebc58d42) - **duckdb**: transpilation support for position with binary arguments *(PR [#7433](https://github.com/tobymao/sqlglot/pull/7433) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
30
|
+
- [`d57221a`](https://github.com/tobymao/sqlglot/commit/d57221a7d3ee75772d45d6c03acd8e511b4eda09) - **hive**: add native AST support for USING JAR/FILE/ARCHIVE in CREATE FUNCTION *(PR [#7436](https://github.com/tobymao/sqlglot/pull/7436) by [@hashwnath](https://github.com/hashwnath))*
|
|
31
|
+
- :arrow_lower_right: *addresses issue [#7435](https://github.com/tobymao/sqlglot/issues/7435) opened by [@catlynkong](https://github.com/catlynkong)*
|
|
32
|
+
- [`8a070fd`](https://github.com/tobymao/sqlglot/commit/8a070fd3f9d17c06cf458a9a96ddeb1dba059b31) - **duckdb**: Add transpilation unsupported for COMPRESS function *(PR [#7445](https://github.com/tobymao/sqlglot/pull/7445) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
33
|
+
- [`eb9dbac`](https://github.com/tobymao/sqlglot/commit/eb9dbac22e361a86fc13fbd49023135e66e2c53e) - **bigquery**: support AI.FORECAST function *(PR [#7457](https://github.com/tobymao/sqlglot/pull/7457) by [@RedZapdos123](https://github.com/RedZapdos123))*
|
|
34
|
+
- :arrow_lower_right: *addresses issue [#7456](https://github.com/tobymao/sqlglot/issues/7456) opened by [@RedZapdos123](https://github.com/RedZapdos123)*
|
|
35
|
+
- [`61bb18c`](https://github.com/tobymao/sqlglot/commit/61bb18cc00a1749f8945e56ff4e83e4c809bd6df) - **snowflake**: Transpilation support for TO_DECIMAL, TO_NUMBER,NUMERIC *(PR [#7315](https://github.com/tobymao/sqlglot/pull/7315) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
36
|
+
- [`4c29711`](https://github.com/tobymao/sqlglot/commit/4c29711d3a6c8e08307e0249ec9dab7486d343db) - **duckdb**: Add transpilation support for COLLATION function *(PR [#7443](https://github.com/tobymao/sqlglot/pull/7443) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
37
|
+
- [`9cf3485`](https://github.com/tobymao/sqlglot/commit/9cf3485eaab80d5e715d9ef9de3c140e9d6c491a) - **snowflake**: parse and generate ROW ACCESS POLICY on views [CLAUDE] *(PR [#7467](https://github.com/tobymao/sqlglot/pull/7467) by [@eakmanrq](https://github.com/eakmanrq))*
|
|
38
|
+
|
|
39
|
+
### :bug: Bug Fixes
|
|
40
|
+
- [`09b5912`](https://github.com/tobymao/sqlglot/commit/09b59124c960dcf3415ef445faaabe5023e9f61c) - **sqlite**: support PRAGMA full syntax *(PR [#7441](https://github.com/tobymao/sqlglot/pull/7441) by [@geooo109](https://github.com/geooo109))*
|
|
41
|
+
- :arrow_lower_right: *fixes issue [#7437](https://github.com/tobymao/sqlglot/issues/7437) opened by [@ppacac](https://github.com/ppacac)*
|
|
42
|
+
- [`b61a85f`](https://github.com/tobymao/sqlglot/commit/b61a85f00b763df819c260e186a1e0b66c0086a9) - **bigquery**: column offset *(PR [#7451](https://github.com/tobymao/sqlglot/pull/7451) by [@geooo109](https://github.com/geooo109))*
|
|
43
|
+
- :arrow_lower_right: *fixes issue [#7447](https://github.com/tobymao/sqlglot/issues/7447) opened by [@roykoand](https://github.com/roykoand)*
|
|
44
|
+
- [`b7c057d`](https://github.com/tobymao/sqlglot/commit/b7c057dad7720e62243da57df2d024266d4fd64d) - **bigquery**: pipe syntax DISTINCT *(PR [#7450](https://github.com/tobymao/sqlglot/pull/7450) by [@geooo109](https://github.com/geooo109))*
|
|
45
|
+
- :arrow_lower_right: *fixes issue [#7449](https://github.com/tobymao/sqlglot/issues/7449) opened by [@roykoand](https://github.com/roykoand)*
|
|
46
|
+
- [`2b3dba1`](https://github.com/tobymao/sqlglot/commit/2b3dba155aa0159e8afabbc86af4283955ac92bb) - **presto**: iterate over copy in eliminate_semi_and_anti_joins *(PR [#7455](https://github.com/tobymao/sqlglot/pull/7455) by [@Evgeniy-Sinyak](https://github.com/Evgeniy-Sinyak))*
|
|
47
|
+
- [`2fc0c25`](https://github.com/tobymao/sqlglot/commit/2fc0c257d7762b8cef156619451d0c4233f6ea7e) - **bigquery**: parse MODEL-first AI/ML GENERATE signatures *(PR [#7463](https://github.com/tobymao/sqlglot/pull/7463) by [@RedZapdos123](https://github.com/RedZapdos123))*
|
|
48
|
+
- :arrow_lower_right: *fixes issue [#7462](https://github.com/tobymao/sqlglot/issues/7462) opened by [@RedZapdos123](https://github.com/RedZapdos123)*
|
|
49
|
+
|
|
50
|
+
### :recycle: Refactors
|
|
51
|
+
- [`4deba62`](https://github.com/tobymao/sqlglot/commit/4deba626c6ee94693a7079c085b80d7eaa619487) - **typing**: add annotations in dialect/parser/schema modules *(PR [#7444](https://github.com/tobymao/sqlglot/pull/7444) by [@OutSquareCapital](https://github.com/OutSquareCapital))*
|
|
52
|
+
- [`c31e2e3`](https://github.com/tobymao/sqlglot/commit/c31e2e3a6994c0c5eeda7d4374d94fc3048c84e0) - **Optimizer**: improve typing coverage of optimizer modules *(PR [#7446](https://github.com/tobymao/sqlglot/pull/7446) by [@OutSquareCapital](https://github.com/OutSquareCapital))*
|
|
53
|
+
- [`08b51e8`](https://github.com/tobymao/sqlglot/commit/08b51e81e0092c63a565f46ec0ccad178006d5df) - use ruff UP rule to modernize coding style *(PR [#7459](https://github.com/tobymao/sqlglot/pull/7459) by [@georgesittas](https://github.com/georgesittas))*
|
|
54
|
+
|
|
55
|
+
### :wrench: Chores
|
|
56
|
+
- [`2e7dec0`](https://github.com/tobymao/sqlglot/commit/2e7dec0c1129e8af28e2ec9b8e0c12282701abc6) - Bump sqlglot-mypy to 1.20 *(PR [#7439](https://github.com/tobymao/sqlglot/pull/7439) by [@VaggelisD](https://github.com/VaggelisD))*
|
|
57
|
+
- [`500e0ce`](https://github.com/tobymao/sqlglot/commit/500e0ce1785a90eb29f7d4e0bf0511db08843219) - Fix uv sync picking up sqlglotc in python 3.9 *(PR [#7452](https://github.com/tobymao/sqlglot/pull/7452) by [@VaggelisD](https://github.com/VaggelisD))*
|
|
58
|
+
- [`0445c24`](https://github.com/tobymao/sqlglot/commit/0445c24577b093154105efaf57b8cd1a147abc7e) - Revert setup.py for sqlglot-mypy *(PR [#7458](https://github.com/tobymao/sqlglot/pull/7458) by [@VaggelisD](https://github.com/VaggelisD))*
|
|
59
|
+
- [`576b5a8`](https://github.com/tobymao/sqlglot/commit/576b5a8ae47e7108c69bdded53729c1e4cb3df1d) - add MaxCompute plugin to dialects list *(PR [#7466](https://github.com/tobymao/sqlglot/pull/7466) by [@azurechen97](https://github.com/azurechen97))*
|
|
60
|
+
|
|
61
|
+
|
|
4
62
|
## [v30.2.1] - 2026-04-02
|
|
5
63
|
### :bug: Bug Fixes
|
|
6
64
|
- [`6983aed`](https://github.com/tobymao/sqlglot/commit/6983aedacc47b4adc127fb7e6ce9e0230f9b94f4) - **postgres**: `_date_add_sql` bug w/ interval inputs *(PR [#7440](https://github.com/tobymao/sqlglot/pull/7440) by [@georgesittas](https://github.com/georgesittas))*
|
|
@@ -14077,3 +14135,5 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
|
|
|
14077
14135
|
[v30.1.0]: https://github.com/tobymao/sqlglot/compare/v30.0.3...v30.1.0
|
|
14078
14136
|
[v30.2.0]: https://github.com/tobymao/sqlglot/compare/v30.1.0...v30.2.0
|
|
14079
14137
|
[v30.2.1]: https://github.com/tobymao/sqlglot/compare/v30.2.0...v30.2.1
|
|
14138
|
+
[v30.3.0]: https://github.com/tobymao/sqlglot/compare/v30.2.1...v30.3.0
|
|
14139
|
+
[v30.4.0]: https://github.com/tobymao/sqlglot/compare/v30.3.0...v30.4.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlglot
|
|
3
|
-
Version: 30.
|
|
3
|
+
Version: 30.4.2
|
|
4
4
|
Summary: An easily customizable SQL parser and transpiler
|
|
5
5
|
Author-email: Toby Mao <toby.mao@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -33,10 +33,10 @@ Requires-Dist: types-pytz; extra == "dev"
|
|
|
33
33
|
Requires-Dist: typing_extensions; extra == "dev"
|
|
34
34
|
Requires-Dist: pyperf; extra == "dev"
|
|
35
35
|
Provides-Extra: c
|
|
36
|
-
Requires-Dist: sqlglotc==30.
|
|
36
|
+
Requires-Dist: sqlglotc==30.4.2; extra == "c"
|
|
37
37
|
Provides-Extra: rs
|
|
38
38
|
Requires-Dist: sqlglotrs==0.13.0; extra == "rs"
|
|
39
|
-
Requires-Dist: sqlglotc==30.
|
|
39
|
+
Requires-Dist: sqlglotc==30.4.2; extra == "rs"
|
|
40
40
|
Dynamic: license-file
|
|
41
41
|
Dynamic: provides-extra
|
|
42
42
|
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '30.
|
|
22
|
-
__version_tuple__ = version_tuple = (30,
|
|
21
|
+
__version__ = version = '30.4.2'
|
|
22
|
+
__version_tuple__ = version_tuple = (30, 4, 2)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'gd04595e1b'
|
|
@@ -3416,6 +3416,17 @@ class Generator:
|
|
|
3416
3416
|
return self.func("CONCAT", *expressions)
|
|
3417
3417
|
|
|
3418
3418
|
def concatws_sql(self, expression: exp.ConcatWs) -> str:
|
|
3419
|
+
if self.dialect.CONCAT_COALESCE and not expression.args.get("coalesce"):
|
|
3420
|
+
# Dialect's CONCAT_WS function coalesces NULLs to empty strings, but the expression does not.
|
|
3421
|
+
# Wrap the entire call in a CASE expression that returns NULL if any input IS NULL.
|
|
3422
|
+
all_args = expression.expressions
|
|
3423
|
+
expression.set("coalesce", True)
|
|
3424
|
+
return self.sql(
|
|
3425
|
+
exp.case()
|
|
3426
|
+
.when(exp.or_(*(arg.is_(exp.null()) for arg in all_args)), exp.null())
|
|
3427
|
+
.else_(expression)
|
|
3428
|
+
)
|
|
3429
|
+
|
|
3419
3430
|
return self.func(
|
|
3420
3431
|
"CONCAT_WS", seq_get(expression.expressions, 0), *self.convert_concat_args(expression)
|
|
3421
3432
|
)
|
|
@@ -82,6 +82,13 @@ WEEK_START_DAY_TO_DOW = {
|
|
|
82
82
|
|
|
83
83
|
MAX_BIT_POSITION = exp.Literal.number(32768)
|
|
84
84
|
|
|
85
|
+
# cs/as/ps are Snowflake defaults; DuckDB already behaves the same way, so they are safe to drop.
|
|
86
|
+
# Note: "as" is also a reserved keyword in DuckDB, making it impossible to pass through.
|
|
87
|
+
_SNOWFLAKE_COLLATION_DEFAULTS = frozenset({"cs", "as", "ps"})
|
|
88
|
+
_SNOWFLAKE_COLLATION_UNSUPPORTED = frozenset(
|
|
89
|
+
{"ci", "ai", "upper", "lower", "utf8", "bin", "pi", "fl", "fu", "trim", "ltrim", "rtrim"}
|
|
90
|
+
)
|
|
91
|
+
|
|
85
92
|
# Window functions that support IGNORE/RESPECT NULLS in DuckDB
|
|
86
93
|
_IGNORE_RESPECT_NULLS_WINDOW_FUNCTIONS = (
|
|
87
94
|
exp.FirstValue,
|
|
@@ -2997,6 +3004,30 @@ class DuckDBGenerator(generator.Generator):
|
|
|
2997
3004
|
self.unsupported("COLLATION function is not supported by DuckDB")
|
|
2998
3005
|
return self.function_fallback_sql(expression)
|
|
2999
3006
|
|
|
3007
|
+
def collate_sql(self, expression: exp.Collate) -> str:
|
|
3008
|
+
if not expression.expression.is_string:
|
|
3009
|
+
return super().collate_sql(expression)
|
|
3010
|
+
|
|
3011
|
+
raw = expression.expression.name
|
|
3012
|
+
if not raw:
|
|
3013
|
+
return self.sql(expression.this)
|
|
3014
|
+
|
|
3015
|
+
parts = []
|
|
3016
|
+
for part in raw.split("-"):
|
|
3017
|
+
lower = part.lower()
|
|
3018
|
+
if lower not in _SNOWFLAKE_COLLATION_DEFAULTS:
|
|
3019
|
+
if lower in _SNOWFLAKE_COLLATION_UNSUPPORTED:
|
|
3020
|
+
self.unsupported(
|
|
3021
|
+
f"Snowflake collation specifier '{part}' has no DuckDB equivalent"
|
|
3022
|
+
)
|
|
3023
|
+
parts.append(lower)
|
|
3024
|
+
|
|
3025
|
+
if not parts:
|
|
3026
|
+
return self.sql(expression.this)
|
|
3027
|
+
return super().collate_sql(
|
|
3028
|
+
exp.Collate(this=expression.this, expression=exp.var(".".join(parts)))
|
|
3029
|
+
)
|
|
3030
|
+
|
|
3000
3031
|
def _validate_regexp_flags(self, flags: exp.Expr | None, supported_flags: str) -> str | None:
|
|
3001
3032
|
"""
|
|
3002
3033
|
Validate and filter regexp flags for DuckDB compatibility.
|
|
@@ -3362,6 +3393,9 @@ class DuckDBGenerator(generator.Generator):
|
|
|
3362
3393
|
def right_sql(self, expression: exp.Right) -> str:
|
|
3363
3394
|
return self._left_right_sql(expression, "RIGHT")
|
|
3364
3395
|
|
|
3396
|
+
def rtrimmedlength_sql(self, expression: exp.RtrimmedLength) -> str:
|
|
3397
|
+
return self.func("LENGTH", exp.Trim(this=expression.this, position="TRAILING"))
|
|
3398
|
+
|
|
3365
3399
|
def rand_sql(self, expression: exp.Rand) -> str:
|
|
3366
3400
|
seed = expression.this
|
|
3367
3401
|
if seed is not None:
|
|
@@ -3733,6 +3767,21 @@ class DuckDBGenerator(generator.Generator):
|
|
|
3733
3767
|
|
|
3734
3768
|
return self.func("ARRAY_TO_STRING", expression.this, expression.expression)
|
|
3735
3769
|
|
|
3770
|
+
def concatws_sql(self, expression: exp.ConcatWs) -> str:
|
|
3771
|
+
# DuckDB-specific: handle binary types using DPipe (||) operator
|
|
3772
|
+
separator = seq_get(expression.expressions, 0)
|
|
3773
|
+
args = expression.expressions[1:]
|
|
3774
|
+
|
|
3775
|
+
if any(_is_binary(arg) for arg in [separator, *args]):
|
|
3776
|
+
result = args[0]
|
|
3777
|
+
for arg in args[1:]:
|
|
3778
|
+
result = exp.DPipe(
|
|
3779
|
+
this=exp.DPipe(this=result, expression=separator), expression=arg
|
|
3780
|
+
)
|
|
3781
|
+
return self.sql(result)
|
|
3782
|
+
|
|
3783
|
+
return super().concatws_sql(expression)
|
|
3784
|
+
|
|
3736
3785
|
def _regexp_extract_sql(self, expression: exp.RegexpExtract | exp.RegexpExtractAll) -> str:
|
|
3737
3786
|
this = expression.this
|
|
3738
3787
|
group = expression.args.get("group")
|
|
@@ -481,6 +481,7 @@ class SnowflakeGenerator(generator.Generator):
|
|
|
481
481
|
),
|
|
482
482
|
exp.CosineDistance: rename_func("VECTOR_COSINE_SIMILARITY"),
|
|
483
483
|
exp.EuclideanDistance: rename_func("VECTOR_L2_DISTANCE"),
|
|
484
|
+
exp.HandlerProperty: lambda self, e: f"HANDLER = {self.sql(e, 'this')}",
|
|
484
485
|
exp.FileFormatProperty: lambda self, e: (
|
|
485
486
|
f"FILE_FORMAT=({self.expressions(e, 'expressions', sep=' ')})"
|
|
486
487
|
),
|
|
@@ -5399,7 +5399,11 @@ class Parser:
|
|
|
5399
5399
|
comments = self._prev_comments
|
|
5400
5400
|
if top:
|
|
5401
5401
|
limit_paren = self._match(TokenType.L_PAREN)
|
|
5402
|
-
expression =
|
|
5402
|
+
expression = (
|
|
5403
|
+
self._parse_term() or self._parse_select()
|
|
5404
|
+
if limit_paren
|
|
5405
|
+
else self._parse_number()
|
|
5406
|
+
)
|
|
5403
5407
|
|
|
5404
5408
|
if limit_paren:
|
|
5405
5409
|
self._match_r_paren()
|
|
@@ -18,7 +18,7 @@ if t.TYPE_CHECKING:
|
|
|
18
18
|
from collections.abc import Sequence
|
|
19
19
|
from typing_extensions import Unpack
|
|
20
20
|
|
|
21
|
-
ColumnMapping = t.Union[dict
|
|
21
|
+
ColumnMapping = t.Union[dict, str, list]
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
@trait
|
|
@@ -708,13 +708,7 @@ def ensure_schema(
|
|
|
708
708
|
return MappingSchema(schema, **kwargs)
|
|
709
709
|
|
|
710
710
|
|
|
711
|
-
|
|
712
|
-
def ensure_column_mapping(mapping: list[str] | None) -> dict[str, None]: ...
|
|
713
|
-
@t.overload
|
|
714
|
-
def ensure_column_mapping(mapping: dict[str, str]) -> dict[str, str]: ...
|
|
715
|
-
@t.overload
|
|
716
|
-
def ensure_column_mapping(mapping: ColumnMapping | None) -> dict[str, None] | dict[str, str]: ...
|
|
717
|
-
def ensure_column_mapping(mapping: ColumnMapping | None) -> dict[str, None] | dict[str, str]:
|
|
711
|
+
def ensure_column_mapping(mapping: ColumnMapping | None) -> dict:
|
|
718
712
|
if mapping is None:
|
|
719
713
|
return {}
|
|
720
714
|
elif isinstance(mapping, dict):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlglot
|
|
3
|
-
Version: 30.
|
|
3
|
+
Version: 30.4.2
|
|
4
4
|
Summary: An easily customizable SQL parser and transpiler
|
|
5
5
|
Author-email: Toby Mao <toby.mao@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -33,10 +33,10 @@ Requires-Dist: types-pytz; extra == "dev"
|
|
|
33
33
|
Requires-Dist: typing_extensions; extra == "dev"
|
|
34
34
|
Requires-Dist: pyperf; extra == "dev"
|
|
35
35
|
Provides-Extra: c
|
|
36
|
-
Requires-Dist: sqlglotc==30.
|
|
36
|
+
Requires-Dist: sqlglotc==30.4.2; extra == "c"
|
|
37
37
|
Provides-Extra: rs
|
|
38
38
|
Requires-Dist: sqlglotrs==0.13.0; extra == "rs"
|
|
39
|
-
Requires-Dist: sqlglotc==30.
|
|
39
|
+
Requires-Dist: sqlglotc==30.4.2; extra == "rs"
|
|
40
40
|
Dynamic: license-file
|
|
41
41
|
Dynamic: provides-extra
|
|
42
42
|
|
|
@@ -2449,7 +2449,7 @@ class TestDialect(Validator):
|
|
|
2449
2449
|
"CONCAT_WS('-', 'a', 'b')",
|
|
2450
2450
|
write={
|
|
2451
2451
|
"clickhouse": "CONCAT_WS('-', 'a', 'b')",
|
|
2452
|
-
"duckdb": "CONCAT_WS('-', 'a', 'b')",
|
|
2452
|
+
"duckdb": "CASE WHEN '-' IS NULL OR 'a' IS NULL OR 'b' IS NULL THEN NULL ELSE CONCAT_WS('-', 'a', 'b') END",
|
|
2453
2453
|
"presto": "CONCAT_WS('-', CAST('a' AS VARCHAR), CAST('b' AS VARCHAR))",
|
|
2454
2454
|
"hive": "CONCAT_WS('-', 'a', 'b')",
|
|
2455
2455
|
"spark": "CONCAT_WS('-', 'a', 'b')",
|
|
@@ -2461,7 +2461,7 @@ class TestDialect(Validator):
|
|
|
2461
2461
|
"CONCAT_WS('-', x)",
|
|
2462
2462
|
write={
|
|
2463
2463
|
"clickhouse": "CONCAT_WS('-', x)",
|
|
2464
|
-
"duckdb": "CONCAT_WS('-', x)",
|
|
2464
|
+
"duckdb": "CASE WHEN '-' IS NULL OR x IS NULL THEN NULL ELSE CONCAT_WS('-', x) END",
|
|
2465
2465
|
"hive": "CONCAT_WS('-', x)",
|
|
2466
2466
|
"presto": "CONCAT_WS('-', CAST(x AS VARCHAR))",
|
|
2467
2467
|
"spark": "CONCAT_WS('-', x)",
|
|
@@ -4419,6 +4419,10 @@ class TestSnowflake(Validator):
|
|
|
4419
4419
|
},
|
|
4420
4420
|
)
|
|
4421
4421
|
|
|
4422
|
+
self.validate_identity(
|
|
4423
|
+
"CREATE OR REPLACE FUNCTION repro_fn() RETURNS INT LANGUAGE PYTHON HANDLER = 'fn' RUNTIME_VERSION='3.11' PACKAGES=() AS '\\ndef fn():\\n return 1\\n'"
|
|
4424
|
+
)
|
|
4425
|
+
|
|
4422
4426
|
def test_stored_procedures(self):
|
|
4423
4427
|
self.validate_identity("CALL a.b.c(x, y)", check_command_warning=True)
|
|
4424
4428
|
self.validate_identity(
|
|
@@ -19,6 +19,7 @@ class TestTSQL(Validator):
|
|
|
19
19
|
# tsql allows .. which means use the default schema
|
|
20
20
|
self.validate_identity("SELECT * FROM a..b")
|
|
21
21
|
|
|
22
|
+
self.validate_identity("SELECT TOP (SELECT 1) * FROM t")
|
|
22
23
|
self.validate_identity("SELECT ATN2(x, y)")
|
|
23
24
|
self.validate_identity("SELECT EXP(1)")
|
|
24
25
|
self.validate_identity("SELECT SYSDATETIMEOFFSET()")
|
|
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
|
|
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
|
|
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
|
|
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
|