sqlglot 30.11.0__tar.gz → 30.12.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.11.0 → sqlglot-30.12.0}/CHANGELOG.md +30 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/Makefile +5 -1
- {sqlglot-30.11.0/sqlglot.egg-info → sqlglot-30.12.0}/PKG-INFO +4 -4
- {sqlglot-30.11.0 → sqlglot-30.12.0}/setup.py +1 -1
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/_version.py +3 -3
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/dialect.py +7 -3
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/postgres.py +1 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/snowflake.py +3 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/array.py +4 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/core.py +23 -10
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/ddl.py +8 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/json.py +4 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/properties.py +5 -1
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/query.py +2 -2
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/temporal.py +5 -1
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generator.py +64 -13
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/clickhouse.py +4 -1
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/databricks.py +1 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/duckdb.py +155 -6
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/exasol.py +1 -3
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/mysql.py +4 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/postgres.py +1 -1
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/presto.py +2 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/snowflake.py +15 -1
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/starrocks.py +15 -1
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/qualify_columns.py +21 -3
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/qualify_tables.py +7 -1
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/resolver.py +4 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/simplify.py +57 -22
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parser.py +63 -29
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/bigquery.py +8 -3
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/clickhouse.py +5 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/databricks.py +1 -0
- sqlglot-30.12.0/sqlglot/parsers/druid.py +10 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/exasol.py +3 -2
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/postgres.py +1 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/snowflake.py +75 -3
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/starrocks.py +4 -1
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/tokenizer_core.py +2 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/tokens.py +2 -2
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/__init__.py +5 -4
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/bigquery.py +42 -4
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/hive.py +3 -1
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/mysql.py +1 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0/sqlglot.egg-info}/PKG-INFO +4 -4
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot.egg-info/SOURCES.txt +2 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot.egg-info/requires.txt +3 -3
- sqlglot-30.12.0/sqlglot.egg-info/scm_file_list.json +354 -0
- sqlglot-30.12.0/sqlglot.egg-info/scm_version.json +8 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglotc/pyproject.toml +2 -2
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_bigquery.py +19 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_clickhouse.py +3 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_databricks.py +3 -2
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_druid.py +6 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_duckdb.py +27 -5
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_exasol.py +16 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_postgres.py +9 -5
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_presto.py +17 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_snowflake.py +50 -4
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_sqlite.py +12 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_starrocks.py +94 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/identity.sql +1 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/annotate_functions.sql +119 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/qualify_columns.sql +12 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/qualify_tables.sql +5 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/simplify.sql +40 -1
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_optimizer.py +49 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_transpile.py +30 -4
- sqlglot-30.11.0/sqlglot/parsers/druid.py +0 -7
- {sqlglot-30.11.0 → sqlglot-30.12.0}/.gitignore +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/.gitmodules +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/.gitpod.yml +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/.pre-commit-config.yaml +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/AGENTS.md +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/CLAUDE.md +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/CONTRIBUTING.md +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/LICENSE +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/MANIFEST.in +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/README.md +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/pyproject.toml +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/setup.cfg +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/__init__.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/__main__.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/_typing.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/__init__.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/athena.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/bigquery.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/clickhouse.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/databricks.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/doris.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/dremio.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/drill.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/druid.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/duckdb.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/dune.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/exasol.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/fabric.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/hive.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/materialize.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/mysql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/oracle.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/presto.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/prql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/redshift.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/risingwave.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/singlestore.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/solr.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/spark.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/spark2.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/sqlite.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/starrocks.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/tableau.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/teradata.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/trino.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/tsql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/diff.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/errors.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/executor/__init__.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/executor/context.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/executor/env.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/executor/python.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/executor/table.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/__init__.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/aggregate.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/builders.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/constraints.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/datatypes.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/dml.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/functions.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/math.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/string.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/__init__.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/athena.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/bigquery.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/doris.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/dremio.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/drill.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/druid.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/dune.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/fabric.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/hive.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/materialize.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/oracle.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/prql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/python.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/redshift.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/risingwave.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/singlestore.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/solr.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/spark.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/spark2.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/sqlite.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/tableau.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/teradata.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/trino.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/tsql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/helper.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/jsonpath.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/lineage.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/__init__.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/annotate_types.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/canonicalize.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/canonicalize_internal_names.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/normalize.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/optimize_joins.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/optimizer.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/qualify.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/scope.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/__init__.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/athena.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/base.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/doris.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/dremio.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/drill.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/duckdb.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/dune.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/fabric.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/hive.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/materialize.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/mysql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/oracle.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/presto.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/prql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/redshift.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/risingwave.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/singlestore.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/solr.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/spark.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/spark2.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/sqlite.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/tableau.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/teradata.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/trino.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/tsql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/planner.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/py.typed +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/schema.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/serde.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/time.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/transforms.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/trie.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/clickhouse.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/duckdb.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/postgres.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/presto.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/redshift.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/snowflake.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/spark.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/spark2.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/tsql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot.egg-info/dependency_links.txt +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot.egg-info/top_level.txt +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot.png +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglotc/MANIFEST.in +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglotc/setup.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/__init__.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/__init__.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_athena.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_dialect.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_doris.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_dremio.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_drill.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_dune.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_fabric.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_hive.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_materialize.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_mysql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_oracle.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_pipe_syntax.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_prql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_redshift.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_risingwave.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_singlestore.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_solr.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_spark.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_tableau.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_teradata.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_trino.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_tsql.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/jsonpath/LICENSE +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/jsonpath/cts.json +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/canonicalize_internal_names.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/normalize.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/partial.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/pretty.sql +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/gen_fixtures.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/helpers.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/leakcheck.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/sqlglot/__init__.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_build.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_dialect_entry_points.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_dialect_imports.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_diff.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_docs.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_errors.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_executor.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_expressions.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_generator.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_helper.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_integration_loader.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_jsonpath.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_lineage.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_parser.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_schema.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_serde.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_time.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_tokens.py +0 -0
- {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_transforms.py +0 -0
|
@@ -1,6 +1,35 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
## [v30.11.0] - 2026-06-11
|
|
5
|
+
### :boom: BREAKING CHANGES
|
|
6
|
+
- due to [`df507aa`](https://github.com/tobymao/sqlglot/commit/df507aac2887d79e229cbc6003ed206e8528449c) - GET_JSON_OBJECT roundtrip *(PR [#7728](https://github.com/tobymao/sqlglot/pull/7728) by [@geooo109](https://github.com/geooo109))*:
|
|
7
|
+
|
|
8
|
+
GET_JSON_OBJECT roundtrip (#7728)
|
|
9
|
+
|
|
10
|
+
- due to [`333e3c7`](https://github.com/tobymao/sqlglot/commit/333e3c7fa82201c0f87160c7e956e6ee18bd14da) - ConcatWs args set incorrectly in `simplify_concat` *(commit by [@georgesittas](https://github.com/georgesittas))*:
|
|
11
|
+
|
|
12
|
+
ConcatWs args set incorrectly in `simplify_concat`
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### :sparkles: New Features
|
|
16
|
+
- [`74bef2f`](https://github.com/tobymao/sqlglot/commit/74bef2f4617f2fa25881dded12ae3851a7ddfa1f) - **lineage**: add support for `UNPIVOT` *(PR [#7729](https://github.com/tobymao/sqlglot/pull/7729) by [@georgesittas](https://github.com/georgesittas))*
|
|
17
|
+
- :arrow_lower_right: *addresses issue [#7727](https://github.com/tobymao/sqlglot/issues/7727) opened by [@tomoki-takahashi-oisix](https://github.com/tomoki-takahashi-oisix)*
|
|
18
|
+
- [`f3ba8e4`](https://github.com/tobymao/sqlglot/commit/f3ba8e4d20311c4e657f4f763c3e354fa533ba47) - **lineage**: more `UNPIVOT` lineage improvements *(PR [#7736](https://github.com/tobymao/sqlglot/pull/7736) by [@georgesittas](https://github.com/georgesittas))*
|
|
19
|
+
|
|
20
|
+
### :bug: Bug Fixes
|
|
21
|
+
- [`6ae4b49`](https://github.com/tobymao/sqlglot/commit/6ae4b49f1d2ef0c4f30575a29a0d1b3273520abf) - **tsql**: do not bubble up CTEs in TVF DDLs with inline `RETURN` queries closes [#7721](https://github.com/tobymao/sqlglot/pull/7721) *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
22
|
+
- [`df507aa`](https://github.com/tobymao/sqlglot/commit/df507aac2887d79e229cbc6003ed206e8528449c) - **databricks**: GET_JSON_OBJECT roundtrip *(PR [#7728](https://github.com/tobymao/sqlglot/pull/7728) by [@geooo109](https://github.com/geooo109))*
|
|
23
|
+
- [`1955881`](https://github.com/tobymao/sqlglot/commit/19558813d3f51e39a20f4e5b669408d72af4e5d6) - **sqlglotc**: pin sqlglot to the exact matching version *(PR [#7730](https://github.com/tobymao/sqlglot/pull/7730) by [@georgesittas](https://github.com/georgesittas))*
|
|
24
|
+
- [`2284484`](https://github.com/tobymao/sqlglot/commit/22844841f1de93643f17ae51077ceac79b0ec69a) - **optimizer**: infinite recursion in the resolver *(PR [#7737](https://github.com/tobymao/sqlglot/pull/7737) by [@georgesittas](https://github.com/georgesittas))*
|
|
25
|
+
- :arrow_lower_right: *fixes issue [#7732](https://github.com/tobymao/sqlglot/issues/7732) opened by [@treff7es](https://github.com/treff7es)*
|
|
26
|
+
- [`333e3c7`](https://github.com/tobymao/sqlglot/commit/333e3c7fa82201c0f87160c7e956e6ee18bd14da) - **optimizer**: ConcatWs args set incorrectly in `simplify_concat` *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
27
|
+
|
|
28
|
+
### :zap: Performance Improvements
|
|
29
|
+
- [`9e4b3d1`](https://github.com/tobymao/sqlglot/commit/9e4b3d15e67bf3508c9b25c0c025da0ea3d1a87b) - **optimizer**: speed up qualify by ~24% and optimize by ~17% *(PR [#7724](https://github.com/tobymao/sqlglot/pull/7724) by [@tobymao](https://github.com/tobymao))*
|
|
30
|
+
- [`32ed149`](https://github.com/tobymao/sqlglot/commit/32ed149002aa76a1b0b674b2c27af39daf70fdf5) - **optimizer**: skip redundant hash invalidation in simplify's pointer-reset loop *(PR [#7725](https://github.com/tobymao/sqlglot/pull/7725) by [@tobymao](https://github.com/tobymao))*
|
|
31
|
+
|
|
32
|
+
|
|
4
33
|
## [v30.10.0] - 2026-06-09
|
|
5
34
|
### :boom: BREAKING CHANGES
|
|
6
35
|
- due to [`287df74`](https://github.com/tobymao/sqlglot/commit/287df744e968e0b3cd70679abf443ce8db685313) - parsing and generation of `CLUSTER BY` *(PR [#7716](https://github.com/tobymao/sqlglot/pull/7716) by [@JoshuaM176](https://github.com/JoshuaM176))*:
|
|
@@ -14609,3 +14638,4 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
|
|
|
14609
14638
|
[v30.8.0]: https://github.com/tobymao/sqlglot/compare/v30.7.0...v30.8.0
|
|
14610
14639
|
[v30.9.0]: https://github.com/tobymao/sqlglot/compare/v30.8.0...v30.9.0
|
|
14611
14640
|
[v30.10.0]: https://github.com/tobymao/sqlglot/compare/v30.9.0...v30.10.0
|
|
14641
|
+
[v30.11.0]: https://github.com/tobymao/sqlglot/compare/v30.10.0...v30.11.0
|
|
@@ -24,8 +24,12 @@ install:
|
|
|
24
24
|
$(PIP) install -e .
|
|
25
25
|
|
|
26
26
|
install-dev:
|
|
27
|
-
$(PIP) install -e ".[dev]"
|
|
28
27
|
git submodule update --init 2>/dev/null || true
|
|
28
|
+
@if [ -f sqlglot-integration-tests/Makefile ]; then \
|
|
29
|
+
$(MAKE) -C sqlglot-integration-tests install; \
|
|
30
|
+
fi
|
|
31
|
+
$(PIP) install -e ".[dev]"
|
|
32
|
+
$(PIP) uninstall -y sqlglotc 2>/dev/null || true
|
|
29
33
|
@if ! command -v gh >/dev/null 2>&1; then \
|
|
30
34
|
echo ""; \
|
|
31
35
|
echo "gh (GitHub CLI) is not installed. It is needed to auto-create PRs for integration tests."; \
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlglot
|
|
3
|
-
Version: 30.
|
|
3
|
+
Version: 30.12.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
|
|
@@ -19,7 +19,7 @@ Description-Content-Type: text/markdown
|
|
|
19
19
|
License-File: LICENSE
|
|
20
20
|
Provides-Extra: dev
|
|
21
21
|
Requires-Dist: duckdb>=0.6; extra == "dev"
|
|
22
|
-
Requires-Dist: sqlglot-mypy>=2.1.0.
|
|
22
|
+
Requires-Dist: sqlglot-mypy>=2.1.0.post3; python_version >= "3.10" and extra == "dev"
|
|
23
23
|
Requires-Dist: mypy; python_version < "3.10" and extra == "dev"
|
|
24
24
|
Requires-Dist: setuptools_scm; extra == "dev"
|
|
25
25
|
Requires-Dist: pandas; extra == "dev"
|
|
@@ -34,10 +34,10 @@ Requires-Dist: types-pytz; extra == "dev"
|
|
|
34
34
|
Requires-Dist: typing_extensions; extra == "dev"
|
|
35
35
|
Requires-Dist: pyperf; extra == "dev"
|
|
36
36
|
Provides-Extra: c
|
|
37
|
-
Requires-Dist: sqlglotc==30.
|
|
37
|
+
Requires-Dist: sqlglotc==30.12.0; python_version >= "3.10" and extra == "c"
|
|
38
38
|
Provides-Extra: rs
|
|
39
39
|
Requires-Dist: sqlglotrs==0.13.0; extra == "rs"
|
|
40
|
-
Requires-Dist: sqlglotc==30.
|
|
40
|
+
Requires-Dist: sqlglotc==30.12.0; python_version >= "3.10" and extra == "rs"
|
|
41
41
|
Dynamic: license-file
|
|
42
42
|
Dynamic: provides-extra
|
|
43
43
|
|
|
@@ -9,7 +9,7 @@ setup(
|
|
|
9
9
|
"duckdb>=0.6",
|
|
10
10
|
# sqlglot-mypy 1.20+ is the build dep for sqlglotc and only ships
|
|
11
11
|
# for py3.10+; on py3.9 just use upstream mypy for type checking.
|
|
12
|
-
"sqlglot-mypy >= 2.1.0.
|
|
12
|
+
"sqlglot-mypy >= 2.1.0.post3; python_version >= '3.10'",
|
|
13
13
|
"mypy; python_version < '3.10'",
|
|
14
14
|
"setuptools_scm",
|
|
15
15
|
"pandas",
|
|
@@ -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.12.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (30, 12, 0)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g64e268a5d'
|
|
@@ -305,7 +305,12 @@ class _Dialect(type):
|
|
|
305
305
|
**klass.UNESCAPED_SEQUENCES,
|
|
306
306
|
}
|
|
307
307
|
|
|
308
|
-
klass.ESCAPED_SEQUENCES = {
|
|
308
|
+
klass.ESCAPED_SEQUENCES = {
|
|
309
|
+
# The filter is necessary because of `\\a -> a` in Snowflake; we can't replace `a` with `\a`.
|
|
310
|
+
v: k
|
|
311
|
+
for k, v in klass.UNESCAPED_SEQUENCES.items()
|
|
312
|
+
if not v.isprintable() or v == "\\"
|
|
313
|
+
}
|
|
309
314
|
|
|
310
315
|
klass.SUPPORTS_COLUMN_JOIN_MARKS = "(+)" in klass.tokenizer_class.KEYWORDS
|
|
311
316
|
|
|
@@ -2134,10 +2139,9 @@ def json_extract_segments(
|
|
|
2134
2139
|
if not isinstance(path, exp.JSONPath):
|
|
2135
2140
|
return rename_func(name)(self, expression)
|
|
2136
2141
|
|
|
2137
|
-
escape = path.args.get("escape")
|
|
2138
|
-
|
|
2139
2142
|
segments = []
|
|
2140
2143
|
for segment in path.expressions:
|
|
2144
|
+
escape = segment.args.get("quoted")
|
|
2141
2145
|
path = self.sql(segment)
|
|
2142
2146
|
if path:
|
|
2143
2147
|
if isinstance(segment, exp.JSONPathPart) and (
|
|
@@ -16,6 +16,8 @@ from sqlglot.typing.snowflake import EXPRESSION_METADATA
|
|
|
16
16
|
class Snowflake(Dialect):
|
|
17
17
|
# https://docs.snowflake.com/en/sql-reference/identifiers-syntax
|
|
18
18
|
NORMALIZATION_STRATEGY = NormalizationStrategy.UPPERCASE
|
|
19
|
+
# https://docs.snowflake.com/en/sql-reference/data-types-text#escape-sequences
|
|
20
|
+
UNESCAPED_SEQUENCES = {"\\a": "a", "\\v": "v"}
|
|
19
21
|
NULL_ORDERING = "nulls_are_large"
|
|
20
22
|
TIME_FORMAT = "'YYYY-MM-DD HH24:MI:SS'"
|
|
21
23
|
SUPPORTS_USER_DEFINED_TYPES = False
|
|
@@ -152,6 +154,7 @@ class Snowflake(Dialect):
|
|
|
152
154
|
"POLICY": TokenType.POLICY,
|
|
153
155
|
"POOL": TokenType.POOL,
|
|
154
156
|
"PUT": TokenType.PUT,
|
|
157
|
+
"UNDROP": TokenType.UNDROP,
|
|
155
158
|
"REMOVE": TokenType.COMMAND,
|
|
156
159
|
"RM": TokenType.COMMAND,
|
|
157
160
|
"ROLE": TokenType.ROLE,
|
|
@@ -114,6 +114,10 @@ class ArrayContainsAll(Expression, Binary, Func):
|
|
|
114
114
|
_sql_names = ["ARRAY_CONTAINS_ALL", "ARRAY_HAS_ALL"]
|
|
115
115
|
|
|
116
116
|
|
|
117
|
+
class ArrayContainedBy(Expression, Binary, Func):
|
|
118
|
+
pass
|
|
119
|
+
|
|
120
|
+
|
|
117
121
|
class ArrayExcept(Expression, Func):
|
|
118
122
|
arg_types = {"this": True, "expression": True, "is_multiset": False}
|
|
119
123
|
|
|
@@ -10,12 +10,14 @@ import re
|
|
|
10
10
|
import sys
|
|
11
11
|
import textwrap
|
|
12
12
|
import typing as t
|
|
13
|
+
from builtins import type as Type
|
|
13
14
|
from collections import deque
|
|
15
|
+
from collections.abc import Collection, Iterator, Mapping, MutableMapping, Sequence
|
|
14
16
|
from copy import deepcopy
|
|
15
17
|
from decimal import Decimal
|
|
16
18
|
from functools import reduce
|
|
17
|
-
|
|
18
|
-
from sqlglot._typing import E, T
|
|
19
|
+
|
|
20
|
+
from sqlglot._typing import E, GeneratorNoDialectArgs, ParserNoDialectArgs, T
|
|
19
21
|
from sqlglot.errors import ParseError
|
|
20
22
|
from sqlglot.helper import (
|
|
21
23
|
camel_to_snake_case,
|
|
@@ -24,17 +26,15 @@ from sqlglot.helper import (
|
|
|
24
26
|
to_bool,
|
|
25
27
|
trait,
|
|
26
28
|
)
|
|
27
|
-
|
|
28
29
|
from sqlglot.tokenizer_core import Token
|
|
29
|
-
from builtins import type as Type
|
|
30
|
-
from sqlglot._typing import GeneratorNoDialectArgs, ParserNoDialectArgs
|
|
31
30
|
|
|
32
31
|
if t.TYPE_CHECKING:
|
|
33
|
-
from typing_extensions import Self, Unpack
|
|
32
|
+
from typing_extensions import Concatenate, Self, Unpack
|
|
33
|
+
|
|
34
|
+
from sqlglot._typing import P
|
|
34
35
|
from sqlglot.dialects.dialect import DialectType
|
|
35
36
|
from sqlglot.expressions.datatypes import DATA_TYPE, DataType, DType, Interval
|
|
36
37
|
from sqlglot.expressions.query import Select
|
|
37
|
-
from sqlglot._typing import P
|
|
38
38
|
|
|
39
39
|
R = t.TypeVar("R")
|
|
40
40
|
|
|
@@ -1789,7 +1789,12 @@ class JoinHint(Expression):
|
|
|
1789
1789
|
|
|
1790
1790
|
|
|
1791
1791
|
class Identifier(Expression):
|
|
1792
|
-
arg_types = {
|
|
1792
|
+
arg_types = {
|
|
1793
|
+
"this": True,
|
|
1794
|
+
"quoted": False,
|
|
1795
|
+
"global_": False,
|
|
1796
|
+
"temporary": False,
|
|
1797
|
+
}
|
|
1793
1798
|
is_primitive = True
|
|
1794
1799
|
_hash_raw_args = True
|
|
1795
1800
|
|
|
@@ -1802,12 +1807,19 @@ class Identifier(Expression):
|
|
|
1802
1807
|
return self.name
|
|
1803
1808
|
|
|
1804
1809
|
|
|
1810
|
+
# https://docs.snowflake.com/en/sql-reference/identifier-literal
|
|
1811
|
+
# "expressions" holds the arguments when the resolved identifier is invoked as a
|
|
1812
|
+
# function, e.g. `IDENTIFIER('my_func')(1, 2)`
|
|
1813
|
+
class DynamicIdentifier(Expression, Func):
|
|
1814
|
+
arg_types = {"this": True, "expressions": False}
|
|
1815
|
+
|
|
1816
|
+
|
|
1805
1817
|
class Opclass(Expression):
|
|
1806
1818
|
arg_types = {"this": True, "expression": True}
|
|
1807
1819
|
|
|
1808
1820
|
|
|
1809
1821
|
class Star(Expression):
|
|
1810
|
-
arg_types = {"except_": False, "replace": False, "rename": False}
|
|
1822
|
+
arg_types = {"except_": False, "replace": False, "rename": False, "ilike": False}
|
|
1811
1823
|
|
|
1812
1824
|
@property
|
|
1813
1825
|
def name(self) -> str:
|
|
@@ -2415,7 +2427,8 @@ def convert(value: t.Any, copy: bool = False) -> Expr:
|
|
|
2415
2427
|
|
|
2416
2428
|
return _Array(expressions=[convert(v, copy=copy) for v in value])
|
|
2417
2429
|
if isinstance(value, dict):
|
|
2418
|
-
from sqlglot.expressions.array import Array as _Array
|
|
2430
|
+
from sqlglot.expressions.array import Array as _Array
|
|
2431
|
+
from sqlglot.expressions.array import Map as _Map
|
|
2419
2432
|
|
|
2420
2433
|
return _Map(
|
|
2421
2434
|
keys=_Array(expressions=[convert(k, copy=copy) for k in value]),
|
|
@@ -370,6 +370,14 @@ class DropPrimaryKey(Expression):
|
|
|
370
370
|
arg_types = {}
|
|
371
371
|
|
|
372
372
|
|
|
373
|
+
class Undrop(Expression):
|
|
374
|
+
arg_types = {"this": True, "kind": True, "rename": False}
|
|
375
|
+
|
|
376
|
+
@property
|
|
377
|
+
def kind(self) -> str:
|
|
378
|
+
return self.args["kind"].upper()
|
|
379
|
+
|
|
380
|
+
|
|
373
381
|
class Command(Expression):
|
|
374
382
|
arg_types = {"this": True, "expression": False}
|
|
375
383
|
|
|
@@ -62,6 +62,10 @@ class JSONBDeleteAtPath(Expression, Binary, Func):
|
|
|
62
62
|
pass
|
|
63
63
|
|
|
64
64
|
|
|
65
|
+
class JSONBPathExists(Expression, Binary, Predicate, Func):
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
|
|
65
69
|
class JSONBExists(Expression, Func):
|
|
66
70
|
arg_types = {"this": True, "path": True}
|
|
67
71
|
_sql_names = ["JSONB_EXISTS"]
|
|
@@ -5,8 +5,8 @@ from __future__ import annotations
|
|
|
5
5
|
import typing as t
|
|
6
6
|
from enum import auto
|
|
7
7
|
|
|
8
|
+
from sqlglot.expressions.core import ColumnConstraintKind, Expression, Literal, convert
|
|
8
9
|
from sqlglot.helper import AutoName
|
|
9
|
-
from sqlglot.expressions.core import Expression, ColumnConstraintKind, Literal, convert
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class Property(Expression):
|
|
@@ -63,6 +63,10 @@ class BlockCompressionProperty(Property):
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
|
|
66
|
+
class CalledOnNullInputProperty(Property):
|
|
67
|
+
arg_types = {}
|
|
68
|
+
|
|
69
|
+
|
|
66
70
|
class CatalogProperty(Property):
|
|
67
71
|
arg_types = {}
|
|
68
72
|
|
|
@@ -1967,7 +1967,7 @@ class JSON(Expression):
|
|
|
1967
1967
|
|
|
1968
1968
|
|
|
1969
1969
|
class JSONPath(Expression):
|
|
1970
|
-
arg_types = {"expressions": True
|
|
1970
|
+
arg_types = {"expressions": True}
|
|
1971
1971
|
|
|
1972
1972
|
@property
|
|
1973
1973
|
def output_name(self) -> str:
|
|
@@ -1984,7 +1984,7 @@ class JSONPathFilter(JSONPathPart):
|
|
|
1984
1984
|
|
|
1985
1985
|
|
|
1986
1986
|
class JSONPathKey(JSONPathPart):
|
|
1987
|
-
arg_types = {"this": True}
|
|
1987
|
+
arg_types = {"this": True, "quoted": False}
|
|
1988
1988
|
|
|
1989
1989
|
|
|
1990
1990
|
class JSONPathRecursive(JSONPathPart):
|
|
@@ -437,8 +437,12 @@ class FromISO8601Timestamp(Expression, Func):
|
|
|
437
437
|
_sql_names = ["FROM_ISO8601_TIMESTAMP"]
|
|
438
438
|
|
|
439
439
|
|
|
440
|
+
class FromISO8601Date(Expression, Func):
|
|
441
|
+
_sql_names = ["FROM_ISO8601_DATE"]
|
|
442
|
+
|
|
443
|
+
|
|
440
444
|
class ParseDatetime(Expression, Func):
|
|
441
|
-
arg_types = {"this": True, "format": False, "zone": False}
|
|
445
|
+
arg_types = {"this": True, "format": False, "zone": False, "default_year": False}
|
|
442
446
|
|
|
443
447
|
|
|
444
448
|
class ParseTime(Expression, Func):
|
|
@@ -9,6 +9,7 @@ from functools import reduce, wraps
|
|
|
9
9
|
from sqlglot import exp
|
|
10
10
|
from sqlglot.errors import ErrorLevel, UnsupportedError, concat_messages
|
|
11
11
|
from sqlglot.expressions import apply_index_offset
|
|
12
|
+
from sqlglot.expressions.core import maybe_parse
|
|
12
13
|
from sqlglot.helper import csv, name_sequence, seq_get
|
|
13
14
|
from sqlglot.jsonpath import ALL_JSON_PATH_PARTS, JSON_PATH_PART_TRANSFORMS
|
|
14
15
|
from sqlglot.time import format_time
|
|
@@ -139,6 +140,7 @@ class Generator:
|
|
|
139
140
|
),
|
|
140
141
|
exp.AnalyzeColumns: lambda self, e: self.sql(e, "this"),
|
|
141
142
|
exp.AnalyzeWith: lambda self, e: self.expressions(e, prefix="WITH ", sep=" "),
|
|
143
|
+
exp.ArrayContainedBy: lambda self, e: self.binary(e, "<@"),
|
|
142
144
|
exp.ArrayContainsAll: lambda self, e: self.binary(e, "@>"),
|
|
143
145
|
exp.ArrayOverlaps: lambda self, e: self.binary(e, "&&"),
|
|
144
146
|
exp.AssumeColumnConstraint: lambda self, e: f"ASSUME ({self.sql(e, 'this')})",
|
|
@@ -147,6 +149,7 @@ class Generator:
|
|
|
147
149
|
exp.CaseSpecificColumnConstraint: lambda _, e: (
|
|
148
150
|
f"{'NOT ' if e.args.get('not_') else ''}CASESPECIFIC"
|
|
149
151
|
),
|
|
152
|
+
exp.CalledOnNullInputProperty: lambda *_: "CALLED ON NULL INPUT",
|
|
150
153
|
exp.Ceil: lambda self, e: self.ceil_floor(e),
|
|
151
154
|
exp.CharacterSetColumnConstraint: lambda self, e: f"CHARACTER SET {self.sql(e, 'this')}",
|
|
152
155
|
exp.CharacterSetProperty: lambda self, e: (
|
|
@@ -203,6 +206,7 @@ class Generator:
|
|
|
203
206
|
exp.JSONBContainsAnyTopKeys: lambda self, e: self.binary(e, "?|"),
|
|
204
207
|
exp.JSONBContainsAllTopKeys: lambda self, e: self.binary(e, "?&"),
|
|
205
208
|
exp.JSONBDeleteAtPath: lambda self, e: self.binary(e, "#-"),
|
|
209
|
+
exp.JSONBPathExists: lambda self, e: self.binary(e, "@?"),
|
|
206
210
|
exp.JSONObject: lambda self, e: self._jsonobject_sql(e),
|
|
207
211
|
exp.JSONObjectAgg: lambda self, e: self._jsonobject_sql(e),
|
|
208
212
|
exp.LanguageProperty: lambda self, e: self.naked_property(e),
|
|
@@ -489,6 +493,12 @@ class Generator:
|
|
|
489
493
|
# Whether to escape keys using single quotes in JSON paths
|
|
490
494
|
JSON_PATH_SINGLE_QUOTE_ESCAPE = False
|
|
491
495
|
|
|
496
|
+
# Whether a quoted JSON path key (e.g. from a quoted identifier or ['key'] bracket) must be
|
|
497
|
+
# rendered in bracket form to preserve its case-sensitivity, even if it would otherwise match
|
|
498
|
+
# SAFE_JSON_PATH_KEY_RE and render as a bare dotted key. Needed for dialects like Databricks
|
|
499
|
+
# where a bare colon key is case-insensitive but a bracketed key is case-sensitive.
|
|
500
|
+
JSON_PATH_KEY_QUOTED_FORCES_BRACKETS = False
|
|
501
|
+
|
|
492
502
|
# The JSONPathPart expressions supported by this dialect
|
|
493
503
|
SUPPORTED_JSON_PATH_PARTS: t.ClassVar = ALL_JSON_PATH_PARTS.copy()
|
|
494
504
|
|
|
@@ -668,6 +678,7 @@ class Generator:
|
|
|
668
678
|
exp.AutoRefreshProperty: exp.Properties.Location.POST_SCHEMA,
|
|
669
679
|
exp.BackupProperty: exp.Properties.Location.POST_SCHEMA,
|
|
670
680
|
exp.BlockCompressionProperty: exp.Properties.Location.POST_NAME,
|
|
681
|
+
exp.CalledOnNullInputProperty: exp.Properties.Location.POST_SCHEMA,
|
|
671
682
|
exp.CatalogProperty: exp.Properties.Location.POST_CREATE,
|
|
672
683
|
exp.CharacterSetProperty: exp.Properties.Location.POST_SCHEMA,
|
|
673
684
|
exp.ChecksumProperty: exp.Properties.Location.POST_NAME,
|
|
@@ -1007,23 +1018,24 @@ class Generator:
|
|
|
1007
1018
|
if not comments or isinstance(expression, self.EXCLUDE_COMMENTS):
|
|
1008
1019
|
return sql
|
|
1009
1020
|
|
|
1010
|
-
|
|
1011
|
-
f"/*{self.sanitize_comment(comment)}*/"
|
|
1012
|
-
|
|
1021
|
+
comments_list = [
|
|
1022
|
+
f"/*{self._replace_line_breaks(self.sanitize_comment(comment))}*/"
|
|
1023
|
+
for comment in comments
|
|
1024
|
+
if comment
|
|
1025
|
+
]
|
|
1013
1026
|
|
|
1014
|
-
if not
|
|
1027
|
+
if not comments_list:
|
|
1015
1028
|
return sql
|
|
1016
1029
|
|
|
1017
|
-
comments_sql = self._replace_line_breaks(comments_sql)
|
|
1018
|
-
|
|
1019
1030
|
if separated or isinstance(expression, self.WITH_SEPARATED_COMMENTS):
|
|
1031
|
+
comments_sql = self.sep().join(comments_list)
|
|
1020
1032
|
return (
|
|
1021
1033
|
f"{self.sep()}{comments_sql}{sql}"
|
|
1022
1034
|
if not sql or sql[0].isspace()
|
|
1023
1035
|
else f"{comments_sql}{self.sep()}{sql}"
|
|
1024
1036
|
)
|
|
1025
1037
|
|
|
1026
|
-
return f"{sql} {
|
|
1038
|
+
return f"{sql} {' '.join(comments_list)}"
|
|
1027
1039
|
|
|
1028
1040
|
def wrap(self, expression: exp.Expr | str) -> str:
|
|
1029
1041
|
this_sql = (
|
|
@@ -1945,6 +1957,20 @@ class Generator:
|
|
|
1945
1957
|
params = self.sql(expression, "params")
|
|
1946
1958
|
return f"{unique}{primary}{amp}{index}{name}{table}{params}"
|
|
1947
1959
|
|
|
1960
|
+
def dynamicidentifier_sql(self, expression: exp.DynamicIdentifier) -> str:
|
|
1961
|
+
this = expression.this
|
|
1962
|
+
if this and this.is_string:
|
|
1963
|
+
resolved = maybe_parse(this.name).sql(self.dialect)
|
|
1964
|
+
if "expressions" in expression.args:
|
|
1965
|
+
# `IDENTIFIER(...)` invoked as a function, e.g. `IDENTIFIER('my_func')(1, 2)`
|
|
1966
|
+
# We can't safely emit the call to other dialects since name/arg semantics may differ
|
|
1967
|
+
self.unsupported(
|
|
1968
|
+
"Transpiling dynamically-invoked IDENTIFIER() functions is unsupported"
|
|
1969
|
+
)
|
|
1970
|
+
return resolved
|
|
1971
|
+
self.unsupported("IDENTIFIER() with non-literal arguments is not supported")
|
|
1972
|
+
return self.func("IDENTIFIER", this)
|
|
1973
|
+
|
|
1948
1974
|
def identifier_sql(self, expression: exp.Identifier) -> str:
|
|
1949
1975
|
text = expression.name
|
|
1950
1976
|
lower = text.lower()
|
|
@@ -2393,10 +2419,12 @@ class Generator:
|
|
|
2393
2419
|
laterals = self.expressions(expression, key="laterals", sep="")
|
|
2394
2420
|
|
|
2395
2421
|
file_format = self.sql(expression, "format")
|
|
2422
|
+
pattern = self.sql(expression, "pattern")
|
|
2396
2423
|
if file_format:
|
|
2397
|
-
pattern = self.sql(expression, "pattern")
|
|
2398
2424
|
pattern = f", PATTERN => {pattern}" if pattern else ""
|
|
2399
2425
|
file_format = f" (FILE_FORMAT => {file_format}{pattern})"
|
|
2426
|
+
elif pattern:
|
|
2427
|
+
file_format = f" (PATTERN => {pattern})"
|
|
2400
2428
|
|
|
2401
2429
|
ordinality = expression.args.get("ordinality") or ""
|
|
2402
2430
|
if ordinality:
|
|
@@ -3371,7 +3399,9 @@ class Generator:
|
|
|
3371
3399
|
replace = f"{self.seg('REPLACE')} ({replace})" if replace else ""
|
|
3372
3400
|
rename = self.expressions(expression, key="rename", flat=True)
|
|
3373
3401
|
rename = f"{self.seg('RENAME')} ({rename})" if rename else ""
|
|
3374
|
-
|
|
3402
|
+
ilike = self.sql(expression, "ilike")
|
|
3403
|
+
ilike = f"{self.seg('ILIKE')} {ilike}" if ilike else ""
|
|
3404
|
+
return f"*{ilike}{except_}{replace}{rename}"
|
|
3375
3405
|
|
|
3376
3406
|
def parameter_sql(self, expression: exp.Parameter) -> str:
|
|
3377
3407
|
this = self.sql(expression, "this")
|
|
@@ -3719,9 +3749,6 @@ class Generator:
|
|
|
3719
3749
|
def jsonpath_sql(self, expression: exp.JSONPath) -> str:
|
|
3720
3750
|
path = self.expressions(expression, sep="", flat=True).lstrip(".")
|
|
3721
3751
|
|
|
3722
|
-
if expression.args.get("escape"):
|
|
3723
|
-
path = self.escape_str(path)
|
|
3724
|
-
|
|
3725
3752
|
if self.QUOTE_JSON_PATH:
|
|
3726
3753
|
path = f"{self.dialect.QUOTE_START}{path}{self.dialect.QUOTE_END}"
|
|
3727
3754
|
|
|
@@ -3975,6 +4002,12 @@ class Generator:
|
|
|
3975
4002
|
zone = self.sql(expression, "zone")
|
|
3976
4003
|
return f"{this} AT TIME ZONE {zone} AT TIME ZONE 'UTC'"
|
|
3977
4004
|
|
|
4005
|
+
def fromiso8601date_sql(self, expression: exp.FromISO8601Date) -> str:
|
|
4006
|
+
return self.sql(exp.cast(expression.this, exp.DType.DATE))
|
|
4007
|
+
|
|
4008
|
+
def fromiso8601timestamp_sql(self, expression: exp.FromISO8601Timestamp) -> str:
|
|
4009
|
+
return self.sql(exp.cast(expression.this, exp.DType.TIMESTAMPTZ))
|
|
4010
|
+
|
|
3978
4011
|
def add_sql(self, expression: exp.Add) -> str:
|
|
3979
4012
|
return self.binary(expression, "+")
|
|
3980
4013
|
|
|
@@ -4054,6 +4087,14 @@ class Generator:
|
|
|
4054
4087
|
def strtotime_sql(self, expression: exp.StrToTime) -> str:
|
|
4055
4088
|
return self.func("STR_TO_TIME", expression.this, expression.args.get("format"))
|
|
4056
4089
|
|
|
4090
|
+
def parsedatetime_sql(self, expression: exp.ParseDatetime) -> str:
|
|
4091
|
+
return self.func(
|
|
4092
|
+
"PARSE_DATETIME",
|
|
4093
|
+
expression.this,
|
|
4094
|
+
expression.args.get("format"),
|
|
4095
|
+
expression.args.get("zone"),
|
|
4096
|
+
)
|
|
4097
|
+
|
|
4057
4098
|
def currentdate_sql(self, expression: exp.CurrentDate) -> str:
|
|
4058
4099
|
zone = self.sql(expression, "this")
|
|
4059
4100
|
return f"CURRENT_DATE({zone})" if zone else "CURRENT_DATE"
|
|
@@ -5228,10 +5269,20 @@ class Generator:
|
|
|
5228
5269
|
this = self.json_path_part(this)
|
|
5229
5270
|
return f".{this}" if this else ""
|
|
5230
5271
|
|
|
5231
|
-
|
|
5272
|
+
quoted = expression.args.get("quoted")
|
|
5273
|
+
if not (
|
|
5274
|
+
quoted and self.JSON_PATH_KEY_QUOTED_FORCES_BRACKETS
|
|
5275
|
+
) and self.SAFE_JSON_PATH_KEY_RE.match(this):
|
|
5232
5276
|
return f".{this}"
|
|
5233
5277
|
|
|
5234
5278
|
this = self.json_path_part(this)
|
|
5279
|
+
|
|
5280
|
+
if quoted and self.QUOTE_JSON_PATH:
|
|
5281
|
+
# The whole path is rendered as a single quoted string literal, so the bracketed key
|
|
5282
|
+
# (which may itself contain backslash-escaped quotes, e.g. ["x \"y\"z"]) must be
|
|
5283
|
+
# escaped again for the outer string literal (-> ["x \\"y\\"z"]).
|
|
5284
|
+
this = self.escape_str(this)
|
|
5285
|
+
|
|
5235
5286
|
return (
|
|
5236
5287
|
f"[{this}]"
|
|
5237
5288
|
if self._quote_json_path_key_using_brackets and self.JSON_PATH_BRACKETED_KEY_SUPPORTED
|
|
@@ -280,6 +280,7 @@ class ClickHouseGenerator(generator.Generator):
|
|
|
280
280
|
exp.ArrayConcat: rename_func("arrayConcat"),
|
|
281
281
|
exp.ArrayContains: rename_func("has"),
|
|
282
282
|
exp.ArrayFilter: lambda self, e: self.func("arrayFilter", e.expression, e.this),
|
|
283
|
+
exp.Transform: lambda self, e: self.func("arrayMap", e.expression, e.this),
|
|
283
284
|
exp.ArrayRemove: remove_from_array_using_filter,
|
|
284
285
|
exp.ArrayReverse: rename_func("arrayReverse"),
|
|
285
286
|
exp.ArraySlice: rename_func("arraySlice"),
|
|
@@ -377,7 +378,9 @@ class ClickHouseGenerator(generator.Generator):
|
|
|
377
378
|
exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")(
|
|
378
379
|
rename_func("editDistance")
|
|
379
380
|
),
|
|
380
|
-
exp.ParseDatetime:
|
|
381
|
+
exp.ParseDatetime: lambda self, e: self.func(
|
|
382
|
+
"parseDateTime", e.this, e.args.get("format"), e.args.get("zone")
|
|
383
|
+
),
|
|
381
384
|
}
|
|
382
385
|
|
|
383
386
|
PROPERTIES_LOCATION = {
|
|
@@ -15,6 +15,7 @@ class DatabricksGenerator(SparkGenerator):
|
|
|
15
15
|
COPY_PARAMS_ARE_WRAPPED = False
|
|
16
16
|
COPY_PARAMS_EQ_REQUIRED = True
|
|
17
17
|
JSON_PATH_SINGLE_QUOTE_ESCAPE = False
|
|
18
|
+
JSON_PATH_KEY_QUOTED_FORCES_BRACKETS = True
|
|
18
19
|
SAFE_JSON_PATH_KEY_RE = exp.SAFE_IDENTIFIER_RE
|
|
19
20
|
QUOTE_JSON_PATH = False
|
|
20
21
|
PARSE_JSON_NAME: str | None = "PARSE_JSON"
|