sqlglot 28.1.0__tar.gz → 28.2.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-28.1.0 → sqlglot-28.2.0}/CHANGELOG.md +265 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/PKG-INFO +1 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/_version.py +3 -3
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/bigquery.py +55 -2
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/clickhouse.py +5 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/databricks.py +11 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/dialect.py +42 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/duckdb.py +248 -8
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/exasol.py +115 -18
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/oracle.py +1 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/redshift.py +9 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/singlestore.py +11 -2
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/snowflake.py +49 -2
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/tsql.py +1 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/expressions.py +183 -15
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/generator.py +13 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/annotate_types.py +68 -37
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/qualify_tables.py +1 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/resolver.py +72 -3
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/scope.py +3 -2
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/parser.py +13 -6
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/tokens.py +6 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/transforms.py +3 -4
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/typing/__init__.py +3 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/typing/bigquery.py +50 -16
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/typing/snowflake.py +92 -7
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot.egg-info/PKG-INFO +1 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_bigquery.py +105 -8
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_clickhouse.py +7 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_databricks.py +21 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_dialect.py +261 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_duckdb.py +28 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_exasol.py +73 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_hive.py +1 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_mysql.py +1 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_postgres.py +4 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_presto.py +1 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_redshift.py +9 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_singlestore.py +3 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_snowflake.py +233 -6
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_spark.py +3 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_starrocks.py +2 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_tsql.py +1 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/identity.sql +2 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/annotate_functions.sql +564 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/annotate_types.sql +32 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_diff.py +5 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_optimizer.py +102 -1
- {sqlglot-28.1.0 → sqlglot-28.2.0}/.gitignore +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/.gitpod.yml +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/.pre-commit-config.yaml +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/CONTRIBUTING.md +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/LICENSE +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/MANIFEST.in +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/Makefile +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/README.md +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/pyproject.toml +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/setup.cfg +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/setup.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/__init__.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/__main__.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/_typing.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/__init__.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/athena.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/doris.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/dremio.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/drill.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/druid.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/dune.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/fabric.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/hive.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/materialize.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/mysql.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/postgres.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/presto.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/prql.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/risingwave.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/solr.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/spark.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/spark2.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/sqlite.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/starrocks.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/tableau.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/teradata.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/dialects/trino.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/diff.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/errors.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/executor/__init__.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/executor/context.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/executor/env.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/executor/python.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/executor/table.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/helper.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/jsonpath.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/lineage.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/__init__.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/canonicalize.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/normalize.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/optimize_joins.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/optimizer.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/qualify.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/qualify_columns.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/simplify.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/planner.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/py.typed +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/schema.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/serde.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/time.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/trie.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/typing/hive.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/typing/presto.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/typing/spark2.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot/typing/tsql.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot.egg-info/SOURCES.txt +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot.egg-info/dependency_links.txt +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot.egg-info/requires.txt +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot.egg-info/top_level.txt +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglot.png +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/Cargo.lock +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/Cargo.toml +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/benches/dialect_settings.json +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/benches/long.rs +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/benches/token_type_settings.json +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/benches/tokenizer_dialect_settings.json +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/benches/tokenizer_settings.json +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/pyproject.toml +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/src/lib.rs +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/src/settings.rs +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/src/token.rs +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/src/tokenizer.rs +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/sqlglotrs/src/trie.rs +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/__init__.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/__init__.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_athena.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_doris.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_dremio.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_drill.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_druid.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_dune.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_fabric.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_materialize.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_oracle.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_pipe_syntax.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_prql.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_risingwave.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_solr.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_sqlite.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_tableau.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_teradata.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/dialects/test_trino.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/jsonpath/LICENSE +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/jsonpath/cts.json +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/normalize.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/simplify.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/partial.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/fixtures/pretty.sql +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/gen_fixtures.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/helpers.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_build.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_dialect_imports.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_docs.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_errors.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_executor.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_expressions.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_generator.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_helper.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_jsonpath.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_lineage.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_parser.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_schema.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_serde.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_time.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_tokens.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_transforms.py +0 -0
- {sqlglot-28.1.0 → sqlglot-28.2.0}/tests/test_transpile.py +0 -0
|
@@ -1,6 +1,270 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
## [v28.1.0] - 2025-12-02
|
|
5
|
+
### :boom: BREAKING CHANGES
|
|
6
|
+
- due to [`e4d1a4f`](https://github.com/tobymao/sqlglot/commit/e4d1a4fcd6741d679c5444bf023077d2aaa8f980) - map date/timestamp `TRUNC` to `DATE_TRUNC` *(PR [#6328](https://github.com/tobymao/sqlglot/pull/6328) by [@nnamdi16](https://github.com/nnamdi16))*:
|
|
7
|
+
|
|
8
|
+
map date/timestamp `TRUNC` to `DATE_TRUNC` (#6328)
|
|
9
|
+
|
|
10
|
+
- due to [`e1b6558`](https://github.com/tobymao/sqlglot/commit/e1b6558cb1a860bbd695f25b66e52064b57c0a84) - handle all datepart alternatives *(PR [#6324](https://github.com/tobymao/sqlglot/pull/6324) by [@lBilali](https://github.com/lBilali))*:
|
|
11
|
+
|
|
12
|
+
handle all datepart alternatives (#6324)
|
|
13
|
+
|
|
14
|
+
- due to [`06daa47`](https://github.com/tobymao/sqlglot/commit/06daa47dedebac672548e1db230b89f5c9eae84e) - update annotated type of ARRAY_AGG to untyped array *(PR [#6347](https://github.com/tobymao/sqlglot/pull/6347) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*:
|
|
15
|
+
|
|
16
|
+
update annotated type of ARRAY_AGG to untyped array (#6347)
|
|
17
|
+
|
|
18
|
+
- due to [`7484c06`](https://github.com/tobymao/sqlglot/commit/7484c06be4534cd22dee14da542d5e29ff2c13a2) - Support rounding mode argument for ROUND function *(PR [#6350](https://github.com/tobymao/sqlglot/pull/6350) by [@vchan](https://github.com/vchan))*:
|
|
19
|
+
|
|
20
|
+
Support rounding mode argument for ROUND function (#6350)
|
|
21
|
+
|
|
22
|
+
- due to [`c495a40`](https://github.com/tobymao/sqlglot/commit/c495a40ee4c1a69b14892e8455ae1bd2ceb5ea4f) - annotate type for MINHASH *(PR [#6355](https://github.com/tobymao/sqlglot/pull/6355) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*:
|
|
23
|
+
|
|
24
|
+
annotate type for MINHASH (#6355)
|
|
25
|
+
|
|
26
|
+
- due to [`b1f9a97`](https://github.com/tobymao/sqlglot/commit/b1f9a976be3c0bcd895bef5bcdb95a013eeb28b7) - annotate type for APPROXIMATE_SIMILARITY *(PR [#6360](https://github.com/tobymao/sqlglot/pull/6360) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*:
|
|
27
|
+
|
|
28
|
+
annotate type for APPROXIMATE_SIMILARITY (#6360)
|
|
29
|
+
|
|
30
|
+
- due to [`3aafca7`](https://github.com/tobymao/sqlglot/commit/3aafca74546b932cea93ed830c021f347ae03ded) - annotate type for MINHASH_COMBINE *(PR [#6362](https://github.com/tobymao/sqlglot/pull/6362) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*:
|
|
31
|
+
|
|
32
|
+
annotate type for MINHASH_COMBINE (#6362)
|
|
33
|
+
|
|
34
|
+
- due to [`df13a65`](https://github.com/tobymao/sqlglot/commit/df13a655646bd2ef5d8b4613670bb5fe48845b73) - unnest deep stuff *(PR [#6366](https://github.com/tobymao/sqlglot/pull/6366) by [@tobymao](https://github.com/tobymao))*:
|
|
35
|
+
|
|
36
|
+
unnest deep stuff (#6366)
|
|
37
|
+
|
|
38
|
+
- due to [`d4c2256`](https://github.com/tobymao/sqlglot/commit/d4c2256fb493ed2f16c29694ae5c31517123d419) - at time zone precedence *(PR [#6383](https://github.com/tobymao/sqlglot/pull/6383) by [@geooo109](https://github.com/geooo109))*:
|
|
39
|
+
|
|
40
|
+
at time zone precedence (#6383)
|
|
41
|
+
|
|
42
|
+
- due to [`4fb4d08`](https://github.com/tobymao/sqlglot/commit/4fb4d08ef8896bda434d4f89c21c669c6146fd02) - properly support table alias in the `INSERT` DML *(PR [#6374](https://github.com/tobymao/sqlglot/pull/6374) by [@snovik75](https://github.com/snovik75))*:
|
|
43
|
+
|
|
44
|
+
properly support table alias in the `INSERT` DML (#6374)
|
|
45
|
+
|
|
46
|
+
- due to [`bf07abd`](https://github.com/tobymao/sqlglot/commit/bf07abd4ee9eb0f5510cb7d1f232bdcaea88941e) - annotation support for APPROX_TOP_K_COMBINE *(PR [#6378](https://github.com/tobymao/sqlglot/pull/6378) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*:
|
|
47
|
+
|
|
48
|
+
annotation support for APPROX_TOP_K_COMBINE (#6378)
|
|
49
|
+
|
|
50
|
+
- due to [`50348ac`](https://github.com/tobymao/sqlglot/commit/50348ac31f784aa97bd09d5d6c6613fbd68402ee) - support order by clause for mysql delete statement *(PR [#6381](https://github.com/tobymao/sqlglot/pull/6381) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*:
|
|
51
|
+
|
|
52
|
+
support order by clause for mysql delete statement (#6381)
|
|
53
|
+
|
|
54
|
+
- due to [`21d3859`](https://github.com/tobymao/sqlglot/commit/21d38590fec6cb55a1a03aeb2621bd9fca677496) - Disable STRING_AGG sep canonicalization *(PR [#6395](https://github.com/tobymao/sqlglot/pull/6395) by [@VaggelisD](https://github.com/VaggelisD))*:
|
|
55
|
+
|
|
56
|
+
Disable STRING_AGG sep canonicalization (#6395)
|
|
57
|
+
|
|
58
|
+
- due to [`95727f6`](https://github.com/tobymao/sqlglot/commit/95727f60d601796b34c850dee9366d79f6e4a24b) - canonicalize table aliases *(PR [#6369](https://github.com/tobymao/sqlglot/pull/6369) by [@georgesittas](https://github.com/georgesittas))*:
|
|
59
|
+
|
|
60
|
+
canonicalize table aliases (#6369)
|
|
61
|
+
|
|
62
|
+
- due to [`c7cb098`](https://github.com/tobymao/sqlglot/commit/c7cb0983a0fa463c43d2c4ee925816e9a1628c79) - Fix underscore separator with scientific notation *(PR [#6401](https://github.com/tobymao/sqlglot/pull/6401) by [@VaggelisD](https://github.com/VaggelisD))*:
|
|
63
|
+
|
|
64
|
+
Fix underscore separator with scientific notation (#6401)
|
|
65
|
+
|
|
66
|
+
- due to [`bb4eda1`](https://github.com/tobymao/sqlglot/commit/bb4eda1beb68b92de9ab014a63c67797a07df2fa) - support transpiling SHA1 from BigQuery to DuckDB *(PR [#6404](https://github.com/tobymao/sqlglot/pull/6404) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*:
|
|
67
|
+
|
|
68
|
+
support transpiling SHA1 from BigQuery to DuckDB (#6404)
|
|
69
|
+
|
|
70
|
+
- due to [`d038ad7`](https://github.com/tobymao/sqlglot/commit/d038ad7f036a140f3eae4bdde15824437d4e44ee) - support named primary keys for mysql *(PR [#6389](https://github.com/tobymao/sqlglot/pull/6389) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*:
|
|
71
|
+
|
|
72
|
+
support named primary keys for mysql (#6389)
|
|
73
|
+
|
|
74
|
+
- due to [`05e83b5`](https://github.com/tobymao/sqlglot/commit/05e83b56f1bf9323cfa819a7f1beb542524c1219) - support transpilation of LEAST from BigQuery to DuckDB *(PR [#6415](https://github.com/tobymao/sqlglot/pull/6415) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*:
|
|
75
|
+
|
|
76
|
+
support transpilation of LEAST from BigQuery to DuckDB (#6415)
|
|
77
|
+
|
|
78
|
+
- due to [`4f3bb0d`](https://github.com/tobymao/sqlglot/commit/4f3bb0d6714bf89ff72e13e1398d8f01cefafb00) - Correct transpilation of BigQuery's JSON_EXTRACT_SCALAR… *(PR [#6414](https://github.com/tobymao/sqlglot/pull/6414) by [@vchan](https://github.com/vchan))*:
|
|
79
|
+
|
|
80
|
+
Correct transpilation of BigQuery's JSON_EXTRACT_SCALAR… (#6414)
|
|
81
|
+
|
|
82
|
+
- due to [`8c314a8`](https://github.com/tobymao/sqlglot/commit/8c314a8b457a5c3ed470ac8fcff022fec881c248) - support cte pivot for duckdb *(PR [#6413](https://github.com/tobymao/sqlglot/pull/6413) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*:
|
|
83
|
+
|
|
84
|
+
support cte pivot for duckdb (#6413)
|
|
85
|
+
|
|
86
|
+
- due to [`c6b0a63`](https://github.com/tobymao/sqlglot/commit/c6b0a6342a21d79635a26d40001c916d05d47cf7) - change version to be a tuple so that it can be pickled, also simpler *(commit by [@tobymao](https://github.com/tobymao))*:
|
|
87
|
+
|
|
88
|
+
change version to be a tuple so that it can be pickled, also simpler
|
|
89
|
+
|
|
90
|
+
- due to [`07d9958`](https://github.com/tobymao/sqlglot/commit/07d99583b4aebdc682bb7604ccdf45bddb89f9c3) - replace direct comparison with dialect properties *(PR [#6398](https://github.com/tobymao/sqlglot/pull/6398) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*:
|
|
91
|
+
|
|
92
|
+
replace direct comparison with dialect properties (#6398)
|
|
93
|
+
|
|
94
|
+
- due to [`38472ce`](https://github.com/tobymao/sqlglot/commit/38472ce14bce731ba4c309d515223ae99e2575ac) - transpile bigquery's %x format literal *(PR [#6375](https://github.com/tobymao/sqlglot/pull/6375) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*:
|
|
95
|
+
|
|
96
|
+
transpile bigquery's %x format literal (#6375)
|
|
97
|
+
|
|
98
|
+
- due to [`92ee124`](https://github.com/tobymao/sqlglot/commit/92ee1241ea3088d4e63c094404252339c54ad0c1) - postgres qualify GENERATE_SERIES and table projection *(PR [#6373](https://github.com/tobymao/sqlglot/pull/6373) by [@geooo109](https://github.com/geooo109))*:
|
|
99
|
+
|
|
100
|
+
postgres qualify GENERATE_SERIES and table projection (#6373)
|
|
101
|
+
|
|
102
|
+
- due to [`0b9d8ac`](https://github.com/tobymao/sqlglot/commit/0b9d8acbe75457424436e8c0acc047ab66e9fdc0) - Annotate type for snowflake MAX function *(PR [#6422](https://github.com/tobymao/sqlglot/pull/6422) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*:
|
|
103
|
+
|
|
104
|
+
Annotate type for snowflake MAX function (#6422)
|
|
105
|
+
|
|
106
|
+
- due to [`68e9414`](https://github.com/tobymao/sqlglot/commit/68e9414725a60b2842d870fa222d8466057a94f6) - Annotate type for snowflake MIN function *(PR [#6427](https://github.com/tobymao/sqlglot/pull/6427) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*:
|
|
107
|
+
|
|
108
|
+
Annotate type for snowflake MIN function (#6427)
|
|
109
|
+
|
|
110
|
+
- due to [`1318de7`](https://github.com/tobymao/sqlglot/commit/1318de77a8aa514ec7eb9f9b8c03228e3f8eb008) - Annotate type for snowflake NORMAL *(PR [#6434](https://github.com/tobymao/sqlglot/pull/6434) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*:
|
|
111
|
+
|
|
112
|
+
Annotate type for snowflake NORMAL (#6434)
|
|
113
|
+
|
|
114
|
+
- due to [`ffbb5c7`](https://github.com/tobymao/sqlglot/commit/ffbb5c7e40aa064ffcd4827e96ea66cfd045118e) - annotate type for HASH_AGG in Snowflake *(PR [#6438](https://github.com/tobymao/sqlglot/pull/6438) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*:
|
|
115
|
+
|
|
116
|
+
annotate type for HASH_AGG in Snowflake (#6438)
|
|
117
|
+
|
|
118
|
+
- due to [`161255f`](https://github.com/tobymao/sqlglot/commit/161255f6c90b9c3ed2074e734f6d074db1d7a6dd) - Add support for `LOCALTIME` function *(PR [#6443](https://github.com/tobymao/sqlglot/pull/6443) by [@VaggelisD](https://github.com/VaggelisD))*:
|
|
119
|
+
|
|
120
|
+
Add support for `LOCALTIME` function (#6443)
|
|
121
|
+
|
|
122
|
+
- due to [`ca329f0`](https://github.com/tobymao/sqlglot/commit/ca329f037a230c315437d830638b514190764c5a) - support transpilation of SHA256 from bigquery to duckdb *(PR [#6421](https://github.com/tobymao/sqlglot/pull/6421) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*:
|
|
123
|
+
|
|
124
|
+
support transpilation of SHA256 from bigquery to duckdb (#6421)
|
|
125
|
+
|
|
126
|
+
- due to [`e18ae24`](https://github.com/tobymao/sqlglot/commit/e18ae248423dbbca78a24a60ea0193da2ee7f68c) - Annotate type for snowflake REGR_SLOPE function *(PR [#6425](https://github.com/tobymao/sqlglot/pull/6425) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*:
|
|
127
|
+
|
|
128
|
+
Annotate type for snowflake REGR_SLOPE function (#6425)
|
|
129
|
+
|
|
130
|
+
- due to [`1d847f0`](https://github.com/tobymao/sqlglot/commit/1d847f0a1f88fce5df340ab646a72c8abbc12a86) - parse & annotate `CHECK_JSON`, `CHECK_XML` *(PR [#6439](https://github.com/tobymao/sqlglot/pull/6439) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*:
|
|
131
|
+
|
|
132
|
+
parse & annotate `CHECK_JSON`, `CHECK_XML` (#6439)
|
|
133
|
+
|
|
134
|
+
- due to [`cb3080d`](https://github.com/tobymao/sqlglot/commit/cb3080d4bed18b1bfbbd08380ed60deeefd15530) - annotation support for APPROX_TOP_K_ESTIMATE . Return type ARRAY *(PR [#6445](https://github.com/tobymao/sqlglot/pull/6445) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*:
|
|
135
|
+
|
|
136
|
+
annotation support for APPROX_TOP_K_ESTIMATE . Return type ARRAY (#6445)
|
|
137
|
+
|
|
138
|
+
- due to [`313afe5`](https://github.com/tobymao/sqlglot/commit/313afe540aa2cdc4cc179c4852c6ef37362bcb3e) - annotate type for snowflake func ARRAY_UNION_AGG *(PR [#6446](https://github.com/tobymao/sqlglot/pull/6446) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*:
|
|
139
|
+
|
|
140
|
+
annotate type for snowflake func ARRAY_UNION_AGG (#6446)
|
|
141
|
+
|
|
142
|
+
- due to [`cd9f037`](https://github.com/tobymao/sqlglot/commit/cd9f037882eef253e86fdb1d51521e0acd7db3f9) - store pk name if provided *(PR [#6424](https://github.com/tobymao/sqlglot/pull/6424) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*:
|
|
143
|
+
|
|
144
|
+
store pk name if provided (#6424)
|
|
145
|
+
|
|
146
|
+
- due to [`65194e4`](https://github.com/tobymao/sqlglot/commit/65194e465489151aa51859a6e3f5672f7d4c5f3b) - Annotate type for snowflake RANDSTR function *(PR [#6436](https://github.com/tobymao/sqlglot/pull/6436) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*:
|
|
147
|
+
|
|
148
|
+
Annotate type for snowflake RANDSTR function (#6436)
|
|
149
|
+
|
|
150
|
+
- due to [`a56262e`](https://github.com/tobymao/sqlglot/commit/a56262e6b4276baae144855478807c173db77ab9) - Annotate type for snowflake MEDIAN *(PR [#6426](https://github.com/tobymao/sqlglot/pull/6426) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*:
|
|
151
|
+
|
|
152
|
+
Annotate type for snowflake MEDIAN (#6426)
|
|
153
|
+
|
|
154
|
+
- due to [`2c56567`](https://github.com/tobymao/sqlglot/commit/2c56567755c8a6571d8b7d410c9de943e54df58b) - Annotate type for snowflake SEARCH_IP *(PR [#6440](https://github.com/tobymao/sqlglot/pull/6440) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*:
|
|
155
|
+
|
|
156
|
+
Annotate type for snowflake SEARCH_IP (#6440)
|
|
157
|
+
|
|
158
|
+
- due to [`ac86568`](https://github.com/tobymao/sqlglot/commit/ac86568a939f692b99813da100297b61fb54e044) - Added decfloat type *(PR [#6444](https://github.com/tobymao/sqlglot/pull/6444) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*:
|
|
159
|
+
|
|
160
|
+
Added decfloat type (#6444)
|
|
161
|
+
|
|
162
|
+
- due to [`b321ca6`](https://github.com/tobymao/sqlglot/commit/b321ca6191fefc88da1a6de83a465886b5754b7a) - bump sqlglotrs to 0.8.0 *(commit by [@georgesittas](https://github.com/georgesittas))*:
|
|
163
|
+
|
|
164
|
+
bump sqlglotrs to 0.8.0
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
### :sparkles: New Features
|
|
168
|
+
- [`ca81217`](https://github.com/tobymao/sqlglot/commit/ca812171ab800e3faa73ea1874dd6814c8d6f701) - **duckdb**: Transpile INITCAP with custom delimiters *(PR [#6302](https://github.com/tobymao/sqlglot/pull/6302) by [@treysp](https://github.com/treysp))*
|
|
169
|
+
- [`7484c06`](https://github.com/tobymao/sqlglot/commit/7484c06be4534cd22dee14da542d5e29ff2c13a2) - **DuckDB**: Support rounding mode argument for ROUND function *(PR [#6350](https://github.com/tobymao/sqlglot/pull/6350) by [@vchan](https://github.com/vchan))*
|
|
170
|
+
- [`79e314d`](https://github.com/tobymao/sqlglot/commit/79e314df76161319ba8495b95f54603cfef0c08a) - **duckdb**: handle casting BLOB input for TRIM() *(PR [#6353](https://github.com/tobymao/sqlglot/pull/6353) by [@toriwei](https://github.com/toriwei))*
|
|
171
|
+
- [`c495a40`](https://github.com/tobymao/sqlglot/commit/c495a40ee4c1a69b14892e8455ae1bd2ceb5ea4f) - **optimizer**: annotate type for MINHASH *(PR [#6355](https://github.com/tobymao/sqlglot/pull/6355) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*
|
|
172
|
+
- [`f16f8a0`](https://github.com/tobymao/sqlglot/commit/f16f8a08072556fd617b5125300262d9bb8c1e48) - improve validate qualify column message closes [#6348](https://github.com/tobymao/sqlglot/pull/6348) *(PR [#6356](https://github.com/tobymao/sqlglot/pull/6356) by [@tobymao](https://github.com/tobymao))*
|
|
173
|
+
- [`17abe23`](https://github.com/tobymao/sqlglot/commit/17abe231bc4d59912952f266ad4df86ece22c8d2) - make simplify more efficient in number of iterations *(PR [#6351](https://github.com/tobymao/sqlglot/pull/6351) by [@tobymao](https://github.com/tobymao))*
|
|
174
|
+
- [`b1f9a97`](https://github.com/tobymao/sqlglot/commit/b1f9a976be3c0bcd895bef5bcdb95a013eeb28b7) - **optimizer**: annotate type for APPROXIMATE_SIMILARITY *(PR [#6360](https://github.com/tobymao/sqlglot/pull/6360) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*
|
|
175
|
+
- [`3aafca7`](https://github.com/tobymao/sqlglot/commit/3aafca74546b932cea93ed830c021f347ae03ded) - **optimizer**: annotate type for MINHASH_COMBINE *(PR [#6362](https://github.com/tobymao/sqlglot/pull/6362) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*
|
|
176
|
+
- [`09a4bd8`](https://github.com/tobymao/sqlglot/commit/09a4bd8870a075e641c6e3e4cee74d73a39e760a) - Trigger integration tests *(PR [#6339](https://github.com/tobymao/sqlglot/pull/6339) by [@erindru](https://github.com/erindru))*
|
|
177
|
+
- [`7769129`](https://github.com/tobymao/sqlglot/commit/7769129eba7ae5f3594e0061bdb1079fedc5aafd) - bignum and time_ns to duckdb closes [#6379](https://github.com/tobymao/sqlglot/pull/6379) *(commit by [@tobymao](https://github.com/tobymao))*
|
|
178
|
+
- [`90a3fa9`](https://github.com/tobymao/sqlglot/commit/90a3fa9f6ddf0aa32b41118c59d4facd9fdb3398) - mark IgnoreNulls and RespectNulls as unsupported on postgres and mysql *(PR [#6377](https://github.com/tobymao/sqlglot/pull/6377) by [@NickCrews](https://github.com/NickCrews))*
|
|
179
|
+
- :arrow_lower_right: *addresses issue [#6376](https://github.com/tobymao/sqlglot/issues/6376) opened by [@NickCrews](https://github.com/NickCrews)*
|
|
180
|
+
- [`5bb1170`](https://github.com/tobymao/sqlglot/commit/5bb117082caeee719442d783ce6742d027b1492e) - transpile bigquery `greatest` null handling to duckdb *(PR [#6361](https://github.com/tobymao/sqlglot/pull/6361) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*
|
|
181
|
+
- [`bf07abd`](https://github.com/tobymao/sqlglot/commit/bf07abd4ee9eb0f5510cb7d1f232bdcaea88941e) - **snowflake**: annotation support for APPROX_TOP_K_COMBINE *(PR [#6378](https://github.com/tobymao/sqlglot/pull/6378) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
182
|
+
- [`01890eb`](https://github.com/tobymao/sqlglot/commit/01890eb16d6624de4f26b7d8eadf850df6f2a042) - **trino**: support refresh materialized view statement closes [#6387](https://github.com/tobymao/sqlglot/pull/6387) *(PR [#6388](https://github.com/tobymao/sqlglot/pull/6388) by [@georgesittas](https://github.com/georgesittas))*
|
|
183
|
+
- [`e4ea6cc`](https://github.com/tobymao/sqlglot/commit/e4ea6ccf08c0ff4063424bf538bc3b22f4b4cfaf) - transpile BQ APPROX_QUANTILES to DuckDB *(PR [#6349](https://github.com/tobymao/sqlglot/pull/6349) by [@treysp](https://github.com/treysp))*
|
|
184
|
+
- [`95727f6`](https://github.com/tobymao/sqlglot/commit/95727f60d601796b34c850dee9366d79f6e4a24b) - **optimizer**: canonicalize table aliases *(PR [#6369](https://github.com/tobymao/sqlglot/pull/6369) by [@georgesittas](https://github.com/georgesittas))*
|
|
185
|
+
- [`3b6855b`](https://github.com/tobymao/sqlglot/commit/3b6855b9787111f27225108241fbe4f389443e29) - **mysql**: support ZEROFILL column attribute *(PR [#6400](https://github.com/tobymao/sqlglot/pull/6400) by [@nian0114](https://github.com/nian0114))*
|
|
186
|
+
- :arrow_lower_right: *addresses issue [#6399](https://github.com/tobymao/sqlglot/issues/6399) opened by [@nian0114](https://github.com/nian0114)*
|
|
187
|
+
- [`bb4eda1`](https://github.com/tobymao/sqlglot/commit/bb4eda1beb68b92de9ab014a63c67797a07df2fa) - **duckdb**: support transpiling SHA1 from BigQuery to DuckDB *(PR [#6404](https://github.com/tobymao/sqlglot/pull/6404) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*
|
|
188
|
+
- [`05e83b5`](https://github.com/tobymao/sqlglot/commit/05e83b56f1bf9323cfa819a7f1beb542524c1219) - **duckdb**: support transpilation of LEAST from BigQuery to DuckDB *(PR [#6415](https://github.com/tobymao/sqlglot/pull/6415) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*
|
|
189
|
+
- [`38472ce`](https://github.com/tobymao/sqlglot/commit/38472ce14bce731ba4c309d515223ae99e2575ac) - **duckdb**: transpile bigquery's %x format literal *(PR [#6375](https://github.com/tobymao/sqlglot/pull/6375) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
190
|
+
- [`a6e1581`](https://github.com/tobymao/sqlglot/commit/a6e15811cf5643bcc18e1e227fea20922b05c54a) - **DuckDB**: Cast BIGNUMERIC and BIGDECIMAL types to DECIMAL(38, 5) *(PR [#6419](https://github.com/tobymao/sqlglot/pull/6419) by [@vchan](https://github.com/vchan))*
|
|
191
|
+
- [`0b9d8ac`](https://github.com/tobymao/sqlglot/commit/0b9d8acbe75457424436e8c0acc047ab66e9fdc0) - **snowflake**: Annotate type for snowflake MAX function *(PR [#6422](https://github.com/tobymao/sqlglot/pull/6422) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
|
|
192
|
+
- [`68e9414`](https://github.com/tobymao/sqlglot/commit/68e9414725a60b2842d870fa222d8466057a94f6) - **snowflake**: Annotate type for snowflake MIN function *(PR [#6427](https://github.com/tobymao/sqlglot/pull/6427) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*
|
|
193
|
+
- [`1318de7`](https://github.com/tobymao/sqlglot/commit/1318de77a8aa514ec7eb9f9b8c03228e3f8eb008) - **snowflake**: Annotate type for snowflake NORMAL *(PR [#6434](https://github.com/tobymao/sqlglot/pull/6434) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
|
|
194
|
+
- [`ffbb5c7`](https://github.com/tobymao/sqlglot/commit/ffbb5c7e40aa064ffcd4827e96ea66cfd045118e) - **snowflake**: annotate type for HASH_AGG in Snowflake *(PR [#6438](https://github.com/tobymao/sqlglot/pull/6438) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*
|
|
195
|
+
- [`161255f`](https://github.com/tobymao/sqlglot/commit/161255f6c90b9c3ed2074e734f6d074db1d7a6dd) - Add support for `LOCALTIME` function *(PR [#6443](https://github.com/tobymao/sqlglot/pull/6443) by [@VaggelisD](https://github.com/VaggelisD))*
|
|
196
|
+
- [`ca329f0`](https://github.com/tobymao/sqlglot/commit/ca329f037a230c315437d830638b514190764c5a) - **duckdb**: support transpilation of SHA256 from bigquery to duckdb *(PR [#6421](https://github.com/tobymao/sqlglot/pull/6421) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*
|
|
197
|
+
- [`e18ae24`](https://github.com/tobymao/sqlglot/commit/e18ae248423dbbca78a24a60ea0193da2ee7f68c) - **snowflake**: Annotate type for snowflake REGR_SLOPE function *(PR [#6425](https://github.com/tobymao/sqlglot/pull/6425) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
|
|
198
|
+
- [`1d847f0`](https://github.com/tobymao/sqlglot/commit/1d847f0a1f88fce5df340ab646a72c8abbc12a86) - **snowflake**: parse & annotate `CHECK_JSON`, `CHECK_XML` *(PR [#6439](https://github.com/tobymao/sqlglot/pull/6439) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
|
|
199
|
+
- [`6843812`](https://github.com/tobymao/sqlglot/commit/68438129ceeea70f801e0ae728c51c19291fc7d8) - add correlation id to remote workflow trigger *(PR [#6441](https://github.com/tobymao/sqlglot/pull/6441) by [@erindru](https://github.com/erindru))*
|
|
200
|
+
- [`cb3080d`](https://github.com/tobymao/sqlglot/commit/cb3080d4bed18b1bfbbd08380ed60deeefd15530) - **snowflake**: annotation support for APPROX_TOP_K_ESTIMATE . Return type ARRAY *(PR [#6445](https://github.com/tobymao/sqlglot/pull/6445) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
201
|
+
- [`cd9f037`](https://github.com/tobymao/sqlglot/commit/cd9f037882eef253e86fdb1d51521e0acd7db3f9) - **optimizer**: store pk name if provided *(PR [#6424](https://github.com/tobymao/sqlglot/pull/6424) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
|
|
202
|
+
- [`65194e4`](https://github.com/tobymao/sqlglot/commit/65194e465489151aa51859a6e3f5672f7d4c5f3b) - **snowflake**: Annotate type for snowflake RANDSTR function *(PR [#6436](https://github.com/tobymao/sqlglot/pull/6436) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
|
|
203
|
+
- [`351d783`](https://github.com/tobymao/sqlglot/commit/351d7834915e02a9f4949f9925437e2731f3a8b4) - add support for LOCALTIMESTAMP *(PR [#6448](https://github.com/tobymao/sqlglot/pull/6448) by [@AbhishekASLK](https://github.com/AbhishekASLK))*
|
|
204
|
+
- [`a56262e`](https://github.com/tobymao/sqlglot/commit/a56262e6b4276baae144855478807c173db77ab9) - **snowflake**: Annotate type for snowflake MEDIAN *(PR [#6426](https://github.com/tobymao/sqlglot/pull/6426) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*
|
|
205
|
+
- [`2c56567`](https://github.com/tobymao/sqlglot/commit/2c56567755c8a6571d8b7d410c9de943e54df58b) - **snowflake**: Annotate type for snowflake SEARCH_IP *(PR [#6440](https://github.com/tobymao/sqlglot/pull/6440) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
|
|
206
|
+
- [`ac86568`](https://github.com/tobymao/sqlglot/commit/ac86568a939f692b99813da100297b61fb54e044) - **snowflake**: Added decfloat type *(PR [#6444](https://github.com/tobymao/sqlglot/pull/6444) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
|
|
207
|
+
|
|
208
|
+
### :bug: Bug Fixes
|
|
209
|
+
- [`0f79f2a`](https://github.com/tobymao/sqlglot/commit/0f79f2a55c4ba14d4a5fcfd01a0a727271992b8c) - **snowflake**: MAX_BY and MIN_BY with count should return plain `ARRAY` *(PR [#6343](https://github.com/tobymao/sqlglot/pull/6343) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
|
|
210
|
+
- [`e1b6558`](https://github.com/tobymao/sqlglot/commit/e1b6558cb1a860bbd695f25b66e52064b57c0a84) - **tsql**: handle all datepart alternatives *(PR [#6324](https://github.com/tobymao/sqlglot/pull/6324) by [@lBilali](https://github.com/lBilali))*
|
|
211
|
+
- [`06daa47`](https://github.com/tobymao/sqlglot/commit/06daa47dedebac672548e1db230b89f5c9eae84e) - **optimizer**: update annotated type of ARRAY_AGG to untyped array *(PR [#6347](https://github.com/tobymao/sqlglot/pull/6347) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*
|
|
212
|
+
- [`826db4d`](https://github.com/tobymao/sqlglot/commit/826db4d3c413941e3b0b31e1f907fabd017bd461) - **redshift**: properly parse default IAM_ROLE and AVRO/JSON formats in COPY *(PR [#6346](https://github.com/tobymao/sqlglot/pull/6346) by [@georgesittas](https://github.com/georgesittas))*
|
|
213
|
+
- :arrow_lower_right: *fixes issue [#6345](https://github.com/tobymao/sqlglot/issues/6345) opened by [@zachary-povey](https://github.com/zachary-povey)*
|
|
214
|
+
- [`c367bac`](https://github.com/tobymao/sqlglot/commit/c367bac878a3c17773009b54b9836e7b9a5b84fe) - **duckdb**: Support update without set in DuckDB merge when matched *(PR [#6357](https://github.com/tobymao/sqlglot/pull/6357) by [@themisvaltinos](https://github.com/themisvaltinos))*
|
|
215
|
+
- [`df13a65`](https://github.com/tobymao/sqlglot/commit/df13a655646bd2ef5d8b4613670bb5fe48845b73) - unnest deep stuff *(PR [#6366](https://github.com/tobymao/sqlglot/pull/6366) by [@tobymao](https://github.com/tobymao))*
|
|
216
|
+
- [`20e33fd`](https://github.com/tobymao/sqlglot/commit/20e33fd0d1bc1899727d023411e604f1ea9347b8) - **duckdb**: regexp_extract_all closes [#6380](https://github.com/tobymao/sqlglot/pull/6380) *(commit by [@tobymao](https://github.com/tobymao))*
|
|
217
|
+
- [`d4c2256`](https://github.com/tobymao/sqlglot/commit/d4c2256fb493ed2f16c29694ae5c31517123d419) - **parser**: at time zone precedence *(PR [#6383](https://github.com/tobymao/sqlglot/pull/6383) by [@geooo109](https://github.com/geooo109))*
|
|
218
|
+
- :arrow_lower_right: *fixes issue [#6359](https://github.com/tobymao/sqlglot/issues/6359) opened by [@parth-wisdom](https://github.com/parth-wisdom)*
|
|
219
|
+
- [`4fb4d08`](https://github.com/tobymao/sqlglot/commit/4fb4d08ef8896bda434d4f89c21c669c6146fd02) - **oracle**: properly support table alias in the `INSERT` DML *(PR [#6374](https://github.com/tobymao/sqlglot/pull/6374) by [@snovik75](https://github.com/snovik75))*
|
|
220
|
+
- :arrow_lower_right: *fixes issue [#6371](https://github.com/tobymao/sqlglot/issues/6371) opened by [@snovik75](https://github.com/snovik75)*
|
|
221
|
+
- [`2169f5b`](https://github.com/tobymao/sqlglot/commit/2169f5b8f30b6c8be1635bb5648a1abf636e49a6) - **parser**: support SET with := *(PR [#6385](https://github.com/tobymao/sqlglot/pull/6385) by [@geooo109](https://github.com/geooo109))*
|
|
222
|
+
- :arrow_lower_right: *fixes issue [#6384](https://github.com/tobymao/sqlglot/issues/6384) opened by [@AndyVW77](https://github.com/AndyVW77)*
|
|
223
|
+
- [`50348ac`](https://github.com/tobymao/sqlglot/commit/50348ac31f784aa97bd09d5d6c6613fbd68402ee) - **mysql**: support order by clause for mysql delete statement *(PR [#6381](https://github.com/tobymao/sqlglot/pull/6381) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
|
|
224
|
+
- :arrow_lower_right: *fixes issue [#6372](https://github.com/tobymao/sqlglot/issues/6372) opened by [@AhlamHani](https://github.com/AhlamHani)*
|
|
225
|
+
- [`21d3859`](https://github.com/tobymao/sqlglot/commit/21d38590fec6cb55a1a03aeb2621bd9fca677496) - **bigquery**: Disable STRING_AGG sep canonicalization *(PR [#6395](https://github.com/tobymao/sqlglot/pull/6395) by [@VaggelisD](https://github.com/VaggelisD))*
|
|
226
|
+
- :arrow_lower_right: *fixes issue [#6392](https://github.com/tobymao/sqlglot/issues/6392) opened by [@erindru](https://github.com/erindru)*
|
|
227
|
+
- [`67f499d`](https://github.com/tobymao/sqlglot/commit/67f499dd497efdf4f3fc49dd75e49a77e036ee63) - **duckdb**: Make exp.DateFromParts more lenient *(PR [#6397](https://github.com/tobymao/sqlglot/pull/6397) by [@VaggelisD](https://github.com/VaggelisD))*
|
|
228
|
+
- :arrow_lower_right: *fixes issue [#6394](https://github.com/tobymao/sqlglot/issues/6394) opened by [@denis-komarov](https://github.com/denis-komarov)*
|
|
229
|
+
- [`39f8c37`](https://github.com/tobymao/sqlglot/commit/39f8c37aca755d97e1e41f232042d1c649e58908) - **parser**: support FROM-syntax with joins *(PR [#6402](https://github.com/tobymao/sqlglot/pull/6402) by [@geooo109](https://github.com/geooo109))*
|
|
230
|
+
- :arrow_lower_right: *fixes issue [#6396](https://github.com/tobymao/sqlglot/issues/6396) opened by [@denis-komarov](https://github.com/denis-komarov)*
|
|
231
|
+
- [`9ddae4d`](https://github.com/tobymao/sqlglot/commit/9ddae4d56d1e3a15fc3b4b76ce3b3040683c220f) - **duckdb**: support IN with no paren *(PR [#6409](https://github.com/tobymao/sqlglot/pull/6409) by [@geooo109](https://github.com/geooo109))*
|
|
232
|
+
- :arrow_lower_right: *fixes issue [#6407](https://github.com/tobymao/sqlglot/issues/6407) opened by [@denis-komarov](https://github.com/denis-komarov)*
|
|
233
|
+
- [`c7cb098`](https://github.com/tobymao/sqlglot/commit/c7cb0983a0fa463c43d2c4ee925816e9a1628c79) - **tokenizer**: Fix underscore separator with scientific notation *(PR [#6401](https://github.com/tobymao/sqlglot/pull/6401) by [@VaggelisD](https://github.com/VaggelisD))*
|
|
234
|
+
- :arrow_lower_right: *fixes issue [#6393](https://github.com/tobymao/sqlglot/issues/6393) opened by [@denis-komarov](https://github.com/denis-komarov)*
|
|
235
|
+
- [`f5635d2`](https://github.com/tobymao/sqlglot/commit/f5635d2cc2a5612d6403bbf508b545f2a4e8f773) - **duckdb**: splice with col named after type closes [#6411](https://github.com/tobymao/sqlglot/pull/6411) *(commit by [@tobymao](https://github.com/tobymao))*
|
|
236
|
+
- [`097d865`](https://github.com/tobymao/sqlglot/commit/097d865554d9ba2e226962fa71778ae0a6c596cb) - **duckdb**: pivot using cast closes [#6410](https://github.com/tobymao/sqlglot/pull/6410) *(commit by [@tobymao](https://github.com/tobymao))*
|
|
237
|
+
- [`d038ad7`](https://github.com/tobymao/sqlglot/commit/d038ad7f036a140f3eae4bdde15824437d4e44ee) - **mysql**: support named primary keys for mysql *(PR [#6389](https://github.com/tobymao/sqlglot/pull/6389) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
|
|
238
|
+
- :arrow_lower_right: *fixes issue [#6382](https://github.com/tobymao/sqlglot/issues/6382) opened by [@AndyVW77](https://github.com/AndyVW77)*
|
|
239
|
+
- [`4f3bb0d`](https://github.com/tobymao/sqlglot/commit/4f3bb0d6714bf89ff72e13e1398d8f01cefafb00) - **DuckDB**: Correct transpilation of BigQuery's JSON_EXTRACT_SCALAR… *(PR [#6414](https://github.com/tobymao/sqlglot/pull/6414) by [@vchan](https://github.com/vchan))*
|
|
240
|
+
- [`e2f306f`](https://github.com/tobymao/sqlglot/commit/e2f306f1893a3f565cbbf7857ffd9795850aba7b) - interval column ops closes [#6416](https://github.com/tobymao/sqlglot/pull/6416) *(commit by [@tobymao](https://github.com/tobymao))*
|
|
241
|
+
- [`8c314a8`](https://github.com/tobymao/sqlglot/commit/8c314a8b457a5c3ed470ac8fcff022fec881c248) - **duckdb**: support cte pivot for duckdb *(PR [#6413](https://github.com/tobymao/sqlglot/pull/6413) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
|
|
242
|
+
- :arrow_lower_right: *fixes issue [#6405](https://github.com/tobymao/sqlglot/issues/6405) opened by [@denis-komarov](https://github.com/denis-komarov)*
|
|
243
|
+
- [`92ee124`](https://github.com/tobymao/sqlglot/commit/92ee1241ea3088d4e63c094404252339c54ad0c1) - **optimizer**: postgres qualify GENERATE_SERIES and table projection *(PR [#6373](https://github.com/tobymao/sqlglot/pull/6373) by [@geooo109](https://github.com/geooo109))*
|
|
244
|
+
- :arrow_lower_right: *fixes issue [#6358](https://github.com/tobymao/sqlglot/issues/6358) opened by [@metahexane](https://github.com/metahexane)*
|
|
245
|
+
|
|
246
|
+
### :recycle: Refactors
|
|
247
|
+
- [`e4d1a4f`](https://github.com/tobymao/sqlglot/commit/e4d1a4fcd6741d679c5444bf023077d2aaa8f980) - **exasol**: map date/timestamp `TRUNC` to `DATE_TRUNC` *(PR [#6328](https://github.com/tobymao/sqlglot/pull/6328) by [@nnamdi16](https://github.com/nnamdi16))*
|
|
248
|
+
- [`c6b0a63`](https://github.com/tobymao/sqlglot/commit/c6b0a6342a21d79635a26d40001c916d05d47cf7) - change version to be a tuple so that it can be pickled, also simpler *(commit by [@tobymao](https://github.com/tobymao))*
|
|
249
|
+
- [`625654a`](https://github.com/tobymao/sqlglot/commit/625654a9623cc5407bfde922c29f32a8ee905a3b) - move resolver to own file *(commit by [@tobymao](https://github.com/tobymao))*
|
|
250
|
+
|
|
251
|
+
### :wrench: Chores
|
|
252
|
+
- [`487d218`](https://github.com/tobymao/sqlglot/commit/487d218a6fcad4e28c65c6df55435ba218826186) - iterative annotate types *(PR [#6342](https://github.com/tobymao/sqlglot/pull/6342) by [@geooo109](https://github.com/geooo109))*
|
|
253
|
+
- [`8201062`](https://github.com/tobymao/sqlglot/commit/8201062ac41b85e5a89aa8e1c5973852f105c66e) - clean up derived table traversal in table qualification *(PR [#6363](https://github.com/tobymao/sqlglot/pull/6363) by [@georgesittas](https://github.com/georgesittas))*
|
|
254
|
+
- [`6b7084d`](https://github.com/tobymao/sqlglot/commit/6b7084d0c9f4735432afc12509c77c286cc50513) - **optimizer**: refactor costly scope walking loop in qualify tables *(PR [#6364](https://github.com/tobymao/sqlglot/pull/6364) by [@georgesittas](https://github.com/georgesittas))*
|
|
255
|
+
- [`0319241`](https://github.com/tobymao/sqlglot/commit/0319241162bbe6d278a626100eac73999b250968) - **mysql,postgres**: tests for unsupported IGNORE/RESPECT NULLS *(PR [#6386](https://github.com/tobymao/sqlglot/pull/6386) by [@geooo109](https://github.com/geooo109))*
|
|
256
|
+
- :arrow_lower_right: *addresses issue [#6376](https://github.com/tobymao/sqlglot/issues/6376) opened by [@NickCrews](https://github.com/NickCrews)*
|
|
257
|
+
- [`11354cc`](https://github.com/tobymao/sqlglot/commit/11354cc85d116cd24c28114a437111965ba828a9) - Make integration test workflow more robust *(PR [#6403](https://github.com/tobymao/sqlglot/pull/6403) by [@erindru](https://github.com/erindru))*
|
|
258
|
+
- [`f758cea`](https://github.com/tobymao/sqlglot/commit/f758cea0e9fca5850895a730c554c17b488d29ca) - **exasol**: transformed rank function, ignoring parameters *(PR [#6408](https://github.com/tobymao/sqlglot/pull/6408) by [@nnamdi16](https://github.com/nnamdi16))*
|
|
259
|
+
- [`07d9958`](https://github.com/tobymao/sqlglot/commit/07d99583b4aebdc682bb7604ccdf45bddb89f9c3) - **optimizer**: replace direct comparison with dialect properties *(PR [#6398](https://github.com/tobymao/sqlglot/pull/6398) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*
|
|
260
|
+
- [`137549e`](https://github.com/tobymao/sqlglot/commit/137549e5e803416d46e13e9a8123cef9b53d349a) - **exasol**: transform substring_index using substr and instr *(PR [#6406](https://github.com/tobymao/sqlglot/pull/6406) by [@nnamdi16](https://github.com/nnamdi16))*
|
|
261
|
+
- [`78f1824`](https://github.com/tobymao/sqlglot/commit/78f1824c790f523845cbda488ecf4c43a92ac0f0) - **exasol**: transform substring_index using substr and instr *(PR [#6406](https://github.com/tobymao/sqlglot/pull/6406) by [@nnamdi16](https://github.com/nnamdi16))*
|
|
262
|
+
- [`39cc555`](https://github.com/tobymao/sqlglot/commit/39cc55586ed76a4a583e6db22a9ee51e09bff92e) - **snowflake**: annotate type for COUNT *(PR [#6437](https://github.com/tobymao/sqlglot/pull/6437) by [@fivetran-felixhuang](https://github.com/fivetran-felixhuang))*
|
|
263
|
+
- [`61f39ba`](https://github.com/tobymao/sqlglot/commit/61f39bab9a0668c338e8c1b5e0fa953f22c0a886) - **optimizer**: improve error message for ambiguous columns *(PR [#6423](https://github.com/tobymao/sqlglot/pull/6423) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*
|
|
264
|
+
- [`313afe5`](https://github.com/tobymao/sqlglot/commit/313afe540aa2cdc4cc179c4852c6ef37362bcb3e) - **optimizer**: annotate type for snowflake func ARRAY_UNION_AGG *(PR [#6446](https://github.com/tobymao/sqlglot/pull/6446) by [@fivetran-MichaelLee](https://github.com/fivetran-MichaelLee))*
|
|
265
|
+
- [`b321ca6`](https://github.com/tobymao/sqlglot/commit/b321ca6191fefc88da1a6de83a465886b5754b7a) - bump sqlglotrs to 0.8.0 *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
266
|
+
|
|
267
|
+
|
|
4
268
|
## [v28.0.0] - 2025-11-17
|
|
5
269
|
### :boom: BREAKING CHANGES
|
|
6
270
|
- due to [`39d8e19`](https://github.com/tobymao/sqlglot/commit/39d8e19419c2adbb80465be414d1cc3bbc6d007b) - include VARIABLE kind in SET transpilation to DuckDB *(PR [#6201](https://github.com/tobymao/sqlglot/pull/6201) by [@toriwei](https://github.com/toriwei))*:
|
|
@@ -8451,3 +8715,4 @@ Changelog
|
|
|
8451
8715
|
[v27.28.0]: https://github.com/tobymao/sqlglot/compare/v27.27.0...v27.28.0
|
|
8452
8716
|
[v27.29.0]: https://github.com/tobymao/sqlglot/compare/v27.28.1...v27.29.0
|
|
8453
8717
|
[v28.0.0]: https://github.com/tobymao/sqlglot/compare/v27.29.0...v28.0.0
|
|
8718
|
+
[v28.1.0]: https://github.com/tobymao/sqlglot/compare/v28.0.0...v28.1.0
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '28.
|
|
32
|
-
__version_tuple__ = version_tuple = (28,
|
|
31
|
+
__version__ = version = '28.2.0'
|
|
32
|
+
__version_tuple__ = version_tuple = (28, 2, 0)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g06c7ffbe1'
|
|
@@ -242,10 +242,28 @@ def _build_datetime(args: t.List) -> exp.Func:
|
|
|
242
242
|
return exp.TimestampFromParts.from_arg_list(args)
|
|
243
243
|
|
|
244
244
|
|
|
245
|
+
def build_date_diff(args: t.List) -> exp.Expression:
|
|
246
|
+
expr = exp.DateDiff(
|
|
247
|
+
this=seq_get(args, 0),
|
|
248
|
+
expression=seq_get(args, 1),
|
|
249
|
+
unit=seq_get(args, 2),
|
|
250
|
+
date_part_boundary=True,
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
# Normalize plain WEEK to WEEK(SUNDAY) to preserve the semantic in the AST to facilitate transpilation
|
|
254
|
+
# This is done post exp.DateDiff construction since the TimeUnit mixin performs canonicalizations in its constructor too
|
|
255
|
+
unit = expr.args.get("unit")
|
|
256
|
+
|
|
257
|
+
if isinstance(unit, exp.Var) and unit.name.upper() == "WEEK":
|
|
258
|
+
expr.set("unit", exp.WeekStart(this=exp.var("SUNDAY")))
|
|
259
|
+
|
|
260
|
+
return expr
|
|
261
|
+
|
|
262
|
+
|
|
245
263
|
def _build_regexp_extract(
|
|
246
264
|
expr_type: t.Type[E], default_group: t.Optional[exp.Expression] = None
|
|
247
|
-
) -> t.Callable[[t.List], E]:
|
|
248
|
-
def _builder(args: t.List) -> E:
|
|
265
|
+
) -> t.Callable[[t.List, BigQuery], E]:
|
|
266
|
+
def _builder(args: t.List, dialect: BigQuery) -> E:
|
|
249
267
|
try:
|
|
250
268
|
group = re.compile(args[1].name).groups == 1
|
|
251
269
|
except re.error:
|
|
@@ -258,6 +276,11 @@ def _build_regexp_extract(
|
|
|
258
276
|
position=seq_get(args, 2),
|
|
259
277
|
occurrence=seq_get(args, 3),
|
|
260
278
|
group=exp.Literal.number(1) if group else default_group,
|
|
279
|
+
**(
|
|
280
|
+
{"null_if_pos_overflow": dialect.REGEXP_EXTRACT_POSITION_OVERFLOW_RETURNS_NULL}
|
|
281
|
+
if expr_type is exp.RegexpExtract
|
|
282
|
+
else {}
|
|
283
|
+
),
|
|
261
284
|
)
|
|
262
285
|
|
|
263
286
|
return _builder
|
|
@@ -366,6 +389,7 @@ class BigQuery(Dialect):
|
|
|
366
389
|
EXCLUDES_PSEUDOCOLUMNS_FROM_STAR = True
|
|
367
390
|
QUERY_RESULTS_ARE_STRUCTS = True
|
|
368
391
|
JSON_EXTRACT_SCALAR_SCALAR_ONLY = True
|
|
392
|
+
DEFAULT_NULL_TYPE = exp.DataType.Type.BIGINT
|
|
369
393
|
|
|
370
394
|
# https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/string_functions#initcap
|
|
371
395
|
INITCAP_DEFAULT_DELIMITER_CHARS = ' \t\n\r\f\v\\[\\](){}/|<>!?@"^#$&~_,.:;*%+\\-'
|
|
@@ -382,6 +406,15 @@ class BigQuery(Dialect):
|
|
|
382
406
|
"%D": "%m/%d/%y",
|
|
383
407
|
"%E6S": "%S.%f",
|
|
384
408
|
"%e": "%-d",
|
|
409
|
+
"%F": "%Y-%m-%d",
|
|
410
|
+
"%T": "%H:%M:%S",
|
|
411
|
+
"%c": "%a %b %e %H:%M:%S %Y",
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
INVERSE_TIME_MAPPING = {
|
|
415
|
+
# Preserve %E6S instead of expanding to %T.%f - since both %E6S & %T.%f are semantically different in BigQuery
|
|
416
|
+
# %E6S is semantically different from %T.%f: %E6S works as a single atomic specifier for seconds with microseconds, while %T.%f expands incorrectly and fails to parse.
|
|
417
|
+
"%H:%M:%S.%f": "%H:%M:%E6S",
|
|
385
418
|
}
|
|
386
419
|
|
|
387
420
|
FORMAT_MAPPING = {
|
|
@@ -416,6 +449,13 @@ class BigQuery(Dialect):
|
|
|
416
449
|
}
|
|
417
450
|
COERCES_TO[exp.DataType.Type.DECIMAL] |= {exp.DataType.Type.BIGDECIMAL}
|
|
418
451
|
COERCES_TO[exp.DataType.Type.BIGINT] |= {exp.DataType.Type.BIGDECIMAL}
|
|
452
|
+
COERCES_TO[exp.DataType.Type.VARCHAR] |= {
|
|
453
|
+
exp.DataType.Type.DATE,
|
|
454
|
+
exp.DataType.Type.DATETIME,
|
|
455
|
+
exp.DataType.Type.TIME,
|
|
456
|
+
exp.DataType.Type.TIMESTAMP,
|
|
457
|
+
exp.DataType.Type.TIMESTAMPTZ,
|
|
458
|
+
}
|
|
419
459
|
|
|
420
460
|
EXPRESSION_METADATA = EXPRESSION_METADATA.copy()
|
|
421
461
|
|
|
@@ -542,6 +582,7 @@ class BigQuery(Dialect):
|
|
|
542
582
|
"CONTAINS_SUBSTR": _build_contains_substring,
|
|
543
583
|
"DATE": _build_date,
|
|
544
584
|
"DATE_ADD": build_date_delta_with_interval(exp.DateAdd),
|
|
585
|
+
"DATE_DIFF": build_date_diff,
|
|
545
586
|
"DATE_SUB": build_date_delta_with_interval(exp.DateSub),
|
|
546
587
|
"DATE_TRUNC": lambda args: exp.DateTrunc(
|
|
547
588
|
unit=seq_get(args, 1),
|
|
@@ -1021,6 +1062,18 @@ class BigQuery(Dialect):
|
|
|
1021
1062
|
this=self._match_text_seq("AS") and self._parse_select(),
|
|
1022
1063
|
)
|
|
1023
1064
|
|
|
1065
|
+
def _parse_column_ops(self, this: t.Optional[exp.Expression]) -> t.Optional[exp.Expression]:
|
|
1066
|
+
this = super()._parse_column_ops(this)
|
|
1067
|
+
|
|
1068
|
+
if isinstance(this, exp.Dot):
|
|
1069
|
+
if this.this.name == "NET":
|
|
1070
|
+
if this.name.upper() == "HOST":
|
|
1071
|
+
this = self.expression(
|
|
1072
|
+
exp.NetHost, this=seq_get(this.expression.expressions, 0)
|
|
1073
|
+
)
|
|
1074
|
+
|
|
1075
|
+
return this
|
|
1076
|
+
|
|
1024
1077
|
class Generator(generator.Generator):
|
|
1025
1078
|
INTERVAL_ALLOWS_PLURAL_FORM = False
|
|
1026
1079
|
JOIN_HINTS = False
|
|
@@ -355,6 +355,8 @@ class ClickHouse(Dialect):
|
|
|
355
355
|
"ARRAYSUM": exp.ArraySum.from_arg_list,
|
|
356
356
|
"ARRAYREVERSE": exp.ArrayReverse.from_arg_list,
|
|
357
357
|
"ARRAYSLICE": exp.ArraySlice.from_arg_list,
|
|
358
|
+
"CURRENTDATABASE": exp.CurrentDatabase.from_arg_list,
|
|
359
|
+
"CURRENTSCHEMAS": exp.CurrentSchemas.from_arg_list,
|
|
358
360
|
"COUNTIF": _build_count_if,
|
|
359
361
|
"COSINEDISTANCE": exp.CosineDistance.from_arg_list,
|
|
360
362
|
"DATE_ADD": build_date_delta(exp.DateAdd, default_unit=None),
|
|
@@ -469,6 +471,7 @@ class ClickHouse(Dialect):
|
|
|
469
471
|
"quantiles",
|
|
470
472
|
"quantileExact",
|
|
471
473
|
"quantilesExact",
|
|
474
|
+
"quantilesExactExclusive",
|
|
472
475
|
"quantileExactLow",
|
|
473
476
|
"quantilesExactLow",
|
|
474
477
|
"quantileExactHigh",
|
|
@@ -1148,6 +1151,8 @@ class ClickHouse(Dialect):
|
|
|
1148
1151
|
exp.ArgMin: arg_max_or_min_no_count("argMin"),
|
|
1149
1152
|
exp.Array: inline_array_sql,
|
|
1150
1153
|
exp.CastToStrType: rename_func("CAST"),
|
|
1154
|
+
exp.CurrentDatabase: rename_func("CURRENT_DATABASE"),
|
|
1155
|
+
exp.CurrentSchemas: rename_func("CURRENT_SCHEMAS"),
|
|
1151
1156
|
exp.CountIf: rename_func("countIf"),
|
|
1152
1157
|
exp.CosineDistance: rename_func("cosineDistance"),
|
|
1153
1158
|
exp.CompressColumnConstraint: lambda self,
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from copy import deepcopy
|
|
4
4
|
from collections import defaultdict
|
|
5
5
|
|
|
6
|
-
from sqlglot import exp, transforms, jsonpath
|
|
6
|
+
from sqlglot import exp, transforms, jsonpath, parser
|
|
7
7
|
from sqlglot.dialects.dialect import (
|
|
8
8
|
date_delta_sql,
|
|
9
9
|
build_date_delta,
|
|
@@ -66,6 +66,15 @@ class Databricks(Spark):
|
|
|
66
66
|
TokenType.COLON: exp.JSONExtract,
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
COLUMN_OPERATORS = {
|
|
70
|
+
**parser.Parser.COLUMN_OPERATORS,
|
|
71
|
+
TokenType.QDCOLON: lambda self, this, to: self.expression(
|
|
72
|
+
exp.TryCast,
|
|
73
|
+
this=this,
|
|
74
|
+
to=to,
|
|
75
|
+
),
|
|
76
|
+
}
|
|
77
|
+
|
|
69
78
|
class Generator(Spark.Generator):
|
|
70
79
|
TABLESAMPLE_SEED_KEYWORD = "REPEATABLE"
|
|
71
80
|
COPY_PARAMS_ARE_WRAPPED = False
|
|
@@ -104,6 +113,7 @@ class Databricks(Spark):
|
|
|
104
113
|
if e.args.get("is_numeric")
|
|
105
114
|
else self.function_fallback_sql(e)
|
|
106
115
|
),
|
|
116
|
+
exp.CurrentCatalog: lambda *_: "CURRENT_CATALOG()",
|
|
107
117
|
}
|
|
108
118
|
|
|
109
119
|
TRANSFORMS.pop(exp.RegexpLike)
|
|
@@ -185,7 +185,11 @@ class _Dialect(type):
|
|
|
185
185
|
klass.FORMAT_TRIE = (
|
|
186
186
|
new_trie(klass.FORMAT_MAPPING) if klass.FORMAT_MAPPING else klass.TIME_TRIE
|
|
187
187
|
)
|
|
188
|
-
|
|
188
|
+
# Merge class-defined INVERSE_TIME_MAPPING with auto-generated mappings
|
|
189
|
+
# This allows dialects to define custom inverse mappings for roundtrip correctness
|
|
190
|
+
klass.INVERSE_TIME_MAPPING = {v: k for k, v in klass.TIME_MAPPING.items()} | (
|
|
191
|
+
klass.__dict__.get("INVERSE_TIME_MAPPING") or {}
|
|
192
|
+
)
|
|
189
193
|
klass.INVERSE_TIME_TRIE = new_trie(klass.INVERSE_TIME_MAPPING)
|
|
190
194
|
klass.INVERSE_FORMAT_MAPPING = {v: k for k, v in klass.FORMAT_MAPPING.items()}
|
|
191
195
|
klass.INVERSE_FORMAT_TRIE = new_trie(klass.INVERSE_FORMAT_MAPPING)
|
|
@@ -292,6 +296,22 @@ class _Dialect(type):
|
|
|
292
296
|
no_paren_functions.pop(TokenType.LOCALTIMESTAMP, None)
|
|
293
297
|
klass.parser_class.NO_PAREN_FUNCTIONS = no_paren_functions
|
|
294
298
|
|
|
299
|
+
if enum in (
|
|
300
|
+
"",
|
|
301
|
+
"postgres",
|
|
302
|
+
"duckdb",
|
|
303
|
+
"trino",
|
|
304
|
+
):
|
|
305
|
+
no_paren_functions = klass.parser_class.NO_PAREN_FUNCTIONS.copy()
|
|
306
|
+
no_paren_functions[TokenType.CURRENT_CATALOG] = exp.CurrentCatalog
|
|
307
|
+
klass.parser_class.NO_PAREN_FUNCTIONS = no_paren_functions
|
|
308
|
+
else:
|
|
309
|
+
# For dialects that don't support this keyword, treat it as a regular identifier
|
|
310
|
+
# This fixes the "Unexpected token" error in BQ, Spark, etc.
|
|
311
|
+
klass.parser_class.ID_VAR_TOKENS = klass.parser_class.ID_VAR_TOKENS | {
|
|
312
|
+
TokenType.CURRENT_CATALOG,
|
|
313
|
+
}
|
|
314
|
+
|
|
295
315
|
klass.VALID_INTERVAL_UNITS = {
|
|
296
316
|
*klass.VALID_INTERVAL_UNITS,
|
|
297
317
|
*klass.DATE_PART_MAPPING.keys(),
|
|
@@ -634,6 +654,9 @@ class Dialect(metaclass=_Dialect):
|
|
|
634
654
|
REGEXP_EXTRACT_DEFAULT_GROUP = 0
|
|
635
655
|
"""The default value for the capturing group."""
|
|
636
656
|
|
|
657
|
+
REGEXP_EXTRACT_POSITION_OVERFLOW_RETURNS_NULL = True
|
|
658
|
+
"""Whether REGEXP_EXTRACT returns NULL when the position arg exceeds the string length."""
|
|
659
|
+
|
|
637
660
|
SET_OP_DISTINCT_BY_DEFAULT: t.Dict[t.Type[exp.Expression], t.Optional[bool]] = {
|
|
638
661
|
exp.Except: True,
|
|
639
662
|
exp.Intersect: True,
|
|
@@ -696,6 +719,13 @@ class Dialect(metaclass=_Dialect):
|
|
|
696
719
|
so we map the ExplodingGenerateSeries expression to "generate_series" string.
|
|
697
720
|
"""
|
|
698
721
|
|
|
722
|
+
DEFAULT_NULL_TYPE = exp.DataType.Type.UNKNOWN
|
|
723
|
+
"""
|
|
724
|
+
The default type of NULL for producing the correct projection type.
|
|
725
|
+
|
|
726
|
+
For example, in BigQuery the default type of the NULL value is INT64.
|
|
727
|
+
"""
|
|
728
|
+
|
|
699
729
|
# --- Autofilled ---
|
|
700
730
|
|
|
701
731
|
tokenizer_class = Tokenizer
|
|
@@ -757,6 +787,7 @@ class Dialect(metaclass=_Dialect):
|
|
|
757
787
|
"WEEKDAY_ISO": "DAYOFWEEKISO",
|
|
758
788
|
"DOW_ISO": "DAYOFWEEKISO",
|
|
759
789
|
"DW_ISO": "DAYOFWEEKISO",
|
|
790
|
+
"DAYOFWEEK_ISO": "DAYOFWEEKISO",
|
|
760
791
|
"DAY OF YEAR": "DAYOFYEAR",
|
|
761
792
|
"DOY": "DAYOFYEAR",
|
|
762
793
|
"DY": "DAYOFYEAR",
|
|
@@ -1961,11 +1992,21 @@ def build_like(
|
|
|
1961
1992
|
|
|
1962
1993
|
def build_regexp_extract(expr_type: t.Type[E]) -> t.Callable[[t.List, Dialect], E]:
|
|
1963
1994
|
def _builder(args: t.List, dialect: Dialect) -> E:
|
|
1995
|
+
# The "position" argument specifies the index of the string character to start matching from.
|
|
1996
|
+
# `null_if_pos_overflow` reflects the dialect's behavior when position is greater than the string
|
|
1997
|
+
# length. If true, returns NULL. If false, returns an empty string. `null_if_pos_overflow` is
|
|
1998
|
+
# only needed for exp.RegexpExtract - exp.RegexpExtractAll always returns an empty array if
|
|
1999
|
+
# position overflows.
|
|
1964
2000
|
return expr_type(
|
|
1965
2001
|
this=seq_get(args, 0),
|
|
1966
2002
|
expression=seq_get(args, 1),
|
|
1967
2003
|
group=seq_get(args, 2) or exp.Literal.number(dialect.REGEXP_EXTRACT_DEFAULT_GROUP),
|
|
1968
2004
|
parameters=seq_get(args, 3),
|
|
2005
|
+
**(
|
|
2006
|
+
{"null_if_pos_overflow": dialect.REGEXP_EXTRACT_POSITION_OVERFLOW_RETURNS_NULL}
|
|
2007
|
+
if expr_type is exp.RegexpExtract
|
|
2008
|
+
else {}
|
|
2009
|
+
),
|
|
1969
2010
|
)
|
|
1970
2011
|
|
|
1971
2012
|
return _builder
|