sqlglot 30.24.0__tar.gz → 30.25.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.24.0 → sqlglot-30.25.0}/CHANGELOG.md +81 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/Makefile +12 -2
- {sqlglot-30.24.0/sqlglot.egg-info → sqlglot-30.25.0}/PKG-INFO +3 -3
- {sqlglot-30.24.0 → sqlglot-30.25.0}/pyproject.toml +1 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/_version.py +3 -3
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/athena.py +35 -12
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/bigquery.py +1 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/dialect.py +21 -4
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/duckdb.py +3 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/snowflake.py +1 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/sqlite.py +4 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/starrocks.py +9 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/array.py +4 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/builders.py +1 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/constraints.py +2 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/core.py +7 -8
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/datatypes.py +3 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/ddl.py +8 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/query.py +8 -3
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generator.py +73 -20
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/bigquery.py +1 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/clickhouse.py +7 -7
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/databricks.py +1 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/duckdb.py +72 -7
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/exasol.py +3 -6
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/hive.py +4 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/oracle.py +0 -3
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/postgres.py +35 -2
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/presto.py +7 -2
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/python.py +5 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/snowflake.py +3 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/sqlite.py +6 -2
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/tsql.py +4 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/annotate_types.py +150 -93
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/canonicalize.py +2 -2
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/canonicalize_internal_names.py +11 -10
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/eliminate_joins.py +19 -10
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/merge_subqueries.py +2 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/optimize_joins.py +3 -2
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/pushdown_predicates.py +4 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/qualify_columns.py +94 -158
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/resolver.py +57 -8
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/scope.py +16 -2
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/simplify.py +5 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/unnest_subqueries.py +44 -3
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parser.py +41 -12
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/clickhouse.py +5 -5
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/duckdb.py +81 -2
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/oracle.py +13 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/postgres.py +33 -5
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/sqlite.py +32 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/tokenizer_core.py +2 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0/sqlglot.egg-info}/PKG-INFO +3 -3
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.egg-info/requires.txt +2 -2
- sqlglot-30.25.0/sqlglot.egg-info/scm_version.json +8 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglotc/pyproject.toml +1 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_athena.py +44 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_bigquery.py +8 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_clickhouse.py +28 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_databricks.py +19 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_dialect.py +4 -4
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_duckdb.py +356 -28
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_exasol.py +2 -2
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_hive.py +15 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_mysql.py +5 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_oracle.py +34 -2
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_postgres.py +56 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_presto.py +1 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_snowflake.py +54 -20
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_sqlite.py +93 -2
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_starrocks.py +14 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_tsql.py +4 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/canonicalize.sql +34 -5
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/canonicalize_internal_names.sql +30 -0
- sqlglot-30.25.0/tests/fixtures/optimizer/eliminate_joins.sql +636 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/optimizer.sql +57 -13
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns.sql +70 -2
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +32 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/simplify.sql +6 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +3 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/unnest_subqueries.sql +159 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/helpers.py +6 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_executor.py +11 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_expressions.py +21 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_generator.py +3 -1
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_optimizer.py +494 -42
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_parser.py +12 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_sqlglotc.py +17 -4
- sqlglot-30.24.0/sqlglot.egg-info/scm_version.json +0 -8
- sqlglot-30.24.0/tests/fixtures/optimizer/eliminate_joins.sql +0 -336
- {sqlglot-30.24.0 → sqlglot-30.25.0}/.gitignore +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/.gitmodules +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/.gitpod.yml +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/.pre-commit-config.yaml +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/AGENTS.md +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/CLAUDE.md +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/CONTRIBUTING.md +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/LICENSE +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/MANIFEST.in +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/README.md +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/setup.cfg +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/setup.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/__init__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/__main__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/_typing.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/anonymize.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/__init__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/clickhouse.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/databricks.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/dax.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/doris.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/dremio.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/drill.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/druid.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/dune.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/exasol.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/fabric.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/hive.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/materialize.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/mysql.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/oracle.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/postgres.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/presto.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/prql.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/redshift.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/risingwave.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/singlestore.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/solr.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/spark.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/spark2.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/tableau.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/teradata.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/trino.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/tsql.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/diff.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/errors.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/executor/__init__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/executor/context.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/executor/env.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/executor/python.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/executor/table.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/__init__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/aggregate.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/dml.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/functions.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/json.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/math.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/properties.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/string.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/temporal.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/__init__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/athena.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/dax.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/doris.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/dremio.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/drill.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/druid.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/dune.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/fabric.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/materialize.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/mysql.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/prql.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/redshift.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/risingwave.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/singlestore.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/solr.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/spark.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/spark2.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/starrocks.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/tableau.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/teradata.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/trino.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/helper.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/jsonpath.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/lineage.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/__init__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/helpers.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/journal.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/normalize.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/optimizer.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/qualify.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/qualify_tables.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/__init__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/athena.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/base.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/bigquery.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/databricks.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/dax.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/doris.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/dremio.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/drill.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/druid.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/dune.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/exasol.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/fabric.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/hive.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/materialize.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/mysql.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/presto.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/prql.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/redshift.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/risingwave.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/singlestore.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/snowflake.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/solr.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/spark.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/spark2.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/starrocks.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/tableau.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/teradata.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/trino.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/tsql.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/planner.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/py.typed +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/schema.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/serde.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/time.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/tokens.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/transforms.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/trie.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/__init__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/bigquery.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/clickhouse.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/databricks.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/duckdb.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/hive.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/mysql.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/postgres.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/presto.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/redshift.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/snowflake.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/spark.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/spark2.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/tsql.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.egg-info/SOURCES.txt +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.egg-info/dependency_links.txt +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.egg-info/scm_file_list.json +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.egg-info/top_level.txt +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.png +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglotc/MANIFEST.in +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglotc/setup.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/__init__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/__init__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_dax.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_doris.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_dremio.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_drill.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_druid.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_dune.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_fabric.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_materialize.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_pipe_syntax.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_prql.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_redshift.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_risingwave.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_singlestore.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_solr.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_spark.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_tableau.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_teradata.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_trino.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/identity.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/jsonpath/LICENSE +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/jsonpath/cts.json +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/annotate_functions.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/normalize.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/partial.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/pretty.sql +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/gen_fixtures.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/leakcheck.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/sqlglot/__init__.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_anonymize.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_build.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_dialect_entry_points.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_dialect_imports.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_diff.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_docs.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_errors.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_helper.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_integration_loader.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_jsonpath.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_lineage.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_schema.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_serde.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_time.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_tokens.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_transforms.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_transpile.py +0 -0
- {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_typing.py +0 -0
|
@@ -1,6 +1,86 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
## [v30.24.0] - 2026-10-20
|
|
5
|
+
### :boom: BREAKING CHANGES
|
|
6
|
+
- due to [`094509a`](https://github.com/tobymao/sqlglot/commit/094509aad83fff575f1b4d198e4d03c21c432e58) - merge SortArray into ArraySort with explicit NULL ordering *(PR [#8643](https://github.com/tobymao/sqlglot/pull/8643) by [@tobymao](https://github.com/tobymao))*:
|
|
7
|
+
|
|
8
|
+
merge SortArray into ArraySort with explicit NULL ordering (#8643)
|
|
9
|
+
|
|
10
|
+
- due to [`7af2aa8`](https://github.com/tobymao/sqlglot/commit/7af2aa8db5e9b9df0afea07201574ceeb9e66098) - register CTE reference alias when pivoted *(PR [#8667](https://github.com/tobymao/sqlglot/pull/8667) by [@ansh-rohilla](https://github.com/ansh-rohilla))*:
|
|
11
|
+
|
|
12
|
+
register CTE reference alias when pivoted (#8667)
|
|
13
|
+
|
|
14
|
+
- due to [`1e5c649`](https://github.com/tobymao/sqlglot/commit/1e5c649cc4157bf4451bba1361a3898d9504745b) - map ISO week format patterns IYYY and IW [CLAUDE] *(PR [#8672](https://github.com/tobymao/sqlglot/pull/8672) by [@vidigoat](https://github.com/vidigoat))*:
|
|
15
|
+
|
|
16
|
+
map ISO week format patterns IYYY and IW [CLAUDE] (#8672)
|
|
17
|
+
|
|
18
|
+
- due to [`479c4ca`](https://github.com/tobymao/sqlglot/commit/479c4cae0e38d60d10f4aac833c4091d5c2304e2) - respect dialect precedence of IS predicates *(PR [#8676](https://github.com/tobymao/sqlglot/pull/8676) by [@georgesittas](https://github.com/georgesittas))*:
|
|
19
|
+
|
|
20
|
+
respect dialect precedence of IS predicates (#8676)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
### :sparkles: New Features
|
|
24
|
+
- [`2444b6d`](https://github.com/tobymao/sqlglot/commit/2444b6db78f336b70c6f7aa980e43036367c7b0d) - **optimizer**: paste join support *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
25
|
+
- [`ec24376`](https://github.com/tobymao/sqlglot/commit/ec24376a58200dff16820fddcd15db102b6ead2e) - **starrocks**: parse admin and job-control statements as commands [CLAUDE] *(PR [#8681](https://github.com/tobymao/sqlglot/pull/8681) by [@nytai](https://github.com/nytai))*
|
|
26
|
+
|
|
27
|
+
### :bug: Bug Fixes
|
|
28
|
+
- [`f814e4c`](https://github.com/tobymao/sqlglot/commit/f814e4cb2a8743bba63e8818bae25207bbd3966f) - **mysql**: preserve population and sample aggregate semantics [CODEX] *(PR [#8632](https://github.com/tobymao/sqlglot/pull/8632) by [@yousefissa](https://github.com/yousefissa))*
|
|
29
|
+
- :arrow_lower_right: *fixes issue [#8626](https://github.com/tobymao/sqlglot/issues/8626) opened by [@bhargaviHQ](https://github.com/bhargaviHQ)*
|
|
30
|
+
- [`5527744`](https://github.com/tobymao/sqlglot/commit/552774469174ee686def95e6bcb2da46f61e047b) - **starrocks**: keep DATEDIFF's date-part semantics [CLAUDE] *(PR [#8636](https://github.com/tobymao/sqlglot/pull/8636) by [@nytai](https://github.com/nytai))*
|
|
31
|
+
- [`03744a2`](https://github.com/tobymao/sqlglot/commit/03744a2a8376af5f5f70230b04d1c5fbfb71dc61) - **hive,spark**: parse ALTER TABLE REPLACE COLUMNS [CLAUDE] *(PR [#8633](https://github.com/tobymao/sqlglot/pull/8633) by [@tsamaras](https://github.com/tsamaras))*
|
|
32
|
+
- [`021991f`](https://github.com/tobymao/sqlglot/commit/021991fb9a63060e2f71aeac48e134f67c77227f) - **optimizer**: evict dead refs from the type annotator cache *(PR [#8642](https://github.com/tobymao/sqlglot/pull/8642) by [@georgesittas](https://github.com/georgesittas))*
|
|
33
|
+
- :arrow_lower_right: *fixes issue [#8637](https://github.com/tobymao/sqlglot/issues/8637) opened by [@naveen-baton](https://github.com/naveen-baton)*
|
|
34
|
+
- [`00fce66`](https://github.com/tobymao/sqlglot/commit/00fce66dffd3dba4f90cda5534ec8df595bb1865) - **optimizer**: ensure generated decorrelation JOIN comes before reference in ON clause *(PR [#8638](https://github.com/tobymao/sqlglot/pull/8638) by [@treysp](https://github.com/treysp))*
|
|
35
|
+
- [`97134ff`](https://github.com/tobymao/sqlglot/commit/97134ffd3cd161222a42405b001a8a30a0a2c6f5) - **optimizer**: preserve precedence when unwrapping parens inside Mul *(PR [#8620](https://github.com/tobymao/sqlglot/pull/8620) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
36
|
+
- [`d747f5b`](https://github.com/tobymao/sqlglot/commit/d747f5b20dd71a379437dd3cf251ec130edd94b3) - don't materialize huge interval literals in simplify and the Postgres generator *(PR [#8641](https://github.com/tobymao/sqlglot/pull/8641) by [@tobymao](https://github.com/tobymao))*
|
|
37
|
+
- [`f321207`](https://github.com/tobymao/sqlglot/commit/f321207c8dcc2973d149744fcaa4d1a13edb0026) - **starrocks**: preserve LIKE argument order [CODEX] *(PR [#8645](https://github.com/tobymao/sqlglot/pull/8645) by [@01zhas](https://github.com/01zhas))*
|
|
38
|
+
- [`954cca1`](https://github.com/tobymao/sqlglot/commit/954cca1268ae38ae0384d5197e54fe50322ee9e3) - **starrocks**: preserve native TO_DAYS [CODEX] *(PR [#8648](https://github.com/tobymao/sqlglot/pull/8648) by [@01zhas](https://github.com/01zhas))*
|
|
39
|
+
- [`ce7f6e3`](https://github.com/tobymao/sqlglot/commit/ce7f6e39dbbbaa61ff01a307226ff867a3a9efb6) - **starrocks**: don't treat # as a comment [CLAUDE] *(PR [#8644](https://github.com/tobymao/sqlglot/pull/8644) by [@nytai](https://github.com/nytai))*
|
|
40
|
+
- [`c388227`](https://github.com/tobymao/sqlglot/commit/c388227a73fe4e6652e311db0a04b8d838c7c821) - remove obsolete sqlglotc extensions during builds *(PR [#8653](https://github.com/tobymao/sqlglot/pull/8653) by [@georgesittas](https://github.com/georgesittas))*
|
|
41
|
+
- [`d17c768`](https://github.com/tobymao/sqlglot/commit/d17c7680b70bccb5fda677aaf63980b2663224dc) - **bigquery**: transpile Trino date parts, FROM_BASE, APPROX_PERCENTILE, ARRAY_SORT and ARRAY_DISTINCT *(PR [#8639](https://github.com/tobymao/sqlglot/pull/8639) by [@tobymao](https://github.com/tobymao))*
|
|
42
|
+
- [`cb57d80`](https://github.com/tobymao/sqlglot/commit/cb57d80214bcd4a165194344b34bc930ef5318b8) - **optimizer**: clear child scope caches when projections are merged *(PR [#8646](https://github.com/tobymao/sqlglot/pull/8646) by [@treysp](https://github.com/treysp))*
|
|
43
|
+
- [`b50e43e`](https://github.com/tobymao/sqlglot/commit/b50e43e4407e010d15da9b313ff99df1b1099343) - **clickhouse**: parse PASTE JOIN instead of aliasing the table *(PR [#8662](https://github.com/tobymao/sqlglot/pull/8662) by [@spicysharkco](https://github.com/spicysharkco))*
|
|
44
|
+
- [`7af2aa8`](https://github.com/tobymao/sqlglot/commit/7af2aa8db5e9b9df0afea07201574ceeb9e66098) - **optimizer**: register CTE reference alias when pivoted *(PR [#8667](https://github.com/tobymao/sqlglot/pull/8667) by [@ansh-rohilla](https://github.com/ansh-rohilla))*
|
|
45
|
+
- :arrow_lower_right: *fixes issue [#8663](https://github.com/tobymao/sqlglot/issues/8663) opened by [@rob2244](https://github.com/rob2244)*
|
|
46
|
+
- [`513beed`](https://github.com/tobymao/sqlglot/commit/513beedd3753a22c1ce234059bd5d831f64e48f0) - **teradata**: drop LOCKING request modifier for other dialects instead of crashing [CLAUDE] *(PR [#8666](https://github.com/tobymao/sqlglot/pull/8666) by [@bhuvan-uda](https://github.com/bhuvan-uda))*
|
|
47
|
+
- :arrow_lower_right: *fixes issue [#8665](https://github.com/tobymao/sqlglot/issues/8665) opened by [@bhuvan-uda](https://github.com/bhuvan-uda)*
|
|
48
|
+
- [`9beb4ab`](https://github.com/tobymao/sqlglot/commit/9beb4ab2807839088f3439a2b937d222e598b617) - **transforms**: don't hoist explodes from nested queries in explode_projection_to_unnest [CLAUDE] *(PR [#8664](https://github.com/tobymao/sqlglot/pull/8664) by [@rob2244](https://github.com/rob2244))*
|
|
49
|
+
- :arrow_lower_right: *fixes issue [#8242](https://github.com/tobymao/sqlglot/issues/8242) opened by [@rob2244](https://github.com/rob2244)*
|
|
50
|
+
- [`f8c314c`](https://github.com/tobymao/sqlglot/commit/f8c314c449080860604b9ddd716d6bc75c89155f) - **teradata**: transpile SAMPLE row counts and fractions [CLAUDE] *(PR [#8670](https://github.com/tobymao/sqlglot/pull/8670) by [@bhuvan-uda](https://github.com/bhuvan-uda))*
|
|
51
|
+
- :arrow_lower_right: *fixes issue [#8669](https://github.com/tobymao/sqlglot/issues/8669) opened by [@bhuvan-uda](https://github.com/bhuvan-uda)*
|
|
52
|
+
- [`1e5c649`](https://github.com/tobymao/sqlglot/commit/1e5c649cc4157bf4451bba1361a3898d9504745b) - **postgres**: map ISO week format patterns IYYY and IW [CLAUDE] *(PR [#8672](https://github.com/tobymao/sqlglot/pull/8672) by [@vidigoat](https://github.com/vidigoat))*
|
|
53
|
+
- [`b06ed8e`](https://github.com/tobymao/sqlglot/commit/b06ed8ea3fc5dbf3771f86ee2a44a2134df0ed00) - **starrocks**: don't default column names for multi-array UNNEST [CLAUDE] *(PR [#8671](https://github.com/tobymao/sqlglot/pull/8671) by [@nytai](https://github.com/nytai))*
|
|
54
|
+
- [`9e57e44`](https://github.com/tobymao/sqlglot/commit/9e57e448de90bc273a926e63f77f4fdf788d0fac) - **oracle**: map ISO week-numbering year IYYY to %G [CLAUDE] *(PR [#8675](https://github.com/tobymao/sqlglot/pull/8675) by [@vidigoat](https://github.com/vidigoat))*
|
|
55
|
+
- [`f536a82`](https://github.com/tobymao/sqlglot/commit/f536a8233b4f9aa1efac982dd9d6b098ed3982a4) - **bigquery**: correct percentile and distinct-array transpilation *(PR [#8674](https://github.com/tobymao/sqlglot/pull/8674) by [@georgesittas](https://github.com/georgesittas))*
|
|
56
|
+
- [`e3d0dfb`](https://github.com/tobymao/sqlglot/commit/e3d0dfb2279d390dfed6e86cc353ed65cb2b97bb) - **optimizer**: give order aliases independent expression nodes *(PR [#8678](https://github.com/tobymao/sqlglot/pull/8678) by [@georgesittas](https://github.com/georgesittas))*
|
|
57
|
+
- [`40dcaab`](https://github.com/tobymao/sqlglot/commit/40dcaabdd29a6c3cda7f4ce29dedcdcffa3e49a0) - **starrocks**: generate PIVOT instead of dropping it [CLAUDE] *(PR [#8679](https://github.com/tobymao/sqlglot/pull/8679) by [@nytai](https://github.com/nytai))*
|
|
58
|
+
- [`fdd0e9a`](https://github.com/tobymao/sqlglot/commit/fdd0e9a464f0f9ec425c56ae83fc87a5e2052087) - **mysql**: relative xor/or/and precedence closes [#8684](https://github.com/tobymao/sqlglot/pull/8684) *(PR [#8686](https://github.com/tobymao/sqlglot/pull/8686) by [@georgesittas](https://github.com/georgesittas))*
|
|
59
|
+
- :arrow_lower_right: *fixes issue [#8684](https://github.com/tobymao/sqlglot/issues/8684) opened by [@pbottine](https://github.com/pbottine)*
|
|
60
|
+
- [`8955d75`](https://github.com/tobymao/sqlglot/commit/8955d752acc88ee23955dd6e07d567542a8cfaf8) - **mysql**: preserve exclamation mark operator precedence *(PR [#8687](https://github.com/tobymao/sqlglot/pull/8687) by [@georgesittas](https://github.com/georgesittas))*
|
|
61
|
+
- :arrow_lower_right: *fixes issue [#8683](https://github.com/tobymao/sqlglot/issues/8683) opened by [@pbottine](https://github.com/pbottine)*
|
|
62
|
+
- [`b1fd4e9`](https://github.com/tobymao/sqlglot/commit/b1fd4e9edf05ee6211656c235a62040e0f055bf0) - **mysql**: respect bitwise operator precedence *(PR [#8688](https://github.com/tobymao/sqlglot/pull/8688) by [@georgesittas](https://github.com/georgesittas))*
|
|
63
|
+
- :arrow_lower_right: *fixes issue [#8685](https://github.com/tobymao/sqlglot/issues/8685) opened by [@pbottine](https://github.com/pbottine)*
|
|
64
|
+
- [`fc1472a`](https://github.com/tobymao/sqlglot/commit/fc1472a0d54c4e8d0d6700b0a4dbe66f0f32707b) - **starrocks**: parse map{...} literals as maps [CLAUDE] *(PR [#8682](https://github.com/tobymao/sqlglot/pull/8682) by [@nytai](https://github.com/nytai))*
|
|
65
|
+
- [`115ce02`](https://github.com/tobymao/sqlglot/commit/115ce02b002ed63ff23a4c99a24ad025ec1efbb4) - **starrocks**: infer static pivot output columns [CODEX] *(PR [#8689](https://github.com/tobymao/sqlglot/pull/8689) by [@georgesittas](https://github.com/georgesittas))*
|
|
66
|
+
- [`479c4ca`](https://github.com/tobymao/sqlglot/commit/479c4cae0e38d60d10f4aac833c4091d5c2304e2) - **parser**: respect dialect precedence of IS predicates *(PR [#8676](https://github.com/tobymao/sqlglot/pull/8676) by [@georgesittas](https://github.com/georgesittas))*
|
|
67
|
+
- :arrow_lower_right: *fixes issue [#8661](https://github.com/tobymao/sqlglot/issues/8661) opened by [@laravioli](https://github.com/laravioli)*
|
|
68
|
+
- [`7e4d995`](https://github.com/tobymao/sqlglot/commit/7e4d995f75dac9fb6ed110109b80bf12f24cdea5) - **clickhouse**: stop re-wrapping parenthesized CTAS queries with COMMENT [CLAUDE] *(PR [#8698](https://github.com/tobymao/sqlglot/pull/8698) by [@vidigoat](https://github.com/vidigoat))*
|
|
69
|
+
- [`d44db25`](https://github.com/tobymao/sqlglot/commit/d44db25a534d86ba593958dd0cc533f8310daef0) - **parser**: support PARTITION BY EXCLUDING *(PR [#8690](https://github.com/tobymao/sqlglot/pull/8690) by [@geooo109](https://github.com/geooo109))*
|
|
70
|
+
- [`2d3d3ff`](https://github.com/tobymao/sqlglot/commit/2d3d3ff7b8b8b475a68d70ffe3529ac110c96f4b) - **fabric**: don't re-wrap AT TIME ZONE that is already cast to DATETIME2 [CLAUDE] *(PR [#8699](https://github.com/tobymao/sqlglot/pull/8699) by [@vidigoat](https://github.com/vidigoat))*
|
|
71
|
+
- [`68cd4a2`](https://github.com/tobymao/sqlglot/commit/68cd4a2d8f766132e338721df8676e0b42d6b7ca) - **duckdb**: quote identifiers that are DuckDB reserved keywords [CLAUDE] *(PR [#8700](https://github.com/tobymao/sqlglot/pull/8700) by [@vidigoat](https://github.com/vidigoat))*
|
|
72
|
+
- [`55bff61`](https://github.com/tobymao/sqlglot/commit/55bff6129f36820c78efccf920c877443dc7fb70) - **optimizer**: retain nodes in type annotation caches *(PR [#8691](https://github.com/tobymao/sqlglot/pull/8691) by [@georgesittas](https://github.com/georgesittas))*
|
|
73
|
+
- [`5d588c0`](https://github.com/tobymao/sqlglot/commit/5d588c0f32d17a08191898638f67ff27bb0a13ff) - **optimizer**: preserve unsupported struct star operands *(PR [#8692](https://github.com/tobymao/sqlglot/pull/8692) by [@georgesittas](https://github.com/georgesittas))*
|
|
74
|
+
|
|
75
|
+
### :recycle: Refactors
|
|
76
|
+
- [`094509a`](https://github.com/tobymao/sqlglot/commit/094509aad83fff575f1b4d198e4d03c21c432e58) - merge SortArray into ArraySort with explicit NULL ordering *(PR [#8643](https://github.com/tobymao/sqlglot/pull/8643) by [@tobymao](https://github.com/tobymao))*
|
|
77
|
+
|
|
78
|
+
### :wrench: Chores
|
|
79
|
+
- [`cd41eee`](https://github.com/tobymao/sqlglot/commit/cd41eeef32e13db1a2517d0a0dc5432ec2b89eb5) - refactor starrocks tests for LIKE *(commit by [@geooo109](https://github.com/geooo109))*
|
|
80
|
+
- [`af2b577`](https://github.com/tobymao/sqlglot/commit/af2b57734d67082ecc4db97cb5da1e8743918af0) - simplify starrocks tests *(commit by [@geooo109](https://github.com/geooo109))*
|
|
81
|
+
- [`df5b53f`](https://github.com/tobymao/sqlglot/commit/df5b53f92e31247e82bc37a512fab0abd4b54031) - refactor starrocks TO_DAYS test *(commit by [@geooo109](https://github.com/geooo109))*
|
|
82
|
+
|
|
83
|
+
|
|
4
84
|
## [v30.23.0] - 2026-10-14
|
|
5
85
|
### :boom: BREAKING CHANGES
|
|
6
86
|
- due to [`cf39265`](https://github.com/tobymao/sqlglot/commit/cf39265a3e8efd8c32bab7f9c9b4f123fdfbf682) - hash flag for case-sensitive nodes [CLAUDE] *(PR [#8599](https://github.com/tobymao/sqlglot/pull/8599) by [@laravioli](https://github.com/laravioli))*:
|
|
@@ -16304,3 +16384,4 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
|
|
|
16304
16384
|
[v30.21.0]: https://github.com/tobymao/sqlglot/compare/v30.20.0...v30.21.0
|
|
16305
16385
|
[v30.22.0]: https://github.com/tobymao/sqlglot/compare/v30.21.0...v30.22.0
|
|
16306
16386
|
[v30.23.0]: https://github.com/tobymao/sqlglot/compare/v30.22.0...v30.23.0
|
|
16387
|
+
[v30.24.0]: https://github.com/tobymao/sqlglot/compare/v30.23.0...v30.24.0
|
|
@@ -48,14 +48,24 @@ PY_GE_310 := $(shell python -c "import sys; print(int(sys.version_info >= (3, 10
|
|
|
48
48
|
|
|
49
49
|
install-devc:
|
|
50
50
|
@if [ "$(PY_GE_310)" = "1" ]; then \
|
|
51
|
-
|
|
51
|
+
echo "Building sqlglotc (log: .sqlglotc-build.log)"; \
|
|
52
|
+
(cd sqlglotc && MYPYC_OPT=0 python setup.py build_ext --inplace -j $(NPROC)) > .sqlglotc-build.log 2>&1 || { \
|
|
53
|
+
status=$$?; \
|
|
54
|
+
echo "sqlglotc build failed. See .sqlglotc-build.log for details." >&2; \
|
|
55
|
+
exit $$status; \
|
|
56
|
+
}; \
|
|
52
57
|
else \
|
|
53
58
|
echo "Skipping sqlglotc build: requires Python 3.10+"; \
|
|
54
59
|
fi
|
|
55
60
|
|
|
56
61
|
install-devc-release: clean
|
|
57
62
|
@if [ "$(PY_GE_310)" = "1" ]; then \
|
|
58
|
-
|
|
63
|
+
echo "Building sqlglotc (log: .sqlglotc-build.log)"; \
|
|
64
|
+
(cd sqlglotc && python setup.py build_ext --inplace -j $(NPROC)) > .sqlglotc-build.log 2>&1 || { \
|
|
65
|
+
status=$$?; \
|
|
66
|
+
echo "sqlglotc build failed. See .sqlglotc-build.log for details." >&2; \
|
|
67
|
+
exit $$status; \
|
|
68
|
+
}; \
|
|
59
69
|
else \
|
|
60
70
|
echo "Skipping sqlglotc build: requires Python 3.10+"; \
|
|
61
71
|
fi
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlglot
|
|
3
|
-
Version: 30.
|
|
3
|
+
Version: 30.25.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
|
|
@@ -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.25.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.25.0; python_version >= "3.10" and extra == "rs"
|
|
41
41
|
Dynamic: license-file
|
|
42
42
|
Dynamic: provides-extra
|
|
43
43
|
|
|
@@ -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.25.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (30, 25, 0)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g9d2966ed3'
|
|
@@ -75,33 +75,56 @@ class Athena(Trino):
|
|
|
75
75
|
self._trino_tokenizer = _TrinoTokenizer(Trino())
|
|
76
76
|
|
|
77
77
|
def tokenize(self, sql: str) -> list[Token]:
|
|
78
|
+
# DML only needs Trino's tokenizer; possible Hive statements need disambiguation.
|
|
79
|
+
try:
|
|
80
|
+
trino_tokens: list[Token] | None = self._trino_tokenizer.tokenize(sql)
|
|
81
|
+
except TokenError:
|
|
82
|
+
trino_tokens = None
|
|
83
|
+
|
|
84
|
+
if trino_tokens is not None and not _may_be_hive(trino_tokens):
|
|
85
|
+
return trino_tokens
|
|
86
|
+
|
|
78
87
|
try:
|
|
79
88
|
tokens = super().tokenize(sql)
|
|
80
89
|
except TokenError:
|
|
81
90
|
# Combined rules can reject literals valid in only one engine.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return [Token(TokenType.HIVE_TOKEN_STREAM, "")] + tokens if hive else tokens
|
|
91
|
+
if trino_tokens is not None and not _tokenize_as_hive(trino_tokens):
|
|
92
|
+
return trino_tokens
|
|
93
|
+
|
|
94
|
+
try:
|
|
95
|
+
tokens = self._hive_tokenizer.tokenize(sql)
|
|
96
|
+
except TokenError:
|
|
97
|
+
pass
|
|
98
|
+
else:
|
|
99
|
+
if _tokenize_as_hive(tokens):
|
|
100
|
+
return [Token(TokenType.HIVE_TOKEN_STREAM, "")] + tokens
|
|
93
101
|
raise
|
|
94
102
|
|
|
95
103
|
if _tokenize_as_hive(tokens):
|
|
96
104
|
return [Token(TokenType.HIVE_TOKEN_STREAM, "")] + self._hive_tokenizer.tokenize(sql)
|
|
97
105
|
|
|
98
|
-
return self._trino_tokenizer.tokenize(sql)
|
|
106
|
+
return trino_tokens if trino_tokens is not None else self._trino_tokenizer.tokenize(sql)
|
|
99
107
|
|
|
100
108
|
Parser = AthenaParser
|
|
101
109
|
|
|
102
110
|
Generator = AthenaGenerator
|
|
103
111
|
|
|
104
112
|
|
|
113
|
+
_MAYBE_HIVE_TOKENS = {
|
|
114
|
+
TokenType.ALTER,
|
|
115
|
+
TokenType.CREATE,
|
|
116
|
+
TokenType.DESCRIBE,
|
|
117
|
+
TokenType.DROP,
|
|
118
|
+
TokenType.SHOW,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _may_be_hive(tokens: list[Token]) -> bool:
|
|
123
|
+
return bool(tokens) and (
|
|
124
|
+
tokens[0].token_type in _MAYBE_HIVE_TOKENS or tokens[0].text.upper() == "MSCK"
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
|
|
105
128
|
def _tokenize_as_hive(tokens: list[Token]) -> bool:
|
|
106
129
|
if len(tokens) < 2:
|
|
107
130
|
return False
|
|
@@ -36,6 +36,7 @@ class BigQuery(Dialect):
|
|
|
36
36
|
ANNOTATE_ALL_SCOPES = True
|
|
37
37
|
PROJECTION_ALIASES_SHADOW_SOURCE_NAMES = True
|
|
38
38
|
TABLES_REFERENCEABLE_AS_COLUMNS = True
|
|
39
|
+
TABLE_ALIASES_SHADOW_COLUMN_NAMES = True
|
|
39
40
|
SUPPORTS_STRUCT_STAR_EXPANSION = True
|
|
40
41
|
EXCLUDES_PSEUDOCOLUMNS_FROM_STAR = True
|
|
41
42
|
QUERY_RESULTS_ARE_STRUCTS = True
|
|
@@ -59,6 +59,10 @@ DATETIME_DELTA = t.Union[
|
|
|
59
59
|
]
|
|
60
60
|
DATETIME_ADD = (exp.DateAdd, exp.TimeAdd, exp.DatetimeAdd, exp.TsOrDsAdd, exp.TimestampAdd)
|
|
61
61
|
|
|
62
|
+
# JSON paths that need parentheses when used as the right operand of -> / ->>.
|
|
63
|
+
# CONCAT may be generated as a chain of || operators, which would bind looser than the arrow
|
|
64
|
+
WRAPPED_JSON_PATH_EXPRESSIONS = (exp.Binary, exp.Predicate, exp.Not, exp.Concat)
|
|
65
|
+
|
|
62
66
|
if t.TYPE_CHECKING:
|
|
63
67
|
from sqlglot._typing import B, E, F, GeneratorArgs, ParserArgs, BuilderArgs
|
|
64
68
|
from typing_extensions import Unpack
|
|
@@ -635,6 +639,11 @@ class Dialect(metaclass=_Dialect):
|
|
|
635
639
|
with "custom_fields" in GROUP BY/HAVING.
|
|
636
640
|
"""
|
|
637
641
|
|
|
642
|
+
TABLE_ALIASES_SHADOW_COLUMN_NAMES = False
|
|
643
|
+
"""
|
|
644
|
+
Whether a whole-row reference to a table alias takes precedence over a same-named column.
|
|
645
|
+
"""
|
|
646
|
+
|
|
638
647
|
TABLES_REFERENCEABLE_AS_COLUMNS = False
|
|
639
648
|
"""
|
|
640
649
|
Whether table names can be referenced as columns (treated as structs).
|
|
@@ -1357,7 +1366,7 @@ def arrow_json_extract_sql(
|
|
|
1357
1366
|
if self.JSON_TYPE_REQUIRED_FOR_EXTRACTION and isinstance(this, exp.Literal) and this.is_string:
|
|
1358
1367
|
this.replace(exp.cast(this, exp.DType.JSON))
|
|
1359
1368
|
|
|
1360
|
-
if isinstance(expression.expression,
|
|
1369
|
+
if isinstance(expression.expression, WRAPPED_JSON_PATH_EXPRESSIONS):
|
|
1361
1370
|
expression.set("expression", exp.paren(expression.expression, copy=False))
|
|
1362
1371
|
|
|
1363
1372
|
op = op or ("->" if isinstance(expression, exp.JSONExtract) else "->>")
|
|
@@ -1608,7 +1617,11 @@ def generate_series_sql(
|
|
|
1608
1617
|
if expression.args.get("is_end_exclusive"):
|
|
1609
1618
|
if exclusive_func_name:
|
|
1610
1619
|
return self.func(exclusive_func_name, start, end, step)
|
|
1611
|
-
|
|
1620
|
+
# The last value is one before the end in the direction of the step
|
|
1621
|
+
if step and step.is_int and t.cast(int, step.to_py()) < 0:
|
|
1622
|
+
adjusted_end: exp.Expr = exp.Add(this=end, expression=exp.Literal.number(1))
|
|
1623
|
+
else:
|
|
1624
|
+
adjusted_end = exp.Sub(this=end, expression=exp.Literal.number(1))
|
|
1612
1625
|
return self.func(func_name, start, adjusted_end, step)
|
|
1613
1626
|
|
|
1614
1627
|
return self.func(func_name, start, end, step)
|
|
@@ -2704,9 +2717,13 @@ def no_make_interval_sql(self: Generator, expression: exp.MakeInterval, sep: str
|
|
|
2704
2717
|
if isinstance(value, exp.Kwarg):
|
|
2705
2718
|
value = value.expression
|
|
2706
2719
|
|
|
2707
|
-
|
|
2720
|
+
if value is None:
|
|
2721
|
+
continue
|
|
2722
|
+
|
|
2723
|
+
value_sql = value.name if value.is_string else self.sql(value)
|
|
2724
|
+
args.append(f"{value_sql} {unit}")
|
|
2708
2725
|
|
|
2709
|
-
return f"INTERVAL
|
|
2726
|
+
return f"INTERVAL {self.sql(exp.Literal.string(self.format_args(*args, sep=sep)))}"
|
|
2710
2727
|
|
|
2711
2728
|
|
|
2712
2729
|
def length_or_char_length_sql(self: Generator, expression: exp.Length) -> str:
|
|
@@ -24,6 +24,7 @@ class DuckDB(Dialect):
|
|
|
24
24
|
SUPPORTS_LIMIT_ALL = True
|
|
25
25
|
SUPPORTS_FIXED_SIZE_ARRAYS = True
|
|
26
26
|
TABLES_REFERENCEABLE_AS_COLUMNS = True
|
|
27
|
+
QUERY_RESULTS_ARE_STRUCTS = True
|
|
27
28
|
STRICT_JSON_PATH_SYNTAX = False
|
|
28
29
|
NUMBERS_CAN_BE_UNDERSCORE_SEPARATED = True
|
|
29
30
|
UUID_IS_STRING_TYPE = False
|
|
@@ -94,8 +95,10 @@ class DuckDB(Dialect):
|
|
|
94
95
|
"BITSTRING": TokenType.BIT,
|
|
95
96
|
"BPCHAR": TokenType.TEXT,
|
|
96
97
|
"CHAR": TokenType.TEXT,
|
|
98
|
+
"CONNECT": TokenType.CONNECT,
|
|
97
99
|
"DATETIME": TokenType.TIMESTAMPNTZ,
|
|
98
100
|
"DETACH": TokenType.DETACH,
|
|
101
|
+
"DISCONNECT": TokenType.DISCONNECT,
|
|
99
102
|
"FORCE": TokenType.FORCE,
|
|
100
103
|
"INSTALL": TokenType.INSTALL,
|
|
101
104
|
"INT8": TokenType.BIGINT,
|
|
@@ -38,6 +38,7 @@ class Snowflake(Dialect):
|
|
|
38
38
|
# https://docs.snowflake.com/en/sql-reference/functions/split_to_table
|
|
39
39
|
DEFAULT_FUNCTIONS_COLUMN_NAMES = {
|
|
40
40
|
exp.SplitToTable: ("seq", "index", "value"),
|
|
41
|
+
exp.StrtokSplitToTable: ("seq", "index", "value"),
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
EXPRESSION_METADATA = EXPRESSION_METADATA.copy()
|
|
@@ -33,8 +33,12 @@ class SQLite(Dialect):
|
|
|
33
33
|
**tokens.Tokenizer.KEYWORDS,
|
|
34
34
|
"ATTACH": TokenType.ATTACH,
|
|
35
35
|
"DETACH": TokenType.DETACH,
|
|
36
|
+
# REAL, FLOAT and DOUBLE are all 8-byte IEEE floats in SQLite (REAL affinity),
|
|
37
|
+
# so they must not become a 4-byte float in dialects where REAL/FLOAT means FLOAT4
|
|
38
|
+
"FLOAT": TokenType.DOUBLE,
|
|
36
39
|
"INDEXED BY": TokenType.INDEXED_BY,
|
|
37
40
|
"MATCH": TokenType.MATCH,
|
|
41
|
+
"REAL": TokenType.DOUBLE,
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
KEYWORDS.pop("/*+")
|
|
@@ -25,10 +25,18 @@ class StarRocks(MySQL):
|
|
|
25
25
|
|
|
26
26
|
KEYWORDS = {
|
|
27
27
|
**MySQL.Tokenizer.KEYWORDS,
|
|
28
|
+
"ADD BACKEND BLACKLIST": TokenType.COMMAND,
|
|
29
|
+
"ADD COMPUTE NODE BLACKLIST": TokenType.COMMAND,
|
|
30
|
+
"ADD SQL DIGEST BLACKLIST": TokenType.COMMAND,
|
|
31
|
+
"ADD SQLBLACKLIST": TokenType.COMMAND,
|
|
28
32
|
"ADMIN": TokenType.COMMAND,
|
|
29
33
|
"BACKUP": TokenType.COMMAND,
|
|
30
34
|
"CANCEL": TokenType.COMMAND,
|
|
31
35
|
"DEALLOCATE": TokenType.COMMAND,
|
|
36
|
+
"DELETE BACKEND BLACKLIST": TokenType.COMMAND,
|
|
37
|
+
"DELETE COMPUTE NODE BLACKLIST": TokenType.COMMAND,
|
|
38
|
+
"DELETE SQL DIGEST BLACKLIST": TokenType.COMMAND,
|
|
39
|
+
"DELETE SQLBLACKLIST": TokenType.COMMAND,
|
|
32
40
|
"EXPORT": TokenType.COMMAND,
|
|
33
41
|
"HLL": TokenType.HLLSKETCH,
|
|
34
42
|
"INSTALL": TokenType.COMMAND,
|
|
@@ -40,6 +48,7 @@ class StarRocks(MySQL):
|
|
|
40
48
|
"RESUME": TokenType.COMMAND,
|
|
41
49
|
"STOP": TokenType.COMMAND,
|
|
42
50
|
"SUBMIT": TokenType.COMMAND,
|
|
51
|
+
"TRANSLATE TRINO": TokenType.COMMAND,
|
|
43
52
|
"UNINSTALL": TokenType.COMMAND,
|
|
44
53
|
}
|
|
45
54
|
KEYWORDS.pop("IGNORE")
|
|
@@ -254,6 +254,10 @@ class SplitToTable(Expression, Func, UDTF):
|
|
|
254
254
|
arg_types = {"this": True, "expression": True}
|
|
255
255
|
|
|
256
256
|
|
|
257
|
+
class StrtokSplitToTable(Expression, Func, UDTF):
|
|
258
|
+
arg_types = {"this": True, "expression": False}
|
|
259
|
+
|
|
260
|
+
|
|
257
261
|
class Stack(Expression, Func, UDTF):
|
|
258
262
|
arg_types = {"this": True, "expressions": True}
|
|
259
263
|
is_var_len_args = True
|
|
@@ -921,7 +921,7 @@ def replace_placeholders(expression: Expr, *args: object, **kwargs: t.Any) -> Ex
|
|
|
921
921
|
def _replace_placeholders(node: Expr, args: Iterator[object], **kwargs: object) -> Expr:
|
|
922
922
|
if isinstance(node, Placeholder):
|
|
923
923
|
if node.this:
|
|
924
|
-
new_name = kwargs.get(node.
|
|
924
|
+
new_name = kwargs.get(node.name)
|
|
925
925
|
if new_name is not None:
|
|
926
926
|
return _replace_placeholder(node, convert(new_name))
|
|
927
927
|
else:
|
|
@@ -161,7 +161,7 @@ class OnUpdateColumnConstraint(Expression, ColumnConstraintKind):
|
|
|
161
161
|
|
|
162
162
|
|
|
163
163
|
class PrimaryKeyColumnConstraint(Expression, ColumnConstraintKind):
|
|
164
|
-
arg_types = {"desc": False, "options": False}
|
|
164
|
+
arg_types = {"desc": False, "options": False, "include": False}
|
|
165
165
|
|
|
166
166
|
|
|
167
167
|
class TitleColumnConstraint(Expression, ColumnConstraintKind):
|
|
@@ -175,6 +175,7 @@ class UniqueColumnConstraint(Expression, ColumnConstraintKind):
|
|
|
175
175
|
"on_conflict": False,
|
|
176
176
|
"nulls": False,
|
|
177
177
|
"options": False,
|
|
178
|
+
"include": False,
|
|
178
179
|
}
|
|
179
180
|
|
|
180
181
|
|
|
@@ -1734,13 +1734,13 @@ class Column(Expression, Condition):
|
|
|
1734
1734
|
return self.name
|
|
1735
1735
|
|
|
1736
1736
|
@property
|
|
1737
|
-
def parts(self) -> list[
|
|
1737
|
+
def parts(self) -> list[Expr]:
|
|
1738
1738
|
"""Return the parts of a column in order catalog, db, table, name."""
|
|
1739
1739
|
return [
|
|
1740
1740
|
self.args[part] for part in ("catalog", "db", "table", "this") if self.args.get(part)
|
|
1741
1741
|
]
|
|
1742
1742
|
|
|
1743
|
-
def to_dot(self, include_dots: bool = True) ->
|
|
1743
|
+
def to_dot(self, include_dots: bool = True) -> Expr:
|
|
1744
1744
|
"""Converts the column into a dot expression."""
|
|
1745
1745
|
parts = self.parts
|
|
1746
1746
|
parent = self.parent
|
|
@@ -3071,7 +3071,7 @@ def alias_(
|
|
|
3071
3071
|
|
|
3072
3072
|
@t.overload
|
|
3073
3073
|
def column(
|
|
3074
|
-
col: str |
|
|
3074
|
+
col: str | Expr,
|
|
3075
3075
|
table: str | Identifier | None = None,
|
|
3076
3076
|
db: str | Identifier | None = None,
|
|
3077
3077
|
catalog: str | Identifier | None = None,
|
|
@@ -3085,7 +3085,7 @@ def column(
|
|
|
3085
3085
|
|
|
3086
3086
|
@t.overload
|
|
3087
3087
|
def column(
|
|
3088
|
-
col: str |
|
|
3088
|
+
col: str | Expr,
|
|
3089
3089
|
table: str | Identifier | None = None,
|
|
3090
3090
|
db: str | Identifier | None = None,
|
|
3091
3091
|
catalog: str | Identifier | None = None,
|
|
@@ -3111,19 +3111,18 @@ def column(
|
|
|
3111
3111
|
Build a Column.
|
|
3112
3112
|
|
|
3113
3113
|
Args:
|
|
3114
|
-
col: Column name.
|
|
3114
|
+
col: Column name or expression.
|
|
3115
3115
|
table: Table name.
|
|
3116
3116
|
db: Database name.
|
|
3117
3117
|
catalog: Catalog name.
|
|
3118
3118
|
fields: Additional fields using dots.
|
|
3119
3119
|
quoted: Whether to force quotes on the column's identifiers.
|
|
3120
|
-
copy: Whether to copy
|
|
3120
|
+
copy: Whether to copy expressions if passed in.
|
|
3121
3121
|
|
|
3122
3122
|
Returns:
|
|
3123
3123
|
The new Column instance.
|
|
3124
3124
|
"""
|
|
3125
|
-
if
|
|
3126
|
-
col = to_identifier(col, quoted=quoted, copy=copy)
|
|
3125
|
+
col = maybe_copy(col, copy) if isinstance(col, Expr) else to_identifier(col, quoted=quoted)
|
|
3127
3126
|
|
|
3128
3127
|
this: Column | Dot = Column(
|
|
3129
3128
|
this=col,
|
|
@@ -461,7 +461,9 @@ class IntervalSpan(DataType):
|
|
|
461
461
|
|
|
462
462
|
|
|
463
463
|
class Interval(_TimeUnit):
|
|
464
|
-
|
|
464
|
+
# fraction_in_string: a fractional amount was written with its unit in one string, e.g.
|
|
465
|
+
# INTERVAL '1.5 DAY', which differs from INTERVAL '1.5' DAY in e.g. DuckDB and Postgres
|
|
466
|
+
arg_types = {"this": False, "unit": False, "fraction_in_string": False}
|
|
465
467
|
|
|
466
468
|
|
|
467
469
|
DATA_TYPE = t.Union[str, Identifier, Dot, DataType, DType]
|
|
@@ -131,6 +131,14 @@ class Describe(Expression):
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
|
|
134
|
+
class ConnectTo(Expression):
|
|
135
|
+
pass
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class Disconnect(Expression):
|
|
139
|
+
arg_types = {}
|
|
140
|
+
|
|
141
|
+
|
|
134
142
|
class Attach(Expression):
|
|
135
143
|
arg_types = {"this": True, "exists": False, "expressions": False}
|
|
136
144
|
|
|
@@ -663,7 +663,7 @@ class GroupingSets(Expression):
|
|
|
663
663
|
|
|
664
664
|
|
|
665
665
|
class Lambda(Expression):
|
|
666
|
-
arg_types = {"this": True, "expressions": True
|
|
666
|
+
arg_types = {"this": True, "expressions": True}
|
|
667
667
|
|
|
668
668
|
|
|
669
669
|
class Limit(Expression):
|
|
@@ -699,8 +699,9 @@ class Join(Expression):
|
|
|
699
699
|
"method": False,
|
|
700
700
|
"global_": False,
|
|
701
701
|
"hint": False,
|
|
702
|
-
"match_condition": False,
|
|
703
|
-
"
|
|
702
|
+
"match_condition": False,
|
|
703
|
+
"nearest": False,
|
|
704
|
+
"directed": False,
|
|
704
705
|
"expressions": False,
|
|
705
706
|
"pivots": False,
|
|
706
707
|
}
|
|
@@ -817,6 +818,10 @@ class Join(Expression):
|
|
|
817
818
|
return join
|
|
818
819
|
|
|
819
820
|
|
|
821
|
+
class Nearest(Expression):
|
|
822
|
+
arg_types = {"this": True, "count": True, "approximate": False, "similarity": False}
|
|
823
|
+
|
|
824
|
+
|
|
820
825
|
class Lateral(Expression, UDTF):
|
|
821
826
|
arg_types = {
|
|
822
827
|
"this": True,
|