sqlglot 30.4.3__tar.gz → 30.6.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.
- {sqlglot-30.4.3 → sqlglot-30.6.0}/CHANGELOG.md +83 -0
- {sqlglot-30.4.3/sqlglot.egg-info → sqlglot-30.6.0}/PKG-INFO +3 -3
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/_typing.py +1 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/_version.py +3 -3
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/bigquery.py +1 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/dialect.py +8 -1
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/duckdb.py +2 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/exasol.py +1 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/executor/python.py +4 -108
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/constraints.py +4 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/ddl.py +4 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/dml.py +4 -1
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/functions.py +18 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/math.py +6 -1
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/string.py +1 -1
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generator.py +33 -5
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/bigquery.py +3 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/clickhouse.py +26 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/duckdb.py +122 -3
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/oracle.py +1 -0
- sqlglot-30.6.0/sqlglot/generators/python.py +108 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/snowflake.py +4 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/spark.py +1 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/starrocks.py +8 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parser.py +28 -3
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/bigquery.py +3 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/clickhouse.py +18 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/databricks.py +1 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/doris.py +5 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/duckdb.py +1 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/mysql.py +10 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/snowflake.py +7 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/spark.py +1 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/starrocks.py +10 -1
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/bigquery.py +21 -10
- {sqlglot-30.4.3 → sqlglot-30.6.0/sqlglot.egg-info}/PKG-INFO +3 -3
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot.egg-info/SOURCES.txt +1 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot.egg-info/requires.txt +2 -2
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_bigquery.py +26 -4
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_clickhouse.py +41 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_databricks.py +31 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_dialect.py +1 -1
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_doris.py +13 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_duckdb.py +34 -1
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_exasol.py +4 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_mysql.py +35 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_oracle.py +15 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_postgres.py +2 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_snowflake.py +1 -9
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_spark.py +15 -1
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_starrocks.py +28 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_executor.py +0 -4
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_parser.py +26 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/.gitignore +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/.gitmodules +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/.gitpod.yml +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/.pre-commit-config.yaml +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/AGENTS.md +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/CLAUDE.md +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/CONTRIBUTING.md +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/LICENSE +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/MANIFEST.in +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/Makefile +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/README.md +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/pyproject.toml +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/setup.cfg +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/setup.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/__init__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/__main__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/__init__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/athena.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/clickhouse.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/databricks.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/doris.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/dremio.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/drill.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/druid.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/dune.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/fabric.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/hive.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/materialize.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/mysql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/oracle.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/postgres.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/presto.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/prql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/redshift.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/risingwave.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/singlestore.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/snowflake.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/solr.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/spark.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/spark2.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/sqlite.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/starrocks.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/tableau.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/teradata.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/trino.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/tsql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/diff.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/errors.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/executor/__init__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/executor/context.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/executor/env.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/executor/table.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/__init__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/aggregate.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/array.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/builders.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/core.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/datatypes.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/json.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/properties.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/query.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/temporal.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/__init__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/athena.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/databricks.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/doris.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/dremio.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/drill.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/druid.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/dune.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/exasol.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/fabric.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/hive.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/materialize.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/mysql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/postgres.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/presto.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/prql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/redshift.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/risingwave.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/singlestore.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/solr.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/spark2.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/sqlite.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/tableau.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/teradata.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/trino.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/tsql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/helper.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/jsonpath.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/lineage.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/__init__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/annotate_types.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/canonicalize.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/normalize.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/optimize_joins.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/optimizer.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/qualify.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/qualify_columns.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/qualify_tables.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/resolver.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/scope.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/simplify.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/__init__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/athena.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/base.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/dremio.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/drill.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/druid.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/dune.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/exasol.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/fabric.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/hive.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/materialize.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/oracle.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/postgres.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/presto.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/prql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/redshift.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/risingwave.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/singlestore.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/solr.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/spark2.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/sqlite.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/tableau.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/teradata.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/trino.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/tsql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/planner.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/py.typed +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/schema.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/serde.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/time.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/tokenizer_core.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/tokens.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/transforms.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/trie.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/__init__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/clickhouse.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/duckdb.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/hive.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/mysql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/presto.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/redshift.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/snowflake.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/spark.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/spark2.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/tsql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot.egg-info/dependency_links.txt +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot.egg-info/top_level.txt +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot.png +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglotc/MANIFEST.in +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglotc/pyproject.toml +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglotc/setup.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/__init__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/__init__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_athena.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_dremio.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_drill.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_druid.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_dune.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_fabric.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_hive.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_materialize.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_pipe_syntax.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_presto.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_prql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_redshift.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_risingwave.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_singlestore.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_solr.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_sqlite.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_tableau.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_teradata.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_trino.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_tsql.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/identity.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/jsonpath/LICENSE +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/jsonpath/cts.json +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/annotate_functions.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/normalize.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/simplify.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/partial.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/pretty.sql +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/gen_fixtures.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/helpers.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/sqlglot/__init__.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_build.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_dialect_entry_points.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_dialect_imports.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_diff.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_docs.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_errors.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_expressions.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_generator.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_helper.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_integration_loader.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_jsonpath.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_lineage.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_optimizer.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_schema.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_serde.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_time.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_tokens.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_transforms.py +0 -0
- {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_transpile.py +0 -0
|
@@ -1,6 +1,87 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
## [v30.5.0] - 2026-04-20
|
|
5
|
+
### :boom: BREAKING CHANGES
|
|
6
|
+
- due to [`98ca4cd`](https://github.com/tobymao/sqlglot/commit/98ca4cdd60124c0e566d1de40855b30a169219fd) - transpile TRY_DIVIDE to/from other dialects [CLAUDE] *(PR [#7489](https://github.com/tobymao/sqlglot/pull/7489) by [@baruchoxman](https://github.com/baruchoxman))*:
|
|
7
|
+
|
|
8
|
+
transpile TRY_DIVIDE to/from other dialects [CLAUDE] (#7489)
|
|
9
|
+
|
|
10
|
+
- due to [`ec516f2`](https://github.com/tobymao/sqlglot/commit/ec516f27213286c7b46731ea0fa72972b1b2f68a) - add typed AI scalar function nodes *(PR [#7479](https://github.com/tobymao/sqlglot/pull/7479) by [@RedZapdos123](https://github.com/RedZapdos123))*:
|
|
11
|
+
|
|
12
|
+
add typed AI scalar function nodes (#7479)
|
|
13
|
+
|
|
14
|
+
- due to [`800ca41`](https://github.com/tobymao/sqlglot/commit/800ca4105583e74cf18fed737bd90f24f55de428) - support LOAD DATA FROM FILES syntax *(PR [#7482](https://github.com/tobymao/sqlglot/pull/7482) by [@RedZapdos123](https://github.com/RedZapdos123))*:
|
|
15
|
+
|
|
16
|
+
support LOAD DATA FROM FILES syntax (#7482)
|
|
17
|
+
|
|
18
|
+
- due to [`efbc5e2`](https://github.com/tobymao/sqlglot/commit/efbc5e220c54c838e6684683fddb77f8056692bf) - add missing TO_CHAR format tokens (Mon, Month, Day, Dy, AM/PM, HH) *(PR [#7477](https://github.com/tobymao/sqlglot/pull/7477) by [@mwade0118](https://github.com/mwade0118))*:
|
|
19
|
+
|
|
20
|
+
add missing TO_CHAR format tokens (Mon, Month, Day, Dy, AM/PM, HH) (#7477)
|
|
21
|
+
|
|
22
|
+
- due to [`d289db3`](https://github.com/tobymao/sqlglot/commit/d289db33be43b99096ee9ec8e1c6d695b1d2a4a5) - stop eliminating semi/anti joins, QUALIFY, and FULL OUTER JOIN [CLAUDE] *(PR [#7524](https://github.com/tobymao/sqlglot/pull/7524) by [@dwoldemariam-klav](https://github.com/dwoldemariam-klav))*:
|
|
23
|
+
|
|
24
|
+
stop eliminating semi/anti joins, QUALIFY, and FULL OUTER JOIN [CLAUDE] (#7524)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
### :sparkles: New Features
|
|
28
|
+
- [`c80c3fd`](https://github.com/tobymao/sqlglot/commit/c80c3fd5c7f74aec28a3377583018b5aa03ec838) - **duckdb**: warn when transpiling snowflake's `ENCRYPT` *(PR [#7472](https://github.com/tobymao/sqlglot/pull/7472) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
29
|
+
- [`e150296`](https://github.com/tobymao/sqlglot/commit/e15029667b3672d0b0f83fa035da6bd01dda6f3d) - **duckdb**: warn when generating Snowflake's `[TRY_]DECRYPT_RAW` *(PR [#7475](https://github.com/tobymao/sqlglot/pull/7475) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
30
|
+
- [`4ac6389`](https://github.com/tobymao/sqlglot/commit/4ac6389cf9ddde2236e76571453117d681995ecf) - **snowflake**: mark ENCRYPT_RAW as unsupported in DuckDB *(PR [#7485](https://github.com/tobymao/sqlglot/pull/7485) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
31
|
+
- [`ec516f2`](https://github.com/tobymao/sqlglot/commit/ec516f27213286c7b46731ea0fa72972b1b2f68a) - **bigquery**: add typed AI scalar function nodes *(PR [#7479](https://github.com/tobymao/sqlglot/pull/7479) by [@RedZapdos123](https://github.com/RedZapdos123))*
|
|
32
|
+
- :arrow_lower_right: *addresses issue [#7478](https://github.com/tobymao/sqlglot/issues/7478) opened by [@RedZapdos123](https://github.com/RedZapdos123)*
|
|
33
|
+
- [`a7ae102`](https://github.com/tobymao/sqlglot/commit/a7ae102520b5c2632314481d5ef040b3fa129d49) - **duckdb**: mark PARSE_URL as unsupported *(PR [#7499](https://github.com/tobymao/sqlglot/pull/7499) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
34
|
+
- [`045f30e`](https://github.com/tobymao/sqlglot/commit/045f30e6ff8026de4a0a2acbdf8aef604c27a60a) - **duckdb**: mark PARSE_IP as unsupported [CLAUDE] *(PR [#7500](https://github.com/tobymao/sqlglot/pull/7500) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
35
|
+
- [`70dec2e`](https://github.com/tobymao/sqlglot/commit/70dec2ec7e6708406c815fab4436db540efe30fd) - **duckdb**: Add transpilation support for INSERT function *(PR [#7486](https://github.com/tobymao/sqlglot/pull/7486) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
36
|
+
- [`fb7d5b2`](https://github.com/tobymao/sqlglot/commit/fb7d5b2458cd65149475e42271ed22055ad1579f) - **oracle**: Support WHERE on MERGE statement *(PR [#7492](https://github.com/tobymao/sqlglot/pull/7492) by [@galunto](https://github.com/galunto))*
|
|
37
|
+
- [`ed58b9b`](https://github.com/tobymao/sqlglot/commit/ed58b9bd942282e1c9b81af5b11e952211d4fe78) - **clickhouse**: support groupConcat parametric syntax *(PR [#7487](https://github.com/tobymao/sqlglot/pull/7487) by [@betodealmeida](https://github.com/betodealmeida))*
|
|
38
|
+
- [`73c1983`](https://github.com/tobymao/sqlglot/commit/73c198380e083d28ac9f0f42cf74f6280e9052db) - **parser**: introduce flag to control AST size *(PR [#7502](https://github.com/tobymao/sqlglot/pull/7502) by [@georgesittas](https://github.com/georgesittas))*
|
|
39
|
+
- [`b985092`](https://github.com/tobymao/sqlglot/commit/b985092f817fb93670355c166839dc2617b47777) - **duckdb**: Add transpilation support for SUBSTR-SUBSTRING functions *(PR [#7471](https://github.com/tobymao/sqlglot/pull/7471) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
40
|
+
- [`1a55f07`](https://github.com/tobymao/sqlglot/commit/1a55f07cc0b27c3826659c1ba7f7873863d22502) - **duckdb**: transpile snowflake's JAROWINKLER_SIMILARITY properly *(PR [#7501](https://github.com/tobymao/sqlglot/pull/7501) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
41
|
+
- [`5fb1f7c`](https://github.com/tobymao/sqlglot/commit/5fb1f7c3d70d00b1e864a3bc2a1db271e72f8bc4) - **duckdb**: Mark ARRAY_UNION_AGG as unsupported [CLAUDE] *(PR [#7503](https://github.com/tobymao/sqlglot/pull/7503) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
42
|
+
- [`d0407ed`](https://github.com/tobymao/sqlglot/commit/d0407edee90cdf75e11bb5ca3064975c0bbfe08b) - **duckdb**: support dollars in identifiers closes [#7509](https://github.com/tobymao/sqlglot/pull/7509) *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
43
|
+
- [`6678ee0`](https://github.com/tobymao/sqlglot/commit/6678ee028d0de97d6cce222302da29477bd3d72b) - **mysql**: Add `INVISIBLE` column constraint for MySQL. *(PR [#7510](https://github.com/tobymao/sqlglot/pull/7510) by [@burnison](https://github.com/burnison))*
|
|
44
|
+
- [`cb91d91`](https://github.com/tobymao/sqlglot/commit/cb91d9142a76234630b4e9dfbccf1fdb8076c830) - **mysql**: support `ALTER TABLE ... RENAME INDEX`. *(PR [#7511](https://github.com/tobymao/sqlglot/pull/7511) by [@burnison](https://github.com/burnison))*
|
|
45
|
+
- [`7660486`](https://github.com/tobymao/sqlglot/commit/7660486c4cc6a679e73d2a45498982d8895b64c0) - **doris, starrocks**: support two-argument DATE_ADD/DATE_SUB *(PR [#7514](https://github.com/tobymao/sqlglot/pull/7514) by [@wuqicyber](https://github.com/wuqicyber))*
|
|
46
|
+
- :arrow_lower_right: *addresses issue [#6341](https://github.com/tobymao/sqlglot/issues/6341) opened by [@HolgerWang1999](https://github.com/HolgerWang1999)*
|
|
47
|
+
- [`e2d6bfe`](https://github.com/tobymao/sqlglot/commit/e2d6bfeeae76846c24dc10a4f758585c828e2928) - **mysql**: parse `ALTER TABLE AUTO_INCREMENT`. *(PR [#7520](https://github.com/tobymao/sqlglot/pull/7520) by [@burnison](https://github.com/burnison))*
|
|
48
|
+
- [`0cd09c2`](https://github.com/tobymao/sqlglot/commit/0cd09c25d14aef5a1c8d9c197bf4b38ad7875e5d) - **mysql**: parse hints on `UPDATE` and `DELETE`. *(PR [#7523](https://github.com/tobymao/sqlglot/pull/7523) by [@burnison](https://github.com/burnison))*
|
|
49
|
+
- [`ceb14fa`](https://github.com/tobymao/sqlglot/commit/ceb14fad0b3e2be7e66523076a78b172d99eb306) - **duckdb**: Add transpilation unsupported for SOUNDEX function *(PR [#7517](https://github.com/tobymao/sqlglot/pull/7517) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
50
|
+
- [`d289db3`](https://github.com/tobymao/sqlglot/commit/d289db33be43b99096ee9ec8e1c6d695b1d2a4a5) - **starrocks**: stop eliminating semi/anti joins, QUALIFY, and FULL OUTER JOIN [CLAUDE] *(PR [#7524](https://github.com/tobymao/sqlglot/pull/7524) by [@dwoldemariam-klav](https://github.com/dwoldemariam-klav))*
|
|
51
|
+
|
|
52
|
+
### :bug: Bug Fixes
|
|
53
|
+
- [`ecd325b`](https://github.com/tobymao/sqlglot/commit/ecd325b4e3e09acfca4273661dffa4aba3302ad4) - **databricks**: support IFF as a synonym for IF [CLAUDE] *(PR [#7488](https://github.com/tobymao/sqlglot/pull/7488) by [@baruchoxman](https://github.com/baruchoxman))*
|
|
54
|
+
- :arrow_lower_right: *fixes issue [#7347](https://github.com/tobymao/sqlglot/issues/7347) opened by [@baruchoxman](https://github.com/baruchoxman)*
|
|
55
|
+
- [`e3cd4a4`](https://github.com/tobymao/sqlglot/commit/e3cd4a4c175525948e319adede3a743f0128701d) - **bigquery**: parse FOR SYSTEM TIME AS OF (with spaces) *(PR [#7493](https://github.com/tobymao/sqlglot/pull/7493) by [@lawrence3699](https://github.com/lawrence3699))*
|
|
56
|
+
- :arrow_lower_right: *fixes issue [#7481](https://github.com/tobymao/sqlglot/issues/7481) opened by [@roykoand](https://github.com/roykoand)*
|
|
57
|
+
- [`c16630f`](https://github.com/tobymao/sqlglot/commit/c16630f61dfa738ac70079a275426549dfa547d6) - **snowflake**: map JSON type to VARIANT in Snowflake generator [CLAUDE] *(PR [#7496](https://github.com/tobymao/sqlglot/pull/7496) by [@maxa-jonathan-hallee](https://github.com/maxa-jonathan-hallee))*
|
|
58
|
+
- [`98ca4cd`](https://github.com/tobymao/sqlglot/commit/98ca4cdd60124c0e566d1de40855b30a169219fd) - **databricks**: transpile TRY_DIVIDE to/from other dialects [CLAUDE] *(PR [#7489](https://github.com/tobymao/sqlglot/pull/7489) by [@baruchoxman](https://github.com/baruchoxman))*
|
|
59
|
+
- :arrow_lower_right: *fixes issue [#7312](https://github.com/tobymao/sqlglot/issues/7312) opened by [@baruchoxman](https://github.com/baruchoxman)*
|
|
60
|
+
- [`800ca41`](https://github.com/tobymao/sqlglot/commit/800ca4105583e74cf18fed737bd90f24f55de428) - **bigquery**: support LOAD DATA FROM FILES syntax *(PR [#7482](https://github.com/tobymao/sqlglot/pull/7482) by [@RedZapdos123](https://github.com/RedZapdos123))*
|
|
61
|
+
- :arrow_lower_right: *fixes issue [#7480](https://github.com/tobymao/sqlglot/issues/7480) opened by [@roykoand](https://github.com/roykoand)*
|
|
62
|
+
- [`efbc5e2`](https://github.com/tobymao/sqlglot/commit/efbc5e220c54c838e6684683fddb77f8056692bf) - **postgres**: add missing TO_CHAR format tokens (Mon, Month, Day, Dy, AM/PM, HH) *(PR [#7477](https://github.com/tobymao/sqlglot/pull/7477) by [@mwade0118](https://github.com/mwade0118))*
|
|
63
|
+
- :arrow_lower_right: *fixes issue [#7476](https://github.com/tobymao/sqlglot/issues/7476) opened by [@mwade0118](https://github.com/mwade0118)*
|
|
64
|
+
- [`0b46b39`](https://github.com/tobymao/sqlglot/commit/0b46b39639d149ff57b4b9dc0000732f9096468d) - **snowflake**: transpile REDUCE to DuckDB LIST_REDUCE *(PR [#7505](https://github.com/tobymao/sqlglot/pull/7505) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
65
|
+
- [`35c6d37`](https://github.com/tobymao/sqlglot/commit/35c6d37c5a32fa7dd95b998c5e06688e1bffb7ea) - **duckdb**: wrap OCTET_LENGTH string arguments with ENCODE *(PR [#7507](https://github.com/tobymao/sqlglot/pull/7507) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
66
|
+
- [`930ff33`](https://github.com/tobymao/sqlglot/commit/930ff330616f72966bb67231bfb26301022814c3) - **snowflake**: transpile DuckDB JSON_ARRAY to ARRAY_CONSTRUCT [CLAUDE] *(PR [#7497](https://github.com/tobymao/sqlglot/pull/7497) by [@maxa-jonathan-hallee](https://github.com/maxa-jonathan-hallee))*
|
|
67
|
+
- [`998b42b`](https://github.com/tobymao/sqlglot/commit/998b42b4edd650dd272284d511a724be27e1b89e) - **exasol**: enable minus *(PR [#7521](https://github.com/tobymao/sqlglot/pull/7521) by [@Hfuegl](https://github.com/Hfuegl))*
|
|
68
|
+
- [`18231ca`](https://github.com/tobymao/sqlglot/commit/18231cad0a187e2646e550b27af68b72eef2cd84) - **mysql**: parse quoted constraint names. *(PR [#7519](https://github.com/tobymao/sqlglot/pull/7519) by [@burnison](https://github.com/burnison))*
|
|
69
|
+
- [`6da9653`](https://github.com/tobymao/sqlglot/commit/6da9653d5f25f9d44ad002b9d072b0d8fd39bcc1) - **optimizer**: support bigquery type inference for unnest + array + struct *(PR [#7525](https://github.com/tobymao/sqlglot/pull/7525) by [@geooo109](https://github.com/geooo109))*
|
|
70
|
+
|
|
71
|
+
### :white_check_mark: Tests
|
|
72
|
+
- [`ad2c98d`](https://github.com/tobymao/sqlglot/commit/ad2c98d771a9818a521e15e26dbea3833ed0295a) - **databricks**: add explicit tests for SET VAR / SET VARIABLE [CLAUDE] *(PR [#7490](https://github.com/tobymao/sqlglot/pull/7490) by [@baruchoxman](https://github.com/baruchoxman))*
|
|
73
|
+
- :arrow_lower_right: *addresses issue [#7358](https://github.com/tobymao/sqlglot/issues/7358) opened by [@baruchoxman](https://github.com/baruchoxman)*
|
|
74
|
+
|
|
75
|
+
### :wrench: Chores
|
|
76
|
+
- [`224e64d`](https://github.com/tobymao/sqlglot/commit/224e64dad3b0dcfc753b9bca78cff326080edbd0) - style for dbx tests *(commit by [@geooo109](https://github.com/geooo109))*
|
|
77
|
+
- [`c1f929f`](https://github.com/tobymao/sqlglot/commit/c1f929fa6cf775bf778a0b832f6df8860bfe62b7) - Fix PR 7510 *(PR [#7513](https://github.com/tobymao/sqlglot/pull/7513) by [@VaggelisD](https://github.com/VaggelisD))*
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
## [v30.4.3] - 2026-04-13
|
|
81
|
+
### :bug: Bug Fixes
|
|
82
|
+
- [`713e95f`](https://github.com/tobymao/sqlglot/commit/713e95fb9bca5fa6ac0aa660f599a4be632872e2) - **snowflake**: parse GET_DDL #unknown_policy in ROW ACCESS POLICY [CLAUDE] *(PR [#7491](https://github.com/tobymao/sqlglot/pull/7491) by [@eakmanrq](https://github.com/eakmanrq))*
|
|
83
|
+
|
|
84
|
+
|
|
4
85
|
## [v30.4.2] - 2026-04-08
|
|
5
86
|
### :bug: Bug Fixes
|
|
6
87
|
- [`d04595e`](https://github.com/tobymao/sqlglot/commit/d04595e1ba91a778e4b76f3f84dcb41649594e32) - incomplete `ColumnMapping` type hint *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
@@ -14143,3 +14224,5 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
|
|
|
14143
14224
|
[v30.3.0]: https://github.com/tobymao/sqlglot/compare/v30.2.1...v30.3.0
|
|
14144
14225
|
[v30.4.0]: https://github.com/tobymao/sqlglot/compare/v30.3.0...v30.4.0
|
|
14145
14226
|
[v30.4.2]: https://github.com/tobymao/sqlglot/compare/v30.4.1...v30.4.2
|
|
14227
|
+
[v30.4.3]: https://github.com/tobymao/sqlglot/compare/v30.4.2...v30.4.3
|
|
14228
|
+
[v30.5.0]: https://github.com/tobymao/sqlglot/compare/v30.4.3...v30.5.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlglot
|
|
3
|
-
Version: 30.
|
|
3
|
+
Version: 30.6.0
|
|
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.6.0; 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.6.0; 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.6.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (30, 6, 0)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'gdcf9ed583'
|
|
@@ -183,6 +183,7 @@ class BigQuery(Dialect):
|
|
|
183
183
|
"EXCEPTION": TokenType.COMMAND,
|
|
184
184
|
"EXPORT": TokenType.EXPORT,
|
|
185
185
|
"FLOAT64": TokenType.DOUBLE,
|
|
186
|
+
"FOR SYSTEM TIME": TokenType.TIMESTAMP_SNAPSHOT,
|
|
186
187
|
"FOR SYSTEM_TIME": TokenType.TIMESTAMP_SNAPSHOT,
|
|
187
188
|
"LOOP": TokenType.COMMAND,
|
|
188
189
|
"MODEL": TokenType.MODEL,
|
|
@@ -1598,6 +1598,7 @@ def build_date_delta(
|
|
|
1598
1598
|
|
|
1599
1599
|
def build_date_delta_with_interval(
|
|
1600
1600
|
expression_class: Type[E],
|
|
1601
|
+
default_unit: str | None = None,
|
|
1601
1602
|
) -> t.Callable[[BuilderArgs], E | None]:
|
|
1602
1603
|
def _builder(args: BuilderArgs) -> E | None:
|
|
1603
1604
|
if len(args) < 2:
|
|
@@ -1606,7 +1607,13 @@ def build_date_delta_with_interval(
|
|
|
1606
1607
|
interval = args[1]
|
|
1607
1608
|
|
|
1608
1609
|
if not isinstance(interval, exp.Interval):
|
|
1609
|
-
|
|
1610
|
+
if default_unit is None:
|
|
1611
|
+
raise ParseError(f"INTERVAL expression expected but got '{interval}'")
|
|
1612
|
+
return expression_class(
|
|
1613
|
+
this=args[0],
|
|
1614
|
+
expression=interval,
|
|
1615
|
+
unit=exp.Literal.string(default_unit),
|
|
1616
|
+
)
|
|
1610
1617
|
|
|
1611
1618
|
return expression_class(this=args[0], expression=interval.this, unit=unit_to_str(interval))
|
|
1612
1619
|
|
|
@@ -2,13 +2,13 @@ import collections
|
|
|
2
2
|
import itertools
|
|
3
3
|
import math
|
|
4
4
|
|
|
5
|
-
from sqlglot import exp,
|
|
6
|
-
from sqlglot.dialects.dialect import Dialect
|
|
5
|
+
from sqlglot import exp, planner, tokens
|
|
6
|
+
from sqlglot.dialects.dialect import Dialect
|
|
7
7
|
from sqlglot.errors import ExecuteError
|
|
8
8
|
from sqlglot.executor.context import Context
|
|
9
9
|
from sqlglot.executor.env import ENV
|
|
10
10
|
from sqlglot.executor.table import RowReader, Table
|
|
11
|
-
from sqlglot.
|
|
11
|
+
from sqlglot.generators.python import PythonGenerator
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class PythonExecutor:
|
|
@@ -324,112 +324,8 @@ class PythonExecutor:
|
|
|
324
324
|
return self.context({step.name: sink})
|
|
325
325
|
|
|
326
326
|
|
|
327
|
-
def _ordered_py(self, expression):
|
|
328
|
-
this = self.sql(expression, "this")
|
|
329
|
-
desc = "True" if expression.args.get("desc") else "False"
|
|
330
|
-
nulls_first = "True" if expression.args.get("nulls_first") else "False"
|
|
331
|
-
return f"ORDERED({this}, {desc}, {nulls_first})"
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
def _rename(self, e):
|
|
335
|
-
try:
|
|
336
|
-
values = list(e.args.values())
|
|
337
|
-
|
|
338
|
-
if len(values) == 1:
|
|
339
|
-
values = values[0]
|
|
340
|
-
if not isinstance(values, list):
|
|
341
|
-
return self.func(e.key, values)
|
|
342
|
-
return self.func(e.key, *values)
|
|
343
|
-
|
|
344
|
-
if isinstance(e, exp.Func) and e.is_var_len_args:
|
|
345
|
-
args = itertools.chain.from_iterable(x if isinstance(x, list) else [x] for x in values)
|
|
346
|
-
return self.func(e.key, *args)
|
|
347
|
-
|
|
348
|
-
return self.func(e.key, *values)
|
|
349
|
-
except Exception as ex:
|
|
350
|
-
raise Exception(f"Could not rename {repr(e)}") from ex
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
def _case_sql(self, expression):
|
|
354
|
-
this = self.sql(expression, "this")
|
|
355
|
-
chain = self.sql(expression, "default") or "None"
|
|
356
|
-
|
|
357
|
-
for e in reversed(expression.args["ifs"]):
|
|
358
|
-
true = self.sql(e, "true")
|
|
359
|
-
condition = self.sql(e, "this")
|
|
360
|
-
condition = f"{this} = ({condition})" if this else condition
|
|
361
|
-
chain = f"{true} if {condition} else ({chain})"
|
|
362
|
-
|
|
363
|
-
return chain
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
def _lambda_sql(self, e: exp.Lambda) -> str:
|
|
367
|
-
names = {e.name.lower() for e in e.expressions}
|
|
368
|
-
|
|
369
|
-
e = e.transform(
|
|
370
|
-
lambda n: (
|
|
371
|
-
exp.var(n.name) if isinstance(n, exp.Identifier) and n.name.lower() in names else n
|
|
372
|
-
)
|
|
373
|
-
).assert_is(exp.Lambda)
|
|
374
|
-
|
|
375
|
-
return f"lambda {self.expressions(e, flat=True)}: {self.sql(e, 'this')}"
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
def _div_sql(self: generator.Generator, e: exp.Div) -> str:
|
|
379
|
-
denominator = self.sql(e, "expression")
|
|
380
|
-
|
|
381
|
-
if e.args.get("safe"):
|
|
382
|
-
denominator += " or None"
|
|
383
|
-
|
|
384
|
-
sql = f"DIV({self.sql(e, 'this')}, {denominator})"
|
|
385
|
-
|
|
386
|
-
if e.args.get("typed"):
|
|
387
|
-
sql = f"int({sql})"
|
|
388
|
-
|
|
389
|
-
return sql
|
|
390
|
-
|
|
391
|
-
|
|
392
327
|
class Python(Dialect):
|
|
393
328
|
class Tokenizer(tokens.Tokenizer):
|
|
394
329
|
STRING_ESCAPES = ["\\"]
|
|
395
330
|
|
|
396
|
-
|
|
397
|
-
TRANSFORMS = {
|
|
398
|
-
**{klass: _rename for klass in subclasses(exp.__name__, exp.Binary)},
|
|
399
|
-
**{klass: _rename for klass in exp.ALL_FUNCTIONS},
|
|
400
|
-
exp.Case: _case_sql,
|
|
401
|
-
exp.Alias: lambda self, e: self.sql(e.this),
|
|
402
|
-
exp.Array: inline_array_sql,
|
|
403
|
-
exp.And: lambda self, e: self.binary(e, "and"),
|
|
404
|
-
exp.Between: _rename,
|
|
405
|
-
exp.Boolean: lambda self, e: "True" if e.this else "False",
|
|
406
|
-
exp.Cast: lambda self, e: f"CAST({self.sql(e.this)}, exp.DType.{e.args['to']})",
|
|
407
|
-
exp.Column: lambda self, e: (
|
|
408
|
-
f"scope[{self.sql(e, 'table') or None}][{self.sql(e.this)}]"
|
|
409
|
-
),
|
|
410
|
-
exp.Concat: lambda self, e: self.func(
|
|
411
|
-
"SAFECONCAT" if e.args.get("safe") else "CONCAT", *e.expressions
|
|
412
|
-
),
|
|
413
|
-
exp.Distinct: lambda self, e: f"set({self.sql(e, 'this')})",
|
|
414
|
-
exp.Div: _div_sql,
|
|
415
|
-
exp.Extract: lambda self, e: (
|
|
416
|
-
f"EXTRACT('{e.name.lower()}', {self.sql(e, 'expression')})"
|
|
417
|
-
),
|
|
418
|
-
exp.In: lambda self, e: (
|
|
419
|
-
f"{self.sql(e, 'this')} in {{{self.expressions(e, flat=True)}}}"
|
|
420
|
-
),
|
|
421
|
-
exp.Interval: lambda self, e: f"INTERVAL({self.sql(e.this)}, '{self.sql(e.unit)}')",
|
|
422
|
-
exp.Is: lambda self, e: (
|
|
423
|
-
self.binary(e, "==") if isinstance(e.this, exp.Literal) else self.binary(e, "is")
|
|
424
|
-
),
|
|
425
|
-
exp.JSONExtract: lambda self, e: self.func(e.key, e.this, e.expression, *e.expressions),
|
|
426
|
-
exp.JSONPath: lambda self, e: f"[{','.join(self.sql(p) for p in e.expressions[1:])}]",
|
|
427
|
-
exp.JSONPathKey: lambda self, e: f"'{self.sql(e.this)}'",
|
|
428
|
-
exp.JSONPathSubscript: lambda self, e: f"'{e.this}'",
|
|
429
|
-
exp.Lambda: _lambda_sql,
|
|
430
|
-
exp.Not: lambda self, e: f"not {self.sql(e.this)}",
|
|
431
|
-
exp.Null: lambda *_: "None",
|
|
432
|
-
exp.Or: lambda self, e: self.binary(e, "or"),
|
|
433
|
-
exp.Ordered: _ordered_py,
|
|
434
|
-
exp.Star: lambda *_: "1",
|
|
435
|
-
}
|
|
331
|
+
Generator = PythonGenerator
|
|
@@ -79,6 +79,7 @@ class Delete(Expression, DML):
|
|
|
79
79
|
"limit": False,
|
|
80
80
|
"tables": False, # Multiple-Table Syntax (MySQL)
|
|
81
81
|
"cluster": False, # Clickhouse
|
|
82
|
+
"hint": False,
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
def delete(
|
|
@@ -282,7 +283,8 @@ class LoadData(Expression):
|
|
|
282
283
|
"this": True,
|
|
283
284
|
"local": False,
|
|
284
285
|
"overwrite": False,
|
|
285
|
-
"inpath":
|
|
286
|
+
"inpath": False,
|
|
287
|
+
"files": False,
|
|
286
288
|
"partition": False,
|
|
287
289
|
"input_format": False,
|
|
288
290
|
"serde": False,
|
|
@@ -300,6 +302,7 @@ class Update(Expression, DML):
|
|
|
300
302
|
"order": False,
|
|
301
303
|
"limit": False,
|
|
302
304
|
"options": False,
|
|
305
|
+
"hint": False,
|
|
303
306
|
}
|
|
304
307
|
|
|
305
308
|
def table(
|
|
@@ -321,6 +321,24 @@ class AIClassify(Expression, Func):
|
|
|
321
321
|
_sql_names = ["AI_CLASSIFY"]
|
|
322
322
|
|
|
323
323
|
|
|
324
|
+
class AIEmbed(Expression, Func):
|
|
325
|
+
arg_types = {"expressions": True}
|
|
326
|
+
is_var_len_args = True
|
|
327
|
+
_sql_names = ["AI_EMBED"]
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
class AISimilarity(Expression, Func):
|
|
331
|
+
arg_types = {"expressions": True}
|
|
332
|
+
is_var_len_args = True
|
|
333
|
+
_sql_names = ["AI_SIMILARITY"]
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
class AIGenerate(Expression, Func):
|
|
337
|
+
arg_types = {"expressions": True}
|
|
338
|
+
is_var_len_args = True
|
|
339
|
+
_sql_names = ["AI_GENERATE"]
|
|
340
|
+
|
|
341
|
+
|
|
324
342
|
class FeaturesAtTime(Expression, Func):
|
|
325
343
|
arg_types = {"this": True, "time": False, "num_rows": False, "ignore_feature_nulls": False}
|
|
326
344
|
|
|
@@ -108,7 +108,12 @@ class EuclideanDistance(Expression, Func):
|
|
|
108
108
|
|
|
109
109
|
|
|
110
110
|
class JarowinklerSimilarity(Expression, Func):
|
|
111
|
-
arg_types = {
|
|
111
|
+
arg_types = {
|
|
112
|
+
"this": True,
|
|
113
|
+
"expression": True,
|
|
114
|
+
"case_insensitive": False,
|
|
115
|
+
"integer_scale": False,
|
|
116
|
+
}
|
|
112
117
|
|
|
113
118
|
|
|
114
119
|
class ManhattanDistance(Expression, Func):
|
|
@@ -220,7 +220,7 @@ class Stuff(Expression, Func):
|
|
|
220
220
|
|
|
221
221
|
class Substring(Expression, Func):
|
|
222
222
|
_sql_names = ["SUBSTRING", "SUBSTR"]
|
|
223
|
-
arg_types = {"this": True, "start": False, "length": False}
|
|
223
|
+
arg_types = {"this": True, "start": False, "length": False, "zero_start": False}
|
|
224
224
|
|
|
225
225
|
|
|
226
226
|
class SubstringIndex(Expression, Func):
|
|
@@ -234,6 +234,7 @@ class Generator:
|
|
|
234
234
|
exp.ProjectionPolicyColumnConstraint: lambda self, e: (
|
|
235
235
|
f"PROJECTION POLICY {self.sql(e, 'this')}"
|
|
236
236
|
),
|
|
237
|
+
exp.InvisibleColumnConstraint: lambda self, e: "INVISIBLE",
|
|
237
238
|
exp.ZeroFillColumnConstraint: lambda self, e: "ZEROFILL",
|
|
238
239
|
exp.Put: lambda self, e: self.get_put_sql(e),
|
|
239
240
|
exp.RemoteWithConnectionModelProperty: lambda self, e: (
|
|
@@ -320,6 +321,9 @@ class Generator:
|
|
|
320
321
|
# Whether MERGE ... WHEN MATCHED BY SOURCE is allowed
|
|
321
322
|
MATCHED_BY_SOURCE = True
|
|
322
323
|
|
|
324
|
+
# Whether MERGE ... WHEN MATCHED/NOT MATCHED THEN UPDATE/INSERT ... WHERE is supported
|
|
325
|
+
SUPPORTS_MERGE_WHERE = False
|
|
326
|
+
|
|
323
327
|
# Whether the INTERVAL expression works only with values like '1 day'
|
|
324
328
|
SINGLE_STRING_INTERVAL = False
|
|
325
329
|
|
|
@@ -1681,6 +1685,7 @@ class Generator:
|
|
|
1681
1685
|
return f"{local}DIRECTORY {self.sql(expression, 'this')}{row_format}"
|
|
1682
1686
|
|
|
1683
1687
|
def delete_sql(self, expression: exp.Delete) -> str:
|
|
1688
|
+
hint = self.sql(expression, "hint")
|
|
1684
1689
|
this = self.sql(expression, "this")
|
|
1685
1690
|
this = f" FROM {this}" if this else ""
|
|
1686
1691
|
using = self.expressions(expression, key="using")
|
|
@@ -1697,7 +1702,7 @@ class Generator:
|
|
|
1697
1702
|
expression_sql = f"{this}{using}{cluster}{where}{returning}{order}{limit}"
|
|
1698
1703
|
else:
|
|
1699
1704
|
expression_sql = f"{returning}{this}{using}{cluster}{where}{order}{limit}"
|
|
1700
|
-
return self.prepend_ctes(expression, f"DELETE{tables}{expression_sql}")
|
|
1705
|
+
return self.prepend_ctes(expression, f"DELETE{hint}{tables}{expression_sql}")
|
|
1701
1706
|
|
|
1702
1707
|
def drop_sql(self, expression: exp.Drop) -> str:
|
|
1703
1708
|
this = self.sql(expression, "this")
|
|
@@ -2463,6 +2468,7 @@ class Generator:
|
|
|
2463
2468
|
return (join_sql, "")
|
|
2464
2469
|
|
|
2465
2470
|
def update_sql(self, expression: exp.Update) -> str:
|
|
2471
|
+
hint = self.sql(expression, "hint")
|
|
2466
2472
|
this = self.sql(expression, "this")
|
|
2467
2473
|
join_sql, from_sql = self._update_from_joins_sql(expression)
|
|
2468
2474
|
set_sql = self.expressions(expression, flat=True)
|
|
@@ -2476,7 +2482,7 @@ class Generator:
|
|
|
2476
2482
|
expression_sql = f"{returning}{from_sql}{where_sql}"
|
|
2477
2483
|
options = self.expressions(expression, key="options")
|
|
2478
2484
|
options = f" OPTION({options})" if options else ""
|
|
2479
|
-
sql = f"UPDATE {this}{join_sql} SET {set_sql}{expression_sql}{order}{limit}{options}"
|
|
2485
|
+
sql = f"UPDATE{hint} {this}{join_sql} SET {set_sql}{expression_sql}{order}{limit}{options}"
|
|
2480
2486
|
return self.prepend_ctes(expression, sql)
|
|
2481
2487
|
|
|
2482
2488
|
def values_sql(self, expression: exp.Values, values_as_table: bool = True) -> str:
|
|
@@ -2811,10 +2817,20 @@ class Generator:
|
|
|
2811
2817
|
return self._replace_line_breaks(text).replace(delimiter, escaped_delimiter)
|
|
2812
2818
|
|
|
2813
2819
|
def loaddata_sql(self, expression: exp.LoadData) -> str:
|
|
2820
|
+
is_overwrite = expression.args.get("overwrite")
|
|
2821
|
+
overwrite = " OVERWRITE" if is_overwrite else ""
|
|
2822
|
+
this = self.sql(expression, "this")
|
|
2823
|
+
|
|
2824
|
+
files = expression.args.get("files")
|
|
2825
|
+
if files:
|
|
2826
|
+
files_sql = self.expressions(files, flat=True)
|
|
2827
|
+
files_sql = f"FILES{self.wrap(files_sql)}"
|
|
2828
|
+
this = f" {this}" if is_overwrite else f" INTO TABLE {this}"
|
|
2829
|
+
return f"LOAD DATA{overwrite}{this} FROM {files_sql}"
|
|
2830
|
+
|
|
2814
2831
|
local = " LOCAL" if expression.args.get("local") else ""
|
|
2815
2832
|
inpath = f" INPATH {self.sql(expression, 'inpath')}"
|
|
2816
|
-
|
|
2817
|
-
this = f" INTO TABLE {self.sql(expression, 'this')}"
|
|
2833
|
+
this = f" INTO TABLE {this}"
|
|
2818
2834
|
partition = self.sql(expression, "partition")
|
|
2819
2835
|
partition = f" {partition}" if partition else ""
|
|
2820
2836
|
input_format = self.sql(expression, "input_format")
|
|
@@ -4448,9 +4464,16 @@ class Generator:
|
|
|
4448
4464
|
else:
|
|
4449
4465
|
expressions_sql = self.expressions(then_expression)
|
|
4450
4466
|
then = f"UPDATE SET{self.sep()}{expressions_sql}" if expressions_sql else "UPDATE"
|
|
4451
|
-
|
|
4452
4467
|
else:
|
|
4453
4468
|
then = self.sql(then_expression)
|
|
4469
|
+
|
|
4470
|
+
if isinstance(then_expression, (exp.Insert, exp.Update)):
|
|
4471
|
+
where = self.sql(then_expression, "where")
|
|
4472
|
+
if where and not self.SUPPORTS_MERGE_WHERE:
|
|
4473
|
+
kind = "INSERT" if isinstance(then_expression, exp.Insert) else "UPDATE"
|
|
4474
|
+
self.unsupported(f"WHERE clause in MERGE {kind} is not supported")
|
|
4475
|
+
where = ""
|
|
4476
|
+
then = f"{then}{where}"
|
|
4454
4477
|
return f"WHEN {matched}{source}{condition} THEN {then}"
|
|
4455
4478
|
|
|
4456
4479
|
def whens_sql(self, expression: exp.Whens) -> str:
|
|
@@ -5899,3 +5922,8 @@ class Generator:
|
|
|
5899
5922
|
def usingproperty_sql(self, expression: exp.UsingProperty) -> str:
|
|
5900
5923
|
kind = expression.args.get("kind")
|
|
5901
5924
|
return f"USING {kind} {self.sql(expression, 'this')}"
|
|
5925
|
+
|
|
5926
|
+
def renameindex_sql(self, expression: exp.RenameIndex) -> str:
|
|
5927
|
+
this = self.sql(expression, "this")
|
|
5928
|
+
to = self.sql(expression, "to")
|
|
5929
|
+
return f"RENAME INDEX {this} TO {to}"
|
|
@@ -272,6 +272,9 @@ class BigQueryGenerator(generator.Generator):
|
|
|
272
272
|
|
|
273
273
|
TRANSFORMS = {
|
|
274
274
|
**generator.Generator.TRANSFORMS,
|
|
275
|
+
exp.AIEmbed: rename_func("EMBED"),
|
|
276
|
+
exp.AIGenerate: rename_func("GENERATE"),
|
|
277
|
+
exp.AISimilarity: rename_func("SIMILARITY"),
|
|
275
278
|
exp.ApproxTopK: rename_func("APPROX_TOP_COUNT"),
|
|
276
279
|
exp.ApproxDistinct: rename_func("APPROX_COUNT_DISTINCT"),
|
|
277
280
|
exp.ArgMax: arg_max_or_min_no_count("MAX_BY"),
|
|
@@ -416,6 +416,32 @@ class ClickHouseGenerator(generator.Generator):
|
|
|
416
416
|
exp.DType.MULTIPOLYGON,
|
|
417
417
|
}
|
|
418
418
|
|
|
419
|
+
def groupconcat_sql(self, expression: exp.GroupConcat) -> str:
|
|
420
|
+
this = expression.this
|
|
421
|
+
separator = expression.args.get("separator")
|
|
422
|
+
|
|
423
|
+
if isinstance(this, exp.Limit) and this.this:
|
|
424
|
+
limit = this
|
|
425
|
+
this = limit.this.pop()
|
|
426
|
+
return self.sql(
|
|
427
|
+
exp.ParameterizedAgg(
|
|
428
|
+
this="groupConcat",
|
|
429
|
+
params=[this],
|
|
430
|
+
expressions=[separator, limit.expression],
|
|
431
|
+
)
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
if separator:
|
|
435
|
+
return self.sql(
|
|
436
|
+
exp.ParameterizedAgg(
|
|
437
|
+
this="groupConcat",
|
|
438
|
+
params=[this],
|
|
439
|
+
expressions=[separator],
|
|
440
|
+
)
|
|
441
|
+
)
|
|
442
|
+
|
|
443
|
+
return self.func("groupConcat", this)
|
|
444
|
+
|
|
419
445
|
def offset_sql(self, expression: exp.Offset) -> str:
|
|
420
446
|
offset = super().offset_sql(expression)
|
|
421
447
|
|