sqlglot 27.13.2__tar.gz → 27.14.0__tar.gz

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