sqlglot 27.13.2__tar.gz → 27.14.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.13.2 → sqlglot-27.14.0}/CHANGELOG.md +6 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/PKG-INFO +1 -1
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/_version.py +3 -3
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/bigquery.py +19 -16
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/clickhouse.py +1 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/dialect.py +1 -1
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/duckdb.py +15 -4
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/fabric.py +1 -1
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/hive.py +1 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/mysql.py +27 -2
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/postgres.py +9 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/redshift.py +1 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/singlestore.py +122 -1
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/snowflake.py +26 -3
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/sqlite.py +1 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/expressions.py +36 -1
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/generator.py +26 -13
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/annotate_types.py +28 -2
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/parser.py +46 -11
- sqlglot-27.14.0/sqlglot/serde.py +118 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/tokens.py +3 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot.egg-info/PKG-INFO +1 -1
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_bigquery.py +68 -10
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_clickhouse.py +24 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_dialect.py +2 -2
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_duckdb.py +23 -4
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_fabric.py +1 -1
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_hive.py +22 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_pipe_syntax.py +8 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_postgres.py +18 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_redshift.py +9 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_singlestore.py +76 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_snowflake.py +45 -24
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/annotate_functions.sql +191 -16
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/annotate_types.sql +8 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_optimizer.py +1 -1
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_serde.py +1 -1
- sqlglot-27.13.2/sqlglot/serde.py +0 -68
- {sqlglot-27.13.2 → sqlglot-27.14.0}/.gitignore +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/.gitpod.yml +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/.pre-commit-config.yaml +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/CONTRIBUTING.md +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/LICENSE +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/MANIFEST.in +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/Makefile +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/README.md +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/pyproject.toml +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/setup.cfg +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/setup.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/__init__.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/__main__.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/_typing.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/__init__.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/athena.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/databricks.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/doris.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/dremio.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/drill.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/druid.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/dune.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/exasol.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/materialize.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/oracle.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/presto.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/prql.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/risingwave.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/spark.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/spark2.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/starrocks.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/tableau.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/teradata.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/trino.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/dialects/tsql.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/diff.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/errors.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/executor/__init__.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/executor/context.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/executor/env.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/executor/python.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/executor/table.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/helper.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/jsonpath.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/lineage.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/__init__.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/canonicalize.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/normalize.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/optimize_joins.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/optimizer.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/qualify.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/qualify_columns.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/qualify_tables.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/scope.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/simplify.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/planner.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/py.typed +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/schema.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/time.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/transforms.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot/trie.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot.egg-info/SOURCES.txt +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot.egg-info/dependency_links.txt +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot.egg-info/requires.txt +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot.egg-info/top_level.txt +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglot.png +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/Cargo.lock +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/Cargo.toml +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/benches/dialect_settings.json +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/benches/long.rs +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/benches/token_type_settings.json +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/benches/tokenizer_dialect_settings.json +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/benches/tokenizer_settings.json +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/pyproject.toml +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/src/lib.rs +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/src/settings.rs +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/src/token.rs +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/src/tokenizer.rs +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/sqlglotrs/src/trie.rs +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/__init__.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/__init__.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_athena.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_databricks.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_doris.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_dremio.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_drill.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_druid.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_dune.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_exasol.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_materialize.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_mysql.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_oracle.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_presto.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_prql.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_risingwave.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_spark.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_sqlite.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_starrocks.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_tableau.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_teradata.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_trino.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/dialects/test_tsql.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/identity.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/jsonpath/LICENSE +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/jsonpath/cts.json +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/normalize.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/simplify.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/partial.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/fixtures/pretty.sql +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/gen_fixtures.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/helpers.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_build.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_dialect_imports.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_diff.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_docs.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_executor.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_expressions.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_generator.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_helper.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_jsonpath.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_lineage.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_parser.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_schema.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_time.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_tokens.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_transforms.py +0 -0
- {sqlglot-27.13.2 → sqlglot-27.14.0}/tests/test_transpile.py +0 -0
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
## [v27.13.2] - 2025-09-08
|
|
5
|
+
### :bug: Bug Fixes
|
|
6
|
+
- [`5e7979f`](https://github.com/tobymao/sqlglot/commit/5e7979f3cf5f7996e198ddd81069d49a4a3b9391) - select session *(PR [#5836](https://github.com/tobymao/sqlglot/pull/5836) by [@tobymao](https://github.com/tobymao))*
|
|
7
|
+
|
|
8
|
+
|
|
4
9
|
## [v27.13.1] - 2025-09-08
|
|
5
10
|
### :bug: Bug Fixes
|
|
6
11
|
- [`f3d55c0`](https://github.com/tobymao/sqlglot/commit/f3d55c05c8411c9871f8ca4d23f726f976c9236b) - remove always token *(PR [#5832](https://github.com/tobymao/sqlglot/pull/5832) by [@tobymao](https://github.com/tobymao))*
|
|
@@ -7172,3 +7177,4 @@ Changelog
|
|
|
7172
7177
|
[v27.12.0]: https://github.com/tobymao/sqlglot/compare/v27.11.0...v27.12.0
|
|
7173
7178
|
[v27.13.0]: https://github.com/tobymao/sqlglot/compare/v27.12.0...v27.13.0
|
|
7174
7179
|
[v27.13.1]: https://github.com/tobymao/sqlglot/compare/v27.13.0...v27.13.1
|
|
7180
|
+
[v27.13.2]: https://github.com/tobymao/sqlglot/compare/v27.13.1...v27.13.2
|
|
@@ -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.14.0'
|
|
32
|
+
__version_tuple__ = version_tuple = (27, 14, 0)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'gb244f3052'
|
|
@@ -859,10 +859,12 @@ class BigQuery(Dialect):
|
|
|
859
859
|
exp.JSONArray, expressions=self._parse_csv(self._parse_bitwise)
|
|
860
860
|
),
|
|
861
861
|
"MAKE_INTERVAL": lambda self: self._parse_make_interval(),
|
|
862
|
-
"PREDICT": lambda self: self.
|
|
862
|
+
"PREDICT": lambda self: self._parse_ml(exp.Predict),
|
|
863
|
+
"TRANSLATE": lambda self: self._parse_translate(),
|
|
863
864
|
"FEATURES_AT_TIME": lambda self: self._parse_features_at_time(),
|
|
864
|
-
"GENERATE_EMBEDDING": lambda self: self.
|
|
865
|
+
"GENERATE_EMBEDDING": lambda self: self._parse_ml(exp.GenerateEmbedding),
|
|
865
866
|
"VECTOR_SEARCH": lambda self: self._parse_vector_search(),
|
|
867
|
+
"FORECAST": lambda self: self._parse_ml(exp.MLForecast),
|
|
866
868
|
}
|
|
867
869
|
FUNCTION_PARSERS.pop("TRIM")
|
|
868
870
|
|
|
@@ -1146,34 +1148,35 @@ class BigQuery(Dialect):
|
|
|
1146
1148
|
|
|
1147
1149
|
return expr
|
|
1148
1150
|
|
|
1149
|
-
def
|
|
1151
|
+
def _parse_ml(self, expr_type: t.Type[E]) -> E:
|
|
1150
1152
|
self._match_text_seq("MODEL")
|
|
1151
1153
|
this = self._parse_table()
|
|
1152
1154
|
|
|
1153
1155
|
self._match(TokenType.COMMA)
|
|
1154
1156
|
self._match_text_seq("TABLE")
|
|
1155
1157
|
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
expression=self._parse_table(),
|
|
1160
|
-
params_struct=self._match(TokenType.COMMA) and self._parse_bitwise(),
|
|
1158
|
+
# Certain functions like ML.FORECAST require a STRUCT argument but not a TABLE/SELECT one
|
|
1159
|
+
expression = (
|
|
1160
|
+
self._parse_table() if not self._match(TokenType.STRUCT, advance=False) else None
|
|
1161
1161
|
)
|
|
1162
1162
|
|
|
1163
|
-
def _parse_generate_embedding(self) -> exp.GenerateEmbedding:
|
|
1164
|
-
self._match_text_seq("MODEL")
|
|
1165
|
-
this = self._parse_table()
|
|
1166
|
-
|
|
1167
1163
|
self._match(TokenType.COMMA)
|
|
1168
|
-
self._match_text_seq("TABLE")
|
|
1169
1164
|
|
|
1170
1165
|
return self.expression(
|
|
1171
|
-
|
|
1166
|
+
expr_type,
|
|
1172
1167
|
this=this,
|
|
1173
|
-
expression=
|
|
1174
|
-
params_struct=self.
|
|
1168
|
+
expression=expression,
|
|
1169
|
+
params_struct=self._parse_bitwise(),
|
|
1175
1170
|
)
|
|
1176
1171
|
|
|
1172
|
+
def _parse_translate(self) -> exp.Translate | exp.MLTranslate:
|
|
1173
|
+
# Check if this is ML.TRANSLATE by looking at previous tokens
|
|
1174
|
+
token = seq_get(self._tokens, self._index - 4)
|
|
1175
|
+
if token and token.text.upper() == "ML":
|
|
1176
|
+
return self._parse_ml(exp.MLTranslate)
|
|
1177
|
+
|
|
1178
|
+
return exp.Translate.from_arg_list(self._parse_function_args())
|
|
1179
|
+
|
|
1177
1180
|
def _parse_features_at_time(self) -> exp.FeaturesAtTime:
|
|
1178
1181
|
self._match(TokenType.TABLE)
|
|
1179
1182
|
this = self._parse_table()
|
|
@@ -189,6 +189,7 @@ def _map_sql(self: ClickHouse.Generator, expression: exp.Map | exp.VarMap) -> st
|
|
|
189
189
|
|
|
190
190
|
|
|
191
191
|
class ClickHouse(Dialect):
|
|
192
|
+
INDEX_OFFSET = 1
|
|
192
193
|
NORMALIZE_FUNCTIONS: bool | str = False
|
|
193
194
|
NULL_ORDERING = "nulls_are_last"
|
|
194
195
|
SUPPORTS_USER_DEFINED_TYPES = False
|
|
@@ -674,6 +674,7 @@ class Dialect(metaclass=_Dialect):
|
|
|
674
674
|
exp.DataType.Type.BOOLEAN: {
|
|
675
675
|
exp.Between,
|
|
676
676
|
exp.Boolean,
|
|
677
|
+
exp.Contains,
|
|
677
678
|
exp.EndsWith,
|
|
678
679
|
exp.In,
|
|
679
680
|
exp.LogicalAnd,
|
|
@@ -818,7 +819,6 @@ class Dialect(metaclass=_Dialect):
|
|
|
818
819
|
exp.Cast: lambda self, e: self._annotate_with_type(e, e.args["to"]),
|
|
819
820
|
exp.Case: lambda self, e: self._annotate_by_args(e, "default", "ifs"),
|
|
820
821
|
exp.Coalesce: lambda self, e: self._annotate_by_args(e, "this", "expressions"),
|
|
821
|
-
exp.Contains: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BOOLEAN),
|
|
822
822
|
exp.Count: lambda self, e: self._annotate_with_type(
|
|
823
823
|
e, exp.DataType.Type.BIGINT if e.args.get("big_int") else exp.DataType.Type.INT
|
|
824
824
|
),
|
|
@@ -365,6 +365,9 @@ class DuckDB(Dialect):
|
|
|
365
365
|
"ANY_VALUE": lambda args: exp.IgnoreNulls(this=exp.AnyValue.from_arg_list(args)),
|
|
366
366
|
"ARRAY_REVERSE_SORT": _build_sort_array_desc,
|
|
367
367
|
"ARRAY_SORT": exp.SortArray.from_arg_list,
|
|
368
|
+
"BIT_AND": exp.BitwiseAndAgg.from_arg_list,
|
|
369
|
+
"BIT_OR": exp.BitwiseOrAgg.from_arg_list,
|
|
370
|
+
"BIT_XOR": exp.BitwiseXorAgg.from_arg_list,
|
|
368
371
|
"DATEDIFF": _build_date_diff,
|
|
369
372
|
"DATE_DIFF": _build_date_diff,
|
|
370
373
|
"DATE_TRUNC": date_trunc_to_time,
|
|
@@ -649,7 +652,10 @@ class DuckDB(Dialect):
|
|
|
649
652
|
exp.ArrayUniqueAgg: lambda self, e: self.func(
|
|
650
653
|
"LIST", exp.Distinct(expressions=[e.this])
|
|
651
654
|
),
|
|
655
|
+
exp.BitwiseAndAgg: rename_func("BIT_AND"),
|
|
656
|
+
exp.BitwiseOrAgg: rename_func("BIT_OR"),
|
|
652
657
|
exp.BitwiseXor: rename_func("XOR"),
|
|
658
|
+
exp.BitwiseXorAgg: rename_func("BIT_XOR"),
|
|
653
659
|
exp.CommentColumnConstraint: no_comment_column_constraint_sql,
|
|
654
660
|
exp.CosineDistance: rename_func("LIST_COSINE_DISTANCE"),
|
|
655
661
|
exp.CurrentDate: lambda *_: "CURRENT_DATE",
|
|
@@ -995,13 +1001,18 @@ class DuckDB(Dialect):
|
|
|
995
1001
|
|
|
996
1002
|
def join_sql(self, expression: exp.Join) -> str:
|
|
997
1003
|
if (
|
|
998
|
-
expression.
|
|
1004
|
+
not expression.args.get("using")
|
|
999
1005
|
and not expression.args.get("on")
|
|
1000
|
-
and
|
|
1006
|
+
and not expression.method
|
|
1007
|
+
and (expression.kind in ("", "INNER", "OUTER"))
|
|
1001
1008
|
):
|
|
1002
|
-
# Some dialects support `LEFT JOIN UNNEST(...)` without an explicit ON clause
|
|
1009
|
+
# Some dialects support `LEFT/INNER JOIN UNNEST(...)` without an explicit ON clause
|
|
1003
1010
|
# DuckDB doesn't, but we can just add a dummy ON clause that is always true
|
|
1004
|
-
|
|
1011
|
+
if isinstance(expression.this, exp.Unnest):
|
|
1012
|
+
return super().join_sql(expression.on(exp.true()))
|
|
1013
|
+
|
|
1014
|
+
expression.args.pop("side", None)
|
|
1015
|
+
expression.args.pop("kind", None)
|
|
1005
1016
|
|
|
1006
1017
|
return super().join_sql(expression)
|
|
1007
1018
|
|
|
@@ -125,7 +125,7 @@ class Fabric(TSQL):
|
|
|
125
125
|
exp.DataType.Type.TIMESTAMPTZ: "DATETIME2",
|
|
126
126
|
exp.DataType.Type.TINYINT: "SMALLINT",
|
|
127
127
|
exp.DataType.Type.UTINYINT: "SMALLINT",
|
|
128
|
-
exp.DataType.Type.UUID: "
|
|
128
|
+
exp.DataType.Type.UUID: "UNIQUEIDENTIFIER",
|
|
129
129
|
exp.DataType.Type.XML: "VARCHAR",
|
|
130
130
|
}
|
|
131
131
|
|
|
@@ -579,9 +579,11 @@ class MySQL(Dialect):
|
|
|
579
579
|
full: t.Optional[bool] = None,
|
|
580
580
|
global_: t.Optional[bool] = None,
|
|
581
581
|
) -> exp.Show:
|
|
582
|
+
json = self._match_text_seq("JSON")
|
|
583
|
+
|
|
582
584
|
if target:
|
|
583
585
|
if isinstance(target, str):
|
|
584
|
-
self._match_text_seq(target)
|
|
586
|
+
self._match_text_seq(*target.split(" "))
|
|
585
587
|
target_id = self._parse_id_var()
|
|
586
588
|
else:
|
|
587
589
|
target_id = None
|
|
@@ -618,6 +620,12 @@ class MySQL(Dialect):
|
|
|
618
620
|
mutex = True if self._match_text_seq("MUTEX") else None
|
|
619
621
|
mutex = False if self._match_text_seq("STATUS") else mutex
|
|
620
622
|
|
|
623
|
+
for_table = self._parse_id_var() if self._match_text_seq("FOR", "TABLE") else None
|
|
624
|
+
for_group = self._parse_string() if self._match_text_seq("FOR", "GROUP") else None
|
|
625
|
+
for_user = self._parse_string() if self._match_text_seq("FOR", "USER") else None
|
|
626
|
+
for_role = self._parse_string() if self._match_text_seq("FOR", "ROLE") else None
|
|
627
|
+
into_outfile = self._parse_string() if self._match_text_seq("INTO", "OUTFILE") else None
|
|
628
|
+
|
|
621
629
|
return self.expression(
|
|
622
630
|
exp.Show,
|
|
623
631
|
this=this,
|
|
@@ -634,6 +642,12 @@ class MySQL(Dialect):
|
|
|
634
642
|
offset=offset,
|
|
635
643
|
limit=limit,
|
|
636
644
|
mutex=mutex,
|
|
645
|
+
for_table=for_table,
|
|
646
|
+
for_group=for_group,
|
|
647
|
+
for_user=for_user,
|
|
648
|
+
for_role=for_role,
|
|
649
|
+
into_outfile=into_outfile,
|
|
650
|
+
json=json,
|
|
637
651
|
**{"global": global_}, # type: ignore
|
|
638
652
|
)
|
|
639
653
|
|
|
@@ -1200,6 +1214,10 @@ class MySQL(Dialect):
|
|
|
1200
1214
|
target = f" FROM{target}"
|
|
1201
1215
|
elif expression.name == "GRANTS":
|
|
1202
1216
|
target = f" FOR{target}"
|
|
1217
|
+
elif expression.name in ("LINKS", "PARTITIONS"):
|
|
1218
|
+
target = f" ON{target}" if target else ""
|
|
1219
|
+
elif expression.name == "PROJECTIONS":
|
|
1220
|
+
target = f" ON TABLE{target}" if target else ""
|
|
1203
1221
|
|
|
1204
1222
|
db = self._prefixed_sql("FROM", expression, "db")
|
|
1205
1223
|
|
|
@@ -1227,7 +1245,14 @@ class MySQL(Dialect):
|
|
|
1227
1245
|
else:
|
|
1228
1246
|
mutex_or_status = ""
|
|
1229
1247
|
|
|
1230
|
-
|
|
1248
|
+
for_table = self._prefixed_sql("FOR TABLE", expression, "for_table")
|
|
1249
|
+
for_group = self._prefixed_sql("FOR GROUP", expression, "for_group")
|
|
1250
|
+
for_user = self._prefixed_sql("FOR USER", expression, "for_user")
|
|
1251
|
+
for_role = self._prefixed_sql("FOR ROLE", expression, "for_role")
|
|
1252
|
+
into_outfile = self._prefixed_sql("INTO OUTFILE", expression, "into_outfile")
|
|
1253
|
+
json = " JSON" if expression.args.get("json") else ""
|
|
1254
|
+
|
|
1255
|
+
return f"SHOW{full}{global_}{this}{json}{target}{for_table}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}{for_group}{for_user}{for_role}{into_outfile}"
|
|
1231
1256
|
|
|
1232
1257
|
def altercolumn_sql(self, expression: exp.AlterColumn) -> str:
|
|
1233
1258
|
dtype = self.sql(expression, "dtype")
|
|
@@ -325,6 +325,9 @@ class Postgres(Dialect):
|
|
|
325
325
|
"@@": TokenType.DAT,
|
|
326
326
|
"@>": TokenType.AT_GT,
|
|
327
327
|
"<@": TokenType.LT_AT,
|
|
328
|
+
"?&": TokenType.QMARK_AMP,
|
|
329
|
+
"?|": TokenType.QMARK_PIPE,
|
|
330
|
+
"#-": TokenType.HASH_DASH,
|
|
328
331
|
"|/": TokenType.PIPE_SLASH,
|
|
329
332
|
"||/": TokenType.DPIPE_SLASH,
|
|
330
333
|
"BEGIN": TokenType.BEGIN,
|
|
@@ -386,6 +389,9 @@ class Postgres(Dialect):
|
|
|
386
389
|
|
|
387
390
|
FUNCTIONS = {
|
|
388
391
|
**parser.Parser.FUNCTIONS,
|
|
392
|
+
"BIT_AND": exp.BitwiseAndAgg.from_arg_list,
|
|
393
|
+
"BIT_OR": exp.BitwiseOrAgg.from_arg_list,
|
|
394
|
+
"BIT_XOR": exp.BitwiseXorAgg.from_arg_list,
|
|
389
395
|
"DATE_TRUNC": build_timestamp_trunc,
|
|
390
396
|
"DIV": lambda args: exp.cast(
|
|
391
397
|
binary_from_function(exp.IntDiv)(args), exp.DataType.Type.DECIMAL
|
|
@@ -584,7 +590,10 @@ class Postgres(Dialect):
|
|
|
584
590
|
exp.AnyValue: _versioned_anyvalue_sql,
|
|
585
591
|
exp.ArrayConcat: lambda self, e: self.arrayconcat_sql(e, name="ARRAY_CAT"),
|
|
586
592
|
exp.ArrayFilter: filter_array_using_unnest,
|
|
593
|
+
exp.BitwiseAndAgg: rename_func("BIT_AND"),
|
|
594
|
+
exp.BitwiseOrAgg: rename_func("BIT_OR"),
|
|
587
595
|
exp.BitwiseXor: lambda self, e: self.binary(e, "#"),
|
|
596
|
+
exp.BitwiseXorAgg: rename_func("BIT_XOR"),
|
|
588
597
|
exp.ColumnDef: transforms.preprocess([_auto_increment_to_serial, _serial_to_generated]),
|
|
589
598
|
exp.CurrentDate: no_paren_current_date_sql,
|
|
590
599
|
exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP",
|
|
@@ -162,6 +162,7 @@ class Redshift(Postgres):
|
|
|
162
162
|
ALTER_SET_TYPE = "TYPE"
|
|
163
163
|
SUPPORTS_DECODE_CASE = True
|
|
164
164
|
SUPPORTS_BETWEEN_FLAGS = False
|
|
165
|
+
LIMIT_FETCH = "LIMIT"
|
|
165
166
|
|
|
166
167
|
# Redshift doesn't have `WITH` as part of their with_properties so we remove it
|
|
167
168
|
WITH_PROPERTIES_PREFIX = " "
|
|
@@ -16,7 +16,7 @@ from sqlglot.dialects.dialect import (
|
|
|
16
16
|
date_add_interval_sql,
|
|
17
17
|
timestampdiff_sql,
|
|
18
18
|
)
|
|
19
|
-
from sqlglot.dialects.mysql import MySQL, _remove_ts_or_ds_to_date, date_add_sql
|
|
19
|
+
from sqlglot.dialects.mysql import MySQL, _remove_ts_or_ds_to_date, date_add_sql, _show_parser
|
|
20
20
|
from sqlglot.expressions import DataType
|
|
21
21
|
from sqlglot.generator import unsupported_args
|
|
22
22
|
from sqlglot.helper import seq_get
|
|
@@ -55,6 +55,17 @@ class SingleStore(MySQL):
|
|
|
55
55
|
"FF6": "%f", # only 6 digits are supported in python formats
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
VECTOR_TYPE_ALIASES = {
|
|
59
|
+
"I8": "TINYINT",
|
|
60
|
+
"I16": "SMALLINT",
|
|
61
|
+
"I32": "INT",
|
|
62
|
+
"I64": "BIGINT",
|
|
63
|
+
"F32": "FLOAT",
|
|
64
|
+
"F64": "DOUBLE",
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
INVERSE_VECTOR_TYPE_ALIASES = {v: k for k, v in VECTOR_TYPE_ALIASES.items()}
|
|
68
|
+
|
|
58
69
|
class Tokenizer(MySQL.Tokenizer):
|
|
59
70
|
BYTE_STRINGS = [("e'", "'"), ("E'", "'")]
|
|
60
71
|
|
|
@@ -249,6 +260,63 @@ class SingleStore(MySQL):
|
|
|
249
260
|
COLUMN_OPERATORS.pop(TokenType.DHASH_ARROW)
|
|
250
261
|
COLUMN_OPERATORS.pop(TokenType.PLACEHOLDER)
|
|
251
262
|
|
|
263
|
+
SHOW_PARSERS = {
|
|
264
|
+
**MySQL.Parser.SHOW_PARSERS,
|
|
265
|
+
"AGGREGATES": _show_parser("AGGREGATES"),
|
|
266
|
+
"CDC EXTRACTOR POOL": _show_parser("CDC EXTRACTOR POOL"),
|
|
267
|
+
"CREATE AGGREGATE": _show_parser("CREATE AGGREGATE", target=True),
|
|
268
|
+
"CREATE PIPELINE": _show_parser("CREATE PIPELINE", target=True),
|
|
269
|
+
"CREATE PROJECTION": _show_parser("CREATE PROJECTION", target=True),
|
|
270
|
+
"DATABASE STATUS": _show_parser("DATABASE STATUS"),
|
|
271
|
+
"DISTRIBUTED_PLANCACHE STATUS": _show_parser("DISTRIBUTED_PLANCACHE STATUS"),
|
|
272
|
+
"FULLTEXT SERVICE METRICS LOCAL": _show_parser("FULLTEXT SERVICE METRICS LOCAL"),
|
|
273
|
+
"FULLTEXT SERVICE METRICS FOR NODE": _show_parser(
|
|
274
|
+
"FULLTEXT SERVICE METRICS FOR NODE", target=True
|
|
275
|
+
),
|
|
276
|
+
"FULLTEXT SERVICE STATUS": _show_parser("FULLTEXT SERVICE STATUS"),
|
|
277
|
+
"FUNCTIONS": _show_parser("FUNCTIONS"),
|
|
278
|
+
"GROUPS": _show_parser("GROUPS"),
|
|
279
|
+
"GROUPS FOR ROLE": _show_parser("GROUPS FOR ROLE", target=True),
|
|
280
|
+
"GROUPS FOR USER": _show_parser("GROUPS FOR USER", target=True),
|
|
281
|
+
"INDEXES": _show_parser("INDEX", target="FROM"),
|
|
282
|
+
"KEYS": _show_parser("INDEX", target="FROM"),
|
|
283
|
+
"LINKS": _show_parser("LINKS", target="ON"),
|
|
284
|
+
"LOAD ERRORS": _show_parser("LOAD ERRORS"),
|
|
285
|
+
"LOAD WARNINGS": _show_parser("LOAD WARNINGS"),
|
|
286
|
+
"PARTITIONS": _show_parser("PARTITIONS", target="ON"),
|
|
287
|
+
"PIPELINES": _show_parser("PIPELINES"),
|
|
288
|
+
"PLAN": _show_parser("PLAN", target=True),
|
|
289
|
+
"PLANCACHE": _show_parser("PLANCACHE"),
|
|
290
|
+
"PROCEDURES": _show_parser("PROCEDURES"),
|
|
291
|
+
"PROJECTIONS": _show_parser("PROJECTIONS", target="ON TABLE"),
|
|
292
|
+
"REPLICATION STATUS": _show_parser("REPLICATION STATUS"),
|
|
293
|
+
"REPRODUCTION": _show_parser("REPRODUCTION"),
|
|
294
|
+
"RESOURCE POOLS": _show_parser("RESOURCE POOLS"),
|
|
295
|
+
"ROLES": _show_parser("ROLES"),
|
|
296
|
+
"ROLES FOR USER": _show_parser("ROLES FOR USER", target=True),
|
|
297
|
+
"ROLES FOR GROUP": _show_parser("ROLES FOR GROUP", target=True),
|
|
298
|
+
"STATUS EXTENDED": _show_parser("STATUS EXTENDED"),
|
|
299
|
+
"USERS": _show_parser("USERS"),
|
|
300
|
+
"USERS FOR ROLE": _show_parser("USERS FOR ROLE", target=True),
|
|
301
|
+
"USERS FOR GROUP": _show_parser("USERS FOR GROUP", target=True),
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
ALTER_PARSERS = {
|
|
305
|
+
**MySQL.Parser.ALTER_PARSERS,
|
|
306
|
+
"CHANGE": lambda self: self.expression(
|
|
307
|
+
exp.RenameColumn, this=self._parse_column(), to=self._parse_column()
|
|
308
|
+
),
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
def _parse_vector_expressions(
|
|
312
|
+
self, expressions: t.List[exp.Expression]
|
|
313
|
+
) -> t.List[exp.Expression]:
|
|
314
|
+
type_name = expressions[1].name.upper()
|
|
315
|
+
if type_name in self.dialect.VECTOR_TYPE_ALIASES:
|
|
316
|
+
type_name = self.dialect.VECTOR_TYPE_ALIASES[type_name]
|
|
317
|
+
|
|
318
|
+
return [exp.DataType.build(type_name, dialect=self.dialect), expressions[0]]
|
|
319
|
+
|
|
252
320
|
class Generator(MySQL.Generator):
|
|
253
321
|
SUPPORTS_UESCAPE = False
|
|
254
322
|
NULL_ORDERING_SUPPORTED = True
|
|
@@ -467,6 +535,29 @@ class SingleStore(MySQL):
|
|
|
467
535
|
exp.MatchAgainst: unsupported_args("modifier")(
|
|
468
536
|
lambda self, e: super().matchagainst_sql(e)
|
|
469
537
|
),
|
|
538
|
+
exp.Show: unsupported_args(
|
|
539
|
+
"history",
|
|
540
|
+
"terse",
|
|
541
|
+
"offset",
|
|
542
|
+
"starts_with",
|
|
543
|
+
"limit",
|
|
544
|
+
"from",
|
|
545
|
+
"scope",
|
|
546
|
+
"scope_kind",
|
|
547
|
+
"mutex",
|
|
548
|
+
"query",
|
|
549
|
+
"channel",
|
|
550
|
+
"log",
|
|
551
|
+
"types",
|
|
552
|
+
"privileges",
|
|
553
|
+
)(lambda self, e: super().show_sql(e)),
|
|
554
|
+
exp.Describe: unsupported_args(
|
|
555
|
+
"style",
|
|
556
|
+
"kind",
|
|
557
|
+
"expressions",
|
|
558
|
+
"partition",
|
|
559
|
+
"format",
|
|
560
|
+
)(lambda self, e: super().describe_sql(e)),
|
|
470
561
|
}
|
|
471
562
|
TRANSFORMS.pop(exp.JSONExtractScalar)
|
|
472
563
|
TRANSFORMS.pop(exp.CurrentDate)
|
|
@@ -1685,6 +1776,14 @@ class SingleStore(MySQL):
|
|
|
1685
1776
|
return f"DECIMAL({precision}, {scale[0]})"
|
|
1686
1777
|
else:
|
|
1687
1778
|
return f"DECIMAL({precision})"
|
|
1779
|
+
if expression.is_type(exp.DataType.Type.VECTOR):
|
|
1780
|
+
expressions = expression.expressions
|
|
1781
|
+
if len(expressions) == 2:
|
|
1782
|
+
type_name = self.sql(expressions[0])
|
|
1783
|
+
if type_name in self.dialect.INVERSE_VECTOR_TYPE_ALIASES:
|
|
1784
|
+
type_name = self.dialect.INVERSE_VECTOR_TYPE_ALIASES[type_name]
|
|
1785
|
+
|
|
1786
|
+
return f"VECTOR({self.sql(expressions[1])}, {type_name})"
|
|
1688
1787
|
|
|
1689
1788
|
return super().datatype_sql(expression)
|
|
1690
1789
|
|
|
@@ -1741,3 +1840,25 @@ class SingleStore(MySQL):
|
|
|
1741
1840
|
|
|
1742
1841
|
self.unsupported("STANDARD_HASH function is not supported in SingleStore")
|
|
1743
1842
|
return self.func("SHA", expression.this)
|
|
1843
|
+
|
|
1844
|
+
@unsupported_args("is_database", "exists", "cluster", "identity", "option", "partition")
|
|
1845
|
+
def truncatetable_sql(self, expression: exp.TruncateTable) -> str:
|
|
1846
|
+
statements = []
|
|
1847
|
+
for expression in expression.expressions:
|
|
1848
|
+
statements.append(f"TRUNCATE {self.sql(expression)}")
|
|
1849
|
+
|
|
1850
|
+
return "; ".join(statements)
|
|
1851
|
+
|
|
1852
|
+
@unsupported_args("exists")
|
|
1853
|
+
def renamecolumn_sql(self, expression: exp.RenameColumn) -> str:
|
|
1854
|
+
old_column = self.sql(expression, "this")
|
|
1855
|
+
new_column = self.sql(expression, "to")
|
|
1856
|
+
return f"CHANGE {old_column} {new_column}"
|
|
1857
|
+
|
|
1858
|
+
@unsupported_args("drop", "comment", "allow_null", "visible", "using")
|
|
1859
|
+
def altercolumn_sql(self, expression: exp.AlterColumn) -> str:
|
|
1860
|
+
alter = super().altercolumn_sql(expression)
|
|
1861
|
+
|
|
1862
|
+
collate = self.sql(expression, "collate")
|
|
1863
|
+
collate = f" COLLATE {collate}" if collate else ""
|
|
1864
|
+
return f"{alter}{collate}"
|
|
@@ -32,6 +32,7 @@ from sqlglot.dialects.dialect import (
|
|
|
32
32
|
)
|
|
33
33
|
from sqlglot.generator import unsupported_args
|
|
34
34
|
from sqlglot.helper import find_new_name, flatten, is_float, is_int, seq_get
|
|
35
|
+
from sqlglot.optimizer.annotate_types import TypeAnnotator
|
|
35
36
|
from sqlglot.optimizer.scope import build_scope, find_all_in_scope
|
|
36
37
|
from sqlglot.tokens import TokenType
|
|
37
38
|
|
|
@@ -482,6 +483,15 @@ def _eliminate_dot_variant_lookup(expression: exp.Expression) -> exp.Expression:
|
|
|
482
483
|
return expression
|
|
483
484
|
|
|
484
485
|
|
|
486
|
+
def _annotate_reverse(self: TypeAnnotator, expression: exp.Reverse) -> exp.Reverse:
|
|
487
|
+
expression = self._annotate_by_args(expression, "this")
|
|
488
|
+
if expression.is_type(exp.DataType.Type.NULL):
|
|
489
|
+
# Snowflake treats REVERSE(NULL) as a VARCHAR
|
|
490
|
+
self._set_type(expression, exp.DataType.Type.VARCHAR)
|
|
491
|
+
|
|
492
|
+
return expression
|
|
493
|
+
|
|
494
|
+
|
|
485
495
|
class Snowflake(Dialect):
|
|
486
496
|
# https://docs.snowflake.com/en/sql-reference/identifiers-syntax
|
|
487
497
|
NORMALIZATION_STRATEGY = NormalizationStrategy.UPPERCASE
|
|
@@ -500,9 +510,17 @@ class Snowflake(Dialect):
|
|
|
500
510
|
**Dialect.ANNOTATORS,
|
|
501
511
|
**{
|
|
502
512
|
expr_type: lambda self, e: self._annotate_by_args(e, "this")
|
|
503
|
-
for expr_type in (
|
|
513
|
+
for expr_type in (
|
|
514
|
+
exp.Left,
|
|
515
|
+
exp.Right,
|
|
516
|
+
exp.Substring,
|
|
517
|
+
)
|
|
504
518
|
},
|
|
505
519
|
exp.ConcatWs: lambda self, e: self._annotate_by_args(e, "expressions"),
|
|
520
|
+
exp.Length: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.INT),
|
|
521
|
+
exp.Replace: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.VARCHAR),
|
|
522
|
+
exp.Reverse: _annotate_reverse,
|
|
523
|
+
exp.Space: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.VARCHAR),
|
|
506
524
|
}
|
|
507
525
|
|
|
508
526
|
TIME_MAPPING = {
|
|
@@ -664,7 +682,8 @@ class Snowflake(Dialect):
|
|
|
664
682
|
"TO_TIMESTAMP_LTZ": _build_datetime("TO_TIMESTAMP_LTZ", exp.DataType.Type.TIMESTAMPLTZ),
|
|
665
683
|
"TO_TIMESTAMP_NTZ": _build_datetime("TO_TIMESTAMP_NTZ", exp.DataType.Type.TIMESTAMP),
|
|
666
684
|
"TO_TIMESTAMP_TZ": _build_datetime("TO_TIMESTAMP_TZ", exp.DataType.Type.TIMESTAMPTZ),
|
|
667
|
-
"TO_VARCHAR":
|
|
685
|
+
"TO_VARCHAR": build_timetostr_or_tochar,
|
|
686
|
+
"TO_JSON": exp.JSONFormat.from_arg_list,
|
|
668
687
|
"VECTOR_L2_DISTANCE": exp.EuclideanDistance.from_arg_list,
|
|
669
688
|
"ZEROIFNULL": _build_if_from_zeroifnull,
|
|
670
689
|
}
|
|
@@ -1273,6 +1292,7 @@ class Snowflake(Dialect):
|
|
|
1273
1292
|
exp.ParseJSON: lambda self, e: self.func(
|
|
1274
1293
|
"TRY_PARSE_JSON" if e.args.get("safe") else "PARSE_JSON", e.this
|
|
1275
1294
|
),
|
|
1295
|
+
exp.JSONFormat: rename_func("TO_JSON"),
|
|
1276
1296
|
exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
|
|
1277
1297
|
exp.PercentileCont: transforms.preprocess(
|
|
1278
1298
|
[transforms.add_within_group_for_percentiles]
|
|
@@ -1297,6 +1317,8 @@ class Snowflake(Dialect):
|
|
|
1297
1317
|
]
|
|
1298
1318
|
),
|
|
1299
1319
|
exp.SHA: rename_func("SHA1"),
|
|
1320
|
+
exp.MD5Digest: rename_func("MD5_BINARY"),
|
|
1321
|
+
exp.LowerHex: rename_func("TO_CHAR"),
|
|
1300
1322
|
exp.SortArray: rename_func("ARRAY_SORT"),
|
|
1301
1323
|
exp.StarMap: rename_func("OBJECT_CONSTRUCT"),
|
|
1302
1324
|
exp.StartsWith: rename_func("STARTSWITH"),
|
|
@@ -1344,9 +1366,10 @@ class Snowflake(Dialect):
|
|
|
1344
1366
|
|
|
1345
1367
|
TYPE_MAPPING = {
|
|
1346
1368
|
**generator.Generator.TYPE_MAPPING,
|
|
1369
|
+
exp.DataType.Type.BIGDECIMAL: "DOUBLE",
|
|
1347
1370
|
exp.DataType.Type.NESTED: "OBJECT",
|
|
1348
1371
|
exp.DataType.Type.STRUCT: "OBJECT",
|
|
1349
|
-
exp.DataType.Type.
|
|
1372
|
+
exp.DataType.Type.TEXT: "VARCHAR",
|
|
1350
1373
|
}
|
|
1351
1374
|
|
|
1352
1375
|
TOKEN_MAPPING = {
|
|
@@ -134,6 +134,11 @@ class Expression(metaclass=_Expression):
|
|
|
134
134
|
|
|
135
135
|
return hash((self.__class__, self.hashable_args))
|
|
136
136
|
|
|
137
|
+
def __reduce__(self) -> t.Tuple[t.Callable, t.Tuple[t.Dict[str, t.Any]]]:
|
|
138
|
+
from sqlglot.serde import dump, load
|
|
139
|
+
|
|
140
|
+
return (load, (dump(self),))
|
|
141
|
+
|
|
137
142
|
@property
|
|
138
143
|
def this(self) -> t.Any:
|
|
139
144
|
"""
|
|
@@ -1646,6 +1651,12 @@ class Show(Expression):
|
|
|
1646
1651
|
"position": False,
|
|
1647
1652
|
"types": False,
|
|
1648
1653
|
"privileges": False,
|
|
1654
|
+
"for_table": False,
|
|
1655
|
+
"for_group": False,
|
|
1656
|
+
"for_user": False,
|
|
1657
|
+
"for_role": False,
|
|
1658
|
+
"into_outfile": False,
|
|
1659
|
+
"json": False,
|
|
1649
1660
|
}
|
|
1650
1661
|
|
|
1651
1662
|
|
|
@@ -2197,7 +2208,7 @@ class Copy(DML):
|
|
|
2197
2208
|
arg_types = {
|
|
2198
2209
|
"this": True,
|
|
2199
2210
|
"kind": True,
|
|
2200
|
-
"files":
|
|
2211
|
+
"files": False,
|
|
2201
2212
|
"credentials": False,
|
|
2202
2213
|
"format": False,
|
|
2203
2214
|
"params": False,
|
|
@@ -6694,11 +6705,26 @@ class JSONBContains(Binary, Func):
|
|
|
6694
6705
|
_sql_names = ["JSONB_CONTAINS"]
|
|
6695
6706
|
|
|
6696
6707
|
|
|
6708
|
+
# https://www.postgresql.org/docs/9.5/functions-json.html
|
|
6709
|
+
class JSONBContainsAnyTopKeys(Binary, Func):
|
|
6710
|
+
pass
|
|
6711
|
+
|
|
6712
|
+
|
|
6713
|
+
# https://www.postgresql.org/docs/9.5/functions-json.html
|
|
6714
|
+
class JSONBContainsAllTopKeys(Binary, Func):
|
|
6715
|
+
pass
|
|
6716
|
+
|
|
6717
|
+
|
|
6697
6718
|
class JSONBExists(Func):
|
|
6698
6719
|
arg_types = {"this": True, "path": True}
|
|
6699
6720
|
_sql_names = ["JSONB_EXISTS"]
|
|
6700
6721
|
|
|
6701
6722
|
|
|
6723
|
+
# https://www.postgresql.org/docs/9.5/functions-json.html
|
|
6724
|
+
class JSONBDeleteAtPath(Binary, Func):
|
|
6725
|
+
pass
|
|
6726
|
+
|
|
6727
|
+
|
|
6702
6728
|
class JSONExtract(Binary, Func):
|
|
6703
6729
|
arg_types = {
|
|
6704
6730
|
"this": True,
|
|
@@ -6963,6 +6989,11 @@ class Predict(Func):
|
|
|
6963
6989
|
arg_types = {"this": True, "expression": True, "params_struct": False}
|
|
6964
6990
|
|
|
6965
6991
|
|
|
6992
|
+
# https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-translate#mltranslate_function
|
|
6993
|
+
class MLTranslate(Func):
|
|
6994
|
+
arg_types = {"this": True, "expression": True, "params_struct": True}
|
|
6995
|
+
|
|
6996
|
+
|
|
6966
6997
|
# https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-feature-time
|
|
6967
6998
|
class FeaturesAtTime(Func):
|
|
6968
6999
|
arg_types = {"this": True, "time": False, "num_rows": False, "ignore_feature_nulls": False}
|
|
@@ -6973,6 +7004,10 @@ class GenerateEmbedding(Func):
|
|
|
6973
7004
|
arg_types = {"this": True, "expression": True, "params_struct": False}
|
|
6974
7005
|
|
|
6975
7006
|
|
|
7007
|
+
class MLForecast(Func):
|
|
7008
|
+
arg_types = {"this": True, "expression": False, "params_struct": False}
|
|
7009
|
+
|
|
7010
|
+
|
|
6976
7011
|
# https://cloud.google.com/bigquery/docs/reference/standard-sql/search_functions#vector_search
|
|
6977
7012
|
class VectorSearch(Func):
|
|
6978
7013
|
arg_types = {
|