sqlglot 27.13.2__tar.gz → 27.15.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.
Files changed (227) hide show
  1. {sqlglot-27.13.2 → sqlglot-27.15.0}/CHANGELOG.md +91 -0
  2. {sqlglot-27.13.2 → sqlglot-27.15.0}/PKG-INFO +1 -1
  3. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/_version.py +3 -3
  4. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/bigquery.py +23 -18
  5. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/clickhouse.py +1 -0
  6. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/dialect.py +1 -1
  7. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/duckdb.py +15 -4
  8. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/fabric.py +1 -1
  9. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/hive.py +1 -0
  10. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/mysql.py +41 -9
  11. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/postgres.py +19 -0
  12. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/redshift.py +1 -0
  13. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/singlestore.py +129 -1
  14. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/snowflake.py +88 -3
  15. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/sqlite.py +1 -0
  16. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/tsql.py +10 -0
  17. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/expressions.py +68 -4
  18. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/generator.py +27 -13
  19. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/annotate_types.py +35 -5
  20. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/qualify_columns.py +6 -2
  21. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/parser.py +51 -15
  22. sqlglot-27.15.0/sqlglot/serde.py +126 -0
  23. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/tokens.py +4 -0
  24. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot.egg-info/PKG-INFO +1 -1
  25. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_bigquery.py +79 -40
  26. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_clickhouse.py +24 -0
  27. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_dialect.py +32 -2
  28. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_duckdb.py +23 -4
  29. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_fabric.py +1 -1
  30. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_hive.py +22 -0
  31. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_mysql.py +13 -0
  32. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_pipe_syntax.py +8 -0
  33. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_postgres.py +22 -0
  34. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_redshift.py +9 -0
  35. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_singlestore.py +93 -0
  36. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_snowflake.py +73 -24
  37. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_tsql.py +13 -0
  38. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/identity.sql +2 -0
  39. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/annotate_functions.sql +420 -12
  40. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/annotate_types.sql +8 -0
  41. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/qualify_columns.sql +10 -0
  42. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_optimizer.py +14 -1
  43. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_serde.py +11 -2
  44. sqlglot-27.13.2/sqlglot/serde.py +0 -68
  45. {sqlglot-27.13.2 → sqlglot-27.15.0}/.gitignore +0 -0
  46. {sqlglot-27.13.2 → sqlglot-27.15.0}/.gitpod.yml +0 -0
  47. {sqlglot-27.13.2 → sqlglot-27.15.0}/.pre-commit-config.yaml +0 -0
  48. {sqlglot-27.13.2 → sqlglot-27.15.0}/CONTRIBUTING.md +0 -0
  49. {sqlglot-27.13.2 → sqlglot-27.15.0}/LICENSE +0 -0
  50. {sqlglot-27.13.2 → sqlglot-27.15.0}/MANIFEST.in +0 -0
  51. {sqlglot-27.13.2 → sqlglot-27.15.0}/Makefile +0 -0
  52. {sqlglot-27.13.2 → sqlglot-27.15.0}/README.md +0 -0
  53. {sqlglot-27.13.2 → sqlglot-27.15.0}/pyproject.toml +0 -0
  54. {sqlglot-27.13.2 → sqlglot-27.15.0}/setup.cfg +0 -0
  55. {sqlglot-27.13.2 → sqlglot-27.15.0}/setup.py +0 -0
  56. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/__init__.py +0 -0
  57. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/__main__.py +0 -0
  58. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/_typing.py +0 -0
  59. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/__init__.py +0 -0
  60. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/athena.py +0 -0
  61. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/databricks.py +0 -0
  62. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/doris.py +0 -0
  63. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/dremio.py +0 -0
  64. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/drill.py +0 -0
  65. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/druid.py +0 -0
  66. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/dune.py +0 -0
  67. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/exasol.py +0 -0
  68. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/materialize.py +0 -0
  69. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/oracle.py +0 -0
  70. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/presto.py +0 -0
  71. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/prql.py +0 -0
  72. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/risingwave.py +0 -0
  73. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/spark.py +0 -0
  74. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/spark2.py +0 -0
  75. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/starrocks.py +0 -0
  76. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/tableau.py +0 -0
  77. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/teradata.py +0 -0
  78. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/dialects/trino.py +0 -0
  79. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/diff.py +0 -0
  80. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/errors.py +0 -0
  81. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/executor/__init__.py +0 -0
  82. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/executor/context.py +0 -0
  83. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/executor/env.py +0 -0
  84. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/executor/python.py +0 -0
  85. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/executor/table.py +0 -0
  86. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/helper.py +0 -0
  87. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/jsonpath.py +0 -0
  88. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/lineage.py +0 -0
  89. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/__init__.py +0 -0
  90. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/canonicalize.py +0 -0
  91. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  92. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  93. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  94. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  95. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
  96. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/normalize.py +0 -0
  97. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  98. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  99. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/optimizer.py +0 -0
  100. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
  101. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  102. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/qualify.py +0 -0
  103. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/qualify_tables.py +0 -0
  104. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/scope.py +0 -0
  105. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/simplify.py +0 -0
  106. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
  107. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/planner.py +0 -0
  108. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/py.typed +0 -0
  109. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/schema.py +0 -0
  110. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/time.py +0 -0
  111. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/transforms.py +0 -0
  112. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot/trie.py +0 -0
  113. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot.egg-info/SOURCES.txt +0 -0
  114. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  115. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot.egg-info/requires.txt +0 -0
  116. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot.egg-info/top_level.txt +0 -0
  117. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglot.png +0 -0
  118. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/Cargo.lock +0 -0
  119. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/Cargo.toml +0 -0
  120. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/benches/dialect_settings.json +0 -0
  121. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/benches/long.rs +0 -0
  122. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/benches/token_type_settings.json +0 -0
  123. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/benches/tokenizer_dialect_settings.json +0 -0
  124. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/benches/tokenizer_settings.json +0 -0
  125. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/pyproject.toml +0 -0
  126. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/src/lib.rs +0 -0
  127. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/src/settings.rs +0 -0
  128. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/src/token.rs +0 -0
  129. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/src/tokenizer.rs +0 -0
  130. {sqlglot-27.13.2 → sqlglot-27.15.0}/sqlglotrs/src/trie.rs +0 -0
  131. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/__init__.py +0 -0
  132. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/__init__.py +0 -0
  133. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_athena.py +0 -0
  134. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_databricks.py +0 -0
  135. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_doris.py +0 -0
  136. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_dremio.py +0 -0
  137. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_drill.py +0 -0
  138. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_druid.py +0 -0
  139. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_dune.py +0 -0
  140. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_exasol.py +0 -0
  141. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_materialize.py +0 -0
  142. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_oracle.py +0 -0
  143. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_presto.py +0 -0
  144. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_prql.py +0 -0
  145. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_risingwave.py +0 -0
  146. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_spark.py +0 -0
  147. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_sqlite.py +0 -0
  148. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_starrocks.py +0 -0
  149. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_tableau.py +0 -0
  150. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_teradata.py +0 -0
  151. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/dialects/test_trino.py +0 -0
  152. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  153. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/jsonpath/cts.json +0 -0
  154. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  155. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  156. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  157. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  158. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  159. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
  160. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  161. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  162. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  163. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
  164. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  165. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  166. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  167. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  168. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  169. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  170. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  171. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  172. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/simplify.sql +0 -0
  173. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  174. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  175. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  176. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  177. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  178. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  179. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  180. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  181. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  182. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  183. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  184. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  185. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  186. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  187. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  188. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  189. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  190. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  191. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  192. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  193. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  194. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  195. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  196. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  197. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  198. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  199. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  200. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  201. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  202. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  203. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  204. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  205. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  206. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  207. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  208. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/partial.sql +0 -0
  209. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/fixtures/pretty.sql +0 -0
  210. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/gen_fixtures.py +0 -0
  211. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/helpers.py +0 -0
  212. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_build.py +0 -0
  213. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_dialect_imports.py +0 -0
  214. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_diff.py +0 -0
  215. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_docs.py +0 -0
  216. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_executor.py +0 -0
  217. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_expressions.py +0 -0
  218. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_generator.py +0 -0
  219. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_helper.py +0 -0
  220. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_jsonpath.py +0 -0
  221. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_lineage.py +0 -0
  222. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_parser.py +0 -0
  223. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_schema.py +0 -0
  224. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_time.py +0 -0
  225. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_tokens.py +0 -0
  226. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_transforms.py +0 -0
  227. {sqlglot-27.13.2 → sqlglot-27.15.0}/tests/test_transpile.py +0 -0
@@ -1,6 +1,95 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v27.14.0] - 2025-09-11
5
+ ### :boom: BREAKING CHANGES
6
+ - due to [`9c8a600`](https://github.com/tobymao/sqlglot/commit/9c8a6001f41816035f391d046eb9692d6f13cefc) - correct parsing of TO_VARCHAR *(PR [#5840](https://github.com/tobymao/sqlglot/pull/5840) by [@geooo109](https://github.com/geooo109))*:
7
+
8
+ correct parsing of TO_VARCHAR (#5840)
9
+
10
+ - due to [`1e9aef1`](https://github.com/tobymao/sqlglot/commit/1e9aef1bb20f4dc5e9c03d59cb3165c235c11ce1) - convert NULL annotations to UNKNOWN *(PR [#5842](https://github.com/tobymao/sqlglot/pull/5842) by [@georgesittas](https://github.com/georgesittas))*:
11
+
12
+ convert NULL annotations to UNKNOWN (#5842)
13
+
14
+ - due to [`44c9e70`](https://github.com/tobymao/sqlglot/commit/44c9e70bd8c9421035eb0e87e4286061ec5d2fa8) - add tests for snowflake STARTSWITH function *(PR [#5847](https://github.com/tobymao/sqlglot/pull/5847) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
15
+
16
+ add tests for snowflake STARTSWITH function (#5847)
17
+
18
+ - due to [`0779c2d`](https://github.com/tobymao/sqlglot/commit/0779c2d4e8ce0228592de6882763940783fa5e87) - support BIT_X aggregates again for duckdb, postgres *(PR [#5851](https://github.com/tobymao/sqlglot/pull/5851) by [@georgesittas](https://github.com/georgesittas))*:
19
+
20
+ support BIT_X aggregates again for duckdb, postgres (#5851)
21
+
22
+ - due to [`c50d6e3`](https://github.com/tobymao/sqlglot/commit/c50d6e3c7b96f00d27c34a02c8e0dced21e6c373) - annotate type for snowflake LEFT, RIGHT and SUBSTRING functions *(PR [#5849](https://github.com/tobymao/sqlglot/pull/5849) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
23
+
24
+ annotate type for snowflake LEFT, RIGHT and SUBSTRING functions (#5849)
25
+
26
+ - due to [`e441e16`](https://github.com/tobymao/sqlglot/commit/e441e16991626c2da2d38bc9c3a2b408e3f773bd) - make dump/pickling non-recursive to avoid hitting stack limits *(PR [#5850](https://github.com/tobymao/sqlglot/pull/5850) by [@tobymao](https://github.com/tobymao))*:
27
+
28
+ make dump/pickling non-recursive to avoid hitting stack limits (#5850)
29
+
30
+ - due to [`b128339`](https://github.com/tobymao/sqlglot/commit/b12833977e2a395712481cf11e293fdbd70fd4ce) - annotate and add tests for snowflake LENGTH and LOWER functions *(PR [#5856](https://github.com/tobymao/sqlglot/pull/5856) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
31
+
32
+ annotate and add tests for snowflake LENGTH and LOWER functions (#5856)
33
+
34
+ - due to [`134957a`](https://github.com/tobymao/sqlglot/commit/134957af11c55a4ab16f58d0725d6bb8ab23eb28) - annotate types for Snowflake TRIM function *(PR [#5811](https://github.com/tobymao/sqlglot/pull/5811) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*:
35
+
36
+ annotate types for Snowflake TRIM function (#5811)
37
+
38
+ - due to [`d3cd6bf`](https://github.com/tobymao/sqlglot/commit/d3cd6bf6e5fbaa490868ee3cd2cc99dd5e40a396) - Annotate and add tests for snowflake REPLACE and SPACE functions *(PR [#5871](https://github.com/tobymao/sqlglot/pull/5871) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
39
+
40
+ Annotate and add tests for snowflake REPLACE and SPACE functions (#5871)
41
+
42
+
43
+ ### :sparkles: New Features
44
+ - [`a398fb4`](https://github.com/tobymao/sqlglot/commit/a398fb4df28c868f4cfc34530044b9d7b78e2e90) - **singlestore**: Splitted truncation of multiple tables into several queries *(PR [#5839](https://github.com/tobymao/sqlglot/pull/5839) by [@AdalbertMemSQL](https://github.com/AdalbertMemSQL))*
45
+ - [`cd27c96`](https://github.com/tobymao/sqlglot/commit/cd27c96fe85aba5f54116f38649edd8db064a5e6) - **snowflake**: transpile `TO_HEX` from bigquery *(PR [#5838](https://github.com/tobymao/sqlglot/pull/5838) by [@YuvalOmerRep](https://github.com/YuvalOmerRep))*
46
+ - [`d2e4ab7`](https://github.com/tobymao/sqlglot/commit/d2e4ab7df41ae3601e9b66e1338db3d851729339) - **snowflake**: add tests for endswith function *(PR [#5846](https://github.com/tobymao/sqlglot/pull/5846) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
47
+ - [`c50d6e3`](https://github.com/tobymao/sqlglot/commit/c50d6e3c7b96f00d27c34a02c8e0dced21e6c373) - **optimizer**: annotate type for snowflake LEFT, RIGHT and SUBSTRING functions *(PR [#5849](https://github.com/tobymao/sqlglot/pull/5849) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
48
+ - [`ca6c8f7`](https://github.com/tobymao/sqlglot/commit/ca6c8f753ba8458544439e20671f0981c98d168d) - **singlestore**: Improved parsting/generation of exp.Show *(PR [#5853](https://github.com/tobymao/sqlglot/pull/5853) by [@AdalbertMemSQL](https://github.com/AdalbertMemSQL))*
49
+ - [`722eceb`](https://github.com/tobymao/sqlglot/commit/722ecebfa43aa5948031edd1828b6482a241d9ef) - **snowflake**: MD5Digest transpiling to MD5_BINARY *(PR [#5855](https://github.com/tobymao/sqlglot/pull/5855) by [@YuvalOmerRep](https://github.com/YuvalOmerRep))*
50
+ - [`b128339`](https://github.com/tobymao/sqlglot/commit/b12833977e2a395712481cf11e293fdbd70fd4ce) - **optimizer**: annotate and add tests for snowflake LENGTH and LOWER functions *(PR [#5856](https://github.com/tobymao/sqlglot/pull/5856) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
51
+ - [`134957a`](https://github.com/tobymao/sqlglot/commit/134957af11c55a4ab16f58d0725d6bb8ab23eb28) - **optimizer**: annotate types for Snowflake TRIM function *(PR [#5811](https://github.com/tobymao/sqlglot/pull/5811) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
52
+ - [`0475dae`](https://github.com/tobymao/sqlglot/commit/0475dae21231b85407bf778fd9f1abaecdeb68de) - **singlestore**: Marked several exp.Describe args as unsupported *(PR [#5861](https://github.com/tobymao/sqlglot/pull/5861) by [@AdalbertMemSQL](https://github.com/AdalbertMemSQL))*
53
+ - [`7a07b41`](https://github.com/tobymao/sqlglot/commit/7a07b41b2357149adc6afb50bb98e37e6a3175f1) - **optimizer**: Add tests for snowflake LTRIM and RTRIM functions *(PR [#5857](https://github.com/tobymao/sqlglot/pull/5857) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
54
+ - [`fb90666`](https://github.com/tobymao/sqlglot/commit/fb90666ff3e710d70815a68defde3dc85aeef7b3) - **singlestore**: Added collate handling to exp.AlterColumn *(PR [#5864](https://github.com/tobymao/sqlglot/pull/5864) by [@AdalbertMemSQL](https://github.com/AdalbertMemSQL))*
55
+ - [`2f27692`](https://github.com/tobymao/sqlglot/commit/2f276929d6b6f788eb5b3ee0b1a8a8c108833474) - **snowflake**: JSONFormat transpiling to TO_JSON *(PR [#5860](https://github.com/tobymao/sqlglot/pull/5860) by [@YuvalOmerRep](https://github.com/YuvalOmerRep))*
56
+ - [`487c811`](https://github.com/tobymao/sqlglot/commit/487c8119cbfaf2783f5f17ec90c8e69e4432a4fa) - **singlestore**: Fixed parsing/generation of exp.RenameColumn *(PR [#5865](https://github.com/tobymao/sqlglot/pull/5865) by [@AdalbertMemSQL](https://github.com/AdalbertMemSQL))*
57
+ - [`76cf4d8`](https://github.com/tobymao/sqlglot/commit/76cf4d892a6d011a2e0020fb1ea82518d4f49e71) - **bigquery**: add support for ML.TRANSLATE func *(PR [#5859](https://github.com/tobymao/sqlglot/pull/5859) by [@geooo109](https://github.com/geooo109))*
58
+ - [`a899eb1`](https://github.com/tobymao/sqlglot/commit/a899eb188d5e354d3ed56d1e7c32861eecf3e906) - **singlestore**: Fixed parsing and generation of VECTOR type *(PR [#5854](https://github.com/tobymao/sqlglot/pull/5854) by [@AdalbertMemSQL](https://github.com/AdalbertMemSQL))*
59
+ - [`0acf076`](https://github.com/tobymao/sqlglot/commit/0acf0769773061fca3ec03125a5d43a4aa9c8e4b) - **postgres**: Support `?|` JSONB operator *(PR [#5866](https://github.com/tobymao/sqlglot/pull/5866) by [@VaggelisD](https://github.com/VaggelisD))*
60
+ - [`bd4b278`](https://github.com/tobymao/sqlglot/commit/bd4b2780c32ee52d25b6539d7b4479b6a7f80d18) - **optimizer**: annotate types for Snowflake UPPER function *(PR [#5812](https://github.com/tobymao/sqlglot/pull/5812) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
61
+ - [`edab189`](https://github.com/tobymao/sqlglot/commit/edab1890e2c790b737be4995a31667448eff148e) - **postgres**: Support ?& JSONB operator *(PR [#5867](https://github.com/tobymao/sqlglot/pull/5867) by [@VaggelisD](https://github.com/VaggelisD))*
62
+ - [`960ec06`](https://github.com/tobymao/sqlglot/commit/960ec069eb275b7b8cc6705dbbb1143159f06237) - **postgres**: Support #- JSONB operator *(PR [#5868](https://github.com/tobymao/sqlglot/pull/5868) by [@VaggelisD](https://github.com/VaggelisD))*
63
+ - [`d3cd6bf`](https://github.com/tobymao/sqlglot/commit/d3cd6bf6e5fbaa490868ee3cd2cc99dd5e40a396) - **optimizer**: Annotate and add tests for snowflake REPLACE and SPACE functions *(PR [#5871](https://github.com/tobymao/sqlglot/pull/5871) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
64
+ - [`ba22531`](https://github.com/tobymao/sqlglot/commit/ba2253113ea5a7c76c8df7ec9b6faf37da698fa4) - **bigquery**: Add support for ML.FORECAST(...) *(PR [#5873](https://github.com/tobymao/sqlglot/pull/5873) by [@VaggelisD](https://github.com/VaggelisD))*
65
+
66
+ ### :bug: Bug Fixes
67
+ - [`9c8a600`](https://github.com/tobymao/sqlglot/commit/9c8a6001f41816035f391d046eb9692d6f13cefc) - **snowflake**: correct parsing of TO_VARCHAR *(PR [#5840](https://github.com/tobymao/sqlglot/pull/5840) by [@geooo109](https://github.com/geooo109))*
68
+ - :arrow_lower_right: *fixes issue [#5837](https://github.com/tobymao/sqlglot/issues/5837) opened by [@ultrabear](https://github.com/ultrabear)*
69
+ - [`f3d07fd`](https://github.com/tobymao/sqlglot/commit/f3d07fd8a106b034f64bb100291671c0fe39a106) - **snowflake**: Enable parsing of COPY INTO without files list *(PR [#5841](https://github.com/tobymao/sqlglot/pull/5841) by [@whummer](https://github.com/whummer))*
70
+ - [`0ffb1fa`](https://github.com/tobymao/sqlglot/commit/0ffb1faac3b32aad845306eed0e000ff0d055554) - **duckdb**: transpile joins without ON/USING to CROSS JOIN *(PR [#5804](https://github.com/tobymao/sqlglot/pull/5804) by [@geooo109](https://github.com/geooo109))*
71
+ - :arrow_lower_right: *fixes issue [#5795](https://github.com/tobymao/sqlglot/issues/5795) opened by [@kyle-cheung](https://github.com/kyle-cheung)*
72
+ - [`1e9aef1`](https://github.com/tobymao/sqlglot/commit/1e9aef1bb20f4dc5e9c03d59cb3165c235c11ce1) - **optimizer**: convert NULL annotations to UNKNOWN *(PR [#5842](https://github.com/tobymao/sqlglot/pull/5842) by [@georgesittas](https://github.com/georgesittas))*
73
+ - [`bbcf0d4`](https://github.com/tobymao/sqlglot/commit/bbcf0d4404ea014f08319c44313719b4377adcdb) - **duckdb**: support trailing commas before `FOR` in pivot, fixes [#5843](https://github.com/tobymao/sqlglot/pull/5843) *(commit by [@georgesittas](https://github.com/georgesittas))*
74
+ - [`ad8a408`](https://github.com/tobymao/sqlglot/commit/ad8a408a4e3e26e32472fc55c67b44687992ae47) - **parser**: more robust nested pipe syntax *(PR [#5845](https://github.com/tobymao/sqlglot/pull/5845) by [@geooo109](https://github.com/geooo109))*
75
+ - [`44c9e70`](https://github.com/tobymao/sqlglot/commit/44c9e70bd8c9421035eb0e87e4286061ec5d2fa8) - **optimizer**: add tests for snowflake STARTSWITH function *(PR [#5847](https://github.com/tobymao/sqlglot/pull/5847) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
76
+ - [`0779c2d`](https://github.com/tobymao/sqlglot/commit/0779c2d4e8ce0228592de6882763940783fa5e87) - support BIT_X aggregates again for duckdb, postgres *(PR [#5851](https://github.com/tobymao/sqlglot/pull/5851) by [@georgesittas](https://github.com/georgesittas))*
77
+ - [`d131aab`](https://github.com/tobymao/sqlglot/commit/d131aab6815bf77d444a763d9bb4028d8f0e742d) - **redshift**: convert FETCH clauses to LIMIT for Redshift dialect *(PR [#5848](https://github.com/tobymao/sqlglot/pull/5848) by [@tomasmontielp](https://github.com/tomasmontielp))*
78
+ - [`b22c4ec`](https://github.com/tobymao/sqlglot/commit/b22c4ecf4c032d89ca737f01d614102aa9c2b1ed) - **fabric**: UUID to UNIQUEIDENTIFIER *(PR [#5863](https://github.com/tobymao/sqlglot/pull/5863) by [@fresioAS](https://github.com/fresioAS))*
79
+ - [`03d4f49`](https://github.com/tobymao/sqlglot/commit/03d4f49d92cd034d37074359b8c2cf96c5c3f5cf) - **clickhouse**: arrays are 1-indexed *(PR [#5862](https://github.com/tobymao/sqlglot/pull/5862) by [@joeyutong](https://github.com/joeyutong))*
80
+
81
+ ### :recycle: Refactors
82
+ - [`e441e16`](https://github.com/tobymao/sqlglot/commit/e441e16991626c2da2d38bc9c3a2b408e3f773bd) - make dump/pickling non-recursive to avoid hitting stack limits *(PR [#5850](https://github.com/tobymao/sqlglot/pull/5850) by [@tobymao](https://github.com/tobymao))*
83
+
84
+ ### :wrench: Chores
85
+ - [`b244f30`](https://github.com/tobymao/sqlglot/commit/b244f30524846bd08d03a73410ae9b4674254ecd) - move `exp.Contains` to `BOOLEAN` entry in `TYPE_TO_EXPRESSIONS` *(commit by [@georgesittas](https://github.com/georgesittas))*
86
+
87
+
88
+ ## [v27.13.2] - 2025-09-08
89
+ ### :bug: Bug Fixes
90
+ - [`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))*
91
+
92
+
4
93
  ## [v27.13.1] - 2025-09-08
5
94
  ### :bug: Bug Fixes
6
95
  - [`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 +7261,5 @@ Changelog
7172
7261
  [v27.12.0]: https://github.com/tobymao/sqlglot/compare/v27.11.0...v27.12.0
7173
7262
  [v27.13.0]: https://github.com/tobymao/sqlglot/compare/v27.12.0...v27.13.0
7174
7263
  [v27.13.1]: https://github.com/tobymao/sqlglot/compare/v27.13.0...v27.13.1
7264
+ [v27.13.2]: https://github.com/tobymao/sqlglot/compare/v27.13.1...v27.13.2
7265
+ [v27.14.0]: https://github.com/tobymao/sqlglot/compare/v27.13.2...v27.14.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.13.2
3
+ Version: 27.15.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
@@ -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.13.2'
32
- __version_tuple__ = version_tuple = (27, 13, 2)
31
+ __version__ = version = '27.15.0'
32
+ __version_tuple__ = version_tuple = (27, 15, 0)
33
33
 
34
- __commit_id__ = commit_id = 'g5e7979f3c'
34
+ __commit_id__ = commit_id = 'g74886d82f'
@@ -859,10 +859,15 @@ 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._parse_predict(),
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._parse_generate_embedding(),
865
+ "GENERATE_EMBEDDING": lambda self: self._parse_ml(exp.GenerateEmbedding),
866
+ "GENERATE_TEXT_EMBEDDING": lambda self: self._parse_ml(
867
+ exp.GenerateEmbedding, is_text=True
868
+ ),
865
869
  "VECTOR_SEARCH": lambda self: self._parse_vector_search(),
870
+ "FORECAST": lambda self: self._parse_ml(exp.MLForecast),
866
871
  }
867
872
  FUNCTION_PARSERS.pop("TRIM")
868
873
 
@@ -892,8 +897,6 @@ class BigQuery(Dialect):
892
897
  RANGE_PARSERS = parser.Parser.RANGE_PARSERS.copy()
893
898
  RANGE_PARSERS.pop(TokenType.OVERLAPS)
894
899
 
895
- NULL_TOKENS = {TokenType.NULL, TokenType.UNKNOWN}
896
-
897
900
  DASHED_TABLE_PART_FOLLOW_TOKENS = {TokenType.DOT, TokenType.L_PAREN, TokenType.R_PAREN}
898
901
 
899
902
  STATEMENT_PARSERS = {
@@ -1146,34 +1149,36 @@ class BigQuery(Dialect):
1146
1149
 
1147
1150
  return expr
1148
1151
 
1149
- def _parse_predict(self) -> exp.Predict:
1152
+ def _parse_ml(self, expr_type: t.Type[E], **kwargs) -> E:
1150
1153
  self._match_text_seq("MODEL")
1151
1154
  this = self._parse_table()
1152
1155
 
1153
1156
  self._match(TokenType.COMMA)
1154
1157
  self._match_text_seq("TABLE")
1155
1158
 
1156
- return self.expression(
1157
- exp.Predict,
1158
- this=this,
1159
- expression=self._parse_table(),
1160
- params_struct=self._match(TokenType.COMMA) and self._parse_bitwise(),
1159
+ # Certain functions like ML.FORECAST require a STRUCT argument but not a TABLE/SELECT one
1160
+ expression = (
1161
+ self._parse_table() if not self._match(TokenType.STRUCT, advance=False) else None
1161
1162
  )
1162
1163
 
1163
- def _parse_generate_embedding(self) -> exp.GenerateEmbedding:
1164
- self._match_text_seq("MODEL")
1165
- this = self._parse_table()
1166
-
1167
1164
  self._match(TokenType.COMMA)
1168
- self._match_text_seq("TABLE")
1169
1165
 
1170
1166
  return self.expression(
1171
- exp.GenerateEmbedding,
1167
+ expr_type,
1172
1168
  this=this,
1173
- expression=self._parse_table(),
1174
- params_struct=self._match(TokenType.COMMA) and self._parse_bitwise(),
1169
+ expression=expression,
1170
+ params_struct=self._parse_bitwise(),
1171
+ **kwargs,
1175
1172
  )
1176
1173
 
1174
+ def _parse_translate(self) -> exp.Translate | exp.MLTranslate:
1175
+ # Check if this is ML.TRANSLATE by looking at previous tokens
1176
+ token = seq_get(self._tokens, self._index - 4)
1177
+ if token and token.text.upper() == "ML":
1178
+ return self._parse_ml(exp.MLTranslate)
1179
+
1180
+ return exp.Translate.from_arg_list(self._parse_function_args())
1181
+
1177
1182
  def _parse_features_at_time(self) -> exp.FeaturesAtTime:
1178
1183
  self._match(TokenType.TABLE)
1179
1184
  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.side == "LEFT"
1004
+ not expression.args.get("using")
999
1005
  and not expression.args.get("on")
1000
- and isinstance(expression.this, exp.Unnest)
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
- return super().join_sql(expression.on(exp.true()))
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: "VARBINARY(MAX)",
128
+ exp.DataType.Type.UUID: "UNIQUEIDENTIFIER",
129
129
  exp.DataType.Type.XML: "VARCHAR",
130
130
  }
131
131
 
@@ -309,6 +309,7 @@ class Hive(Dialect):
309
309
  STRICT_CAST = False
310
310
  VALUES_FOLLOWED_BY_PAREN = False
311
311
  JOINS_HAVE_EQUAL_PRECEDENCE = True
312
+ ADD_JOIN_ON_TRUE = True
312
313
 
313
314
  FUNCTIONS = {
314
315
  **parser.Parser.FUNCTIONS,
@@ -191,10 +191,8 @@ class MySQL(Dialect):
191
191
 
192
192
  KEYWORDS = {
193
193
  **tokens.Tokenizer.KEYWORDS,
194
- "CHARSET": TokenType.CHARACTER_SET,
195
- # The DESCRIBE and EXPLAIN statements are synonyms.
196
- # https://dev.mysql.com/doc/refman/8.4/en/explain.html
197
194
  "BLOB": TokenType.BLOB,
195
+ "CHARSET": TokenType.CHARACTER_SET,
198
196
  "DISTINCTROW": TokenType.DISTINCT,
199
197
  "EXPLAIN": TokenType.DESCRIBE,
200
198
  "FORCE": TokenType.FORCE,
@@ -204,17 +202,19 @@ class MySQL(Dialect):
204
202
  "LONGBLOB": TokenType.LONGBLOB,
205
203
  "LONGTEXT": TokenType.LONGTEXT,
206
204
  "MEDIUMBLOB": TokenType.MEDIUMBLOB,
207
- "TINYBLOB": TokenType.TINYBLOB,
208
- "TINYTEXT": TokenType.TINYTEXT,
209
- "MEDIUMTEXT": TokenType.MEDIUMTEXT,
210
205
  "MEDIUMINT": TokenType.MEDIUMINT,
206
+ "MEDIUMTEXT": TokenType.MEDIUMTEXT,
211
207
  "MEMBER OF": TokenType.MEMBER_OF,
208
+ "MOD": TokenType.MOD,
212
209
  "SEPARATOR": TokenType.SEPARATOR,
213
210
  "SERIAL": TokenType.SERIAL,
214
- "START": TokenType.BEGIN,
215
211
  "SIGNED": TokenType.BIGINT,
216
212
  "SIGNED INTEGER": TokenType.BIGINT,
213
+ "SOUNDS LIKE": TokenType.SOUNDS_LIKE,
214
+ "START": TokenType.BEGIN,
217
215
  "TIMESTAMP": TokenType.TIMESTAMPTZ,
216
+ "TINYBLOB": TokenType.TINYBLOB,
217
+ "TINYTEXT": TokenType.TINYTEXT,
218
218
  "UNLOCK TABLES": TokenType.COMMAND,
219
219
  "UNSIGNED": TokenType.UBIGINT,
220
220
  "UNSIGNED INTEGER": TokenType.UBIGINT,
@@ -271,6 +271,7 @@ class MySQL(Dialect):
271
271
  FUNC_TOKENS = {
272
272
  *parser.Parser.FUNC_TOKENS,
273
273
  TokenType.DATABASE,
274
+ TokenType.MOD,
274
275
  TokenType.SCHEMA,
275
276
  TokenType.VALUES,
276
277
  }
@@ -292,6 +293,11 @@ class MySQL(Dialect):
292
293
 
293
294
  RANGE_PARSERS = {
294
295
  **parser.Parser.RANGE_PARSERS,
296
+ TokenType.SOUNDS_LIKE: lambda self, this: self.expression(
297
+ exp.EQ,
298
+ this=self.expression(exp.Soundex, this=this),
299
+ expression=self.expression(exp.Soundex, this=self._parse_term()),
300
+ ),
295
301
  TokenType.MEMBER_OF: lambda self, this: self.expression(
296
302
  exp.JSONArrayContains,
297
303
  this=this,
@@ -359,6 +365,7 @@ class MySQL(Dialect):
359
365
  exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()]
360
366
  ),
361
367
  "JSON_VALUE": lambda self: self._parse_json_value(),
368
+ "SUBSTR": lambda self: self._parse_substring(),
362
369
  }
363
370
 
364
371
  STATEMENT_PARSERS = {
@@ -579,9 +586,11 @@ class MySQL(Dialect):
579
586
  full: t.Optional[bool] = None,
580
587
  global_: t.Optional[bool] = None,
581
588
  ) -> exp.Show:
589
+ json = self._match_text_seq("JSON")
590
+
582
591
  if target:
583
592
  if isinstance(target, str):
584
- self._match_text_seq(target)
593
+ self._match_text_seq(*target.split(" "))
585
594
  target_id = self._parse_id_var()
586
595
  else:
587
596
  target_id = None
@@ -618,6 +627,12 @@ class MySQL(Dialect):
618
627
  mutex = True if self._match_text_seq("MUTEX") else None
619
628
  mutex = False if self._match_text_seq("STATUS") else mutex
620
629
 
630
+ for_table = self._parse_id_var() if self._match_text_seq("FOR", "TABLE") else None
631
+ for_group = self._parse_string() if self._match_text_seq("FOR", "GROUP") else None
632
+ for_user = self._parse_string() if self._match_text_seq("FOR", "USER") else None
633
+ for_role = self._parse_string() if self._match_text_seq("FOR", "ROLE") else None
634
+ into_outfile = self._parse_string() if self._match_text_seq("INTO", "OUTFILE") else None
635
+
621
636
  return self.expression(
622
637
  exp.Show,
623
638
  this=this,
@@ -634,6 +649,12 @@ class MySQL(Dialect):
634
649
  offset=offset,
635
650
  limit=limit,
636
651
  mutex=mutex,
652
+ for_table=for_table,
653
+ for_group=for_group,
654
+ for_user=for_user,
655
+ for_role=for_role,
656
+ into_outfile=into_outfile,
657
+ json=json,
637
658
  **{"global": global_}, # type: ignore
638
659
  )
639
660
 
@@ -1200,6 +1221,10 @@ class MySQL(Dialect):
1200
1221
  target = f" FROM{target}"
1201
1222
  elif expression.name == "GRANTS":
1202
1223
  target = f" FOR{target}"
1224
+ elif expression.name in ("LINKS", "PARTITIONS"):
1225
+ target = f" ON{target}" if target else ""
1226
+ elif expression.name == "PROJECTIONS":
1227
+ target = f" ON TABLE{target}" if target else ""
1203
1228
 
1204
1229
  db = self._prefixed_sql("FROM", expression, "db")
1205
1230
 
@@ -1227,7 +1252,14 @@ class MySQL(Dialect):
1227
1252
  else:
1228
1253
  mutex_or_status = ""
1229
1254
 
1230
- return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}"
1255
+ for_table = self._prefixed_sql("FOR TABLE", expression, "for_table")
1256
+ for_group = self._prefixed_sql("FOR GROUP", expression, "for_group")
1257
+ for_user = self._prefixed_sql("FOR USER", expression, "for_user")
1258
+ for_role = self._prefixed_sql("FOR ROLE", expression, "for_role")
1259
+ into_outfile = self._prefixed_sql("INTO OUTFILE", expression, "into_outfile")
1260
+ json = " JSON" if expression.args.get("json") else ""
1261
+
1262
+ 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
1263
 
1232
1264
  def altercolumn_sql(self, expression: exp.AlterColumn) -> str:
1233
1265
  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
@@ -418,6 +424,11 @@ class Postgres(Dialect):
418
424
  FUNCTION_PARSERS = {
419
425
  **parser.Parser.FUNCTION_PARSERS,
420
426
  "DATE_PART": lambda self: self._parse_date_part(),
427
+ "JSON_AGG": lambda self: self.expression(
428
+ exp.JSONArrayAgg,
429
+ this=self._parse_bitwise(),
430
+ order=self._parse_order(),
431
+ ),
421
432
  "JSONB_EXISTS": lambda self: self._parse_jsonb_exists(),
422
433
  }
423
434
 
@@ -584,7 +595,10 @@ class Postgres(Dialect):
584
595
  exp.AnyValue: _versioned_anyvalue_sql,
585
596
  exp.ArrayConcat: lambda self, e: self.arrayconcat_sql(e, name="ARRAY_CAT"),
586
597
  exp.ArrayFilter: filter_array_using_unnest,
598
+ exp.BitwiseAndAgg: rename_func("BIT_AND"),
599
+ exp.BitwiseOrAgg: rename_func("BIT_OR"),
587
600
  exp.BitwiseXor: lambda self, e: self.binary(e, "#"),
601
+ exp.BitwiseXorAgg: rename_func("BIT_XOR"),
588
602
  exp.ColumnDef: transforms.preprocess([_auto_increment_to_serial, _serial_to_generated]),
589
603
  exp.CurrentDate: no_paren_current_date_sql,
590
604
  exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP",
@@ -599,6 +613,11 @@ class Postgres(Dialect):
599
613
  self, e, func_name="STRING_AGG", within_group=False
600
614
  ),
601
615
  exp.IntDiv: rename_func("DIV"),
616
+ exp.JSONArrayAgg: lambda self, e: self.func(
617
+ "JSON_AGG",
618
+ self.sql(e, "this"),
619
+ suffix=f"{self.sql(e, 'order')})",
620
+ ),
602
621
  exp.JSONExtract: _json_extract_sql("JSON_EXTRACT_PATH", "->"),
603
622
  exp.JSONExtractScalar: _json_extract_sql("JSON_EXTRACT_PATH_TEXT", "->>"),
604
623
  exp.JSONBExtract: lambda self, e: self.binary(e, "#>"),
@@ -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 = " "