sqlglot 27.25.2__tar.gz → 27.26.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.25.2 → sqlglot-27.26.0}/PKG-INFO +1 -1
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/_version.py +3 -3
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/clickhouse.py +3 -1
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/dialect.py +2 -1
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/duckdb.py +16 -3
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/postgres.py +1 -1
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/snowflake.py +6 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/tsql.py +2 -1
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/expressions.py +12 -2
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/generator.py +7 -3
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/qualify_columns.py +2 -2
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/qualify_tables.py +2 -1
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/unnest_subqueries.py +1 -1
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/parser.py +13 -4
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/transforms.py +2 -2
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.egg-info/PKG-INFO +1 -1
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_bigquery.py +8 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_duckdb.py +13 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_mysql.py +2 -2
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_snowflake.py +23 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/identity.sql +1 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/annotate_functions.sql +52 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_parser.py +2 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/.gitignore +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/.gitpod.yml +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/.pre-commit-config.yaml +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/CHANGELOG.md +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/CONTRIBUTING.md +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/LICENSE +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/MANIFEST.in +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/Makefile +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/README.md +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/pyproject.toml +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/setup.cfg +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/setup.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/__init__.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/__main__.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/_typing.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/__init__.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/athena.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/bigquery.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/databricks.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/doris.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/dremio.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/drill.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/druid.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/dune.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/exasol.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/fabric.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/hive.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/materialize.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/mysql.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/oracle.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/presto.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/prql.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/redshift.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/risingwave.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/singlestore.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/solr.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/spark.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/spark2.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/sqlite.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/starrocks.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/tableau.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/teradata.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/trino.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/diff.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/errors.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/executor/__init__.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/executor/context.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/executor/env.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/executor/python.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/executor/table.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/helper.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/jsonpath.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/lineage.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/__init__.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/annotate_types.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/canonicalize.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/normalize.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/optimize_joins.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/optimizer.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/qualify.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/scope.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/simplify.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/planner.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/py.typed +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/schema.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/serde.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/time.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/tokens.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/trie.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.egg-info/SOURCES.txt +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.egg-info/dependency_links.txt +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.egg-info/requires.txt +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.egg-info/top_level.txt +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.png +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/Cargo.lock +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/Cargo.toml +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/benches/dialect_settings.json +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/benches/long.rs +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/benches/token_type_settings.json +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/benches/tokenizer_dialect_settings.json +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/benches/tokenizer_settings.json +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/pyproject.toml +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/src/lib.rs +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/src/settings.rs +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/src/token.rs +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/src/tokenizer.rs +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/src/trie.rs +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/__init__.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/__init__.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_athena.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_clickhouse.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_databricks.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_dialect.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_doris.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_dremio.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_drill.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_druid.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_dune.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_exasol.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_fabric.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_hive.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_materialize.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_oracle.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_pipe_syntax.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_postgres.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_presto.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_prql.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_redshift.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_risingwave.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_singlestore.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_solr.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_spark.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_sqlite.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_starrocks.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_tableau.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_teradata.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_trino.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_tsql.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/jsonpath/LICENSE +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/jsonpath/cts.json +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/normalize.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/simplify.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/partial.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/pretty.sql +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/gen_fixtures.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/helpers.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_build.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_dialect_imports.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_diff.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_docs.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_executor.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_expressions.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_generator.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_helper.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_jsonpath.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_lineage.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_optimizer.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_schema.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_serde.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_time.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_tokens.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_transforms.py +0 -0
- {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_transpile.py +0 -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 = '27.
|
|
32
|
-
__version_tuple__ = version_tuple = (27,
|
|
31
|
+
__version__ = version = '27.26.0'
|
|
32
|
+
__version_tuple__ = version_tuple = (27, 26, 0)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'gc94e3e0e4'
|
|
@@ -769,7 +769,9 @@ class ClickHouse(Dialect):
|
|
|
769
769
|
) -> t.Optional[exp.Join]:
|
|
770
770
|
join = super()._parse_join(skip_join_token=skip_join_token, parse_bracket=True)
|
|
771
771
|
if join:
|
|
772
|
-
|
|
772
|
+
method = join.args.get("method")
|
|
773
|
+
join.set("method", None)
|
|
774
|
+
join.set("global", method)
|
|
773
775
|
|
|
774
776
|
# tbl ARRAY JOIN arr <-- this should be a `Column` reference, not a `Table`
|
|
775
777
|
# https://clickhouse.com/docs/en/sql-reference/statements/select/array-join
|
|
@@ -721,6 +721,7 @@ class Dialect(metaclass=_Dialect):
|
|
|
721
721
|
exp.Exp,
|
|
722
722
|
exp.Ln,
|
|
723
723
|
exp.Log,
|
|
724
|
+
exp.Pi,
|
|
724
725
|
exp.Pow,
|
|
725
726
|
exp.Quantile,
|
|
726
727
|
exp.Round,
|
|
@@ -1195,7 +1196,7 @@ def no_paren_current_date_sql(self: Generator, expression: exp.CurrentDate) -> s
|
|
|
1195
1196
|
def no_recursive_cte_sql(self: Generator, expression: exp.With) -> str:
|
|
1196
1197
|
if expression.args.get("recursive"):
|
|
1197
1198
|
self.unsupported("Recursive CTEs are unsupported")
|
|
1198
|
-
expression.
|
|
1199
|
+
expression.set("recursive", False)
|
|
1199
1200
|
return self.with_sql(expression)
|
|
1200
1201
|
|
|
1201
1202
|
|
|
@@ -706,7 +706,6 @@ class DuckDB(Dialect):
|
|
|
706
706
|
exp.GenerateDateArray: _generate_datetime_array_sql,
|
|
707
707
|
exp.GenerateTimestampArray: _generate_datetime_array_sql,
|
|
708
708
|
exp.GroupConcat: lambda self, e: groupconcat_sql(self, e, within_group=False),
|
|
709
|
-
exp.HexString: lambda self, e: self.hexstring_sql(e, binary_function_repr="FROM_HEX"),
|
|
710
709
|
exp.Explode: rename_func("UNNEST"),
|
|
711
710
|
exp.IntDiv: lambda self, e: self.binary(e, "//"),
|
|
712
711
|
exp.IsInf: rename_func("ISINF"),
|
|
@@ -1039,8 +1038,8 @@ class DuckDB(Dialect):
|
|
|
1039
1038
|
if isinstance(expression.this, exp.Unnest):
|
|
1040
1039
|
return super().join_sql(expression.on(exp.true()))
|
|
1041
1040
|
|
|
1042
|
-
expression.
|
|
1043
|
-
expression.
|
|
1041
|
+
expression.set("side", None)
|
|
1042
|
+
expression.set("kind", None)
|
|
1044
1043
|
|
|
1045
1044
|
return super().join_sql(expression)
|
|
1046
1045
|
|
|
@@ -1301,3 +1300,17 @@ class DuckDB(Dialect):
|
|
|
1301
1300
|
return self.func("FORMAT", "'{}'", expression.expressions[0])
|
|
1302
1301
|
|
|
1303
1302
|
return self.function_fallback_sql(expression)
|
|
1303
|
+
|
|
1304
|
+
def hexstring_sql(
|
|
1305
|
+
self, expression: exp.HexString, binary_function_repr: t.Optional[str] = None
|
|
1306
|
+
) -> str:
|
|
1307
|
+
from_hex = super().hexstring_sql(expression, binary_function_repr="FROM_HEX")
|
|
1308
|
+
|
|
1309
|
+
if expression.args.get("is_integer"):
|
|
1310
|
+
return from_hex
|
|
1311
|
+
|
|
1312
|
+
# `from_hex` has transpiled x'ABCD' (BINARY) to DuckDB's '\xAB\xCD' (BINARY)
|
|
1313
|
+
# `to_hex` & CASTing transforms it to "ABCD" (BINARY) to match representation
|
|
1314
|
+
to_hex = exp.cast(self.func("TO_HEX", from_hex), exp.DataType.Type.BLOB)
|
|
1315
|
+
|
|
1316
|
+
return self.sql(to_hex)
|
|
@@ -67,7 +67,7 @@ def _date_add_sql(kind: str) -> t.Callable[[Postgres.Generator, DATE_ADD_OR_SUB]
|
|
|
67
67
|
|
|
68
68
|
e = self._simplify_unless_literal(expression.expression)
|
|
69
69
|
if isinstance(e, exp.Literal):
|
|
70
|
-
e.
|
|
70
|
+
e.set("is_string", True)
|
|
71
71
|
elif e.is_number:
|
|
72
72
|
e = exp.Literal.string(e.to_py())
|
|
73
73
|
else:
|
|
@@ -571,8 +571,13 @@ class Snowflake(Dialect):
|
|
|
571
571
|
exp.Degrees,
|
|
572
572
|
exp.Exp,
|
|
573
573
|
exp.Sin,
|
|
574
|
+
exp.Sinh,
|
|
574
575
|
exp.Tan,
|
|
576
|
+
exp.Tanh,
|
|
575
577
|
exp.Asin,
|
|
578
|
+
exp.Asinh,
|
|
579
|
+
exp.Atan,
|
|
580
|
+
exp.Atan2,
|
|
576
581
|
exp.Atanh,
|
|
577
582
|
exp.Cbrt,
|
|
578
583
|
},
|
|
@@ -671,6 +676,7 @@ class Snowflake(Dialect):
|
|
|
671
676
|
exp.Stuff,
|
|
672
677
|
exp.Substring,
|
|
673
678
|
exp.Round,
|
|
679
|
+
exp.Ceil,
|
|
674
680
|
)
|
|
675
681
|
},
|
|
676
682
|
**{
|
|
@@ -1219,7 +1219,8 @@ class TSQL(Dialect):
|
|
|
1219
1219
|
|
|
1220
1220
|
def create_sql(self, expression: exp.Create) -> str:
|
|
1221
1221
|
kind = expression.kind
|
|
1222
|
-
exists = expression.args.
|
|
1222
|
+
exists = expression.args.get("exists")
|
|
1223
|
+
expression.set("exists", None)
|
|
1223
1224
|
|
|
1224
1225
|
like_property = expression.find(exp.LikeProperty)
|
|
1225
1226
|
if like_property:
|
|
@@ -1008,8 +1008,8 @@ class Expression(metaclass=_Expression):
|
|
|
1008
1008
|
|
|
1009
1009
|
def div(self, other: ExpOrStr, typed: bool = False, safe: bool = False) -> Div:
|
|
1010
1010
|
div = self._binop(Div, other)
|
|
1011
|
-
div.
|
|
1012
|
-
div.
|
|
1011
|
+
div.set("typed", typed)
|
|
1012
|
+
div.set("safe", safe)
|
|
1013
1013
|
return div
|
|
1014
1014
|
|
|
1015
1015
|
def asc(self, nulls_first: bool = True) -> Ordered:
|
|
@@ -1727,6 +1727,7 @@ class CTE(DerivedTable):
|
|
|
1727
1727
|
"alias": True,
|
|
1728
1728
|
"scalar": False,
|
|
1729
1729
|
"materialized": False,
|
|
1730
|
+
"key_expressions": False,
|
|
1730
1731
|
}
|
|
1731
1732
|
|
|
1732
1733
|
|
|
@@ -2386,6 +2387,7 @@ class Insert(DDL, DML):
|
|
|
2386
2387
|
"partition": False,
|
|
2387
2388
|
"settings": False,
|
|
2388
2389
|
"source": False,
|
|
2390
|
+
"default": False,
|
|
2389
2391
|
}
|
|
2390
2392
|
|
|
2391
2393
|
def with_(
|
|
@@ -5560,6 +5562,10 @@ class Tan(Func):
|
|
|
5560
5562
|
pass
|
|
5561
5563
|
|
|
5562
5564
|
|
|
5565
|
+
class Tanh(Func):
|
|
5566
|
+
pass
|
|
5567
|
+
|
|
5568
|
+
|
|
5563
5569
|
class Degrees(Func):
|
|
5564
5570
|
pass
|
|
5565
5571
|
|
|
@@ -7201,6 +7207,10 @@ class VectorSearch(Func):
|
|
|
7201
7207
|
}
|
|
7202
7208
|
|
|
7203
7209
|
|
|
7210
|
+
class Pi(Func):
|
|
7211
|
+
arg_types = {}
|
|
7212
|
+
|
|
7213
|
+
|
|
7204
7214
|
class Pow(Binary, Func):
|
|
7205
7215
|
_sql_names = ["POWER", "POW"]
|
|
7206
7216
|
|
|
@@ -1332,7 +1332,10 @@ class Generator(metaclass=_Generator):
|
|
|
1332
1332
|
elif materialized:
|
|
1333
1333
|
materialized = "MATERIALIZED "
|
|
1334
1334
|
|
|
1335
|
-
|
|
1335
|
+
key_expressions = self.expressions(expression, key="key_expressions", flat=True)
|
|
1336
|
+
key_expressions = f" USING KEY ({key_expressions})" if key_expressions else ""
|
|
1337
|
+
|
|
1338
|
+
return f"{alias_sql}{key_expressions} AS {materialized or ''}{self.wrap(expression)}"
|
|
1336
1339
|
|
|
1337
1340
|
def tablealias_sql(self, expression: exp.TableAlias) -> str:
|
|
1338
1341
|
alias = self.sql(expression, "this")
|
|
@@ -1478,7 +1481,7 @@ class Generator(metaclass=_Generator):
|
|
|
1478
1481
|
def delete_sql(self, expression: exp.Delete) -> str:
|
|
1479
1482
|
this = self.sql(expression, "this")
|
|
1480
1483
|
this = f" FROM {this}" if this else ""
|
|
1481
|
-
using = self.
|
|
1484
|
+
using = self.expressions(expression, key="using")
|
|
1482
1485
|
using = f" USING {using}" if using else ""
|
|
1483
1486
|
cluster = self.sql(expression, "cluster")
|
|
1484
1487
|
cluster = f" {cluster}" if cluster else ""
|
|
@@ -1952,10 +1955,11 @@ class Generator(metaclass=_Generator):
|
|
|
1952
1955
|
on_conflict = self.sql(expression, "conflict")
|
|
1953
1956
|
on_conflict = f" {on_conflict}" if on_conflict else ""
|
|
1954
1957
|
by_name = " BY NAME" if expression.args.get("by_name") else ""
|
|
1958
|
+
default_values = "DEFAULT VALUES" if expression.args.get("default") else ""
|
|
1955
1959
|
returning = self.sql(expression, "returning")
|
|
1956
1960
|
|
|
1957
1961
|
if self.RETURNING_END:
|
|
1958
|
-
expression_sql = f"{expression_sql}{on_conflict}{returning}"
|
|
1962
|
+
expression_sql = f"{expression_sql}{on_conflict}{default_values}{returning}"
|
|
1959
1963
|
else:
|
|
1960
1964
|
expression_sql = f"{returning}{expression_sql}{on_conflict}"
|
|
1961
1965
|
|
|
@@ -162,7 +162,7 @@ def _pop_table_column_aliases(derived_tables: t.List[exp.CTE | exp.Subquery]) ->
|
|
|
162
162
|
continue
|
|
163
163
|
table_alias = derived_table.args.get("alias")
|
|
164
164
|
if table_alias:
|
|
165
|
-
table_alias.
|
|
165
|
+
table_alias.set("columns", None)
|
|
166
166
|
|
|
167
167
|
|
|
168
168
|
def _expand_using(scope: Scope, resolver: Resolver) -> t.Dict[str, t.Any]:
|
|
@@ -239,7 +239,7 @@ def _expand_using(scope: Scope, resolver: Resolver) -> t.Dict[str, t.Any]:
|
|
|
239
239
|
if join_table not in tables:
|
|
240
240
|
tables[join_table] = None
|
|
241
241
|
|
|
242
|
-
join.
|
|
242
|
+
join.set("using", None)
|
|
243
243
|
join.set("on", exp.and_(*conditions, copy=False))
|
|
244
244
|
|
|
245
245
|
if column_tables:
|
|
@@ -72,7 +72,8 @@ def qualify_tables(
|
|
|
72
72
|
if isinstance(derived_table, exp.Subquery):
|
|
73
73
|
unnested = derived_table.unnest()
|
|
74
74
|
if isinstance(unnested, exp.Table):
|
|
75
|
-
joins = unnested.args.
|
|
75
|
+
joins = unnested.args.get("joins")
|
|
76
|
+
unnested.set("joins", None)
|
|
76
77
|
derived_table.this.replace(exp.select("*").from_(unnested.copy(), copy=False))
|
|
77
78
|
derived_table.this.set("joins", joins)
|
|
78
79
|
|
|
@@ -189,7 +189,7 @@ def decorrelate(select, parent_select, external_columns, next_alias_name):
|
|
|
189
189
|
# exists queries should not have any selects as it only checks if there are any rows
|
|
190
190
|
# all selects will be added by the optimizer and only used for join keys
|
|
191
191
|
if isinstance(parent_predicate, exp.Exists):
|
|
192
|
-
select.
|
|
192
|
+
select.set("expressions", [])
|
|
193
193
|
|
|
194
194
|
for key, alias in key_aliases.items():
|
|
195
195
|
if key in group_by:
|
|
@@ -805,6 +805,7 @@ class Parser(metaclass=_Parser):
|
|
|
805
805
|
EXPRESSION_PARSERS = {
|
|
806
806
|
exp.Cluster: lambda self: self._parse_sort(exp.Cluster, TokenType.CLUSTER_BY),
|
|
807
807
|
exp.Column: lambda self: self._parse_column(),
|
|
808
|
+
exp.ColumnDef: lambda self: self._parse_column_def(self._parse_column()),
|
|
808
809
|
exp.Condition: lambda self: self._parse_assignment(),
|
|
809
810
|
exp.DataType: lambda self: self._parse_types(allow_identifiers=False, schema=True),
|
|
810
811
|
exp.Expression: lambda self: self._parse_expression(),
|
|
@@ -2962,6 +2963,7 @@ class Parser(metaclass=_Parser):
|
|
|
2962
2963
|
where=self._match_pair(TokenType.REPLACE, TokenType.WHERE) and self._parse_assignment(),
|
|
2963
2964
|
partition=self._match(TokenType.PARTITION_BY) and self._parse_partitioned_by(),
|
|
2964
2965
|
settings=self._match_text_seq("SETTINGS") and self._parse_settings_property(),
|
|
2966
|
+
default=self._match_text_seq("DEFAULT", "VALUES"),
|
|
2965
2967
|
expression=self._parse_derived_table_values() or self._parse_ddl_select(),
|
|
2966
2968
|
conflict=self._parse_on_conflict(),
|
|
2967
2969
|
returning=returning or self._parse_returning(),
|
|
@@ -3110,7 +3112,8 @@ class Parser(metaclass=_Parser):
|
|
|
3110
3112
|
exp.Delete,
|
|
3111
3113
|
tables=tables,
|
|
3112
3114
|
this=self._match(TokenType.FROM) and self._parse_table(joins=True),
|
|
3113
|
-
using=self._match(TokenType.USING)
|
|
3115
|
+
using=self._match(TokenType.USING)
|
|
3116
|
+
and self._parse_csv(lambda: self._parse_table(joins=True)),
|
|
3114
3117
|
cluster=self._match(TokenType.ON) and self._parse_on_property(),
|
|
3115
3118
|
where=self._parse_where(),
|
|
3116
3119
|
returning=returning or self._parse_returning(),
|
|
@@ -3434,6 +3437,10 @@ class Parser(metaclass=_Parser):
|
|
|
3434
3437
|
if not alias or not alias.this:
|
|
3435
3438
|
self.raise_error("Expected CTE to have alias")
|
|
3436
3439
|
|
|
3440
|
+
key_expressions = (
|
|
3441
|
+
self._parse_wrapped_id_vars() if self._match_text_seq("USING", "KEY") else None
|
|
3442
|
+
)
|
|
3443
|
+
|
|
3437
3444
|
if not self._match(TokenType.ALIAS) and not self.OPTIONAL_ALIAS_TOKEN_CTE:
|
|
3438
3445
|
self._retreat(index)
|
|
3439
3446
|
return None
|
|
@@ -3452,6 +3459,7 @@ class Parser(metaclass=_Parser):
|
|
|
3452
3459
|
this=self._parse_wrapped(self._parse_statement),
|
|
3453
3460
|
alias=alias,
|
|
3454
3461
|
materialized=materialized,
|
|
3462
|
+
key_expressions=key_expressions,
|
|
3455
3463
|
comments=comments,
|
|
3456
3464
|
)
|
|
3457
3465
|
|
|
@@ -3566,7 +3574,8 @@ class Parser(metaclass=_Parser):
|
|
|
3566
3574
|
|
|
3567
3575
|
this.set(key, expression)
|
|
3568
3576
|
if key == "limit":
|
|
3569
|
-
offset = expression.args.
|
|
3577
|
+
offset = expression.args.get("offset")
|
|
3578
|
+
expression.set("offset", None)
|
|
3570
3579
|
|
|
3571
3580
|
if offset:
|
|
3572
3581
|
offset = exp.Offset(expression=offset)
|
|
@@ -5266,8 +5275,8 @@ class Parser(metaclass=_Parser):
|
|
|
5266
5275
|
this = self.expression(klass, this=this, comments=comments, expression=expression)
|
|
5267
5276
|
|
|
5268
5277
|
if isinstance(this, exp.Div):
|
|
5269
|
-
this.
|
|
5270
|
-
this.
|
|
5278
|
+
this.set("typed", self.dialect.TYPED_DIVISION)
|
|
5279
|
+
this.set("safe", self.dialect.SAFE_DIVISION)
|
|
5271
5280
|
|
|
5272
5281
|
return this
|
|
5273
5282
|
|
|
@@ -650,8 +650,8 @@ def eliminate_full_outer_join(expression: exp.Expression) -> exp.Expression:
|
|
|
650
650
|
anti_join_clause = exp.select("1").from_(expression.args["from"]).where(join_conditions)
|
|
651
651
|
expression_copy.args["joins"][index].set("side", "right")
|
|
652
652
|
expression_copy = expression_copy.where(exp.Exists(this=anti_join_clause).not_())
|
|
653
|
-
expression_copy.
|
|
654
|
-
expression.
|
|
653
|
+
expression_copy.set("with", None) # remove CTEs from RIGHT side
|
|
654
|
+
expression.set("order", None) # remove order by from LEFT side
|
|
655
655
|
|
|
656
656
|
return exp.union(expression, expression_copy, copy=False, distinct=False)
|
|
657
657
|
|
|
@@ -1834,6 +1834,14 @@ WHERE
|
|
|
1834
1834
|
self.validate_identity("SELECT TRANSLATE(MODEL, 'in', 't') FROM (SELECT 'input' AS MODEL)")
|
|
1835
1835
|
self.validate_identity("SELECT GRANT FROM (SELECT 'input' AS GRANT)")
|
|
1836
1836
|
|
|
1837
|
+
self.validate_all(
|
|
1838
|
+
"SELECT 0xA",
|
|
1839
|
+
write={
|
|
1840
|
+
"bigquery": "SELECT 0xA",
|
|
1841
|
+
"duckdb": "SELECT 10",
|
|
1842
|
+
},
|
|
1843
|
+
)
|
|
1844
|
+
|
|
1837
1845
|
def test_errors(self):
|
|
1838
1846
|
with self.assertRaises(ParseError):
|
|
1839
1847
|
self.parse_one("SELECT * FROM a - b.c.d2")
|
|
@@ -292,6 +292,7 @@ class TestDuckDB(Validator):
|
|
|
292
292
|
self.validate_identity(
|
|
293
293
|
"ARG_MAX(keyword_name, keyword_category, 3 ORDER BY keyword_name DESC)"
|
|
294
294
|
)
|
|
295
|
+
self.validate_identity("INSERT INTO t DEFAULT VALUES RETURNING (c1)")
|
|
295
296
|
self.validate_identity("CREATE TABLE notes (watermark TEXT)")
|
|
296
297
|
self.validate_identity("SELECT LIST_TRANSFORM([5, NULL, 6], LAMBDA x : COALESCE(x, 0) + 1)")
|
|
297
298
|
self.validate_identity("SELECT LIST_TRANSFORM(nbr, LAMBDA x : x + 1) FROM article AS a")
|
|
@@ -1094,6 +1095,10 @@ class TestDuckDB(Validator):
|
|
|
1094
1095
|
|
|
1095
1096
|
self.validate_identity("SELECT row")
|
|
1096
1097
|
|
|
1098
|
+
self.validate_identity(
|
|
1099
|
+
"DELETE FROM t USING (VALUES (1)) AS t1(c), (VALUES (1), (2)) AS t2(c) WHERE t.c = t1.c AND t.c = t2.c"
|
|
1100
|
+
)
|
|
1101
|
+
|
|
1097
1102
|
def test_array_index(self):
|
|
1098
1103
|
with self.assertLogs(helper_logger) as cm:
|
|
1099
1104
|
self.validate_all(
|
|
@@ -1850,3 +1855,11 @@ class TestDuckDB(Validator):
|
|
|
1850
1855
|
self.validate_identity("FORCE INSTALL httpfs FROM community")
|
|
1851
1856
|
self.validate_identity("FORCE INSTALL httpfs FROM 'https://extensions.duckdb.org'")
|
|
1852
1857
|
self.validate_identity("FORCE CHECKPOINT db", check_command_warning=True)
|
|
1858
|
+
|
|
1859
|
+
def test_cte_using_key(self):
|
|
1860
|
+
self.validate_identity(
|
|
1861
|
+
"WITH RECURSIVE tbl(a, b) USING KEY (a) AS (SELECT a, b FROM (VALUES (1, 3), (2, 4)) AS t(a, b) UNION SELECT a + 1, b FROM tbl WHERE a < 3) SELECT * FROM tbl"
|
|
1862
|
+
)
|
|
1863
|
+
self.validate_identity(
|
|
1864
|
+
"WITH RECURSIVE tbl(a, b) USING KEY (a, b) AS (SELECT a, b FROM (VALUES (1, 3), (2, 4)) AS t(a, b) UNION SELECT a + 1, b FROM tbl WHERE a < 3) SELECT * FROM tbl"
|
|
1865
|
+
)
|
|
@@ -450,7 +450,7 @@ class TestMySQL(Validator):
|
|
|
450
450
|
"clickhouse": UnsupportedError,
|
|
451
451
|
"databricks": "SELECT X'CC'",
|
|
452
452
|
"drill": "SELECT 204",
|
|
453
|
-
"duckdb": "SELECT FROM_HEX('CC')",
|
|
453
|
+
"duckdb": "SELECT CAST(HEX(FROM_HEX('CC')) AS VARBINARY)",
|
|
454
454
|
"hive": "SELECT 204",
|
|
455
455
|
"mysql": "SELECT x'CC'",
|
|
456
456
|
"oracle": "SELECT 204",
|
|
@@ -471,7 +471,7 @@ class TestMySQL(Validator):
|
|
|
471
471
|
"clickhouse": UnsupportedError,
|
|
472
472
|
"databricks": "SELECT X'0000CC'",
|
|
473
473
|
"drill": "SELECT 204",
|
|
474
|
-
"duckdb": "SELECT FROM_HEX('0000CC')",
|
|
474
|
+
"duckdb": "SELECT CAST(HEX(FROM_HEX('0000CC')) AS VARBINARY)",
|
|
475
475
|
"hive": "SELECT 204",
|
|
476
476
|
"mysql": "SELECT x'0000CC'",
|
|
477
477
|
"oracle": "SELECT 204",
|
|
@@ -21,6 +21,7 @@ class TestSnowflake(Validator):
|
|
|
21
21
|
self.validate_identity("SELECT GET(a, b)")
|
|
22
22
|
self.validate_identity("SELECT TAN(x)")
|
|
23
23
|
self.validate_identity("SELECT COS(x)")
|
|
24
|
+
self.validate_identity("SELECT SINH(1.5)")
|
|
24
25
|
self.validate_identity("SELECT MOD(x, y)", "SELECT x % y")
|
|
25
26
|
self.validate_identity("SELECT ROUND(x)")
|
|
26
27
|
self.validate_identity("SELECT ROUND(123.456, -1)")
|
|
@@ -60,14 +61,22 @@ class TestSnowflake(Validator):
|
|
|
60
61
|
self.validate_identity("SELECT SOUNDEX_P123(column_name)")
|
|
61
62
|
self.validate_identity("SELECT ABS(x)")
|
|
62
63
|
self.validate_identity("SELECT ASIN(0.5)")
|
|
64
|
+
self.validate_identity("SELECT ASINH(0.5)")
|
|
65
|
+
self.validate_identity("SELECT ATAN(0.5)")
|
|
66
|
+
self.validate_identity("SELECT ATAN2(0.5, 0.3)")
|
|
63
67
|
self.validate_identity("SELECT ATANH(0.5)")
|
|
64
68
|
self.validate_identity("SELECT CBRT(27.0)")
|
|
69
|
+
self.validate_identity("SELECT POW(2, 3)", "SELECT POWER(2, 3)")
|
|
70
|
+
self.validate_identity("SELECT POW(2.5, 3.0)", "SELECT POWER(2.5, 3.0)")
|
|
71
|
+
self.validate_identity("SELECT SQUARE(2.5)", "SELECT POWER(2.5, 2)")
|
|
65
72
|
self.validate_identity("SELECT SIGN(x)")
|
|
66
73
|
self.validate_identity("SELECT COSH(1.5)")
|
|
74
|
+
self.validate_identity("SELECT TANH(0.5)")
|
|
67
75
|
self.validate_identity("SELECT JAROWINKLER_SIMILARITY('hello', 'world')")
|
|
68
76
|
self.validate_identity("SELECT TRANSLATE(column_name, 'abc', '123')")
|
|
69
77
|
self.validate_identity("SELECT UNICODE(column_name)")
|
|
70
78
|
self.validate_identity("SELECT SPLIT_PART('11.22.33', '.', 1)")
|
|
79
|
+
self.validate_identity("SELECT PI()")
|
|
71
80
|
self.validate_identity("SELECT DEGREES(PI() / 3)")
|
|
72
81
|
self.validate_identity("SELECT DEGREES(1)")
|
|
73
82
|
self.validate_identity("PARSE_URL('https://example.com/path')")
|
|
@@ -354,6 +363,12 @@ class TestSnowflake(Validator):
|
|
|
354
363
|
"SELECT {fn CEILING(5.3)}",
|
|
355
364
|
"SELECT CEIL(5.3)",
|
|
356
365
|
)
|
|
366
|
+
self.validate_identity(
|
|
367
|
+
"SELECT CEIL(3.14)",
|
|
368
|
+
)
|
|
369
|
+
self.validate_identity(
|
|
370
|
+
"SELECT CEIL(3.14, 1)",
|
|
371
|
+
)
|
|
357
372
|
self.validate_identity(
|
|
358
373
|
"CAST(x AS BYTEINT)",
|
|
359
374
|
"CAST(x AS INT)",
|
|
@@ -1484,6 +1499,14 @@ class TestSnowflake(Validator):
|
|
|
1484
1499
|
)
|
|
1485
1500
|
self.validate_identity("SELECT ARRAY_CONTAINS(1, [1])")
|
|
1486
1501
|
|
|
1502
|
+
self.validate_all(
|
|
1503
|
+
"SELECT x'ABCD'",
|
|
1504
|
+
write={
|
|
1505
|
+
"snowflake": "SELECT x'ABCD'",
|
|
1506
|
+
"duckdb": "SELECT CAST(HEX(FROM_HEX('ABCD')) AS VARBINARY)",
|
|
1507
|
+
},
|
|
1508
|
+
)
|
|
1509
|
+
|
|
1487
1510
|
def test_null_treatment(self):
|
|
1488
1511
|
self.validate_all(
|
|
1489
1512
|
r"SELECT FIRST_VALUE(TABLE1.COLUMN1) OVER (PARTITION BY RANDOM_COLUMN1, RANDOM_COLUMN2 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS MY_ALIAS FROM TABLE1",
|
|
@@ -1547,6 +1547,18 @@ DOUBLE;
|
|
|
1547
1547
|
ASIN(tbl.double_col);
|
|
1548
1548
|
DOUBLE;
|
|
1549
1549
|
|
|
1550
|
+
# dialect: snowflake
|
|
1551
|
+
ASINH(tbl.double_col);
|
|
1552
|
+
DOUBLE;
|
|
1553
|
+
|
|
1554
|
+
# dialect: snowflake
|
|
1555
|
+
ATAN(tbl.double_col);
|
|
1556
|
+
DOUBLE;
|
|
1557
|
+
|
|
1558
|
+
# dialect: snowflake
|
|
1559
|
+
ATAN2(tbl.double_col, tbl.double_col);
|
|
1560
|
+
DOUBLE;
|
|
1561
|
+
|
|
1550
1562
|
# dialect: snowflake
|
|
1551
1563
|
ATANH(tbl.double_col);
|
|
1552
1564
|
DOUBLE;
|
|
@@ -1631,6 +1643,22 @@ INT;
|
|
|
1631
1643
|
CHARINDEX('world', 'hello world', 1);
|
|
1632
1644
|
INT;
|
|
1633
1645
|
|
|
1646
|
+
# dialect: snowflake
|
|
1647
|
+
CEIL(3.14);
|
|
1648
|
+
DOUBLE;
|
|
1649
|
+
|
|
1650
|
+
# dialect: snowflake
|
|
1651
|
+
CEIL(3.14::FLOAT, 1);
|
|
1652
|
+
FLOAT;
|
|
1653
|
+
|
|
1654
|
+
# dialect: snowflake
|
|
1655
|
+
CEIL(3.14, 1);
|
|
1656
|
+
DOUBLE;
|
|
1657
|
+
|
|
1658
|
+
# dialect: snowflake
|
|
1659
|
+
CEIL(10::NUMERIC);
|
|
1660
|
+
NUMBER;
|
|
1661
|
+
|
|
1634
1662
|
# dialect: snowflake
|
|
1635
1663
|
CHAR(65);
|
|
1636
1664
|
VARCHAR;
|
|
@@ -1919,6 +1947,14 @@ INT;
|
|
|
1919
1947
|
POSITION('abc', 'abcdef', 1);
|
|
1920
1948
|
INT;
|
|
1921
1949
|
|
|
1950
|
+
# dialect: snowflake
|
|
1951
|
+
PI();
|
|
1952
|
+
DOUBLE;
|
|
1953
|
+
|
|
1954
|
+
# dialect: snowflake
|
|
1955
|
+
POW(tbl.double_col, 2);
|
|
1956
|
+
DOUBLE;
|
|
1957
|
+
|
|
1922
1958
|
# dialect: snowflake
|
|
1923
1959
|
LOWER(tbl.str_col);
|
|
1924
1960
|
VARCHAR;
|
|
@@ -2131,6 +2167,14 @@ BIGINT;
|
|
|
2131
2167
|
ROUND(tbl.double_col, 0, 'HALF_TO_EVEN');
|
|
2132
2168
|
DOUBLE;
|
|
2133
2169
|
|
|
2170
|
+
# dialect: snowflake
|
|
2171
|
+
SQUARE(tbl.double_col);
|
|
2172
|
+
DOUBLE;
|
|
2173
|
+
|
|
2174
|
+
# dialect: snowflake
|
|
2175
|
+
TANH(tbl.double_col);
|
|
2176
|
+
DOUBLE;
|
|
2177
|
+
|
|
2134
2178
|
# dialect: snowflake
|
|
2135
2179
|
RIGHT('hello world', 5);
|
|
2136
2180
|
VARCHAR;
|
|
@@ -2251,6 +2295,14 @@ VARCHAR;
|
|
|
2251
2295
|
SIN(tbl.double_col);
|
|
2252
2296
|
DOUBLE;
|
|
2253
2297
|
|
|
2298
|
+
# dialect: snowflake
|
|
2299
|
+
SINH(1);
|
|
2300
|
+
DOUBLE;
|
|
2301
|
+
|
|
2302
|
+
# dialect: snowflake
|
|
2303
|
+
SINH(1.5);
|
|
2304
|
+
DOUBLE;
|
|
2305
|
+
|
|
2254
2306
|
# dialect: snowflake
|
|
2255
2307
|
SIGN(tbl.double_col);
|
|
2256
2308
|
INT;
|
|
@@ -40,6 +40,8 @@ class TestParser(unittest.TestCase):
|
|
|
40
40
|
"Failed to parse 'SELECT * FROM tbl' into <class 'sqlglot.expressions.Table'>",
|
|
41
41
|
)
|
|
42
42
|
|
|
43
|
+
self.assertIsInstance(parse_one("foo INT NOT NULL", into=exp.ColumnDef), exp.ColumnDef)
|
|
44
|
+
|
|
43
45
|
def test_parse_into_error(self):
|
|
44
46
|
expected_message = "Failed to parse 'SELECT 1;' into [<class 'sqlglot.expressions.From'>]"
|
|
45
47
|
expected_errors = [
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|