sqlglot 27.25.2__tar.gz → 27.27.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.

Potentially problematic release.


This version of sqlglot might be problematic. Click here for more details.

Files changed (228) hide show
  1. {sqlglot-27.25.2 → sqlglot-27.27.0}/CHANGELOG.md +51 -0
  2. {sqlglot-27.25.2 → sqlglot-27.27.0}/PKG-INFO +2 -2
  3. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/_version.py +3 -3
  4. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/clickhouse.py +3 -1
  5. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/dialect.py +3 -1
  6. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/duckdb.py +16 -3
  7. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/postgres.py +1 -1
  8. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/snowflake.py +6 -0
  9. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/tsql.py +7 -1
  10. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/expressions.py +16 -2
  11. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/generator.py +7 -3
  12. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/qualify_columns.py +2 -2
  13. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/qualify_tables.py +2 -1
  14. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/unnest_subqueries.py +1 -1
  15. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/parser.py +13 -4
  16. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/transforms.py +2 -2
  17. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot.egg-info/PKG-INFO +2 -2
  18. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot.egg-info/requires.txt +1 -1
  19. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/Cargo.lock +1 -1
  20. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/Cargo.toml +1 -1
  21. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_bigquery.py +8 -0
  22. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_duckdb.py +13 -0
  23. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_mysql.py +2 -2
  24. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_snowflake.py +24 -0
  25. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/identity.sql +2 -0
  26. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/annotate_functions.sql +60 -0
  27. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_parser.py +2 -0
  28. {sqlglot-27.25.2 → sqlglot-27.27.0}/.gitignore +0 -0
  29. {sqlglot-27.25.2 → sqlglot-27.27.0}/.gitpod.yml +0 -0
  30. {sqlglot-27.25.2 → sqlglot-27.27.0}/.pre-commit-config.yaml +0 -0
  31. {sqlglot-27.25.2 → sqlglot-27.27.0}/CONTRIBUTING.md +0 -0
  32. {sqlglot-27.25.2 → sqlglot-27.27.0}/LICENSE +0 -0
  33. {sqlglot-27.25.2 → sqlglot-27.27.0}/MANIFEST.in +0 -0
  34. {sqlglot-27.25.2 → sqlglot-27.27.0}/Makefile +0 -0
  35. {sqlglot-27.25.2 → sqlglot-27.27.0}/README.md +0 -0
  36. {sqlglot-27.25.2 → sqlglot-27.27.0}/pyproject.toml +0 -0
  37. {sqlglot-27.25.2 → sqlglot-27.27.0}/setup.cfg +0 -0
  38. {sqlglot-27.25.2 → sqlglot-27.27.0}/setup.py +0 -0
  39. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/__init__.py +0 -0
  40. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/__main__.py +0 -0
  41. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/_typing.py +0 -0
  42. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/__init__.py +0 -0
  43. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/athena.py +0 -0
  44. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/bigquery.py +0 -0
  45. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/databricks.py +0 -0
  46. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/doris.py +0 -0
  47. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/dremio.py +0 -0
  48. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/drill.py +0 -0
  49. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/druid.py +0 -0
  50. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/dune.py +0 -0
  51. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/exasol.py +0 -0
  52. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/fabric.py +0 -0
  53. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/hive.py +0 -0
  54. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/materialize.py +0 -0
  55. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/mysql.py +0 -0
  56. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/oracle.py +0 -0
  57. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/presto.py +0 -0
  58. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/prql.py +0 -0
  59. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/redshift.py +0 -0
  60. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/risingwave.py +0 -0
  61. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/singlestore.py +0 -0
  62. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/solr.py +0 -0
  63. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/spark.py +0 -0
  64. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/spark2.py +0 -0
  65. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/sqlite.py +0 -0
  66. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/starrocks.py +0 -0
  67. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/tableau.py +0 -0
  68. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/teradata.py +0 -0
  69. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/dialects/trino.py +0 -0
  70. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/diff.py +0 -0
  71. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/errors.py +0 -0
  72. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/executor/__init__.py +0 -0
  73. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/executor/context.py +0 -0
  74. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/executor/env.py +0 -0
  75. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/executor/python.py +0 -0
  76. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/executor/table.py +0 -0
  77. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/helper.py +0 -0
  78. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/jsonpath.py +0 -0
  79. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/lineage.py +0 -0
  80. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/__init__.py +0 -0
  81. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/annotate_types.py +0 -0
  82. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/canonicalize.py +0 -0
  83. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  84. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  85. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  86. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  87. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
  88. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/normalize.py +0 -0
  89. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  90. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  91. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/optimizer.py +0 -0
  92. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
  93. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  94. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/qualify.py +0 -0
  95. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/scope.py +0 -0
  96. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/optimizer/simplify.py +0 -0
  97. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/planner.py +0 -0
  98. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/py.typed +0 -0
  99. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/schema.py +0 -0
  100. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/serde.py +0 -0
  101. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/time.py +0 -0
  102. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/tokens.py +0 -0
  103. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot/trie.py +0 -0
  104. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot.egg-info/SOURCES.txt +0 -0
  105. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  106. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot.egg-info/top_level.txt +0 -0
  107. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglot.png +0 -0
  108. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/benches/dialect_settings.json +0 -0
  109. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/benches/long.rs +0 -0
  110. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/benches/token_type_settings.json +0 -0
  111. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/benches/tokenizer_dialect_settings.json +0 -0
  112. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/benches/tokenizer_settings.json +0 -0
  113. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/pyproject.toml +0 -0
  114. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/src/lib.rs +0 -0
  115. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/src/settings.rs +0 -0
  116. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/src/token.rs +0 -0
  117. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/src/tokenizer.rs +0 -0
  118. {sqlglot-27.25.2 → sqlglot-27.27.0}/sqlglotrs/src/trie.rs +0 -0
  119. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/__init__.py +0 -0
  120. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/__init__.py +0 -0
  121. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_athena.py +0 -0
  122. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_clickhouse.py +0 -0
  123. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_databricks.py +0 -0
  124. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_dialect.py +0 -0
  125. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_doris.py +0 -0
  126. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_dremio.py +0 -0
  127. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_drill.py +0 -0
  128. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_druid.py +0 -0
  129. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_dune.py +0 -0
  130. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_exasol.py +0 -0
  131. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_fabric.py +0 -0
  132. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_hive.py +0 -0
  133. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_materialize.py +0 -0
  134. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_oracle.py +0 -0
  135. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_pipe_syntax.py +0 -0
  136. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_postgres.py +0 -0
  137. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_presto.py +0 -0
  138. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_prql.py +0 -0
  139. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_redshift.py +0 -0
  140. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_risingwave.py +0 -0
  141. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_singlestore.py +0 -0
  142. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_solr.py +0 -0
  143. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_spark.py +0 -0
  144. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_sqlite.py +0 -0
  145. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_starrocks.py +0 -0
  146. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_tableau.py +0 -0
  147. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_teradata.py +0 -0
  148. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_trino.py +0 -0
  149. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/dialects/test_tsql.py +0 -0
  150. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  151. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/jsonpath/cts.json +0 -0
  152. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  153. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  154. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  155. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  156. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  157. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  158. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
  159. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  160. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  161. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  162. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
  163. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  164. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  165. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  166. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
  167. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  168. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  169. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  170. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  171. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  172. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/simplify.sql +0 -0
  173. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  174. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  175. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  176. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  177. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  178. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  179. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  180. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  181. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  182. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  183. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  184. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  185. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  186. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  187. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  188. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  189. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  190. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  191. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  192. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  193. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  194. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  195. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  196. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  197. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  198. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  199. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  200. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  201. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  202. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  203. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  204. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  205. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  206. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  207. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  208. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/partial.sql +0 -0
  209. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/fixtures/pretty.sql +0 -0
  210. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/gen_fixtures.py +0 -0
  211. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/helpers.py +0 -0
  212. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_build.py +0 -0
  213. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_dialect_imports.py +0 -0
  214. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_diff.py +0 -0
  215. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_docs.py +0 -0
  216. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_executor.py +0 -0
  217. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_expressions.py +0 -0
  218. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_generator.py +0 -0
  219. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_helper.py +0 -0
  220. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_jsonpath.py +0 -0
  221. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_lineage.py +0 -0
  222. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_optimizer.py +0 -0
  223. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_schema.py +0 -0
  224. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_serde.py +0 -0
  225. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_time.py +0 -0
  226. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_tokens.py +0 -0
  227. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_transforms.py +0 -0
  228. {sqlglot-27.25.2 → sqlglot-27.27.0}/tests/test_transpile.py +0 -0
@@ -1,6 +1,56 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v27.26.0] - 2025-10-10
5
+ ### :boom: BREAKING CHANGES
6
+ - due to [`9060f60`](https://github.com/tobymao/sqlglot/commit/9060f603818db863b7570a2c3c50c3eb88155e76) - Annotate type for snowflake ATAN2 function. *(PR [#6060](https://github.com/tobymao/sqlglot/pull/6060) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
7
+
8
+ Annotate type for snowflake ATAN2 function. (#6060)
9
+
10
+ - due to [`b3eb2e4`](https://github.com/tobymao/sqlglot/commit/b3eb2e4ca6177ee61b27675e8ec8b4815587df31) - annotate type for Snowflake SINH function *(PR [#6052](https://github.com/tobymao/sqlglot/pull/6052) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*:
11
+
12
+ annotate type for Snowflake SINH function (#6052)
13
+
14
+ - due to [`157d2fa`](https://github.com/tobymao/sqlglot/commit/157d2fa06ab110ebc760aa7567d7fda801a5ced9) - annotate type for Snowflake CEIL function *(PR [#6051](https://github.com/tobymao/sqlglot/pull/6051) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*:
15
+
16
+ annotate type for Snowflake CEIL function (#6051)
17
+
18
+ - due to [`e7833de`](https://github.com/tobymao/sqlglot/commit/e7833de9744a4aa69d244285e7f6f7281af178ba) - support DELETE with USING and multiple VALUES *(PR [#6072](https://github.com/tobymao/sqlglot/pull/6072) by [@geooo109](https://github.com/geooo109))*:
19
+
20
+ support DELETE with USING and multiple VALUES (#6072)
21
+
22
+ - due to [`354140d`](https://github.com/tobymao/sqlglot/commit/354140d0a279f317439bdb247e1ab9578f9a035d) - Annotate type for snowflake TANH and ATAN functions *(PR [#6069](https://github.com/tobymao/sqlglot/pull/6069) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
23
+
24
+ Annotate type for snowflake TANH and ATAN functions (#6069)
25
+
26
+
27
+ ### :sparkles: New Features
28
+ - [`9060f60`](https://github.com/tobymao/sqlglot/commit/9060f603818db863b7570a2c3c50c3eb88155e76) - **optimizer**: Annotate type for snowflake ATAN2 function. *(PR [#6060](https://github.com/tobymao/sqlglot/pull/6060) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
29
+ - [`b3eb2e4`](https://github.com/tobymao/sqlglot/commit/b3eb2e4ca6177ee61b27675e8ec8b4815587df31) - **optimizer**: annotate type for Snowflake SINH function *(PR [#6052](https://github.com/tobymao/sqlglot/pull/6052) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
30
+ - [`440b960`](https://github.com/tobymao/sqlglot/commit/440b960529801674fa23708212485fda95749699) - **duckdb**: support `USING KEY (...)` in recursive DuckDB CTEs *(PR [#6068](https://github.com/tobymao/sqlglot/pull/6068) by [@georgesittas](https://github.com/georgesittas))*
31
+ - :arrow_lower_right: *addresses issue [#6066](https://github.com/tobymao/sqlglot/issues/6066) opened by [@denis-komarov](https://github.com/denis-komarov)*
32
+ - [`157d2fa`](https://github.com/tobymao/sqlglot/commit/157d2fa06ab110ebc760aa7567d7fda801a5ced9) - **optimizer**: annotate type for Snowflake CEIL function *(PR [#6051](https://github.com/tobymao/sqlglot/pull/6051) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
33
+ - [`eb6d6e7`](https://github.com/tobymao/sqlglot/commit/eb6d6e7ccde37456ab56ad976e7d95cea23c14e3) - **duckdb**: support `DEFAULT VALUES` clause in `INSERT` DML *(PR [#6067](https://github.com/tobymao/sqlglot/pull/6067) by [@georgesittas](https://github.com/georgesittas))*
34
+ - :arrow_lower_right: *addresses issue [#6065](https://github.com/tobymao/sqlglot/issues/6065) opened by [@denis-komarov](https://github.com/denis-komarov)*
35
+ - [`354140d`](https://github.com/tobymao/sqlglot/commit/354140d0a279f317439bdb247e1ab9578f9a035d) - **optimizer**: Annotate type for snowflake TANH and ATAN functions *(PR [#6069](https://github.com/tobymao/sqlglot/pull/6069) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
36
+ - [`c94e3e0`](https://github.com/tobymao/sqlglot/commit/c94e3e0e4e20bd76d4cf630123d2c05a0e3044c3) - add ColumnDef expression parser *(PR [#6075](https://github.com/tobymao/sqlglot/pull/6075) by [@geooo109](https://github.com/geooo109))*
37
+
38
+ ### :bug: Bug Fixes
39
+ - [`2c7cc29`](https://github.com/tobymao/sqlglot/commit/2c7cc29a329dcbaaa90a6f857d2383d2967ea6cc) - **duckdb**: Transform exp.HexString to BLOB in hex notation *(PR [#6045](https://github.com/tobymao/sqlglot/pull/6045) by [@VaggelisD](https://github.com/VaggelisD))*
40
+ - :arrow_lower_right: *fixes issue [#6035](https://github.com/tobymao/sqlglot/issues/6035) opened by [@kyle-cheung](https://github.com/kyle-cheung)*
41
+ - [`e7833de`](https://github.com/tobymao/sqlglot/commit/e7833de9744a4aa69d244285e7f6f7281af178ba) - **parser**: support DELETE with USING and multiple VALUES *(PR [#6072](https://github.com/tobymao/sqlglot/pull/6072) by [@geooo109](https://github.com/geooo109))*
42
+ - :arrow_lower_right: *fixes issue [#6070](https://github.com/tobymao/sqlglot/issues/6070) opened by [@denis-komarov](https://github.com/denis-komarov)*
43
+
44
+ ### :recycle: Refactors
45
+ - [`2c9d15c`](https://github.com/tobymao/sqlglot/commit/2c9d15c92da25c8456b2463c69aa56c8ec47c453) - replace direct arg manipulation *(PR [#6073](https://github.com/tobymao/sqlglot/pull/6073) by [@geooo109](https://github.com/geooo109))*
46
+
47
+ ### :wrench: Chores
48
+ - [`75b8d16`](https://github.com/tobymao/sqlglot/commit/75b8d16e41b677ea7e150c89d713795073aae6e3) - remove docs from main branch *(PR [#6057](https://github.com/tobymao/sqlglot/pull/6057) by [@georgesittas](https://github.com/georgesittas))*
49
+ - [`cfa2493`](https://github.com/tobymao/sqlglot/commit/cfa249328eef31ab0e0688dcc03521da3343ce47) - **optimizer**: Annotate type for snowflake SQUARE function *(PR [#6059](https://github.com/tobymao/sqlglot/pull/6059) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
50
+ - [`e26c394`](https://github.com/tobymao/sqlglot/commit/e26c3949beb7f73020fcd099237dbe31a4db8d84) - **optimizer**: Annotate type for snowflake POW function *(PR [#6058](https://github.com/tobymao/sqlglot/pull/6058) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
51
+ - [`7d303ad`](https://github.com/tobymao/sqlglot/commit/7d303adc5efe9d51eb62aeab80bfa4f844e1911d) - include Python 3.14 in the testing matrix *(PR [#6074](https://github.com/tobymao/sqlglot/pull/6074) by [@georgesittas](https://github.com/georgesittas))*
52
+
53
+
4
54
  ## [v27.25.0] - 2025-10-09
5
55
  ### :boom: BREAKING CHANGES
6
56
  - due to [`6f31b86`](https://github.com/tobymao/sqlglot/commit/6f31b86599258afe156aa3d9ccc42389cac37021) - Annotate type for snowflake FLOOR function *(PR [#6030](https://github.com/tobymao/sqlglot/pull/6030) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
@@ -7819,3 +7869,4 @@ Changelog
7819
7869
  [v27.22.1]: https://github.com/tobymao/sqlglot/compare/v27.22.0...v27.22.1
7820
7870
  [v27.22.2]: https://github.com/tobymao/sqlglot/compare/v27.22.1...v27.22.2
7821
7871
  [v27.25.0]: https://github.com/tobymao/sqlglot/compare/v27.24.2...v27.25.0
7872
+ [v27.26.0]: https://github.com/tobymao/sqlglot/compare/v27.25.2...v27.26.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.25.2
3
+ Version: 27.27.0
4
4
  Summary: An easily customizable SQL parser and transpiler
5
5
  Author-email: Toby Mao <toby.mao@gmail.com>
6
6
  License-Expression: MIT
@@ -33,7 +33,7 @@ Requires-Dist: typing_extensions; extra == "dev"
33
33
  Requires-Dist: maturin<2.0,>=1.4; extra == "dev"
34
34
  Requires-Dist: pyperf; extra == "dev"
35
35
  Provides-Extra: rs
36
- Requires-Dist: sqlglotrs==0.7.2; extra == "rs"
36
+ Requires-Dist: sqlglotrs==0.7.3; extra == "rs"
37
37
  Dynamic: license-file
38
38
  Dynamic: provides-extra
39
39
 
@@ -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.25.2'
32
- __version_tuple__ = version_tuple = (27, 25, 2)
31
+ __version__ = version = '27.27.0'
32
+ __version_tuple__ = version_tuple = (27, 27, 0)
33
33
 
34
- __commit_id__ = commit_id = 'gcd09ea78d'
34
+ __commit_id__ = commit_id = 'gdab2a3fbd'
@@ -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
- join.set("global", join.args.pop("method", None))
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,8 +721,10 @@ 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,
727
+ exp.Radians,
726
728
  exp.Round,
727
729
  exp.SafeDivide,
728
730
  exp.Sqrt,
@@ -1195,7 +1197,7 @@ def no_paren_current_date_sql(self: Generator, expression: exp.CurrentDate) -> s
1195
1197
  def no_recursive_cte_sql(self: Generator, expression: exp.With) -> str:
1196
1198
  if expression.args.get("recursive"):
1197
1199
  self.unsupported("Recursive CTEs are unsupported")
1198
- expression.args["recursive"] = False
1200
+ expression.set("recursive", False)
1199
1201
  return self.with_sql(expression)
1200
1202
 
1201
1203
 
@@ -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.args.pop("side", None)
1043
- expression.args.pop("kind", None)
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.args["is_string"] = True
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
  **{
@@ -412,6 +412,11 @@ class TSQL(Dialect):
412
412
 
413
413
  TIME_FORMAT = "'yyyy-mm-dd hh:mm:ss'"
414
414
 
415
+ ANNOTATORS = {
416
+ **Dialect.ANNOTATORS,
417
+ exp.Radians: lambda self, e: self._annotate_by_args(e, "this"),
418
+ }
419
+
415
420
  TIME_MAPPING = {
416
421
  "year": "%Y",
417
422
  "dayofyear": "%j",
@@ -1219,7 +1224,8 @@ class TSQL(Dialect):
1219
1224
 
1220
1225
  def create_sql(self, expression: exp.Create) -> str:
1221
1226
  kind = expression.kind
1222
- exists = expression.args.pop("exists", None)
1227
+ exists = expression.args.get("exists")
1228
+ expression.set("exists", None)
1223
1229
 
1224
1230
  like_property = expression.find(exp.LikeProperty)
1225
1231
  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.args["typed"] = typed
1012
- div.args["safe"] = safe
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
 
@@ -7351,6 +7361,10 @@ class Replace(Func):
7351
7361
  arg_types = {"this": True, "expression": True, "replacement": False}
7352
7362
 
7353
7363
 
7364
+ class Radians(Func):
7365
+ pass
7366
+
7367
+
7354
7368
  # https://learn.microsoft.com/en-us/sql/t-sql/functions/round-transact-sql?view=sql-server-ver16
7355
7369
  # tsql third argument function == trunctaion if not 0
7356
7370
  class Round(Func):
@@ -1332,7 +1332,10 @@ class Generator(metaclass=_Generator):
1332
1332
  elif materialized:
1333
1333
  materialized = "MATERIALIZED "
1334
1334
 
1335
- return f"{alias_sql} AS {materialized or ''}{self.wrap(expression)}"
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.sql(expression, "using")
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.args.pop("columns", None)
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.args.pop("using")
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.pop("joins", None)
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.args["expressions"] = []
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) and self._parse_table(joins=True),
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.pop("offset", None)
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.args["typed"] = self.dialect.TYPED_DIVISION
5270
- this.args["safe"] = self.dialect.SAFE_DIVISION
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.args.pop("with", None) # remove CTEs from RIGHT side
654
- expression.args.pop("order", None) # remove order by from LEFT side
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.25.2
3
+ Version: 27.27.0
4
4
  Summary: An easily customizable SQL parser and transpiler
5
5
  Author-email: Toby Mao <toby.mao@gmail.com>
6
6
  License-Expression: MIT
@@ -33,7 +33,7 @@ Requires-Dist: typing_extensions; extra == "dev"
33
33
  Requires-Dist: maturin<2.0,>=1.4; extra == "dev"
34
34
  Requires-Dist: pyperf; extra == "dev"
35
35
  Provides-Extra: rs
36
- Requires-Dist: sqlglotrs==0.7.2; extra == "rs"
36
+ Requires-Dist: sqlglotrs==0.7.3; extra == "rs"
37
37
  Dynamic: license-file
38
38
  Dynamic: provides-extra
39
39
 
@@ -16,4 +16,4 @@ maturin<2.0,>=1.4
16
16
  pyperf
17
17
 
18
18
  [rs]
19
- sqlglotrs==0.7.2
19
+ sqlglotrs==0.7.3
@@ -534,7 +534,7 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
534
534
 
535
535
  [[package]]
536
536
  name = "sqlglotrs"
537
- version = "0.7.2"
537
+ version = "0.7.3"
538
538
  dependencies = [
539
539
  "criterion",
540
540
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "sqlglotrs"
3
- version = "0.7.2"
3
+ version = "0.7.3"
4
4
  edition = "2021"
5
5
  license = "MIT"
6
6
 
@@ -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,16 +61,25 @@ 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)")
82
+ self.validate_identity("SELECT RADIANS(180)")
73
83
  self.validate_identity("PARSE_URL('https://example.com/path')")
74
84
  self.validate_identity("PARSE_URL('https://example.com/path', 1)")
75
85
  self.validate_identity("SELECT {*} FROM my_table")
@@ -354,6 +364,12 @@ class TestSnowflake(Validator):
354
364
  "SELECT {fn CEILING(5.3)}",
355
365
  "SELECT CEIL(5.3)",
356
366
  )
367
+ self.validate_identity(
368
+ "SELECT CEIL(3.14)",
369
+ )
370
+ self.validate_identity(
371
+ "SELECT CEIL(3.14, 1)",
372
+ )
357
373
  self.validate_identity(
358
374
  "CAST(x AS BYTEINT)",
359
375
  "CAST(x AS INT)",
@@ -1484,6 +1500,14 @@ class TestSnowflake(Validator):
1484
1500
  )
1485
1501
  self.validate_identity("SELECT ARRAY_CONTAINS(1, [1])")
1486
1502
 
1503
+ self.validate_all(
1504
+ "SELECT x'ABCD'",
1505
+ write={
1506
+ "snowflake": "SELECT x'ABCD'",
1507
+ "duckdb": "SELECT CAST(HEX(FROM_HEX('ABCD')) AS VARBINARY)",
1508
+ },
1509
+ )
1510
+
1487
1511
  def test_null_treatment(self):
1488
1512
  self.validate_all(
1489
1513
  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",
@@ -922,6 +922,7 @@ SELECT COT(x)
922
922
  SELECT COTH(x)
923
923
  SELECT CSC(x)
924
924
  SELECT CSCH(x)
925
+ SELECT RADIANS(x)
925
926
  SELECT SEC(x)
926
927
  SELECT SECH(x)
927
928
  SELECT UTC_DATE
@@ -929,6 +930,7 @@ SELECT UTC_TIME
929
930
  SELECT UTC_TIMESTAMP
930
931
  SELECT SIN(x)
931
932
  SELECT SINH(x)
933
+ SELECT TANH(x)
932
934
  SELECT COSINE_DISTANCE(v1, v2)
933
935
  SELECT EUCLIDEAN_DISTANCE(v1, v2)
934
936
  FOO(values.c)