sqlglot 27.18.0__tar.gz → 27.19.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.18.0 → sqlglot-27.19.0}/CHANGELOG.md +43 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/PKG-INFO +1 -1
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/_version.py +3 -3
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/bigquery.py +25 -9
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/snowflake.py +10 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/expressions.py +14 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/parser.py +2 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.egg-info/PKG-INFO +1 -1
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_bigquery.py +1 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_databricks.py +4 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_snowflake.py +25 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/annotate_functions.sql +60 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_parser.py +21 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/.gitignore +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/.gitpod.yml +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/.pre-commit-config.yaml +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/CONTRIBUTING.md +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/LICENSE +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/MANIFEST.in +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/Makefile +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/README.md +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/pyproject.toml +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/setup.cfg +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/setup.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/__init__.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/__main__.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/_typing.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/__init__.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/athena.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/clickhouse.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/databricks.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/dialect.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/doris.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/dremio.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/drill.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/druid.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/duckdb.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/dune.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/exasol.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/fabric.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/hive.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/materialize.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/mysql.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/oracle.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/postgres.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/presto.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/prql.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/redshift.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/risingwave.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/singlestore.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/solr.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/spark.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/spark2.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/sqlite.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/starrocks.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/tableau.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/teradata.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/trino.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/tsql.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/diff.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/errors.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/executor/__init__.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/executor/context.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/executor/env.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/executor/python.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/executor/table.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/generator.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/helper.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/jsonpath.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/lineage.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/__init__.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/annotate_types.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/canonicalize.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/normalize.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/optimize_joins.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/optimizer.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/qualify.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/qualify_columns.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/qualify_tables.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/scope.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/simplify.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/planner.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/py.typed +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/schema.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/serde.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/time.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/tokens.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/transforms.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/trie.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.egg-info/SOURCES.txt +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.egg-info/dependency_links.txt +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.egg-info/requires.txt +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.egg-info/top_level.txt +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.png +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/Cargo.lock +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/Cargo.toml +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/benches/dialect_settings.json +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/benches/long.rs +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/benches/token_type_settings.json +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/benches/tokenizer_dialect_settings.json +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/benches/tokenizer_settings.json +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/pyproject.toml +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/src/lib.rs +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/src/settings.rs +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/src/token.rs +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/src/tokenizer.rs +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/src/trie.rs +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/__init__.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/__init__.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_athena.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_clickhouse.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_dialect.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_doris.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_dremio.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_drill.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_druid.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_duckdb.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_dune.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_exasol.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_fabric.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_hive.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_materialize.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_mysql.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_oracle.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_pipe_syntax.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_postgres.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_presto.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_prql.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_redshift.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_risingwave.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_singlestore.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_solr.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_spark.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_sqlite.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_starrocks.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_tableau.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_teradata.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_trino.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_tsql.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/identity.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/jsonpath/LICENSE +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/jsonpath/cts.json +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/normalize.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/simplify.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/partial.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/pretty.sql +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/gen_fixtures.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/helpers.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_build.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_dialect_imports.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_diff.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_docs.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_executor.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_expressions.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_generator.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_helper.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_jsonpath.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_lineage.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_optimizer.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_schema.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_serde.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_time.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_tokens.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_transforms.py +0 -0
- {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_transpile.py +0 -0
|
@@ -1,6 +1,48 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
## [v27.18.0] - 2025-09-25
|
|
5
|
+
### :boom: BREAKING CHANGES
|
|
6
|
+
- due to [`7f13eaf`](https://github.com/tobymao/sqlglot/commit/7f13eaf7769a3381a56c9209af590835be2f95cd) - Annotate type for snowflake DECOMPRESS_BINARY function *(PR [#5945](https://github.com/tobymao/sqlglot/pull/5945) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
|
|
7
|
+
|
|
8
|
+
Annotate type for snowflake DECOMPRESS_BINARY function (#5945)
|
|
9
|
+
|
|
10
|
+
- due to [`be12b29`](https://github.com/tobymao/sqlglot/commit/be12b29b5a7bd6d6e09dbd8c17086bd77c19abc0) - Annotate type for snowflake DECOMPRESS_STRING function *(PR [#5947](https://github.com/tobymao/sqlglot/pull/5947) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
|
|
11
|
+
|
|
12
|
+
Annotate type for snowflake DECOMPRESS_STRING function (#5947)
|
|
13
|
+
|
|
14
|
+
- due to [`1573fef`](https://github.com/tobymao/sqlglot/commit/1573fefac27b5b1215e3d458f8ccf1b9dadbb772) - annotate types for Snowflake JAROWINKLER_SIMILARITY function *(PR [#5950](https://github.com/tobymao/sqlglot/pull/5950) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*:
|
|
15
|
+
|
|
16
|
+
annotate types for Snowflake JAROWINKLER_SIMILARITY function (#5950)
|
|
17
|
+
|
|
18
|
+
- due to [`883c6ab`](https://github.com/tobymao/sqlglot/commit/883c6abe589865f478d95604e8d670e57afd04af) - annotate type for Snowflake COLLATION function *(PR [#5939](https://github.com/tobymao/sqlglot/pull/5939) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*:
|
|
19
|
+
|
|
20
|
+
annotate type for Snowflake COLLATION function (#5939)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
### :sparkles: New Features
|
|
24
|
+
- [`7f13eaf`](https://github.com/tobymao/sqlglot/commit/7f13eaf7769a3381a56c9209af590835be2f95cd) - **optimizer**: Annotate type for snowflake DECOMPRESS_BINARY function *(PR [#5945](https://github.com/tobymao/sqlglot/pull/5945) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
25
|
+
- [`be12b29`](https://github.com/tobymao/sqlglot/commit/be12b29b5a7bd6d6e09dbd8c17086bd77c19abc0) - **optimizer**: Annotate type for snowflake DECOMPRESS_STRING function *(PR [#5947](https://github.com/tobymao/sqlglot/pull/5947) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
26
|
+
- [`a55fce5`](https://github.com/tobymao/sqlglot/commit/a55fce5310a50af132c5d06bb299fe3f025442c4) - **optimizer**: Annotate type for snowflake LPAD function *(PR [#5948](https://github.com/tobymao/sqlglot/pull/5948) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
|
|
27
|
+
- [`05e07aa`](https://github.com/tobymao/sqlglot/commit/05e07aa740d7977a6b42ec15ae4fa9c2168a15f5) - **optimizer**: annotate type for Snowflake INSERT function *(PR [#5942](https://github.com/tobymao/sqlglot/pull/5942) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
|
|
28
|
+
- [`6268e10`](https://github.com/tobymao/sqlglot/commit/6268e107a947badaa00508544f5389412806ecd0) - **solr**: initial dialect implementation *(PR [#5946](https://github.com/tobymao/sqlglot/pull/5946) by [@aadel](https://github.com/aadel))*
|
|
29
|
+
- [`1573fef`](https://github.com/tobymao/sqlglot/commit/1573fefac27b5b1215e3d458f8ccf1b9dadbb772) - **optimizer**: annotate types for Snowflake JAROWINKLER_SIMILARITY function *(PR [#5950](https://github.com/tobymao/sqlglot/pull/5950) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
|
|
30
|
+
- [`883c6ab`](https://github.com/tobymao/sqlglot/commit/883c6abe589865f478d95604e8d670e57afd04af) - **optimizer**: annotate type for Snowflake COLLATION function *(PR [#5939](https://github.com/tobymao/sqlglot/pull/5939) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
|
|
31
|
+
- [`627c18d`](https://github.com/tobymao/sqlglot/commit/627c18d7da6bf644bc14c0f17963dea0be20604a) - **mysql**: add valid INTERVAL units *(PR [#5951](https://github.com/tobymao/sqlglot/pull/5951) by [@geooo109](https://github.com/geooo109))*
|
|
32
|
+
|
|
33
|
+
### :bug: Bug Fixes
|
|
34
|
+
- [`3846d4d`](https://github.com/tobymao/sqlglot/commit/3846d4dcdf8cbf8e90b2661083a567ab0547ad3c) - **solr**: properly support OR alternative operator *(commit by [@georgesittas](https://github.com/georgesittas))*
|
|
35
|
+
- [`df428d5`](https://github.com/tobymao/sqlglot/commit/df428d516113a47ae50d04cd50a250830589c072) - **parser**: interval identifier followed by END *(PR [#5944](https://github.com/tobymao/sqlglot/pull/5944) by [@geooo109](https://github.com/geooo109))*
|
|
36
|
+
- [`e178d16`](https://github.com/tobymao/sqlglot/commit/e178d1674a71e6f35a6acfa8f4a317f0fe2e4516) - **duckdb**: UNNEST as table *(PR [#5953](https://github.com/tobymao/sqlglot/pull/5953) by [@geooo109](https://github.com/geooo109))*
|
|
37
|
+
- :arrow_lower_right: *fixes issue [#5952](https://github.com/tobymao/sqlglot/issues/5952) opened by [@denis-komarov](https://github.com/denis-komarov)*
|
|
38
|
+
- [`24feb8e`](https://github.com/tobymao/sqlglot/commit/24feb8ee0bc43f3f14fd768c9a0d986355becea2) - **parser**: parse `UPDATE` clauses in any order *(PR [#5958](https://github.com/tobymao/sqlglot/pull/5958) by [@georgesittas](https://github.com/georgesittas))*
|
|
39
|
+
- :arrow_lower_right: *fixes issue [#5956](https://github.com/tobymao/sqlglot/issues/5956) opened by [@sfc-gh-clathrope](https://github.com/sfc-gh-clathrope)*
|
|
40
|
+
- [`980f99a`](https://github.com/tobymao/sqlglot/commit/980f99a4cc0613012a189ee5636af37ec736040c) - **snowflake**: properly generate inferred `STRUCT` data types *(PR [#5954](https://github.com/tobymao/sqlglot/pull/5954) by [@georgesittas](https://github.com/georgesittas))*
|
|
41
|
+
|
|
42
|
+
### :wrench: Chores
|
|
43
|
+
- [`c18aaf8`](https://github.com/tobymao/sqlglot/commit/c18aaf80fd7375e89dfc8863da619d84f3257353) - cleanup *(commit by [@tobymao](https://github.com/tobymao))*
|
|
44
|
+
|
|
45
|
+
|
|
4
46
|
## [v27.17.0] - 2025-09-23
|
|
5
47
|
### :boom: BREAKING CHANGES
|
|
6
48
|
- due to [`f4ad258`](https://github.com/tobymao/sqlglot/commit/f4ad25882951de4e4442dfd5189a56d5a1c5e630) - Annotate types for Snowflake BASE64_DECODE_BINARY function *(PR [#5917](https://github.com/tobymao/sqlglot/pull/5917) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
|
|
@@ -7477,3 +7519,4 @@ Changelog
|
|
|
7477
7519
|
[v27.16.2]: https://github.com/tobymao/sqlglot/compare/v27.16.1...v27.16.2
|
|
7478
7520
|
[v27.16.3]: https://github.com/tobymao/sqlglot/compare/v27.16.2...v27.16.3
|
|
7479
7521
|
[v27.17.0]: https://github.com/tobymao/sqlglot/compare/v27.16.3...v27.17.0
|
|
7522
|
+
[v27.18.0]: https://github.com/tobymao/sqlglot/compare/v27.17.0...v27.18.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.19.0'
|
|
32
|
+
__version_tuple__ = version_tuple = (27, 19, 0)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g1471306ed'
|
|
@@ -754,15 +754,31 @@ class BigQuery(Dialect):
|
|
|
754
754
|
SUPPORTS_IMPLICIT_UNNEST = True
|
|
755
755
|
JOINS_HAVE_EQUAL_PRECEDENCE = True
|
|
756
756
|
|
|
757
|
-
# BigQuery does not allow ASC/DESC to be used as an identifier
|
|
758
|
-
ID_VAR_TOKENS =
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
757
|
+
# BigQuery does not allow ASC/DESC to be used as an identifier, allows GRANT as an identifier
|
|
758
|
+
ID_VAR_TOKENS = {
|
|
759
|
+
*parser.Parser.ID_VAR_TOKENS,
|
|
760
|
+
TokenType.GRANT,
|
|
761
|
+
} - {TokenType.ASC, TokenType.DESC}
|
|
762
|
+
|
|
763
|
+
ALIAS_TOKENS = {
|
|
764
|
+
*parser.Parser.ALIAS_TOKENS,
|
|
765
|
+
TokenType.GRANT,
|
|
766
|
+
} - {TokenType.ASC, TokenType.DESC}
|
|
767
|
+
|
|
768
|
+
TABLE_ALIAS_TOKENS = {
|
|
769
|
+
*parser.Parser.TABLE_ALIAS_TOKENS,
|
|
770
|
+
TokenType.GRANT,
|
|
771
|
+
} - {TokenType.ASC, TokenType.DESC}
|
|
772
|
+
|
|
773
|
+
COMMENT_TABLE_ALIAS_TOKENS = {
|
|
774
|
+
*parser.Parser.COMMENT_TABLE_ALIAS_TOKENS,
|
|
775
|
+
TokenType.GRANT,
|
|
776
|
+
} - {TokenType.ASC, TokenType.DESC}
|
|
777
|
+
|
|
778
|
+
UPDATE_ALIAS_TOKENS = {
|
|
779
|
+
*parser.Parser.UPDATE_ALIAS_TOKENS,
|
|
780
|
+
TokenType.GRANT,
|
|
781
|
+
} - {TokenType.ASC, TokenType.DESC}
|
|
766
782
|
|
|
767
783
|
FUNCTIONS = {
|
|
768
784
|
**parser.Parser.FUNCTIONS,
|
|
@@ -532,10 +532,13 @@ class Snowflake(Dialect):
|
|
|
532
532
|
exp.DataType.Type.INT: {
|
|
533
533
|
*Dialect.TYPE_TO_EXPRESSIONS[exp.DataType.Type.INT],
|
|
534
534
|
exp.Ascii,
|
|
535
|
+
exp.ByteLength,
|
|
535
536
|
exp.Length,
|
|
537
|
+
exp.RtrimmedLength,
|
|
536
538
|
exp.BitLength,
|
|
537
539
|
exp.Levenshtein,
|
|
538
540
|
exp.JarowinklerSimilarity,
|
|
541
|
+
exp.StrPosition,
|
|
539
542
|
},
|
|
540
543
|
exp.DataType.Type.VARCHAR: {
|
|
541
544
|
*Dialect.TYPE_TO_EXPRESSIONS[exp.DataType.Type.VARCHAR],
|
|
@@ -579,6 +582,10 @@ class Snowflake(Dialect):
|
|
|
579
582
|
exp.DataType.Type.ARRAY: {
|
|
580
583
|
exp.Split,
|
|
581
584
|
},
|
|
585
|
+
exp.DataType.Type.OBJECT: {
|
|
586
|
+
exp.ParseUrl,
|
|
587
|
+
exp.ParseIp,
|
|
588
|
+
},
|
|
582
589
|
}
|
|
583
590
|
|
|
584
591
|
ANNOTATORS = {
|
|
@@ -732,6 +739,9 @@ class Snowflake(Dialect):
|
|
|
732
739
|
"NULLIFZERO": _build_if_from_nullifzero,
|
|
733
740
|
"OBJECT_CONSTRUCT": _build_object_construct,
|
|
734
741
|
"OCTET_LENGTH": exp.ByteLength.from_arg_list,
|
|
742
|
+
"PARSE_URL": lambda args: exp.ParseUrl(
|
|
743
|
+
this=seq_get(args, 0), permissive=seq_get(args, 1)
|
|
744
|
+
),
|
|
735
745
|
"REGEXP_EXTRACT_ALL": _build_regexp_extract(exp.RegexpExtractAll),
|
|
736
746
|
"REGEXP_REPLACE": _build_regexp_replace,
|
|
737
747
|
"REGEXP_SUBSTR": _build_regexp_extract(exp.RegexpExtract),
|
|
@@ -6888,6 +6888,16 @@ class ParseJSON(Func):
|
|
|
6888
6888
|
arg_types = {"this": True, "expression": False, "safe": False}
|
|
6889
6889
|
|
|
6890
6890
|
|
|
6891
|
+
# Snowflake: https://docs.snowflake.com/en/sql-reference/functions/parse_url
|
|
6892
|
+
# Databricks: https://docs.databricks.com/aws/en/sql/language-manual/functions/parse_url
|
|
6893
|
+
class ParseUrl(Func):
|
|
6894
|
+
arg_types = {"this": True, "part_to_extract": False, "key": False, "permissive": False}
|
|
6895
|
+
|
|
6896
|
+
|
|
6897
|
+
class ParseIp(Func):
|
|
6898
|
+
arg_types = {"this": True, "type": True, "permissive": False}
|
|
6899
|
+
|
|
6900
|
+
|
|
6891
6901
|
class ParseTime(Func):
|
|
6892
6902
|
arg_types = {"this": True, "format": True}
|
|
6893
6903
|
|
|
@@ -6918,6 +6928,10 @@ class Length(Func):
|
|
|
6918
6928
|
_sql_names = ["LENGTH", "LEN", "CHAR_LENGTH", "CHARACTER_LENGTH"]
|
|
6919
6929
|
|
|
6920
6930
|
|
|
6931
|
+
class RtrimmedLength(Func):
|
|
6932
|
+
pass
|
|
6933
|
+
|
|
6934
|
+
|
|
6921
6935
|
class BitLength(Func):
|
|
6922
6936
|
pass
|
|
6923
6937
|
|
|
@@ -809,6 +809,8 @@ class Parser(metaclass=_Parser):
|
|
|
809
809
|
exp.DataType: lambda self: self._parse_types(allow_identifiers=False, schema=True),
|
|
810
810
|
exp.Expression: lambda self: self._parse_expression(),
|
|
811
811
|
exp.From: lambda self: self._parse_from(joins=True),
|
|
812
|
+
exp.GrantPrincipal: lambda self: self._parse_grant_principal(),
|
|
813
|
+
exp.GrantPrivilege: lambda self: self._parse_grant_privilege(),
|
|
812
814
|
exp.Group: lambda self: self._parse_group(),
|
|
813
815
|
exp.Having: lambda self: self._parse_having(),
|
|
814
816
|
exp.Hint: lambda self: self._parse_hint_body(),
|
|
@@ -1813,6 +1813,7 @@ WHERE
|
|
|
1813
1813
|
self.validate_identity("TO_JSON(9999999999, stringify_wide_numbers => FALSE)")
|
|
1814
1814
|
self.validate_identity("RANGE_BUCKET(20, [0, 10, 20, 30, 40])")
|
|
1815
1815
|
self.validate_identity("SELECT TRANSLATE(MODEL, 'in', 't') FROM (SELECT 'input' AS MODEL)")
|
|
1816
|
+
self.validate_identity("SELECT GRANT FROM (SELECT 'input' AS GRANT)")
|
|
1816
1817
|
|
|
1817
1818
|
def test_errors(self):
|
|
1818
1819
|
with self.assertRaises(ParseError):
|
|
@@ -37,6 +37,10 @@ class TestDatabricks(Validator):
|
|
|
37
37
|
self.validate_identity("CREATE TABLE foo (x DATE GENERATED ALWAYS AS (CAST(y AS DATE)))")
|
|
38
38
|
self.validate_identity("TRUNCATE TABLE t1 PARTITION(age = 10, name = 'test', address)")
|
|
39
39
|
self.validate_identity("SELECT PARSE_JSON('{}')")
|
|
40
|
+
|
|
41
|
+
self.validate_identity("PARSE_URL('https://example.com/path')")
|
|
42
|
+
self.validate_identity("PARSE_URL('https://example.com/path', 'HOST')")
|
|
43
|
+
self.validate_identity("PARSE_URL('https://example.com/path', 'QUERY', 'param')")
|
|
40
44
|
self.validate_identity(
|
|
41
45
|
"CREATE TABLE IF NOT EXISTS db.table (a TIMESTAMP, b BOOLEAN GENERATED ALWAYS AS (NOT a IS NULL)) USING DELTA"
|
|
42
46
|
)
|
|
@@ -31,6 +31,7 @@ class TestSnowflake(Validator):
|
|
|
31
31
|
|
|
32
32
|
self.validate_identity("SELECT BIT_LENGTH('abc')")
|
|
33
33
|
self.validate_identity("SELECT BIT_LENGTH(x'A1B2')")
|
|
34
|
+
self.validate_identity("SELECT RTRIMMED_LENGTH(' ABCD ')")
|
|
34
35
|
self.validate_identity("SELECT HEX_DECODE_STRING('48656C6C6F')")
|
|
35
36
|
self.validate_identity("SELECT HEX_ENCODE('Hello World')")
|
|
36
37
|
self.validate_identity("SELECT HEX_ENCODE('Hello World', 1)")
|
|
@@ -41,7 +42,11 @@ class TestSnowflake(Validator):
|
|
|
41
42
|
self.validate_identity("SELECT DECOMPRESS_STRING('compressed_data', 'ZSTD')")
|
|
42
43
|
self.validate_identity("SELECT LPAD('Hello', 10, '*')")
|
|
43
44
|
self.validate_identity("SELECT LPAD(tbl.bin_col, 10)")
|
|
45
|
+
self.validate_identity("SELECT RPAD('Hello', 10, '*')")
|
|
46
|
+
self.validate_identity("SELECT RPAD(tbl.bin_col, 10)")
|
|
44
47
|
self.validate_identity("SELECT JAROWINKLER_SIMILARITY('hello', 'world')")
|
|
48
|
+
self.validate_identity("PARSE_URL('https://example.com/path')")
|
|
49
|
+
self.validate_identity("PARSE_URL('https://example.com/path', 1)")
|
|
45
50
|
self.validate_identity("SELECT {*} FROM my_table")
|
|
46
51
|
self.validate_identity("SELECT {my_table.*} FROM my_table")
|
|
47
52
|
self.validate_identity("SELECT {* ILIKE 'col1%'} FROM my_table")
|
|
@@ -111,6 +116,8 @@ class TestSnowflake(Validator):
|
|
|
111
116
|
self.validate_identity("SELECT TO_CHAR(CAST('12:05:05' AS TIME))")
|
|
112
117
|
self.validate_identity("SELECT TRIM(COALESCE(TO_CHAR(CAST(c AS TIME)), '')) FROM t")
|
|
113
118
|
self.validate_identity("SELECT GET_PATH(PARSE_JSON(foo), 'bar')")
|
|
119
|
+
self.validate_identity("SELECT PARSE_IP('192.168.1.1', 'INET')")
|
|
120
|
+
self.validate_identity("SELECT PARSE_IP('192.168.1.1', 'INET', 0)")
|
|
114
121
|
self.validate_identity("SELECT GET_PATH(foo, 'bar')")
|
|
115
122
|
self.validate_identity("SELECT a, exclude, b FROM xxx")
|
|
116
123
|
self.validate_identity("SELECT ARRAY_SORT(x, TRUE, FALSE)")
|
|
@@ -1019,6 +1026,24 @@ class TestSnowflake(Validator):
|
|
|
1019
1026
|
"spark": "SELECT a RLIKE b",
|
|
1020
1027
|
},
|
|
1021
1028
|
)
|
|
1029
|
+
self.validate_all(
|
|
1030
|
+
"'foo' REGEXP 'bar'",
|
|
1031
|
+
write={
|
|
1032
|
+
"snowflake": "REGEXP_LIKE('foo', 'bar')",
|
|
1033
|
+
"postgres": "'foo' ~ 'bar'",
|
|
1034
|
+
"mysql": "REGEXP_LIKE('foo', 'bar')",
|
|
1035
|
+
"bigquery": "REGEXP_CONTAINS('foo', 'bar')",
|
|
1036
|
+
},
|
|
1037
|
+
)
|
|
1038
|
+
self.validate_all(
|
|
1039
|
+
"'foo' NOT REGEXP 'bar'",
|
|
1040
|
+
write={
|
|
1041
|
+
"snowflake": "NOT REGEXP_LIKE('foo', 'bar')",
|
|
1042
|
+
"postgres": "NOT 'foo' ~ 'bar'",
|
|
1043
|
+
"mysql": "NOT REGEXP_LIKE('foo', 'bar')",
|
|
1044
|
+
"bigquery": "NOT REGEXP_CONTAINS('foo', 'bar')",
|
|
1045
|
+
},
|
|
1046
|
+
)
|
|
1022
1047
|
self.validate_all(
|
|
1023
1048
|
"SELECT a FROM test pivot",
|
|
1024
1049
|
write={
|
|
@@ -1651,6 +1651,18 @@ VARCHAR;
|
|
|
1651
1651
|
LPAD(tbl.bin_col, 10, 0x20);
|
|
1652
1652
|
BINARY;
|
|
1653
1653
|
|
|
1654
|
+
# dialect: snowflake
|
|
1655
|
+
RPAD('Hello', 10, '*');
|
|
1656
|
+
VARCHAR;
|
|
1657
|
+
|
|
1658
|
+
# dialect: snowflake
|
|
1659
|
+
RPAD(tbl.str_col, 10);
|
|
1660
|
+
VARCHAR;
|
|
1661
|
+
|
|
1662
|
+
# dialect: snowflake
|
|
1663
|
+
RPAD(tbl.bin_col, 10, 0x20);
|
|
1664
|
+
BINARY;
|
|
1665
|
+
|
|
1654
1666
|
# dialect: snowflake
|
|
1655
1667
|
COLLATION('hello');
|
|
1656
1668
|
VARCHAR;
|
|
@@ -1799,6 +1811,34 @@ INT;
|
|
|
1799
1811
|
LENGTH(tbl.bin_col);
|
|
1800
1812
|
INT;
|
|
1801
1813
|
|
|
1814
|
+
# dialect: snowflake
|
|
1815
|
+
OCTET_LENGTH(tbl.str_col);
|
|
1816
|
+
INT;
|
|
1817
|
+
|
|
1818
|
+
# dialect: snowflake
|
|
1819
|
+
OCTET_LENGTH(tbl.bin_col);
|
|
1820
|
+
INT;
|
|
1821
|
+
|
|
1822
|
+
# dialect: snowflake
|
|
1823
|
+
PARSE_URL('https://example.com/path');
|
|
1824
|
+
OBJECT;
|
|
1825
|
+
|
|
1826
|
+
# dialect: snowflake
|
|
1827
|
+
PARSE_URL(tbl.str_col, 0);
|
|
1828
|
+
OBJECT;
|
|
1829
|
+
|
|
1830
|
+
# dialect: snowflake
|
|
1831
|
+
POSITION('abc' IN 'abcdef');
|
|
1832
|
+
INT;
|
|
1833
|
+
|
|
1834
|
+
# dialect: snowflake
|
|
1835
|
+
POSITION('abc', 'abcdef');
|
|
1836
|
+
INT;
|
|
1837
|
+
|
|
1838
|
+
# dialect: snowflake
|
|
1839
|
+
POSITION('abc', 'abcdef', 1);
|
|
1840
|
+
INT;
|
|
1841
|
+
|
|
1802
1842
|
# dialect: snowflake
|
|
1803
1843
|
LOWER(tbl.str_col);
|
|
1804
1844
|
VARCHAR;
|
|
@@ -1815,6 +1855,18 @@ VARCHAR;
|
|
|
1815
1855
|
LTRIM(NULL);
|
|
1816
1856
|
VARCHAR;
|
|
1817
1857
|
|
|
1858
|
+
# dialect: snowflake
|
|
1859
|
+
'foo' REGEXP 'bar';
|
|
1860
|
+
BOOLEAN;
|
|
1861
|
+
|
|
1862
|
+
# dialect: snowflake
|
|
1863
|
+
'foo' NOT REGEXP 'bar';
|
|
1864
|
+
BOOLEAN;
|
|
1865
|
+
|
|
1866
|
+
# dialect: snowflake
|
|
1867
|
+
'text123' REGEXP '^[a-z]+[0-9]+$';
|
|
1868
|
+
BOOLEAN;
|
|
1869
|
+
|
|
1818
1870
|
# dialect: snowflake
|
|
1819
1871
|
REGEXP_LIKE('foo', 'bar');
|
|
1820
1872
|
BOOLEAN;
|
|
@@ -1939,6 +1991,10 @@ VARCHAR;
|
|
|
1939
1991
|
RTRIM(NULL);
|
|
1940
1992
|
VARCHAR;
|
|
1941
1993
|
|
|
1994
|
+
# dialect: snowflake
|
|
1995
|
+
RTRIMMED_LENGTH(' ABCD ');
|
|
1996
|
+
INT;
|
|
1997
|
+
|
|
1942
1998
|
# dialect: snowflake
|
|
1943
1999
|
SHA1('foo');
|
|
1944
2000
|
VARCHAR;
|
|
@@ -2171,6 +2227,10 @@ BOOLEAN;
|
|
|
2171
2227
|
ILIKE(tbl.str_col, 'pattern');
|
|
2172
2228
|
BOOLEAN;
|
|
2173
2229
|
|
|
2230
|
+
# dialect: snowflake
|
|
2231
|
+
PARSE_IP('192.168.1.1', 'INET');
|
|
2232
|
+
OBJECT;
|
|
2233
|
+
|
|
2174
2234
|
--------------------------------------
|
|
2175
2235
|
-- T-SQL
|
|
2176
2236
|
--------------------------------------
|
|
@@ -1029,3 +1029,24 @@ class TestParser(unittest.TestCase):
|
|
|
1029
1029
|
parse_one(sql, error_level=ErrorLevel.IGNORE).sql(),
|
|
1030
1030
|
"SELECT * FROM a WHERE c = 'false'",
|
|
1031
1031
|
)
|
|
1032
|
+
|
|
1033
|
+
def test_parse_into_grant_principal(self):
|
|
1034
|
+
self.assertIsInstance(parse_one("ROLE blah", into=exp.GrantPrincipal), exp.GrantPrincipal)
|
|
1035
|
+
self.assertIsInstance(parse_one("GROUP blah", into=exp.GrantPrincipal), exp.GrantPrincipal)
|
|
1036
|
+
self.assertIsInstance(parse_one("blah", into=exp.GrantPrincipal), exp.GrantPrincipal)
|
|
1037
|
+
self.assertIsInstance(
|
|
1038
|
+
parse_one("ROLE `blah`", into=exp.GrantPrincipal, dialect="databricks"),
|
|
1039
|
+
exp.GrantPrincipal,
|
|
1040
|
+
)
|
|
1041
|
+
self.assertEqual(
|
|
1042
|
+
parse_one("ROLE `blah`", into=exp.GrantPrincipal, dialect="databricks").sql(
|
|
1043
|
+
dialect="databricks"
|
|
1044
|
+
),
|
|
1045
|
+
"ROLE `blah`",
|
|
1046
|
+
)
|
|
1047
|
+
|
|
1048
|
+
def test_parse_into_grant_privilege(self):
|
|
1049
|
+
self.assertIsInstance(parse_one("SELECT", into=exp.GrantPrivilege), exp.GrantPrivilege)
|
|
1050
|
+
self.assertIsInstance(
|
|
1051
|
+
parse_one("ALL PRIVILEGES", into=exp.GrantPrivilege), exp.GrantPrivilege
|
|
1052
|
+
)
|
|
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
|
|
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
|
|
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
|