sqlglot 27.7.0__tar.gz → 27.8.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-27.7.0 → sqlglot-27.8.0}/CHANGELOG.md +131 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/PKG-INFO +2 -2
- {sqlglot-27.7.0 → sqlglot-27.8.0}/README.md +1 -1
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/_version.py +16 -3
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/bigquery.py +17 -3
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/databricks.py +5 -1
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/dialect.py +72 -23
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/dremio.py +29 -8
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/duckdb.py +7 -40
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/exasol.py +5 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/mysql.py +0 -15
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/presto.py +0 -2
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/singlestore.py +94 -1
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/spark.py +6 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/trino.py +1 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/expressions.py +28 -3
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/generator.py +6 -1
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/jsonpath.py +10 -3
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/parser.py +15 -1
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.egg-info/PKG-INFO +2 -2
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_bigquery.py +6 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_databricks.py +13 -1
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_dialect.py +144 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_dremio.py +35 -2
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_exasol.py +2 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_singlestore.py +88 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_trino.py +16 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/annotate_functions.sql +56 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/.gitignore +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/.gitpod.yml +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/.pre-commit-config.yaml +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/CONTRIBUTING.md +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/LICENSE +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/MANIFEST.in +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/Makefile +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/pyproject.toml +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/setup.cfg +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/setup.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/__init__.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/__main__.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/_typing.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/__init__.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/athena.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/clickhouse.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/doris.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/drill.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/druid.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/dune.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/fabric.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/hive.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/materialize.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/oracle.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/postgres.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/prql.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/redshift.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/risingwave.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/snowflake.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/spark2.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/sqlite.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/starrocks.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/tableau.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/teradata.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/tsql.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/diff.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/errors.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/executor/__init__.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/executor/context.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/executor/env.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/executor/python.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/executor/table.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/helper.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/lineage.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/__init__.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/annotate_types.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/canonicalize.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/normalize.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/optimize_joins.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/optimizer.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/qualify.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/qualify_columns.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/qualify_tables.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/scope.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/simplify.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/planner.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/py.typed +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/schema.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/serde.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/time.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/tokens.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/transforms.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/trie.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.egg-info/SOURCES.txt +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.egg-info/dependency_links.txt +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.egg-info/requires.txt +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.egg-info/top_level.txt +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.png +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/Cargo.lock +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/Cargo.toml +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/benches/dialect_settings.json +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/benches/long.rs +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/benches/token_type_settings.json +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/benches/tokenizer_dialect_settings.json +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/benches/tokenizer_settings.json +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/pyproject.toml +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/src/lib.rs +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/src/settings.rs +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/src/token.rs +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/src/tokenizer.rs +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/src/trie.rs +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/__init__.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/__init__.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_athena.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_clickhouse.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_doris.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_drill.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_druid.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_duckdb.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_dune.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_fabric.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_hive.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_materialize.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_mysql.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_oracle.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_pipe_syntax.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_postgres.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_presto.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_prql.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_redshift.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_risingwave.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_snowflake.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_spark.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_sqlite.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_starrocks.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_tableau.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_teradata.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_tsql.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/identity.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/jsonpath/LICENSE +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/jsonpath/cts.json +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/normalize.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/simplify.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/partial.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/pretty.sql +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/gen_fixtures.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/helpers.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_build.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_dialect_imports.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_diff.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_docs.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_executor.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_expressions.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_generator.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_helper.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_jsonpath.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_lineage.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_optimizer.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_parser.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_schema.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_serde.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_time.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_tokens.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_transforms.py +0 -0
- {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_transpile.py +0 -0
|
@@ -1,6 +1,136 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
## [v27.7.0] - 2025-08-13
|
|
5
|
+
### :boom: BREAKING CHANGES
|
|
6
|
+
- due to [`938f4b6`](https://github.com/tobymao/sqlglot/commit/938f4b6ebc1c0d26bd3c1400883978c79a435189) - annotate type for LAST_DAY *(PR [#5528](https://github.com/tobymao/sqlglot/pull/5528) by [@geooo109](https://github.com/geooo109))*:
|
|
7
|
+
|
|
8
|
+
annotate type for LAST_DAY (#5528)
|
|
9
|
+
|
|
10
|
+
- due to [`7d12dac`](https://github.com/tobymao/sqlglot/commit/7d12dac613ba5119334408f2c52cb270067156d9) - annotate type for bigquery GENERATE_TIMESTAMP_ARRAY *(PR [#5529](https://github.com/tobymao/sqlglot/pull/5529) by [@geooo109](https://github.com/geooo109))*:
|
|
11
|
+
|
|
12
|
+
annotate type for bigquery GENERATE_TIMESTAMP_ARRAY (#5529)
|
|
13
|
+
|
|
14
|
+
- due to [`d50ebe2`](https://github.com/tobymao/sqlglot/commit/d50ebe286dd8e2836b9eb2a3406f15976db3aa05) - annotate type for bigquery TIME_TRUNC *(PR [#5530](https://github.com/tobymao/sqlglot/pull/5530) by [@geooo109](https://github.com/geooo109))*:
|
|
15
|
+
|
|
16
|
+
annotate type for bigquery TIME_TRUNC (#5530)
|
|
17
|
+
|
|
18
|
+
- due to [`29748be`](https://github.com/tobymao/sqlglot/commit/29748be7dfc10edc9f29665c98327883dd25c13d) - annotate type for bigquery TIME *(PR [#5531](https://github.com/tobymao/sqlglot/pull/5531) by [@geooo109](https://github.com/geooo109))*:
|
|
19
|
+
|
|
20
|
+
annotate type for bigquery TIME (#5531)
|
|
21
|
+
|
|
22
|
+
- due to [`7003b3f`](https://github.com/tobymao/sqlglot/commit/7003b3fa39cd455e3643066364696708d1ac4f38) - parse and annotate type for bigquery DATE_FROM_UNIX_DATE *(PR [#5532](https://github.com/tobymao/sqlglot/pull/5532) by [@geooo109](https://github.com/geooo109))*:
|
|
23
|
+
|
|
24
|
+
parse and annotate type for bigquery DATE_FROM_UNIX_DATE (#5532)
|
|
25
|
+
|
|
26
|
+
- due to [`a276ca6`](https://github.com/tobymao/sqlglot/commit/a276ca6fd5f9d47fa8c90fcfa19f9864e7a28f8f) - parse and annotate type for bigquery JUSTIFY funcs *(PR [#5534](https://github.com/tobymao/sqlglot/pull/5534) by [@geooo109](https://github.com/geooo109))*:
|
|
27
|
+
|
|
28
|
+
parse and annotate type for bigquery JUSTIFY funcs (#5534)
|
|
29
|
+
|
|
30
|
+
- due to [`374178e`](https://github.com/tobymao/sqlglot/commit/374178e22fe8d2d2275b65fe08e27ef66c611220) - parse and annotate type for bigquery UNIX_MICROS and UNIX_MILLIS *(PR [#5535](https://github.com/tobymao/sqlglot/pull/5535) by [@geooo109](https://github.com/geooo109))*:
|
|
31
|
+
|
|
32
|
+
parse and annotate type for bigquery UNIX_MICROS and UNIX_MILLIS (#5535)
|
|
33
|
+
|
|
34
|
+
- due to [`1d8d1ab`](https://github.com/tobymao/sqlglot/commit/1d8d1abe459053a135a46525d0a13bb861220927) - annotate type for bigquery DATE_TRUNC *(PR [#5540](https://github.com/tobymao/sqlglot/pull/5540) by [@geooo109](https://github.com/geooo109))*:
|
|
35
|
+
|
|
36
|
+
annotate type for bigquery DATE_TRUNC (#5540)
|
|
37
|
+
|
|
38
|
+
- due to [`306ba65`](https://github.com/tobymao/sqlglot/commit/306ba6531839ea2823f5165de7bde01d17560845) - annotate type for bigquery TIMESTAMP_TRUNC *(PR [#5541](https://github.com/tobymao/sqlglot/pull/5541) by [@geooo109](https://github.com/geooo109))*:
|
|
39
|
+
|
|
40
|
+
annotate type for bigquery TIMESTAMP_TRUNC (#5541)
|
|
41
|
+
|
|
42
|
+
- due to [`d799c5a`](https://github.com/tobymao/sqlglot/commit/d799c5af23010a67c29edb6d45a40fb24903e1a3) - preserve projection names when merging subqueries *(commit by [@snovik75](https://github.com/snovik75))*:
|
|
43
|
+
|
|
44
|
+
preserve projection names when merging subqueries
|
|
45
|
+
|
|
46
|
+
- due to [`8130bd4`](https://github.com/tobymao/sqlglot/commit/8130bd40815803a6781ee8f20fccd30987516192) - WEEKDAY of WEEK as VAR *(PR [#5552](https://github.com/tobymao/sqlglot/pull/5552) by [@geooo109](https://github.com/geooo109))*:
|
|
47
|
+
|
|
48
|
+
WEEKDAY of WEEK as VAR (#5552)
|
|
49
|
+
|
|
50
|
+
- due to [`f3ffe19`](https://github.com/tobymao/sqlglot/commit/f3ffe19ec01533c5f27b9d3a7b6704b83c005118) - annotate type for bigquery format_time *(PR [#5559](https://github.com/tobymao/sqlglot/pull/5559) by [@geooo109](https://github.com/geooo109))*:
|
|
51
|
+
|
|
52
|
+
annotate type for bigquery format_time (#5559)
|
|
53
|
+
|
|
54
|
+
- due to [`6872b43`](https://github.com/tobymao/sqlglot/commit/6872b43ba17a39137172fd2fa9f0d059ce595ef9) - use dialect in DataType.build fixes [#5560](https://github.com/tobymao/sqlglot/pull/5560) *(commit by [@georgesittas](https://github.com/georgesittas))*:
|
|
55
|
+
|
|
56
|
+
use dialect in DataType.build fixes #5560
|
|
57
|
+
|
|
58
|
+
- due to [`3ab3690`](https://github.com/tobymao/sqlglot/commit/3ab369096313b418699b7942b1c513c0c66a5331) - parse and annotate type for bigquery PARSE_DATETIME *(PR [#5558](https://github.com/tobymao/sqlglot/pull/5558) by [@geooo109](https://github.com/geooo109))*:
|
|
59
|
+
|
|
60
|
+
parse and annotate type for bigquery PARSE_DATETIME (#5558)
|
|
61
|
+
|
|
62
|
+
- due to [`e5da951`](https://github.com/tobymao/sqlglot/commit/e5da951542eb55691bc43fbbfbec4a30100de038) - parse and annotate type for bigquery PARSE_TIME *(PR [#5561](https://github.com/tobymao/sqlglot/pull/5561) by [@geooo109](https://github.com/geooo109))*:
|
|
63
|
+
|
|
64
|
+
parse and annotate type for bigquery PARSE_TIME (#5561)
|
|
65
|
+
|
|
66
|
+
- due to [`798e213`](https://github.com/tobymao/sqlglot/commit/798e213fd10c3b61afbd8cef621546de65fa6f26) - improve transpilability of ANY_VALUE closes [#5563](https://github.com/tobymao/sqlglot/pull/5563) *(commit by [@georgesittas](https://github.com/georgesittas))*:
|
|
67
|
+
|
|
68
|
+
improve transpilability of ANY_VALUE closes #5563
|
|
69
|
+
|
|
70
|
+
- due to [`8c0cb76`](https://github.com/tobymao/sqlglot/commit/8c0cb764fd825062fb7334032b8eeffbc39627d5) - more robust CREATE SEQUENCE *(PR [#5566](https://github.com/tobymao/sqlglot/pull/5566) by [@geooo109](https://github.com/geooo109))*:
|
|
71
|
+
|
|
72
|
+
more robust CREATE SEQUENCE (#5566)
|
|
73
|
+
|
|
74
|
+
- due to [`c7041c7`](https://github.com/tobymao/sqlglot/commit/c7041c71250b17192c2f25fb8f33407324d332c2) - parse and annotate type for bigquery BYTE_LENGHT *(PR [#5568](https://github.com/tobymao/sqlglot/pull/5568) by [@geooo109](https://github.com/geooo109))*:
|
|
75
|
+
|
|
76
|
+
parse and annotate type for bigquery BYTE_LENGHT (#5568)
|
|
77
|
+
|
|
78
|
+
- due to [`a6c61c3`](https://github.com/tobymao/sqlglot/commit/a6c61c34f1e168c97dd5c2b8ec071372ba593992) - parse and annotate type for bigquery CODE_POINTS_TO_STRING *(PR [#5569](https://github.com/tobymao/sqlglot/pull/5569) by [@geooo109](https://github.com/geooo109))*:
|
|
79
|
+
|
|
80
|
+
parse and annotate type for bigquery CODE_POINTS_TO_STRING (#5569)
|
|
81
|
+
|
|
82
|
+
- due to [`51e0335`](https://github.com/tobymao/sqlglot/commit/51e0335377fe2bc2e2a94a623475791e9dd19fb9) - parse and annotate type for bigquery REVERSE *(PR [#5571](https://github.com/tobymao/sqlglot/pull/5571) by [@geooo109](https://github.com/geooo109))*:
|
|
83
|
+
|
|
84
|
+
parse and annotate type for bigquery REVERSE (#5571)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
### :sparkles: New Features
|
|
88
|
+
- [`1fb90db`](https://github.com/tobymao/sqlglot/commit/1fb90db52b59e6e3a40597c6f611d0476b72025b) - **teradata**: Add support for Teradata set query band expression *(PR [#5519](https://github.com/tobymao/sqlglot/pull/5519) by [@treff7es](https://github.com/treff7es))*
|
|
89
|
+
- [`a49baaf`](https://github.com/tobymao/sqlglot/commit/a49baaf717cb41abb25ca51ae5adddc8473baa8b) - **doris**: Override table_sql to avoid AS keyword in UPDATE and DELETE statements *(PR [#5517](https://github.com/tobymao/sqlglot/pull/5517) by [@peterylh](https://github.com/peterylh))*
|
|
90
|
+
- [`75fd6d2`](https://github.com/tobymao/sqlglot/commit/75fd6d21fb7bc8399432e73d10b4837ae62d2ab5) - **exasol**: Add support for date difference functions in Exasol dialect *(PR [#5510](https://github.com/tobymao/sqlglot/pull/5510) by [@nnamdi16](https://github.com/nnamdi16))*
|
|
91
|
+
- [`2a91bb4`](https://github.com/tobymao/sqlglot/commit/2a91bb4f17c7569a5b409cc07e970e5d68235149) - **teradata**: Add support for Teradata locking select *(PR [#5524](https://github.com/tobymao/sqlglot/pull/5524) by [@treff7es](https://github.com/treff7es))*
|
|
92
|
+
- [`938f4b6`](https://github.com/tobymao/sqlglot/commit/938f4b6ebc1c0d26bd3c1400883978c79a435189) - **optimizer**: annotate type for LAST_DAY *(PR [#5528](https://github.com/tobymao/sqlglot/pull/5528) by [@geooo109](https://github.com/geooo109))*
|
|
93
|
+
- [`7d12dac`](https://github.com/tobymao/sqlglot/commit/7d12dac613ba5119334408f2c52cb270067156d9) - **optimizer**: annotate type for bigquery GENERATE_TIMESTAMP_ARRAY *(PR [#5529](https://github.com/tobymao/sqlglot/pull/5529) by [@geooo109](https://github.com/geooo109))*
|
|
94
|
+
- [`d50ebe2`](https://github.com/tobymao/sqlglot/commit/d50ebe286dd8e2836b9eb2a3406f15976db3aa05) - **optimizer**: annotate type for bigquery TIME_TRUNC *(PR [#5530](https://github.com/tobymao/sqlglot/pull/5530) by [@geooo109](https://github.com/geooo109))*
|
|
95
|
+
- [`29748be`](https://github.com/tobymao/sqlglot/commit/29748be7dfc10edc9f29665c98327883dd25c13d) - **optimizer**: annotate type for bigquery TIME *(PR [#5531](https://github.com/tobymao/sqlglot/pull/5531) by [@geooo109](https://github.com/geooo109))*
|
|
96
|
+
- [`7003b3f`](https://github.com/tobymao/sqlglot/commit/7003b3fa39cd455e3643066364696708d1ac4f38) - **optimizer**: parse and annotate type for bigquery DATE_FROM_UNIX_DATE *(PR [#5532](https://github.com/tobymao/sqlglot/pull/5532) by [@geooo109](https://github.com/geooo109))*
|
|
97
|
+
- [`a276ca6`](https://github.com/tobymao/sqlglot/commit/a276ca6fd5f9d47fa8c90fcfa19f9864e7a28f8f) - **optimizer**: parse and annotate type for bigquery JUSTIFY funcs *(PR [#5534](https://github.com/tobymao/sqlglot/pull/5534) by [@geooo109](https://github.com/geooo109))*
|
|
98
|
+
- [`374178e`](https://github.com/tobymao/sqlglot/commit/374178e22fe8d2d2275b65fe08e27ef66c611220) - **optimizer**: parse and annotate type for bigquery UNIX_MICROS and UNIX_MILLIS *(PR [#5535](https://github.com/tobymao/sqlglot/pull/5535) by [@geooo109](https://github.com/geooo109))*
|
|
99
|
+
- [`1d8d1ab`](https://github.com/tobymao/sqlglot/commit/1d8d1abe459053a135a46525d0a13bb861220927) - **optimizer**: annotate type for bigquery DATE_TRUNC *(PR [#5540](https://github.com/tobymao/sqlglot/pull/5540) by [@geooo109](https://github.com/geooo109))*
|
|
100
|
+
- [`306ba65`](https://github.com/tobymao/sqlglot/commit/306ba6531839ea2823f5165de7bde01d17560845) - **optimizer**: annotate type for bigquery TIMESTAMP_TRUNC *(PR [#5541](https://github.com/tobymao/sqlglot/pull/5541) by [@geooo109](https://github.com/geooo109))*
|
|
101
|
+
- [`6a68cca`](https://github.com/tobymao/sqlglot/commit/6a68cca97ad4bdd75c544ada0a5af0fa92ec4664) - **dremio**: support lowercase `TIME_MAPPING` formats *(PR [#5556](https://github.com/tobymao/sqlglot/pull/5556) by [@jasonthomassql](https://github.com/jasonthomassql))*
|
|
102
|
+
- [`f3ffe19`](https://github.com/tobymao/sqlglot/commit/f3ffe19ec01533c5f27b9d3a7b6704b83c005118) - **optimizer**: annotate type for bigquery format_time *(PR [#5559](https://github.com/tobymao/sqlglot/pull/5559) by [@geooo109](https://github.com/geooo109))*
|
|
103
|
+
- [`3ab3690`](https://github.com/tobymao/sqlglot/commit/3ab369096313b418699b7942b1c513c0c66a5331) - **optimizer**: parse and annotate type for bigquery PARSE_DATETIME *(PR [#5558](https://github.com/tobymao/sqlglot/pull/5558) by [@geooo109](https://github.com/geooo109))*
|
|
104
|
+
- [`e5da951`](https://github.com/tobymao/sqlglot/commit/e5da951542eb55691bc43fbbfbec4a30100de038) - **optimizer**: parse and annotate type for bigquery PARSE_TIME *(PR [#5561](https://github.com/tobymao/sqlglot/pull/5561) by [@geooo109](https://github.com/geooo109))*
|
|
105
|
+
- [`902a0cd`](https://github.com/tobymao/sqlglot/commit/902a0cdfe46f693aa55612d45a2de2def21f0b8c) - **singlestore**: Added parsing/generation of UNIXTIME functions *(PR [#5562](https://github.com/tobymao/sqlglot/pull/5562) by [@AdalbertMemSQL](https://github.com/AdalbertMemSQL))*
|
|
106
|
+
- [`798e213`](https://github.com/tobymao/sqlglot/commit/798e213fd10c3b61afbd8cef621546de65fa6f26) - **duckdb**: improve transpilability of ANY_VALUE closes [#5563](https://github.com/tobymao/sqlglot/pull/5563) *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
107
|
+
- [`c7041c7`](https://github.com/tobymao/sqlglot/commit/c7041c71250b17192c2f25fb8f33407324d332c2) - **optimizer**: parse and annotate type for bigquery BYTE_LENGHT *(PR [#5568](https://github.com/tobymao/sqlglot/pull/5568) by [@geooo109](https://github.com/geooo109))*
|
|
108
|
+
- [`a6c61c3`](https://github.com/tobymao/sqlglot/commit/a6c61c34f1e168c97dd5c2b8ec071372ba593992) - **optimizer**: parse and annotate type for bigquery CODE_POINTS_TO_STRING *(PR [#5569](https://github.com/tobymao/sqlglot/pull/5569) by [@geooo109](https://github.com/geooo109))*
|
|
109
|
+
|
|
110
|
+
### :bug: Bug Fixes
|
|
111
|
+
- [`9020684`](https://github.com/tobymao/sqlglot/commit/9020684a7e984a10fa4775339596ac5a0d6a6d93) - nested natural join performance closes [#5514](https://github.com/tobymao/sqlglot/pull/5514) *(PR [#5515](https://github.com/tobymao/sqlglot/pull/5515) by [@tobymao](https://github.com/tobymao))*
|
|
112
|
+
- [`394870a`](https://github.com/tobymao/sqlglot/commit/394870a7ee9bb3bc814b7c3847193687f06b432b) - **duckdb**: transpile ADD_MONTHS *(PR [#5523](https://github.com/tobymao/sqlglot/pull/5523) by [@geooo109](https://github.com/geooo109))*
|
|
113
|
+
- :arrow_lower_right: *fixes issue [#5505](https://github.com/tobymao/sqlglot/issues/5505) opened by [@kyle-cheung](https://github.com/kyle-cheung)*
|
|
114
|
+
- [`249692c`](https://github.com/tobymao/sqlglot/commit/249692c67450a1fe3775e1f35b6f62fdb0a62e1a) - **duckdb**: put guard in AddMonths generator before annotating it *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
115
|
+
- [`d799c5a`](https://github.com/tobymao/sqlglot/commit/d799c5af23010a67c29edb6d45a40fb24903e1a3) - **optimizer**: preserve projection names when merging subqueries *(commit by [@snovik75](https://github.com/snovik75))*
|
|
116
|
+
- [`8130bd4`](https://github.com/tobymao/sqlglot/commit/8130bd40815803a6781ee8f20fccd30987516192) - **parser**: WEEKDAY of WEEK as VAR *(PR [#5552](https://github.com/tobymao/sqlglot/pull/5552) by [@geooo109](https://github.com/geooo109))*
|
|
117
|
+
- :arrow_lower_right: *fixes issue [#5547](https://github.com/tobymao/sqlglot/issues/5547) opened by [@rloredo](https://github.com/rloredo)*
|
|
118
|
+
- [`4e1373f`](https://github.com/tobymao/sqlglot/commit/4e1373f301cbea3cb5762fc1430b65deae3f9d04) - **doris**: Rename Table *(PR [#5549](https://github.com/tobymao/sqlglot/pull/5549) by [@xinge-ji](https://github.com/xinge-ji))*
|
|
119
|
+
- [`16f544d`](https://github.com/tobymao/sqlglot/commit/16f544dc25d5d61277d32f02e4be18c10d16cf9f) - **doris**: fix DATE_TRUNC and partition by *(PR [#5553](https://github.com/tobymao/sqlglot/pull/5553) by [@xinge-ji](https://github.com/xinge-ji))*
|
|
120
|
+
- [`6295414`](https://github.com/tobymao/sqlglot/commit/6295414fb41401f92993e661b880a0727e74c087) - convert unit to Var instead of choosing default in `unit_to_var` *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
121
|
+
- [`6872b43`](https://github.com/tobymao/sqlglot/commit/6872b43ba17a39137172fd2fa9f0d059ce595ef9) - **parser**: use dialect in DataType.build fixes [#5560](https://github.com/tobymao/sqlglot/pull/5560) *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
122
|
+
- [`6f354d9`](https://github.com/tobymao/sqlglot/commit/6f354d958fb9ca9242b7fc1d2da86af74d57fedc) - **clickhouse**: add ROWS keyword in OFFSET followed by FETCH fixes [#5564](https://github.com/tobymao/sqlglot/pull/5564) *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
123
|
+
- [`8c0cb76`](https://github.com/tobymao/sqlglot/commit/8c0cb764fd825062fb7334032b8eeffbc39627d5) - **parser**: more robust CREATE SEQUENCE *(PR [#5566](https://github.com/tobymao/sqlglot/pull/5566) by [@geooo109](https://github.com/geooo109))*
|
|
124
|
+
- :arrow_lower_right: *fixes issue [#5537](https://github.com/tobymao/sqlglot/issues/5537) opened by [@tekumara](https://github.com/tekumara)*
|
|
125
|
+
- [`7e9df88`](https://github.com/tobymao/sqlglot/commit/7e9df880bc118d0dbb2dbd6344f805f79af2fe5e) - **doris**: CURRENT_DATE *(PR [#5567](https://github.com/tobymao/sqlglot/pull/5567) by [@xinge-ji](https://github.com/xinge-ji))*
|
|
126
|
+
- [`51e0335`](https://github.com/tobymao/sqlglot/commit/51e0335377fe2bc2e2a94a623475791e9dd19fb9) - **optimizer**: parse and annotate type for bigquery REVERSE *(PR [#5571](https://github.com/tobymao/sqlglot/pull/5571) by [@geooo109](https://github.com/geooo109))*
|
|
127
|
+
|
|
128
|
+
### :wrench: Chores
|
|
129
|
+
- [`720f634`](https://github.com/tobymao/sqlglot/commit/720f6343f6144e8986ec6b7e50419c3d7a331f0a) - Fix style on main, refactor exasol tests *(PR [#5527](https://github.com/tobymao/sqlglot/pull/5527) by [@VaggelisD](https://github.com/VaggelisD))*
|
|
130
|
+
- [`5653501`](https://github.com/tobymao/sqlglot/commit/5653501606f041282b6315c3efa33b9a3baf8d98) - Refactor PR 5517 *(PR [#5526](https://github.com/tobymao/sqlglot/pull/5526) by [@VaggelisD](https://github.com/VaggelisD))*
|
|
131
|
+
- [`d15dfe3`](https://github.com/tobymao/sqlglot/commit/d15dfe3f0f4444e4999ad65051b2474e62f422b3) - build type using dialect for bigquery *(PR [#5539](https://github.com/tobymao/sqlglot/pull/5539) by [@geooo109](https://github.com/geooo109))*
|
|
132
|
+
|
|
133
|
+
|
|
4
134
|
## [v27.6.0] - 2025-08-01
|
|
5
135
|
### :boom: BREAKING CHANGES
|
|
6
136
|
- due to [`6b691b3`](https://github.com/tobymao/sqlglot/commit/6b691b33c3528c0377bd8822a3df90de869c6cb1) - Parse and transpile GET(...) extract function *(PR [#5500](https://github.com/tobymao/sqlglot/pull/5500) by [@VaggelisD](https://github.com/VaggelisD))*:
|
|
@@ -6404,3 +6534,4 @@ Changelog
|
|
|
6404
6534
|
[v27.5.0]: https://github.com/tobymao/sqlglot/compare/v27.4.1...v27.5.0
|
|
6405
6535
|
[v27.5.1]: https://github.com/tobymao/sqlglot/compare/v27.5.0...v27.5.1
|
|
6406
6536
|
[v27.6.0]: https://github.com/tobymao/sqlglot/compare/v27.5.1...v27.6.0
|
|
6537
|
+
[v27.7.0]: https://github.com/tobymao/sqlglot/compare/v27.6.0...v27.7.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlglot
|
|
3
|
-
Version: 27.
|
|
3
|
+
Version: 27.8.0
|
|
4
4
|
Summary: An easily customizable SQL parser and transpiler
|
|
5
5
|
Author-email: Toby Mao <toby.mao@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://sqlglot.com/
|
|
@@ -256,7 +256,7 @@ sqlglot.errors.ParseError: Expecting ). Line 1, Col: 34.
|
|
|
256
256
|
Structured syntax errors are accessible for programmatic use:
|
|
257
257
|
|
|
258
258
|
```python
|
|
259
|
-
import sqlglot
|
|
259
|
+
import sqlglot.errors
|
|
260
260
|
try:
|
|
261
261
|
sqlglot.transpile("SELECT foo FROM (SELECT baz FROM t")
|
|
262
262
|
except sqlglot.errors.ParseError as e:
|
|
@@ -218,7 +218,7 @@ sqlglot.errors.ParseError: Expecting ). Line 1, Col: 34.
|
|
|
218
218
|
Structured syntax errors are accessible for programmatic use:
|
|
219
219
|
|
|
220
220
|
```python
|
|
221
|
-
import sqlglot
|
|
221
|
+
import sqlglot.errors
|
|
222
222
|
try:
|
|
223
223
|
sqlglot.transpile("SELECT foo FROM (SELECT baz FROM t")
|
|
224
224
|
except sqlglot.errors.ParseError as e:
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
# file generated by setuptools-scm
|
|
2
2
|
# don't change, don't track in version control
|
|
3
3
|
|
|
4
|
-
__all__ = [
|
|
4
|
+
__all__ = [
|
|
5
|
+
"__version__",
|
|
6
|
+
"__version_tuple__",
|
|
7
|
+
"version",
|
|
8
|
+
"version_tuple",
|
|
9
|
+
"__commit_id__",
|
|
10
|
+
"commit_id",
|
|
11
|
+
]
|
|
5
12
|
|
|
6
13
|
TYPE_CHECKING = False
|
|
7
14
|
if TYPE_CHECKING:
|
|
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
|
|
|
9
16
|
from typing import Union
|
|
10
17
|
|
|
11
18
|
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
|
19
|
+
COMMIT_ID = Union[str, None]
|
|
12
20
|
else:
|
|
13
21
|
VERSION_TUPLE = object
|
|
22
|
+
COMMIT_ID = object
|
|
14
23
|
|
|
15
24
|
version: str
|
|
16
25
|
__version__: str
|
|
17
26
|
__version_tuple__: VERSION_TUPLE
|
|
18
27
|
version_tuple: VERSION_TUPLE
|
|
28
|
+
commit_id: COMMIT_ID
|
|
29
|
+
__commit_id__: COMMIT_ID
|
|
19
30
|
|
|
20
|
-
__version__ = version = '27.
|
|
21
|
-
__version_tuple__ = version_tuple = (27,
|
|
31
|
+
__version__ = version = '27.8.0'
|
|
32
|
+
__version_tuple__ = version_tuple = (27, 8, 0)
|
|
33
|
+
|
|
34
|
+
__commit_id__ = commit_id = 'g093f35c20'
|
|
@@ -4,7 +4,7 @@ import logging
|
|
|
4
4
|
import re
|
|
5
5
|
import typing as t
|
|
6
6
|
|
|
7
|
-
from sqlglot import exp, generator, parser, tokens, transforms
|
|
7
|
+
from sqlglot import exp, generator, jsonpath, parser, tokens, transforms
|
|
8
8
|
from sqlglot._typing import E
|
|
9
9
|
from sqlglot.dialects.dialect import (
|
|
10
10
|
Dialect,
|
|
@@ -30,7 +30,6 @@ from sqlglot.dialects.dialect import (
|
|
|
30
30
|
unit_to_var,
|
|
31
31
|
strposition_sql,
|
|
32
32
|
groupconcat_sql,
|
|
33
|
-
space_sql,
|
|
34
33
|
)
|
|
35
34
|
from sqlglot.helper import seq_get, split_num_words
|
|
36
35
|
from sqlglot.tokens import TokenType
|
|
@@ -474,6 +473,8 @@ class BigQuery(Dialect):
|
|
|
474
473
|
exp.Substring,
|
|
475
474
|
)
|
|
476
475
|
},
|
|
476
|
+
exp.ArgMax: lambda self, e: self._annotate_by_args(e, "this"),
|
|
477
|
+
exp.ArgMin: lambda self, e: self._annotate_by_args(e, "this"),
|
|
477
478
|
exp.Array: _annotate_array,
|
|
478
479
|
exp.ArrayConcat: lambda self, e: self._annotate_by_args(e, "this", "expressions"),
|
|
479
480
|
exp.Ascii: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
|
|
@@ -495,6 +496,7 @@ class BigQuery(Dialect):
|
|
|
495
496
|
exp.GenerateTimestampArray: lambda self, e: self._annotate_with_type(
|
|
496
497
|
e, exp.DataType.build("ARRAY<TIMESTAMP>", dialect="bigquery")
|
|
497
498
|
),
|
|
499
|
+
exp.Grouping: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
|
|
498
500
|
exp.JSONArray: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.JSON),
|
|
499
501
|
exp.JSONExtractScalar: lambda self, e: self._annotate_with_type(
|
|
500
502
|
e, exp.DataType.Type.VARCHAR
|
|
@@ -504,9 +506,13 @@ class BigQuery(Dialect):
|
|
|
504
506
|
),
|
|
505
507
|
exp.JSONType: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.VARCHAR),
|
|
506
508
|
exp.Lag: lambda self, e: self._annotate_by_args(e, "this", "default"),
|
|
509
|
+
exp.MD5Digest: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BINARY),
|
|
507
510
|
exp.ParseTime: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.TIME),
|
|
508
511
|
exp.ParseDatetime: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.DATETIME),
|
|
512
|
+
exp.RegexpExtractAll: lambda self, e: self._annotate_by_args(e, "this", array=True),
|
|
513
|
+
exp.Replace: lambda self, e: self._annotate_by_args(e, "this"),
|
|
509
514
|
exp.Reverse: lambda self, e: self._annotate_by_args(e, "this"),
|
|
515
|
+
exp.Soundex: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.VARCHAR),
|
|
510
516
|
exp.SHA: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BINARY),
|
|
511
517
|
exp.SHA2: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BINARY),
|
|
512
518
|
exp.Sign: lambda self, e: self._annotate_by_args(e, "this"),
|
|
@@ -518,6 +524,7 @@ class BigQuery(Dialect):
|
|
|
518
524
|
exp.TimeFromParts: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.TIME),
|
|
519
525
|
exp.TsOrDsToTime: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.TIME),
|
|
520
526
|
exp.TimeTrunc: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.TIME),
|
|
527
|
+
exp.Translate: lambda self, e: self._annotate_by_args(e, "this"),
|
|
521
528
|
exp.Unicode: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
|
|
522
529
|
}
|
|
523
530
|
|
|
@@ -550,6 +557,12 @@ class BigQuery(Dialect):
|
|
|
550
557
|
|
|
551
558
|
return super().normalize_identifier(expression)
|
|
552
559
|
|
|
560
|
+
class JSONPathTokenizer(jsonpath.JSONPathTokenizer):
|
|
561
|
+
VAR_TOKENS = {
|
|
562
|
+
TokenType.DASH,
|
|
563
|
+
TokenType.VAR,
|
|
564
|
+
}
|
|
565
|
+
|
|
553
566
|
class Tokenizer(tokens.Tokenizer):
|
|
554
567
|
QUOTES = ["'", '"', '"""', "'''"]
|
|
555
568
|
COMMENTS = ["--", "#", ("/*", "*/")]
|
|
@@ -1019,6 +1032,8 @@ class BigQuery(Dialect):
|
|
|
1019
1032
|
EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSE = False
|
|
1020
1033
|
SUPPORTS_UNIX_SECONDS = True
|
|
1021
1034
|
|
|
1035
|
+
SAFE_JSON_PATH_KEY_RE = re.compile(r"^[_\-a-zA-Z][\-\w]*$")
|
|
1036
|
+
|
|
1022
1037
|
TS_OR_DS_TYPES = (
|
|
1023
1038
|
exp.TsOrDsToDatetime,
|
|
1024
1039
|
exp.TsOrDsToTimestamp,
|
|
@@ -1107,7 +1122,6 @@ class BigQuery(Dialect):
|
|
|
1107
1122
|
),
|
|
1108
1123
|
exp.SHA: rename_func("SHA1"),
|
|
1109
1124
|
exp.SHA2: sha256_sql,
|
|
1110
|
-
exp.Space: space_sql,
|
|
1111
1125
|
exp.StabilityProperty: lambda self, e: (
|
|
1112
1126
|
"DETERMINISTIC" if e.name == "IMMUTABLE" else "NOT DETERMINISTIC"
|
|
1113
1127
|
),
|
|
@@ -99,7 +99,11 @@ class Databricks(Spark):
|
|
|
99
99
|
exp.JSONExtract: _jsonextract_sql,
|
|
100
100
|
exp.JSONExtractScalar: _jsonextract_sql,
|
|
101
101
|
exp.JSONPathRoot: lambda *_: "",
|
|
102
|
-
exp.ToChar: lambda self, e:
|
|
102
|
+
exp.ToChar: lambda self, e: (
|
|
103
|
+
self.cast_sql(exp.Cast(this=e.this, to=exp.DataType(this="STRING")))
|
|
104
|
+
if e.args.get("is_numeric")
|
|
105
|
+
else self.function_fallback_sql(e)
|
|
106
|
+
),
|
|
103
107
|
}
|
|
104
108
|
|
|
105
109
|
TRANSFORMS.pop(exp.TryCast)
|
|
@@ -35,8 +35,18 @@ DATE_ADD_OR_DIFF = t.Union[
|
|
|
35
35
|
exp.TsOrDsDiff,
|
|
36
36
|
]
|
|
37
37
|
DATE_ADD_OR_SUB = t.Union[exp.DateAdd, exp.TsOrDsAdd, exp.DateSub]
|
|
38
|
-
JSON_EXTRACT_TYPE = t.Union[
|
|
39
|
-
|
|
38
|
+
JSON_EXTRACT_TYPE = t.Union[
|
|
39
|
+
exp.JSONExtract, exp.JSONExtractScalar, exp.JSONBExtract, exp.JSONBExtractScalar
|
|
40
|
+
]
|
|
41
|
+
DATETIME_DELTA = t.Union[
|
|
42
|
+
exp.DateAdd,
|
|
43
|
+
exp.DatetimeAdd,
|
|
44
|
+
exp.DatetimeSub,
|
|
45
|
+
exp.TimeAdd,
|
|
46
|
+
exp.TimeSub,
|
|
47
|
+
exp.TimestampSub,
|
|
48
|
+
exp.TsOrDsAdd,
|
|
49
|
+
]
|
|
40
50
|
|
|
41
51
|
if t.TYPE_CHECKING:
|
|
42
52
|
from sqlglot._typing import B, E, F
|
|
@@ -1059,7 +1069,9 @@ class Dialect(metaclass=_Dialect):
|
|
|
1059
1069
|
try:
|
|
1060
1070
|
return parse_json_path(path_text, self)
|
|
1061
1071
|
except ParseError as e:
|
|
1062
|
-
if self.STRICT_JSON_PATH_SYNTAX
|
|
1072
|
+
if self.STRICT_JSON_PATH_SYNTAX and not path_text.lstrip().startswith(
|
|
1073
|
+
("lax", "strict")
|
|
1074
|
+
):
|
|
1063
1075
|
logger.warning(f"Invalid JSON path syntax. {str(e)}")
|
|
1064
1076
|
|
|
1065
1077
|
return path
|
|
@@ -1643,14 +1655,49 @@ def date_delta_sql(name: str, cast: bool = False) -> t.Callable[[Generator, DATE
|
|
|
1643
1655
|
return _delta_sql
|
|
1644
1656
|
|
|
1645
1657
|
|
|
1658
|
+
def date_delta_to_binary_interval_op(
|
|
1659
|
+
cast: bool = True,
|
|
1660
|
+
) -> t.Callable[[Generator, DATETIME_DELTA], str]:
|
|
1661
|
+
def date_delta_to_binary_interval_op_sql(self: Generator, expression: DATETIME_DELTA) -> str:
|
|
1662
|
+
this = expression.this
|
|
1663
|
+
unit = unit_to_var(expression)
|
|
1664
|
+
op = (
|
|
1665
|
+
"+"
|
|
1666
|
+
if isinstance(expression, (exp.DateAdd, exp.TimeAdd, exp.DatetimeAdd, exp.TsOrDsAdd))
|
|
1667
|
+
else "-"
|
|
1668
|
+
)
|
|
1669
|
+
|
|
1670
|
+
to_type: t.Optional[exp.DATA_TYPE] = None
|
|
1671
|
+
if cast:
|
|
1672
|
+
if isinstance(expression, exp.TsOrDsAdd):
|
|
1673
|
+
to_type = expression.return_type
|
|
1674
|
+
elif this.is_string:
|
|
1675
|
+
# Cast string literals (i.e function parameters) to the appropriate type for +/- interval to work
|
|
1676
|
+
to_type = (
|
|
1677
|
+
exp.DataType.Type.DATETIME
|
|
1678
|
+
if isinstance(expression, (exp.DatetimeAdd, exp.DatetimeSub))
|
|
1679
|
+
else exp.DataType.Type.DATE
|
|
1680
|
+
)
|
|
1681
|
+
|
|
1682
|
+
this = exp.cast(this, to_type) if to_type else this
|
|
1683
|
+
|
|
1684
|
+
expr = expression.expression
|
|
1685
|
+
interval = expr if isinstance(expr, exp.Interval) else exp.Interval(this=expr, unit=unit)
|
|
1686
|
+
|
|
1687
|
+
return f"{self.sql(this)} {op} {self.sql(interval)}"
|
|
1688
|
+
|
|
1689
|
+
return date_delta_to_binary_interval_op_sql
|
|
1690
|
+
|
|
1691
|
+
|
|
1646
1692
|
def unit_to_str(expression: exp.Expression, default: str = "DAY") -> t.Optional[exp.Expression]:
|
|
1647
1693
|
unit = expression.args.get("unit")
|
|
1694
|
+
if not unit:
|
|
1695
|
+
return exp.Literal.string(default) if default else None
|
|
1648
1696
|
|
|
1649
|
-
if isinstance(unit, exp.Placeholder):
|
|
1697
|
+
if isinstance(unit, exp.Placeholder) or type(unit) not in (exp.Var, exp.Literal):
|
|
1650
1698
|
return unit
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
return exp.Literal.string(default) if default else None
|
|
1699
|
+
|
|
1700
|
+
return exp.Literal.string(unit.name)
|
|
1654
1701
|
|
|
1655
1702
|
|
|
1656
1703
|
def unit_to_var(expression: exp.Expression, default: str = "DAY") -> t.Optional[exp.Expression]:
|
|
@@ -1730,7 +1777,10 @@ def merge_without_target_sql(self: Generator, expression: exp.Merge) -> str:
|
|
|
1730
1777
|
|
|
1731
1778
|
|
|
1732
1779
|
def build_json_extract_path(
|
|
1733
|
-
expr_type: t.Type[F],
|
|
1780
|
+
expr_type: t.Type[F],
|
|
1781
|
+
zero_based_indexing: bool = True,
|
|
1782
|
+
arrow_req_json_type: bool = False,
|
|
1783
|
+
json_type: t.Optional[str] = None,
|
|
1734
1784
|
) -> t.Callable[[t.List], F]:
|
|
1735
1785
|
def _builder(args: t.List) -> F:
|
|
1736
1786
|
segments: t.List[exp.JSONPathPart] = [exp.JSONPathRoot()]
|
|
@@ -1750,11 +1800,19 @@ def build_json_extract_path(
|
|
|
1750
1800
|
|
|
1751
1801
|
# This is done to avoid failing in the expression validator due to the arg count
|
|
1752
1802
|
del args[2:]
|
|
1753
|
-
|
|
1754
|
-
this
|
|
1755
|
-
expression
|
|
1756
|
-
|
|
1757
|
-
|
|
1803
|
+
kwargs = {
|
|
1804
|
+
"this": seq_get(args, 0),
|
|
1805
|
+
"expression": exp.JSONPath(expressions=segments),
|
|
1806
|
+
}
|
|
1807
|
+
|
|
1808
|
+
is_jsonb = issubclass(expr_type, (exp.JSONBExtract, exp.JSONBExtractScalar))
|
|
1809
|
+
if not is_jsonb:
|
|
1810
|
+
kwargs["only_json_types"] = arrow_req_json_type
|
|
1811
|
+
|
|
1812
|
+
if json_type is not None:
|
|
1813
|
+
kwargs["json_type"] = json_type
|
|
1814
|
+
|
|
1815
|
+
return expr_type(**kwargs)
|
|
1758
1816
|
|
|
1759
1817
|
return _builder
|
|
1760
1818
|
|
|
@@ -1962,7 +2020,7 @@ def groupconcat_sql(
|
|
|
1962
2020
|
return self.sql(listagg)
|
|
1963
2021
|
|
|
1964
2022
|
|
|
1965
|
-
def build_timetostr_or_tochar(args: t.List, dialect:
|
|
2023
|
+
def build_timetostr_or_tochar(args: t.List, dialect: DialectType) -> exp.TimeToStr | exp.ToChar:
|
|
1966
2024
|
if len(args) == 2:
|
|
1967
2025
|
this = args[0]
|
|
1968
2026
|
if not this.type:
|
|
@@ -1983,12 +2041,3 @@ def build_replace_with_optional_replacement(args: t.List) -> exp.Replace:
|
|
|
1983
2041
|
expression=seq_get(args, 1),
|
|
1984
2042
|
replacement=seq_get(args, 2) or exp.Literal.string(""),
|
|
1985
2043
|
)
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
def space_sql(self: Generator, expression: exp.Space) -> str:
|
|
1989
|
-
return self.sql(
|
|
1990
|
-
exp.Repeat(
|
|
1991
|
-
this=exp.Literal.string(" "),
|
|
1992
|
-
times=expression.this,
|
|
1993
|
-
)
|
|
1994
|
-
)
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import typing as t
|
|
4
|
+
|
|
3
5
|
from sqlglot import expressions as exp
|
|
4
6
|
from sqlglot import parser, generator, tokens
|
|
5
|
-
from sqlglot.dialects.dialect import
|
|
6
|
-
|
|
7
|
+
from sqlglot.dialects.dialect import (
|
|
8
|
+
Dialect,
|
|
9
|
+
build_timetostr_or_tochar,
|
|
10
|
+
build_formatted_time,
|
|
11
|
+
rename_func,
|
|
12
|
+
unit_to_var,
|
|
13
|
+
)
|
|
14
|
+
from sqlglot.helper import seq_get
|
|
15
|
+
|
|
16
|
+
if t.TYPE_CHECKING:
|
|
17
|
+
from sqlglot.dialects.dialect import DialectType
|
|
7
18
|
|
|
8
|
-
DATE_DELTA = t.Union[
|
|
9
|
-
exp.DateAdd,
|
|
10
|
-
exp.DateSub,
|
|
11
|
-
]
|
|
19
|
+
DATE_DELTA = t.Union[exp.DateAdd, exp.DateSub]
|
|
12
20
|
|
|
13
21
|
|
|
14
22
|
def _date_delta_sql(name: str) -> t.Callable[[Dremio.Generator, DATE_DELTA], str]:
|
|
@@ -31,6 +39,17 @@ def _date_delta_sql(name: str) -> t.Callable[[Dremio.Generator, DATE_DELTA], str
|
|
|
31
39
|
return _delta_sql
|
|
32
40
|
|
|
33
41
|
|
|
42
|
+
def to_char_is_numeric_handler(args: t.List, dialect: DialectType) -> exp.TimeToStr | exp.ToChar:
|
|
43
|
+
expression = build_timetostr_or_tochar(args, dialect)
|
|
44
|
+
fmt = seq_get(args, 1)
|
|
45
|
+
|
|
46
|
+
if fmt and isinstance(expression, exp.ToChar) and fmt.is_string and "#" in fmt.name:
|
|
47
|
+
# Only mark as numeric if format is a literal containing #
|
|
48
|
+
expression.set("is_numeric", True)
|
|
49
|
+
|
|
50
|
+
return expression
|
|
51
|
+
|
|
52
|
+
|
|
34
53
|
class Dremio(Dialect):
|
|
35
54
|
SUPPORTS_USER_DEFINED_TYPES = False
|
|
36
55
|
CONCAT_COALESCE = True
|
|
@@ -94,7 +113,9 @@ class Dremio(Dialect):
|
|
|
94
113
|
|
|
95
114
|
FUNCTIONS = {
|
|
96
115
|
**parser.Parser.FUNCTIONS,
|
|
97
|
-
"TO_CHAR":
|
|
116
|
+
"TO_CHAR": to_char_is_numeric_handler,
|
|
117
|
+
"DATE_FORMAT": build_formatted_time(exp.TimeToStr, "dremio"),
|
|
118
|
+
"TO_DATE": build_formatted_time(exp.TsOrDsToDate, "dremio"),
|
|
98
119
|
}
|
|
99
120
|
|
|
100
121
|
class Generator(generator.Generator):
|
|
@@ -123,8 +144,8 @@ class Dremio(Dialect):
|
|
|
123
144
|
|
|
124
145
|
TRANSFORMS = {
|
|
125
146
|
**generator.Generator.TRANSFORMS,
|
|
147
|
+
exp.ToChar: rename_func("TO_CHAR"),
|
|
126
148
|
exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)),
|
|
127
|
-
exp.ToChar: lambda self, e: self.function_fallback_sql(e),
|
|
128
149
|
exp.DateAdd: _date_delta_sql("DATE_ADD"),
|
|
129
150
|
exp.DateSub: _date_delta_sql("DATE_SUB"),
|
|
130
151
|
}
|
|
@@ -4,7 +4,6 @@ import typing as t
|
|
|
4
4
|
|
|
5
5
|
from sqlglot import exp, generator, parser, tokens, transforms
|
|
6
6
|
|
|
7
|
-
from sqlglot.expressions import DATA_TYPE
|
|
8
7
|
from sqlglot.dialects.dialect import (
|
|
9
8
|
Dialect,
|
|
10
9
|
JSON_EXTRACT_TYPE,
|
|
@@ -16,6 +15,7 @@ from sqlglot.dialects.dialect import (
|
|
|
16
15
|
bool_xor_sql,
|
|
17
16
|
build_default_decimal_type,
|
|
18
17
|
count_if_to_sum,
|
|
18
|
+
date_delta_to_binary_interval_op,
|
|
19
19
|
date_trunc_to_time,
|
|
20
20
|
datestrtodate_sql,
|
|
21
21
|
no_datetime_sql,
|
|
@@ -32,7 +32,6 @@ from sqlglot.dialects.dialect import (
|
|
|
32
32
|
str_to_time_sql,
|
|
33
33
|
timestamptrunc_sql,
|
|
34
34
|
timestrtotime_sql,
|
|
35
|
-
unit_to_var,
|
|
36
35
|
unit_to_str,
|
|
37
36
|
sha256_sql,
|
|
38
37
|
build_regexp_extract,
|
|
@@ -45,38 +44,6 @@ from sqlglot.helper import seq_get
|
|
|
45
44
|
from sqlglot.tokens import TokenType
|
|
46
45
|
from sqlglot.parser import binary_range_parser
|
|
47
46
|
|
|
48
|
-
DATETIME_DELTA = t.Union[
|
|
49
|
-
exp.DateAdd, exp.TimeAdd, exp.DatetimeAdd, exp.TsOrDsAdd, exp.DateSub, exp.DatetimeSub
|
|
50
|
-
]
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def _date_delta_sql(self: DuckDB.Generator, expression: DATETIME_DELTA) -> str:
|
|
54
|
-
this = expression.this
|
|
55
|
-
unit = unit_to_var(expression)
|
|
56
|
-
op = (
|
|
57
|
-
"+"
|
|
58
|
-
if isinstance(expression, (exp.DateAdd, exp.TimeAdd, exp.DatetimeAdd, exp.TsOrDsAdd))
|
|
59
|
-
else "-"
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
to_type: t.Optional[DATA_TYPE] = None
|
|
63
|
-
if isinstance(expression, exp.TsOrDsAdd):
|
|
64
|
-
to_type = expression.return_type
|
|
65
|
-
elif this.is_string:
|
|
66
|
-
# Cast string literals (i.e function parameters) to the appropriate type for +/- interval to work
|
|
67
|
-
to_type = (
|
|
68
|
-
exp.DataType.Type.DATETIME
|
|
69
|
-
if isinstance(expression, (exp.DatetimeAdd, exp.DatetimeSub))
|
|
70
|
-
else exp.DataType.Type.DATE
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
this = exp.cast(this, to_type) if to_type else this
|
|
74
|
-
|
|
75
|
-
expr = expression.expression
|
|
76
|
-
interval = expr if isinstance(expr, exp.Interval) else exp.Interval(this=expr, unit=unit)
|
|
77
|
-
|
|
78
|
-
return f"{self.sql(this)} {op} {self.sql(interval)}"
|
|
79
|
-
|
|
80
47
|
|
|
81
48
|
# BigQuery -> DuckDB conversion for the DATE function
|
|
82
49
|
def _date_sql(self: DuckDB.Generator, expression: exp.Date) -> str:
|
|
@@ -687,14 +654,14 @@ class DuckDB(Dialect):
|
|
|
687
654
|
exp.DayOfYear: rename_func("DAYOFYEAR"),
|
|
688
655
|
exp.DataType: _datatype_sql,
|
|
689
656
|
exp.Date: _date_sql,
|
|
690
|
-
exp.DateAdd:
|
|
657
|
+
exp.DateAdd: date_delta_to_binary_interval_op(),
|
|
691
658
|
exp.DateFromParts: rename_func("MAKE_DATE"),
|
|
692
|
-
exp.DateSub:
|
|
659
|
+
exp.DateSub: date_delta_to_binary_interval_op(),
|
|
693
660
|
exp.DateDiff: _date_diff_sql,
|
|
694
661
|
exp.DateStrToDate: datestrtodate_sql,
|
|
695
662
|
exp.Datetime: no_datetime_sql,
|
|
696
|
-
exp.DatetimeSub:
|
|
697
|
-
exp.DatetimeAdd:
|
|
663
|
+
exp.DatetimeSub: date_delta_to_binary_interval_op(),
|
|
664
|
+
exp.DatetimeAdd: date_delta_to_binary_interval_op(),
|
|
698
665
|
exp.DateToDi: lambda self,
|
|
699
666
|
e: f"CAST(STRFTIME({self.sql(e, 'this')}, {DuckDB.DATEINT_FORMAT}) AS INT)",
|
|
700
667
|
exp.Decode: lambda self, e: encode_decode_sql(self, e, "DECODE", replace=False),
|
|
@@ -756,7 +723,7 @@ class DuckDB(Dialect):
|
|
|
756
723
|
),
|
|
757
724
|
exp.Struct: _struct_sql,
|
|
758
725
|
exp.Transform: rename_func("LIST_TRANSFORM"),
|
|
759
|
-
exp.TimeAdd:
|
|
726
|
+
exp.TimeAdd: date_delta_to_binary_interval_op(),
|
|
760
727
|
exp.Time: no_time_sql,
|
|
761
728
|
exp.TimeDiff: _timediff_sql,
|
|
762
729
|
exp.Timestamp: no_timestamp_sql,
|
|
@@ -773,7 +740,7 @@ class DuckDB(Dialect):
|
|
|
773
740
|
exp.TimeToUnix: rename_func("EPOCH"),
|
|
774
741
|
exp.TsOrDiToDi: lambda self,
|
|
775
742
|
e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS TEXT), '-', ''), 1, 8) AS INT)",
|
|
776
|
-
exp.TsOrDsAdd:
|
|
743
|
+
exp.TsOrDsAdd: date_delta_to_binary_interval_op(),
|
|
777
744
|
exp.TsOrDsDiff: lambda self, e: self.func(
|
|
778
745
|
"DATE_DIFF",
|
|
779
746
|
f"'{e.args.get('unit') or 'DAY'}'",
|