sqlglot 30.5.0__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.5.0 → sqlglot-30.6.0}/CHANGELOG.md +77 -0
- {sqlglot-30.5.0/sqlglot.egg-info → sqlglot-30.6.0}/PKG-INFO +3 -3
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/_version.py +3 -3
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/executor/python.py +4 -108
- sqlglot-30.6.0/sqlglot/generators/python.py +108 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parser.py +1 -1
- {sqlglot-30.5.0 → sqlglot-30.6.0/sqlglot.egg-info}/PKG-INFO +3 -3
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot.egg-info/SOURCES.txt +1 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot.egg-info/requires.txt +2 -2
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_postgres.py +2 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_executor.py +0 -4
- {sqlglot-30.5.0 → sqlglot-30.6.0}/.gitignore +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/.gitmodules +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/.gitpod.yml +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/.pre-commit-config.yaml +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/AGENTS.md +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/CLAUDE.md +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/CONTRIBUTING.md +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/LICENSE +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/MANIFEST.in +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/Makefile +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/README.md +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/pyproject.toml +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/setup.cfg +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/setup.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/__init__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/__main__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/_typing.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/__init__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/athena.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/bigquery.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/clickhouse.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/databricks.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/dialect.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/doris.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/dremio.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/drill.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/druid.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/duckdb.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/dune.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/exasol.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/fabric.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/hive.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/materialize.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/mysql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/oracle.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/postgres.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/presto.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/prql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/redshift.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/risingwave.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/singlestore.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/snowflake.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/solr.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/spark.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/spark2.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/sqlite.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/starrocks.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/tableau.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/teradata.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/trino.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/dialects/tsql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/diff.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/errors.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/executor/__init__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/executor/context.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/executor/env.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/executor/table.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/__init__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/aggregate.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/array.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/builders.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/constraints.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/core.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/datatypes.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/ddl.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/dml.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/functions.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/json.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/math.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/properties.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/query.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/string.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/expressions/temporal.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generator.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/__init__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/athena.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/bigquery.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/clickhouse.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/databricks.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/doris.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/dremio.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/drill.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/druid.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/duckdb.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/dune.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/exasol.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/fabric.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/hive.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/materialize.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/mysql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/oracle.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/postgres.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/presto.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/prql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/redshift.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/risingwave.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/singlestore.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/snowflake.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/solr.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/spark.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/spark2.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/sqlite.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/starrocks.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/tableau.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/teradata.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/trino.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/generators/tsql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/helper.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/jsonpath.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/lineage.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/__init__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/annotate_types.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/canonicalize.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/normalize.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/optimize_joins.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/optimizer.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/qualify.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/qualify_columns.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/qualify_tables.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/resolver.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/scope.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/simplify.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/__init__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/athena.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/base.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/bigquery.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/clickhouse.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/databricks.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/doris.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/dremio.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/drill.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/druid.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/duckdb.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/dune.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/exasol.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/fabric.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/hive.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/materialize.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/mysql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/oracle.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/postgres.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/presto.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/prql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/redshift.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/risingwave.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/singlestore.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/snowflake.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/solr.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/spark.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/spark2.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/sqlite.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/starrocks.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/tableau.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/teradata.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/trino.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/parsers/tsql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/planner.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/py.typed +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/schema.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/serde.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/time.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/tokenizer_core.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/tokens.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/transforms.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/trie.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/__init__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/bigquery.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/clickhouse.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/duckdb.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/hive.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/mysql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/presto.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/redshift.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/snowflake.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/spark.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/spark2.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot/typing/tsql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot.egg-info/dependency_links.txt +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot.egg-info/top_level.txt +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglot.png +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglotc/MANIFEST.in +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglotc/pyproject.toml +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/sqlglotc/setup.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/__init__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/__init__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_athena.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_bigquery.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_clickhouse.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_databricks.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_dialect.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_doris.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_dremio.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_drill.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_druid.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_duckdb.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_dune.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_exasol.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_fabric.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_hive.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_materialize.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_mysql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_oracle.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_pipe_syntax.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_presto.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_prql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_redshift.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_risingwave.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_singlestore.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_snowflake.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_solr.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_spark.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_sqlite.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_starrocks.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_tableau.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_teradata.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_trino.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/dialects/test_tsql.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/identity.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/jsonpath/LICENSE +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/jsonpath/cts.json +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/annotate_functions.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/normalize.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/simplify.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/partial.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/fixtures/pretty.sql +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/gen_fixtures.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/helpers.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/sqlglot/__init__.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_build.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_dialect_entry_points.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_dialect_imports.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_diff.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_docs.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_errors.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_expressions.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_generator.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_helper.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_integration_loader.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_jsonpath.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_lineage.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_optimizer.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_parser.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_schema.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_serde.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_time.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_tokens.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_transforms.py +0 -0
- {sqlglot-30.5.0 → sqlglot-30.6.0}/tests/test_transpile.py +0 -0
|
@@ -1,6 +1,82 @@
|
|
|
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
|
+
|
|
4
80
|
## [v30.4.3] - 2026-04-13
|
|
5
81
|
### :bug: Bug Fixes
|
|
6
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))*
|
|
@@ -14149,3 +14225,4 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
|
|
|
14149
14225
|
[v30.4.0]: https://github.com/tobymao/sqlglot/compare/v30.3.0...v30.4.0
|
|
14150
14226
|
[v30.4.2]: https://github.com/tobymao/sqlglot/compare/v30.4.1...v30.4.2
|
|
14151
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'
|
|
@@ -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
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import itertools
|
|
4
|
+
|
|
5
|
+
from sqlglot import exp, generator
|
|
6
|
+
from sqlglot.dialects.dialect import inline_array_sql
|
|
7
|
+
from sqlglot.helper import subclasses
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _ordered_py(self, expression):
|
|
11
|
+
this = self.sql(expression, "this")
|
|
12
|
+
desc = "True" if expression.args.get("desc") else "False"
|
|
13
|
+
nulls_first = "True" if expression.args.get("nulls_first") else "False"
|
|
14
|
+
return f"ORDERED({this}, {desc}, {nulls_first})"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _rename(self, e):
|
|
18
|
+
try:
|
|
19
|
+
values = list(e.args.values())
|
|
20
|
+
|
|
21
|
+
if len(values) == 1:
|
|
22
|
+
values = values[0]
|
|
23
|
+
if not isinstance(values, list):
|
|
24
|
+
return self.func(e.key, values)
|
|
25
|
+
return self.func(e.key, *values)
|
|
26
|
+
|
|
27
|
+
if isinstance(e, exp.Func) and e.is_var_len_args:
|
|
28
|
+
args = itertools.chain.from_iterable(x if isinstance(x, list) else [x] for x in values)
|
|
29
|
+
return self.func(e.key, *args)
|
|
30
|
+
|
|
31
|
+
return self.func(e.key, *values)
|
|
32
|
+
except Exception as ex:
|
|
33
|
+
raise Exception(f"Could not rename {repr(e)}") from ex
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _case_sql(self, expression):
|
|
37
|
+
this = self.sql(expression, "this")
|
|
38
|
+
chain = self.sql(expression, "default") or "None"
|
|
39
|
+
|
|
40
|
+
for e in reversed(expression.args["ifs"]):
|
|
41
|
+
true = self.sql(e, "true")
|
|
42
|
+
condition = self.sql(e, "this")
|
|
43
|
+
condition = f"{this} = ({condition})" if this else condition
|
|
44
|
+
chain = f"{true} if {condition} else ({chain})"
|
|
45
|
+
|
|
46
|
+
return chain
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _lambda_sql(self, e: exp.Lambda) -> str:
|
|
50
|
+
names = {e.name.lower() for e in e.expressions}
|
|
51
|
+
|
|
52
|
+
e = e.transform(
|
|
53
|
+
lambda n: (
|
|
54
|
+
exp.var(n.name) if isinstance(n, exp.Identifier) and n.name.lower() in names else n
|
|
55
|
+
)
|
|
56
|
+
).assert_is(exp.Lambda)
|
|
57
|
+
|
|
58
|
+
return f"lambda {self.expressions(e, flat=True)}: {self.sql(e, 'this')}"
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _div_sql(self: generator.Generator, e: exp.Div) -> str:
|
|
62
|
+
denominator = self.sql(e, "expression")
|
|
63
|
+
|
|
64
|
+
if e.args.get("safe"):
|
|
65
|
+
denominator += " or None"
|
|
66
|
+
|
|
67
|
+
sql = f"DIV({self.sql(e, 'this')}, {denominator})"
|
|
68
|
+
|
|
69
|
+
if e.args.get("typed"):
|
|
70
|
+
sql = f"int({sql})"
|
|
71
|
+
|
|
72
|
+
return sql
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class PythonGenerator(generator.Generator):
|
|
76
|
+
TRANSFORMS = {
|
|
77
|
+
**{klass: _rename for klass in subclasses(exp.__name__, exp.Binary)},
|
|
78
|
+
**{klass: _rename for klass in exp.ALL_FUNCTIONS},
|
|
79
|
+
exp.Case: _case_sql,
|
|
80
|
+
exp.Alias: lambda self, e: self.sql(e.this),
|
|
81
|
+
exp.Array: inline_array_sql,
|
|
82
|
+
exp.And: lambda self, e: self.binary(e, "and"),
|
|
83
|
+
exp.Between: _rename,
|
|
84
|
+
exp.Boolean: lambda self, e: "True" if e.this else "False",
|
|
85
|
+
exp.Cast: lambda self, e: f"CAST({self.sql(e.this)}, exp.DType.{e.args['to']})",
|
|
86
|
+
exp.Column: lambda self, e: f"scope[{self.sql(e, 'table') or None}][{self.sql(e.this)}]",
|
|
87
|
+
exp.Concat: lambda self, e: self.func(
|
|
88
|
+
"SAFECONCAT" if e.args.get("safe") else "CONCAT", *e.expressions
|
|
89
|
+
),
|
|
90
|
+
exp.Distinct: lambda self, e: f"set({self.sql(e, 'this')})",
|
|
91
|
+
exp.Div: _div_sql,
|
|
92
|
+
exp.Extract: lambda self, e: f"EXTRACT('{e.name.lower()}', {self.sql(e, 'expression')})",
|
|
93
|
+
exp.In: lambda self, e: f"{self.sql(e, 'this')} in {{{self.expressions(e, flat=True)}}}",
|
|
94
|
+
exp.Interval: lambda self, e: f"INTERVAL({self.sql(e.this)}, '{self.sql(e.unit)}')",
|
|
95
|
+
exp.Is: lambda self, e: (
|
|
96
|
+
self.binary(e, "==") if isinstance(e.this, exp.Literal) else self.binary(e, "is")
|
|
97
|
+
),
|
|
98
|
+
exp.JSONExtract: lambda self, e: self.func(e.key, e.this, e.expression, *e.expressions),
|
|
99
|
+
exp.JSONPath: lambda self, e: f"[{','.join(self.sql(p) for p in e.expressions[1:])}]",
|
|
100
|
+
exp.JSONPathKey: lambda self, e: f"'{self.sql(e.this)}'",
|
|
101
|
+
exp.JSONPathSubscript: lambda self, e: f"'{e.this}'",
|
|
102
|
+
exp.Lambda: _lambda_sql,
|
|
103
|
+
exp.Not: lambda self, e: f"not {self.sql(e.this)}",
|
|
104
|
+
exp.Null: lambda *_: "None",
|
|
105
|
+
exp.Or: lambda self, e: self.binary(e, "or"),
|
|
106
|
+
exp.Ordered: _ordered_py,
|
|
107
|
+
exp.Star: lambda *_: "1",
|
|
108
|
+
}
|
|
@@ -2688,7 +2688,7 @@ class Parser:
|
|
|
2688
2688
|
if not self._match_set((TokenType.FUNCTION, TokenType.PROCEDURE)):
|
|
2689
2689
|
self.raise_error("Expected FUNCTION or PROCEDURE after EXECUTE")
|
|
2690
2690
|
|
|
2691
|
-
func_call = self.
|
|
2691
|
+
func_call = self._parse_column()
|
|
2692
2692
|
return self.expression(exp.TriggerExecute(this=func_call))
|
|
2693
2693
|
|
|
2694
2694
|
def _parse_property_before(self) -> exp.Expr | list[exp.Expr] | None:
|
|
@@ -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
|
|
|
@@ -114,6 +114,7 @@ sqlglot/generators/oracle.py
|
|
|
114
114
|
sqlglot/generators/postgres.py
|
|
115
115
|
sqlglot/generators/presto.py
|
|
116
116
|
sqlglot/generators/prql.py
|
|
117
|
+
sqlglot/generators/python.py
|
|
117
118
|
sqlglot/generators/redshift.py
|
|
118
119
|
sqlglot/generators/risingwave.py
|
|
119
120
|
sqlglot/generators/singlestore.py
|
|
@@ -1815,6 +1815,8 @@ CROSS JOIN JSON_ARRAY_ELEMENTS(CAST(JSON_EXTRACT_PATH(tbox, 'boxes') AS JSON)) A
|
|
|
1815
1815
|
"CREATE OR REPLACE TRIGGER replace_trigger BEFORE INSERT ON users FOR EACH ROW EXECUTE FUNCTION LOG_INSERT()",
|
|
1816
1816
|
"CREATE TRIGGER param_trigger BEFORE INSERT ON users FOR EACH ROW EXECUTE FUNCTION LOG_WITH_PARAMS('insert', 'users')",
|
|
1817
1817
|
"CREATE TRIGGER my_trigger BEFORE INSERT ON myschema.users FOR EACH ROW EXECUTE FUNCTION LOG_CHANGES()",
|
|
1818
|
+
"CREATE TRIGGER trg_foo BEFORE UPDATE ON bar.bat FOR EACH ROW EXECUTE FUNCTION baz.asdf()",
|
|
1819
|
+
"CREATE TRIGGER trg_foo BEFORE UPDATE ON bar.bat FOR EACH ROW EXECUTE FUNCTION c.s.asdf('x', 1)",
|
|
1818
1820
|
"CREATE TRIGGER truncate_trigger BEFORE TRUNCATE ON users FOR EACH STATEMENT EXECUTE FUNCTION LOG_TRUNCATE()",
|
|
1819
1821
|
"CREATE TRIGGER complex_when BEFORE UPDATE ON accounts FOR EACH ROW WHEN (OLD.balance IS DISTINCT FROM NEW.balance AND NEW.balance > 0) EXECUTE FUNCTION CHECK_BALANCE()",
|
|
1820
1822
|
"CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp FOR EACH ROW EXECUTE FUNCTION EMP_STAMP()",
|
|
@@ -10,7 +10,6 @@ import numpy as np
|
|
|
10
10
|
import pandas as pd
|
|
11
11
|
from pandas.testing import assert_frame_equal
|
|
12
12
|
|
|
13
|
-
import sqlglot.generator as _generator_module
|
|
14
13
|
from sqlglot import exp, find_tables, parse_one, transpile
|
|
15
14
|
from sqlglot.errors import ExecuteError
|
|
16
15
|
from sqlglot.executor import execute
|
|
@@ -26,8 +25,6 @@ from tests.helpers import (
|
|
|
26
25
|
load_sql_fixture_pairs,
|
|
27
26
|
)
|
|
28
27
|
|
|
29
|
-
_GENERATOR_IS_COMPILED = getattr(_generator_module, "__file__", "").endswith(".so")
|
|
30
|
-
|
|
31
28
|
DIR_TPCH = FIXTURES_DIR + "/optimizer/tpc-h/"
|
|
32
29
|
DIR_TPCDS = FIXTURES_DIR + "/optimizer/tpc-ds/"
|
|
33
30
|
|
|
@@ -69,7 +66,6 @@ def mp_execute(expression, meta):
|
|
|
69
66
|
|
|
70
67
|
|
|
71
68
|
@unittest.skipIf(SKIP_INTEGRATION, "Skipping Integration Tests since `SKIP_INTEGRATION` is set")
|
|
72
|
-
@unittest.skipIf(_GENERATOR_IS_COMPILED, "executor requires interpreted Generator subclass")
|
|
73
69
|
class TestExecutor(unittest.TestCase):
|
|
74
70
|
@classmethod
|
|
75
71
|
def setUpClass(cls):
|
|
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
|