sqlglot 30.4.3__tar.gz → 30.6.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 (322) hide show
  1. {sqlglot-30.4.3 → sqlglot-30.6.0}/CHANGELOG.md +83 -0
  2. {sqlglot-30.4.3/sqlglot.egg-info → sqlglot-30.6.0}/PKG-INFO +3 -3
  3. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/_typing.py +1 -0
  4. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/_version.py +3 -3
  5. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/bigquery.py +1 -0
  6. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/dialect.py +8 -1
  7. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/duckdb.py +2 -0
  8. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/exasol.py +1 -0
  9. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/executor/python.py +4 -108
  10. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/constraints.py +4 -0
  11. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/ddl.py +4 -0
  12. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/dml.py +4 -1
  13. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/functions.py +18 -0
  14. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/math.py +6 -1
  15. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/string.py +1 -1
  16. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generator.py +33 -5
  17. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/bigquery.py +3 -0
  18. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/clickhouse.py +26 -0
  19. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/duckdb.py +122 -3
  20. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/oracle.py +1 -0
  21. sqlglot-30.6.0/sqlglot/generators/python.py +108 -0
  22. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/snowflake.py +4 -0
  23. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/spark.py +1 -0
  24. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/starrocks.py +8 -0
  25. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parser.py +28 -3
  26. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/bigquery.py +3 -0
  27. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/clickhouse.py +18 -0
  28. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/databricks.py +1 -0
  29. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/doris.py +5 -0
  30. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/duckdb.py +1 -0
  31. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/mysql.py +10 -0
  32. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/snowflake.py +7 -0
  33. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/spark.py +1 -0
  34. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/starrocks.py +10 -1
  35. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/bigquery.py +21 -10
  36. {sqlglot-30.4.3 → sqlglot-30.6.0/sqlglot.egg-info}/PKG-INFO +3 -3
  37. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot.egg-info/SOURCES.txt +1 -0
  38. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot.egg-info/requires.txt +2 -2
  39. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_bigquery.py +26 -4
  40. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_clickhouse.py +41 -0
  41. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_databricks.py +31 -0
  42. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_dialect.py +1 -1
  43. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_doris.py +13 -0
  44. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_duckdb.py +34 -1
  45. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_exasol.py +4 -0
  46. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_mysql.py +35 -0
  47. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_oracle.py +15 -0
  48. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_postgres.py +2 -0
  49. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_snowflake.py +1 -9
  50. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_spark.py +15 -1
  51. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_starrocks.py +28 -0
  52. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_executor.py +0 -4
  53. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_parser.py +26 -0
  54. {sqlglot-30.4.3 → sqlglot-30.6.0}/.gitignore +0 -0
  55. {sqlglot-30.4.3 → sqlglot-30.6.0}/.gitmodules +0 -0
  56. {sqlglot-30.4.3 → sqlglot-30.6.0}/.gitpod.yml +0 -0
  57. {sqlglot-30.4.3 → sqlglot-30.6.0}/.pre-commit-config.yaml +0 -0
  58. {sqlglot-30.4.3 → sqlglot-30.6.0}/AGENTS.md +0 -0
  59. {sqlglot-30.4.3 → sqlglot-30.6.0}/CLAUDE.md +0 -0
  60. {sqlglot-30.4.3 → sqlglot-30.6.0}/CONTRIBUTING.md +0 -0
  61. {sqlglot-30.4.3 → sqlglot-30.6.0}/LICENSE +0 -0
  62. {sqlglot-30.4.3 → sqlglot-30.6.0}/MANIFEST.in +0 -0
  63. {sqlglot-30.4.3 → sqlglot-30.6.0}/Makefile +0 -0
  64. {sqlglot-30.4.3 → sqlglot-30.6.0}/README.md +0 -0
  65. {sqlglot-30.4.3 → sqlglot-30.6.0}/pyproject.toml +0 -0
  66. {sqlglot-30.4.3 → sqlglot-30.6.0}/setup.cfg +0 -0
  67. {sqlglot-30.4.3 → sqlglot-30.6.0}/setup.py +0 -0
  68. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/__init__.py +0 -0
  69. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/__main__.py +0 -0
  70. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/__init__.py +0 -0
  71. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/athena.py +0 -0
  72. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/clickhouse.py +0 -0
  73. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/databricks.py +0 -0
  74. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/doris.py +0 -0
  75. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/dremio.py +0 -0
  76. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/drill.py +0 -0
  77. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/druid.py +0 -0
  78. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/dune.py +0 -0
  79. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/fabric.py +0 -0
  80. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/hive.py +0 -0
  81. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/materialize.py +0 -0
  82. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/mysql.py +0 -0
  83. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/oracle.py +0 -0
  84. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/postgres.py +0 -0
  85. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/presto.py +0 -0
  86. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/prql.py +0 -0
  87. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/redshift.py +0 -0
  88. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/risingwave.py +0 -0
  89. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/singlestore.py +0 -0
  90. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/snowflake.py +0 -0
  91. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/solr.py +0 -0
  92. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/spark.py +0 -0
  93. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/spark2.py +0 -0
  94. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/sqlite.py +0 -0
  95. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/starrocks.py +0 -0
  96. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/tableau.py +0 -0
  97. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/teradata.py +0 -0
  98. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/trino.py +0 -0
  99. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/dialects/tsql.py +0 -0
  100. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/diff.py +0 -0
  101. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/errors.py +0 -0
  102. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/executor/__init__.py +0 -0
  103. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/executor/context.py +0 -0
  104. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/executor/env.py +0 -0
  105. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/executor/table.py +0 -0
  106. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/__init__.py +0 -0
  107. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/aggregate.py +0 -0
  108. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/array.py +0 -0
  109. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/builders.py +0 -0
  110. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/core.py +0 -0
  111. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/datatypes.py +0 -0
  112. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/json.py +0 -0
  113. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/properties.py +0 -0
  114. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/query.py +0 -0
  115. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/expressions/temporal.py +0 -0
  116. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/__init__.py +0 -0
  117. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/athena.py +0 -0
  118. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/databricks.py +0 -0
  119. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/doris.py +0 -0
  120. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/dremio.py +0 -0
  121. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/drill.py +0 -0
  122. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/druid.py +0 -0
  123. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/dune.py +0 -0
  124. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/exasol.py +0 -0
  125. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/fabric.py +0 -0
  126. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/hive.py +0 -0
  127. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/materialize.py +0 -0
  128. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/mysql.py +0 -0
  129. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/postgres.py +0 -0
  130. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/presto.py +0 -0
  131. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/prql.py +0 -0
  132. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/redshift.py +0 -0
  133. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/risingwave.py +0 -0
  134. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/singlestore.py +0 -0
  135. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/solr.py +0 -0
  136. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/spark2.py +0 -0
  137. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/sqlite.py +0 -0
  138. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/tableau.py +0 -0
  139. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/teradata.py +0 -0
  140. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/trino.py +0 -0
  141. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/generators/tsql.py +0 -0
  142. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/helper.py +0 -0
  143. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/jsonpath.py +0 -0
  144. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/lineage.py +0 -0
  145. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/__init__.py +0 -0
  146. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/annotate_types.py +0 -0
  147. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/canonicalize.py +0 -0
  148. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  149. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  150. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  151. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  152. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
  153. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/normalize.py +0 -0
  154. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  155. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  156. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/optimizer.py +0 -0
  157. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
  158. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  159. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/qualify.py +0 -0
  160. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/qualify_columns.py +0 -0
  161. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/qualify_tables.py +0 -0
  162. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/resolver.py +0 -0
  163. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/scope.py +0 -0
  164. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/simplify.py +0 -0
  165. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
  166. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/__init__.py +0 -0
  167. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/athena.py +0 -0
  168. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/base.py +0 -0
  169. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/dremio.py +0 -0
  170. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/drill.py +0 -0
  171. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/druid.py +0 -0
  172. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/dune.py +0 -0
  173. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/exasol.py +0 -0
  174. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/fabric.py +0 -0
  175. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/hive.py +0 -0
  176. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/materialize.py +0 -0
  177. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/oracle.py +0 -0
  178. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/postgres.py +0 -0
  179. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/presto.py +0 -0
  180. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/prql.py +0 -0
  181. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/redshift.py +0 -0
  182. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/risingwave.py +0 -0
  183. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/singlestore.py +0 -0
  184. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/solr.py +0 -0
  185. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/spark2.py +0 -0
  186. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/sqlite.py +0 -0
  187. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/tableau.py +0 -0
  188. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/teradata.py +0 -0
  189. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/trino.py +0 -0
  190. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/parsers/tsql.py +0 -0
  191. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/planner.py +0 -0
  192. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/py.typed +0 -0
  193. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/schema.py +0 -0
  194. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/serde.py +0 -0
  195. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/time.py +0 -0
  196. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/tokenizer_core.py +0 -0
  197. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/tokens.py +0 -0
  198. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/transforms.py +0 -0
  199. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/trie.py +0 -0
  200. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/__init__.py +0 -0
  201. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/clickhouse.py +0 -0
  202. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/duckdb.py +0 -0
  203. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/hive.py +0 -0
  204. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/mysql.py +0 -0
  205. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/presto.py +0 -0
  206. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/redshift.py +0 -0
  207. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/snowflake.py +0 -0
  208. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/spark.py +0 -0
  209. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/spark2.py +0 -0
  210. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot/typing/tsql.py +0 -0
  211. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  212. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot.egg-info/top_level.txt +0 -0
  213. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglot.png +0 -0
  214. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglotc/MANIFEST.in +0 -0
  215. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglotc/pyproject.toml +0 -0
  216. {sqlglot-30.4.3 → sqlglot-30.6.0}/sqlglotc/setup.py +0 -0
  217. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/__init__.py +0 -0
  218. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/__init__.py +0 -0
  219. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_athena.py +0 -0
  220. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_dremio.py +0 -0
  221. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_drill.py +0 -0
  222. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_druid.py +0 -0
  223. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_dune.py +0 -0
  224. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_fabric.py +0 -0
  225. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_hive.py +0 -0
  226. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_materialize.py +0 -0
  227. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_pipe_syntax.py +0 -0
  228. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_presto.py +0 -0
  229. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_prql.py +0 -0
  230. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_redshift.py +0 -0
  231. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_risingwave.py +0 -0
  232. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_singlestore.py +0 -0
  233. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_solr.py +0 -0
  234. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_sqlite.py +0 -0
  235. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_tableau.py +0 -0
  236. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_teradata.py +0 -0
  237. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_trino.py +0 -0
  238. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/dialects/test_tsql.py +0 -0
  239. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/identity.sql +0 -0
  240. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  241. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/jsonpath/cts.json +0 -0
  242. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/annotate_functions.sql +0 -0
  243. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  244. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  245. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  246. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  247. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  248. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  249. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
  250. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  251. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  252. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  253. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
  254. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  255. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  256. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  257. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
  258. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  259. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  260. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  261. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  262. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  263. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/simplify.sql +0 -0
  264. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  265. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  266. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  267. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  268. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  269. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  270. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  271. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  272. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  273. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  274. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  275. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  276. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  277. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  278. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  279. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  280. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  281. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  282. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  283. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  284. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  285. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  286. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  287. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  288. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  289. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  290. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  291. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  292. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  293. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  294. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  295. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  296. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  297. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  298. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  299. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/partial.sql +0 -0
  300. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/fixtures/pretty.sql +0 -0
  301. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/gen_fixtures.py +0 -0
  302. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/helpers.py +0 -0
  303. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/sqlglot/__init__.py +0 -0
  304. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_build.py +0 -0
  305. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_dialect_entry_points.py +0 -0
  306. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_dialect_imports.py +0 -0
  307. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_diff.py +0 -0
  308. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_docs.py +0 -0
  309. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_errors.py +0 -0
  310. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_expressions.py +0 -0
  311. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_generator.py +0 -0
  312. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_helper.py +0 -0
  313. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_integration_loader.py +0 -0
  314. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_jsonpath.py +0 -0
  315. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_lineage.py +0 -0
  316. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_optimizer.py +0 -0
  317. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_schema.py +0 -0
  318. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_serde.py +0 -0
  319. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_time.py +0 -0
  320. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_tokens.py +0 -0
  321. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_transforms.py +0 -0
  322. {sqlglot-30.4.3 → sqlglot-30.6.0}/tests/test_transpile.py +0 -0
@@ -1,6 +1,87 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v30.5.0] - 2026-04-20
5
+ ### :boom: BREAKING CHANGES
6
+ - due to [`98ca4cd`](https://github.com/tobymao/sqlglot/commit/98ca4cdd60124c0e566d1de40855b30a169219fd) - transpile TRY_DIVIDE to/from other dialects [CLAUDE] *(PR [#7489](https://github.com/tobymao/sqlglot/pull/7489) by [@baruchoxman](https://github.com/baruchoxman))*:
7
+
8
+ transpile TRY_DIVIDE to/from other dialects [CLAUDE] (#7489)
9
+
10
+ - due to [`ec516f2`](https://github.com/tobymao/sqlglot/commit/ec516f27213286c7b46731ea0fa72972b1b2f68a) - add typed AI scalar function nodes *(PR [#7479](https://github.com/tobymao/sqlglot/pull/7479) by [@RedZapdos123](https://github.com/RedZapdos123))*:
11
+
12
+ add typed AI scalar function nodes (#7479)
13
+
14
+ - due to [`800ca41`](https://github.com/tobymao/sqlglot/commit/800ca4105583e74cf18fed737bd90f24f55de428) - support LOAD DATA FROM FILES syntax *(PR [#7482](https://github.com/tobymao/sqlglot/pull/7482) by [@RedZapdos123](https://github.com/RedZapdos123))*:
15
+
16
+ support LOAD DATA FROM FILES syntax (#7482)
17
+
18
+ - due to [`efbc5e2`](https://github.com/tobymao/sqlglot/commit/efbc5e220c54c838e6684683fddb77f8056692bf) - add missing TO_CHAR format tokens (Mon, Month, Day, Dy, AM/PM, HH) *(PR [#7477](https://github.com/tobymao/sqlglot/pull/7477) by [@mwade0118](https://github.com/mwade0118))*:
19
+
20
+ add missing TO_CHAR format tokens (Mon, Month, Day, Dy, AM/PM, HH) (#7477)
21
+
22
+ - due to [`d289db3`](https://github.com/tobymao/sqlglot/commit/d289db33be43b99096ee9ec8e1c6d695b1d2a4a5) - stop eliminating semi/anti joins, QUALIFY, and FULL OUTER JOIN [CLAUDE] *(PR [#7524](https://github.com/tobymao/sqlglot/pull/7524) by [@dwoldemariam-klav](https://github.com/dwoldemariam-klav))*:
23
+
24
+ stop eliminating semi/anti joins, QUALIFY, and FULL OUTER JOIN [CLAUDE] (#7524)
25
+
26
+
27
+ ### :sparkles: New Features
28
+ - [`c80c3fd`](https://github.com/tobymao/sqlglot/commit/c80c3fd5c7f74aec28a3377583018b5aa03ec838) - **duckdb**: warn when transpiling snowflake's `ENCRYPT` *(PR [#7472](https://github.com/tobymao/sqlglot/pull/7472) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
29
+ - [`e150296`](https://github.com/tobymao/sqlglot/commit/e15029667b3672d0b0f83fa035da6bd01dda6f3d) - **duckdb**: warn when generating Snowflake's `[TRY_]DECRYPT_RAW` *(PR [#7475](https://github.com/tobymao/sqlglot/pull/7475) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
30
+ - [`4ac6389`](https://github.com/tobymao/sqlglot/commit/4ac6389cf9ddde2236e76571453117d681995ecf) - **snowflake**: mark ENCRYPT_RAW as unsupported in DuckDB *(PR [#7485](https://github.com/tobymao/sqlglot/pull/7485) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
31
+ - [`ec516f2`](https://github.com/tobymao/sqlglot/commit/ec516f27213286c7b46731ea0fa72972b1b2f68a) - **bigquery**: add typed AI scalar function nodes *(PR [#7479](https://github.com/tobymao/sqlglot/pull/7479) by [@RedZapdos123](https://github.com/RedZapdos123))*
32
+ - :arrow_lower_right: *addresses issue [#7478](https://github.com/tobymao/sqlglot/issues/7478) opened by [@RedZapdos123](https://github.com/RedZapdos123)*
33
+ - [`a7ae102`](https://github.com/tobymao/sqlglot/commit/a7ae102520b5c2632314481d5ef040b3fa129d49) - **duckdb**: mark PARSE_URL as unsupported *(PR [#7499](https://github.com/tobymao/sqlglot/pull/7499) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
34
+ - [`045f30e`](https://github.com/tobymao/sqlglot/commit/045f30e6ff8026de4a0a2acbdf8aef604c27a60a) - **duckdb**: mark PARSE_IP as unsupported [CLAUDE] *(PR [#7500](https://github.com/tobymao/sqlglot/pull/7500) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
35
+ - [`70dec2e`](https://github.com/tobymao/sqlglot/commit/70dec2ec7e6708406c815fab4436db540efe30fd) - **duckdb**: Add transpilation support for INSERT function *(PR [#7486](https://github.com/tobymao/sqlglot/pull/7486) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
36
+ - [`fb7d5b2`](https://github.com/tobymao/sqlglot/commit/fb7d5b2458cd65149475e42271ed22055ad1579f) - **oracle**: Support WHERE on MERGE statement *(PR [#7492](https://github.com/tobymao/sqlglot/pull/7492) by [@galunto](https://github.com/galunto))*
37
+ - [`ed58b9b`](https://github.com/tobymao/sqlglot/commit/ed58b9bd942282e1c9b81af5b11e952211d4fe78) - **clickhouse**: support groupConcat parametric syntax *(PR [#7487](https://github.com/tobymao/sqlglot/pull/7487) by [@betodealmeida](https://github.com/betodealmeida))*
38
+ - [`73c1983`](https://github.com/tobymao/sqlglot/commit/73c198380e083d28ac9f0f42cf74f6280e9052db) - **parser**: introduce flag to control AST size *(PR [#7502](https://github.com/tobymao/sqlglot/pull/7502) by [@georgesittas](https://github.com/georgesittas))*
39
+ - [`b985092`](https://github.com/tobymao/sqlglot/commit/b985092f817fb93670355c166839dc2617b47777) - **duckdb**: Add transpilation support for SUBSTR-SUBSTRING functions *(PR [#7471](https://github.com/tobymao/sqlglot/pull/7471) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
40
+ - [`1a55f07`](https://github.com/tobymao/sqlglot/commit/1a55f07cc0b27c3826659c1ba7f7873863d22502) - **duckdb**: transpile snowflake's JAROWINKLER_SIMILARITY properly *(PR [#7501](https://github.com/tobymao/sqlglot/pull/7501) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
41
+ - [`5fb1f7c`](https://github.com/tobymao/sqlglot/commit/5fb1f7c3d70d00b1e864a3bc2a1db271e72f8bc4) - **duckdb**: Mark ARRAY_UNION_AGG as unsupported [CLAUDE] *(PR [#7503](https://github.com/tobymao/sqlglot/pull/7503) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
42
+ - [`d0407ed`](https://github.com/tobymao/sqlglot/commit/d0407edee90cdf75e11bb5ca3064975c0bbfe08b) - **duckdb**: support dollars in identifiers closes [#7509](https://github.com/tobymao/sqlglot/pull/7509) *(commit by [@georgesittas](https://github.com/georgesittas))*
43
+ - [`6678ee0`](https://github.com/tobymao/sqlglot/commit/6678ee028d0de97d6cce222302da29477bd3d72b) - **mysql**: Add `INVISIBLE` column constraint for MySQL. *(PR [#7510](https://github.com/tobymao/sqlglot/pull/7510) by [@burnison](https://github.com/burnison))*
44
+ - [`cb91d91`](https://github.com/tobymao/sqlglot/commit/cb91d9142a76234630b4e9dfbccf1fdb8076c830) - **mysql**: support `ALTER TABLE ... RENAME INDEX`. *(PR [#7511](https://github.com/tobymao/sqlglot/pull/7511) by [@burnison](https://github.com/burnison))*
45
+ - [`7660486`](https://github.com/tobymao/sqlglot/commit/7660486c4cc6a679e73d2a45498982d8895b64c0) - **doris, starrocks**: support two-argument DATE_ADD/DATE_SUB *(PR [#7514](https://github.com/tobymao/sqlglot/pull/7514) by [@wuqicyber](https://github.com/wuqicyber))*
46
+ - :arrow_lower_right: *addresses issue [#6341](https://github.com/tobymao/sqlglot/issues/6341) opened by [@HolgerWang1999](https://github.com/HolgerWang1999)*
47
+ - [`e2d6bfe`](https://github.com/tobymao/sqlglot/commit/e2d6bfeeae76846c24dc10a4f758585c828e2928) - **mysql**: parse `ALTER TABLE AUTO_INCREMENT`. *(PR [#7520](https://github.com/tobymao/sqlglot/pull/7520) by [@burnison](https://github.com/burnison))*
48
+ - [`0cd09c2`](https://github.com/tobymao/sqlglot/commit/0cd09c25d14aef5a1c8d9c197bf4b38ad7875e5d) - **mysql**: parse hints on `UPDATE` and `DELETE`. *(PR [#7523](https://github.com/tobymao/sqlglot/pull/7523) by [@burnison](https://github.com/burnison))*
49
+ - [`ceb14fa`](https://github.com/tobymao/sqlglot/commit/ceb14fad0b3e2be7e66523076a78b172d99eb306) - **duckdb**: Add transpilation unsupported for SOUNDEX function *(PR [#7517](https://github.com/tobymao/sqlglot/pull/7517) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
50
+ - [`d289db3`](https://github.com/tobymao/sqlglot/commit/d289db33be43b99096ee9ec8e1c6d695b1d2a4a5) - **starrocks**: stop eliminating semi/anti joins, QUALIFY, and FULL OUTER JOIN [CLAUDE] *(PR [#7524](https://github.com/tobymao/sqlglot/pull/7524) by [@dwoldemariam-klav](https://github.com/dwoldemariam-klav))*
51
+
52
+ ### :bug: Bug Fixes
53
+ - [`ecd325b`](https://github.com/tobymao/sqlglot/commit/ecd325b4e3e09acfca4273661dffa4aba3302ad4) - **databricks**: support IFF as a synonym for IF [CLAUDE] *(PR [#7488](https://github.com/tobymao/sqlglot/pull/7488) by [@baruchoxman](https://github.com/baruchoxman))*
54
+ - :arrow_lower_right: *fixes issue [#7347](https://github.com/tobymao/sqlglot/issues/7347) opened by [@baruchoxman](https://github.com/baruchoxman)*
55
+ - [`e3cd4a4`](https://github.com/tobymao/sqlglot/commit/e3cd4a4c175525948e319adede3a743f0128701d) - **bigquery**: parse FOR SYSTEM TIME AS OF (with spaces) *(PR [#7493](https://github.com/tobymao/sqlglot/pull/7493) by [@lawrence3699](https://github.com/lawrence3699))*
56
+ - :arrow_lower_right: *fixes issue [#7481](https://github.com/tobymao/sqlglot/issues/7481) opened by [@roykoand](https://github.com/roykoand)*
57
+ - [`c16630f`](https://github.com/tobymao/sqlglot/commit/c16630f61dfa738ac70079a275426549dfa547d6) - **snowflake**: map JSON type to VARIANT in Snowflake generator [CLAUDE] *(PR [#7496](https://github.com/tobymao/sqlglot/pull/7496) by [@maxa-jonathan-hallee](https://github.com/maxa-jonathan-hallee))*
58
+ - [`98ca4cd`](https://github.com/tobymao/sqlglot/commit/98ca4cdd60124c0e566d1de40855b30a169219fd) - **databricks**: transpile TRY_DIVIDE to/from other dialects [CLAUDE] *(PR [#7489](https://github.com/tobymao/sqlglot/pull/7489) by [@baruchoxman](https://github.com/baruchoxman))*
59
+ - :arrow_lower_right: *fixes issue [#7312](https://github.com/tobymao/sqlglot/issues/7312) opened by [@baruchoxman](https://github.com/baruchoxman)*
60
+ - [`800ca41`](https://github.com/tobymao/sqlglot/commit/800ca4105583e74cf18fed737bd90f24f55de428) - **bigquery**: support LOAD DATA FROM FILES syntax *(PR [#7482](https://github.com/tobymao/sqlglot/pull/7482) by [@RedZapdos123](https://github.com/RedZapdos123))*
61
+ - :arrow_lower_right: *fixes issue [#7480](https://github.com/tobymao/sqlglot/issues/7480) opened by [@roykoand](https://github.com/roykoand)*
62
+ - [`efbc5e2`](https://github.com/tobymao/sqlglot/commit/efbc5e220c54c838e6684683fddb77f8056692bf) - **postgres**: add missing TO_CHAR format tokens (Mon, Month, Day, Dy, AM/PM, HH) *(PR [#7477](https://github.com/tobymao/sqlglot/pull/7477) by [@mwade0118](https://github.com/mwade0118))*
63
+ - :arrow_lower_right: *fixes issue [#7476](https://github.com/tobymao/sqlglot/issues/7476) opened by [@mwade0118](https://github.com/mwade0118)*
64
+ - [`0b46b39`](https://github.com/tobymao/sqlglot/commit/0b46b39639d149ff57b4b9dc0000732f9096468d) - **snowflake**: transpile REDUCE to DuckDB LIST_REDUCE *(PR [#7505](https://github.com/tobymao/sqlglot/pull/7505) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
65
+ - [`35c6d37`](https://github.com/tobymao/sqlglot/commit/35c6d37c5a32fa7dd95b998c5e06688e1bffb7ea) - **duckdb**: wrap OCTET_LENGTH string arguments with ENCODE *(PR [#7507](https://github.com/tobymao/sqlglot/pull/7507) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
66
+ - [`930ff33`](https://github.com/tobymao/sqlglot/commit/930ff330616f72966bb67231bfb26301022814c3) - **snowflake**: transpile DuckDB JSON_ARRAY to ARRAY_CONSTRUCT [CLAUDE] *(PR [#7497](https://github.com/tobymao/sqlglot/pull/7497) by [@maxa-jonathan-hallee](https://github.com/maxa-jonathan-hallee))*
67
+ - [`998b42b`](https://github.com/tobymao/sqlglot/commit/998b42b4edd650dd272284d511a724be27e1b89e) - **exasol**: enable minus *(PR [#7521](https://github.com/tobymao/sqlglot/pull/7521) by [@Hfuegl](https://github.com/Hfuegl))*
68
+ - [`18231ca`](https://github.com/tobymao/sqlglot/commit/18231cad0a187e2646e550b27af68b72eef2cd84) - **mysql**: parse quoted constraint names. *(PR [#7519](https://github.com/tobymao/sqlglot/pull/7519) by [@burnison](https://github.com/burnison))*
69
+ - [`6da9653`](https://github.com/tobymao/sqlglot/commit/6da9653d5f25f9d44ad002b9d072b0d8fd39bcc1) - **optimizer**: support bigquery type inference for unnest + array + struct *(PR [#7525](https://github.com/tobymao/sqlglot/pull/7525) by [@geooo109](https://github.com/geooo109))*
70
+
71
+ ### :white_check_mark: Tests
72
+ - [`ad2c98d`](https://github.com/tobymao/sqlglot/commit/ad2c98d771a9818a521e15e26dbea3833ed0295a) - **databricks**: add explicit tests for SET VAR / SET VARIABLE [CLAUDE] *(PR [#7490](https://github.com/tobymao/sqlglot/pull/7490) by [@baruchoxman](https://github.com/baruchoxman))*
73
+ - :arrow_lower_right: *addresses issue [#7358](https://github.com/tobymao/sqlglot/issues/7358) opened by [@baruchoxman](https://github.com/baruchoxman)*
74
+
75
+ ### :wrench: Chores
76
+ - [`224e64d`](https://github.com/tobymao/sqlglot/commit/224e64dad3b0dcfc753b9bca78cff326080edbd0) - style for dbx tests *(commit by [@geooo109](https://github.com/geooo109))*
77
+ - [`c1f929f`](https://github.com/tobymao/sqlglot/commit/c1f929fa6cf775bf778a0b832f6df8860bfe62b7) - Fix PR 7510 *(PR [#7513](https://github.com/tobymao/sqlglot/pull/7513) by [@VaggelisD](https://github.com/VaggelisD))*
78
+
79
+
80
+ ## [v30.4.3] - 2026-04-13
81
+ ### :bug: Bug Fixes
82
+ - [`713e95f`](https://github.com/tobymao/sqlglot/commit/713e95fb9bca5fa6ac0aa660f599a4be632872e2) - **snowflake**: parse GET_DDL #unknown_policy in ROW ACCESS POLICY [CLAUDE] *(PR [#7491](https://github.com/tobymao/sqlglot/pull/7491) by [@eakmanrq](https://github.com/eakmanrq))*
83
+
84
+
4
85
  ## [v30.4.2] - 2026-04-08
5
86
  ### :bug: Bug Fixes
6
87
  - [`d04595e`](https://github.com/tobymao/sqlglot/commit/d04595e1ba91a778e4b76f3f84dcb41649594e32) - incomplete `ColumnMapping` type hint *(commit by [@georgesittas](https://github.com/georgesittas))*
@@ -14143,3 +14224,5 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
14143
14224
  [v30.3.0]: https://github.com/tobymao/sqlglot/compare/v30.2.1...v30.3.0
14144
14225
  [v30.4.0]: https://github.com/tobymao/sqlglot/compare/v30.3.0...v30.4.0
14145
14226
  [v30.4.2]: https://github.com/tobymao/sqlglot/compare/v30.4.1...v30.4.2
14227
+ [v30.4.3]: https://github.com/tobymao/sqlglot/compare/v30.4.2...v30.4.3
14228
+ [v30.5.0]: https://github.com/tobymao/sqlglot/compare/v30.4.3...v30.5.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 30.4.3
3
+ Version: 30.6.0
4
4
  Summary: An easily customizable SQL parser and transpiler
5
5
  Author-email: Toby Mao <toby.mao@gmail.com>
6
6
  License-Expression: MIT
@@ -33,10 +33,10 @@ Requires-Dist: types-pytz; extra == "dev"
33
33
  Requires-Dist: typing_extensions; extra == "dev"
34
34
  Requires-Dist: pyperf; extra == "dev"
35
35
  Provides-Extra: c
36
- Requires-Dist: sqlglotc==30.4.3; extra == "c"
36
+ Requires-Dist: sqlglotc==30.6.0; extra == "c"
37
37
  Provides-Extra: rs
38
38
  Requires-Dist: sqlglotrs==0.13.0; extra == "rs"
39
- Requires-Dist: sqlglotc==30.4.3; extra == "rs"
39
+ Requires-Dist: sqlglotc==30.6.0; extra == "rs"
40
40
  Dynamic: license-file
41
41
  Dynamic: provides-extra
42
42
 
@@ -29,6 +29,7 @@ class ParserNoDialectArgs(t.TypedDict, total=False):
29
29
  error_level: ErrorLevel | None
30
30
  error_message_context: int
31
31
  max_errors: int
32
+ max_nodes: int
32
33
 
33
34
 
34
35
  class ParserArgs(ParserNoDialectArgs, _DialectArg, total=False):
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '30.4.3'
22
- __version_tuple__ = version_tuple = (30, 4, 3)
21
+ __version__ = version = '30.6.0'
22
+ __version_tuple__ = version_tuple = (30, 6, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g713e95fb9'
24
+ __commit_id__ = commit_id = 'gdcf9ed583'
@@ -183,6 +183,7 @@ class BigQuery(Dialect):
183
183
  "EXCEPTION": TokenType.COMMAND,
184
184
  "EXPORT": TokenType.EXPORT,
185
185
  "FLOAT64": TokenType.DOUBLE,
186
+ "FOR SYSTEM TIME": TokenType.TIMESTAMP_SNAPSHOT,
186
187
  "FOR SYSTEM_TIME": TokenType.TIMESTAMP_SNAPSHOT,
187
188
  "LOOP": TokenType.COMMAND,
188
189
  "MODEL": TokenType.MODEL,
@@ -1598,6 +1598,7 @@ def build_date_delta(
1598
1598
 
1599
1599
  def build_date_delta_with_interval(
1600
1600
  expression_class: Type[E],
1601
+ default_unit: str | None = None,
1601
1602
  ) -> t.Callable[[BuilderArgs], E | None]:
1602
1603
  def _builder(args: BuilderArgs) -> E | None:
1603
1604
  if len(args) < 2:
@@ -1606,7 +1607,13 @@ def build_date_delta_with_interval(
1606
1607
  interval = args[1]
1607
1608
 
1608
1609
  if not isinstance(interval, exp.Interval):
1609
- raise ParseError(f"INTERVAL expression expected but got '{interval}'")
1610
+ if default_unit is None:
1611
+ raise ParseError(f"INTERVAL expression expected but got '{interval}'")
1612
+ return expression_class(
1613
+ this=args[0],
1614
+ expression=interval,
1615
+ unit=exp.Literal.string(default_unit),
1616
+ )
1610
1617
 
1611
1618
  return expression_class(this=args[0], expression=interval.this, unit=unit_to_str(interval))
1612
1619
 
@@ -116,6 +116,8 @@ class DuckDB(Dialect):
116
116
  "$": TokenType.PARAMETER,
117
117
  }
118
118
 
119
+ VAR_SINGLE_TOKENS = {"$"}
120
+
119
121
  COMMANDS = tokens.Tokenizer.COMMANDS - {TokenType.SHOW}
120
122
 
121
123
  Parser = DuckDBParser
@@ -61,6 +61,7 @@ class Exasol(Dialect):
61
61
  "REGEXP_LIKE": TokenType.RLIKE,
62
62
  "SEPARATOR": TokenType.SEPARATOR,
63
63
  "SYSTIMESTAMP": TokenType.SYSTIMESTAMP,
64
+ "MINUS": TokenType.EXCEPT,
64
65
  }
65
66
  KEYWORDS.pop("DIV")
66
67
 
@@ -2,13 +2,13 @@ import collections
2
2
  import itertools
3
3
  import math
4
4
 
5
- from sqlglot import exp, generator, planner, tokens
6
- from sqlglot.dialects.dialect import Dialect, inline_array_sql
5
+ from sqlglot import exp, planner, tokens
6
+ from sqlglot.dialects.dialect import Dialect
7
7
  from sqlglot.errors import ExecuteError
8
8
  from sqlglot.executor.context import Context
9
9
  from sqlglot.executor.env import ENV
10
10
  from sqlglot.executor.table import RowReader, Table
11
- from sqlglot.helper import subclasses
11
+ from sqlglot.generators.python import PythonGenerator
12
12
 
13
13
 
14
14
  class PythonExecutor:
@@ -324,112 +324,8 @@ class PythonExecutor:
324
324
  return self.context({step.name: sink})
325
325
 
326
326
 
327
- def _ordered_py(self, expression):
328
- this = self.sql(expression, "this")
329
- desc = "True" if expression.args.get("desc") else "False"
330
- nulls_first = "True" if expression.args.get("nulls_first") else "False"
331
- return f"ORDERED({this}, {desc}, {nulls_first})"
332
-
333
-
334
- def _rename(self, e):
335
- try:
336
- values = list(e.args.values())
337
-
338
- if len(values) == 1:
339
- values = values[0]
340
- if not isinstance(values, list):
341
- return self.func(e.key, values)
342
- return self.func(e.key, *values)
343
-
344
- if isinstance(e, exp.Func) and e.is_var_len_args:
345
- args = itertools.chain.from_iterable(x if isinstance(x, list) else [x] for x in values)
346
- return self.func(e.key, *args)
347
-
348
- return self.func(e.key, *values)
349
- except Exception as ex:
350
- raise Exception(f"Could not rename {repr(e)}") from ex
351
-
352
-
353
- def _case_sql(self, expression):
354
- this = self.sql(expression, "this")
355
- chain = self.sql(expression, "default") or "None"
356
-
357
- for e in reversed(expression.args["ifs"]):
358
- true = self.sql(e, "true")
359
- condition = self.sql(e, "this")
360
- condition = f"{this} = ({condition})" if this else condition
361
- chain = f"{true} if {condition} else ({chain})"
362
-
363
- return chain
364
-
365
-
366
- def _lambda_sql(self, e: exp.Lambda) -> str:
367
- names = {e.name.lower() for e in e.expressions}
368
-
369
- e = e.transform(
370
- lambda n: (
371
- exp.var(n.name) if isinstance(n, exp.Identifier) and n.name.lower() in names else n
372
- )
373
- ).assert_is(exp.Lambda)
374
-
375
- return f"lambda {self.expressions(e, flat=True)}: {self.sql(e, 'this')}"
376
-
377
-
378
- def _div_sql(self: generator.Generator, e: exp.Div) -> str:
379
- denominator = self.sql(e, "expression")
380
-
381
- if e.args.get("safe"):
382
- denominator += " or None"
383
-
384
- sql = f"DIV({self.sql(e, 'this')}, {denominator})"
385
-
386
- if e.args.get("typed"):
387
- sql = f"int({sql})"
388
-
389
- return sql
390
-
391
-
392
327
  class Python(Dialect):
393
328
  class Tokenizer(tokens.Tokenizer):
394
329
  STRING_ESCAPES = ["\\"]
395
330
 
396
- class Generator(generator.Generator):
397
- TRANSFORMS = {
398
- **{klass: _rename for klass in subclasses(exp.__name__, exp.Binary)},
399
- **{klass: _rename for klass in exp.ALL_FUNCTIONS},
400
- exp.Case: _case_sql,
401
- exp.Alias: lambda self, e: self.sql(e.this),
402
- exp.Array: inline_array_sql,
403
- exp.And: lambda self, e: self.binary(e, "and"),
404
- exp.Between: _rename,
405
- exp.Boolean: lambda self, e: "True" if e.this else "False",
406
- exp.Cast: lambda self, e: f"CAST({self.sql(e.this)}, exp.DType.{e.args['to']})",
407
- exp.Column: lambda self, e: (
408
- f"scope[{self.sql(e, 'table') or None}][{self.sql(e.this)}]"
409
- ),
410
- exp.Concat: lambda self, e: self.func(
411
- "SAFECONCAT" if e.args.get("safe") else "CONCAT", *e.expressions
412
- ),
413
- exp.Distinct: lambda self, e: f"set({self.sql(e, 'this')})",
414
- exp.Div: _div_sql,
415
- exp.Extract: lambda self, e: (
416
- f"EXTRACT('{e.name.lower()}', {self.sql(e, 'expression')})"
417
- ),
418
- exp.In: lambda self, e: (
419
- f"{self.sql(e, 'this')} in {{{self.expressions(e, flat=True)}}}"
420
- ),
421
- exp.Interval: lambda self, e: f"INTERVAL({self.sql(e.this)}, '{self.sql(e.unit)}')",
422
- exp.Is: lambda self, e: (
423
- self.binary(e, "==") if isinstance(e.this, exp.Literal) else self.binary(e, "is")
424
- ),
425
- exp.JSONExtract: lambda self, e: self.func(e.key, e.this, e.expression, *e.expressions),
426
- exp.JSONPath: lambda self, e: f"[{','.join(self.sql(p) for p in e.expressions[1:])}]",
427
- exp.JSONPathKey: lambda self, e: f"'{self.sql(e.this)}'",
428
- exp.JSONPathSubscript: lambda self, e: f"'{e.this}'",
429
- exp.Lambda: _lambda_sql,
430
- exp.Not: lambda self, e: f"not {self.sql(e.this)}",
431
- exp.Null: lambda *_: "None",
432
- exp.Or: lambda self, e: self.binary(e, "or"),
433
- exp.Ordered: _ordered_py,
434
- exp.Star: lambda *_: "1",
435
- }
331
+ Generator = PythonGenerator
@@ -33,6 +33,10 @@ class AutoIncrementColumnConstraint(Expression, ColumnConstraintKind):
33
33
  pass
34
34
 
35
35
 
36
+ class InvisibleColumnConstraint(Expression, ColumnConstraintKind):
37
+ arg_types = {}
38
+
39
+
36
40
  class ZeroFillColumnConstraint(ColumnConstraint):
37
41
  arg_types = {}
38
42
 
@@ -279,6 +279,10 @@ class AlterRename(Expression):
279
279
  pass
280
280
 
281
281
 
282
+ class RenameIndex(Expression):
283
+ arg_types = {"this": True, "to": True}
284
+
285
+
282
286
  class AlterModifySqlSecurity(Expression):
283
287
  arg_types = {"expressions": True}
284
288
 
@@ -79,6 +79,7 @@ class Delete(Expression, DML):
79
79
  "limit": False,
80
80
  "tables": False, # Multiple-Table Syntax (MySQL)
81
81
  "cluster": False, # Clickhouse
82
+ "hint": False,
82
83
  }
83
84
 
84
85
  def delete(
@@ -282,7 +283,8 @@ class LoadData(Expression):
282
283
  "this": True,
283
284
  "local": False,
284
285
  "overwrite": False,
285
- "inpath": True,
286
+ "inpath": False,
287
+ "files": False,
286
288
  "partition": False,
287
289
  "input_format": False,
288
290
  "serde": False,
@@ -300,6 +302,7 @@ class Update(Expression, DML):
300
302
  "order": False,
301
303
  "limit": False,
302
304
  "options": False,
305
+ "hint": False,
303
306
  }
304
307
 
305
308
  def table(
@@ -321,6 +321,24 @@ class AIClassify(Expression, Func):
321
321
  _sql_names = ["AI_CLASSIFY"]
322
322
 
323
323
 
324
+ class AIEmbed(Expression, Func):
325
+ arg_types = {"expressions": True}
326
+ is_var_len_args = True
327
+ _sql_names = ["AI_EMBED"]
328
+
329
+
330
+ class AISimilarity(Expression, Func):
331
+ arg_types = {"expressions": True}
332
+ is_var_len_args = True
333
+ _sql_names = ["AI_SIMILARITY"]
334
+
335
+
336
+ class AIGenerate(Expression, Func):
337
+ arg_types = {"expressions": True}
338
+ is_var_len_args = True
339
+ _sql_names = ["AI_GENERATE"]
340
+
341
+
324
342
  class FeaturesAtTime(Expression, Func):
325
343
  arg_types = {"this": True, "time": False, "num_rows": False, "ignore_feature_nulls": False}
326
344
 
@@ -108,7 +108,12 @@ class EuclideanDistance(Expression, Func):
108
108
 
109
109
 
110
110
  class JarowinklerSimilarity(Expression, Func):
111
- arg_types = {"this": True, "expression": True, "case_insensitive": False}
111
+ arg_types = {
112
+ "this": True,
113
+ "expression": True,
114
+ "case_insensitive": False,
115
+ "integer_scale": False,
116
+ }
112
117
 
113
118
 
114
119
  class ManhattanDistance(Expression, Func):
@@ -220,7 +220,7 @@ class Stuff(Expression, Func):
220
220
 
221
221
  class Substring(Expression, Func):
222
222
  _sql_names = ["SUBSTRING", "SUBSTR"]
223
- arg_types = {"this": True, "start": False, "length": False}
223
+ arg_types = {"this": True, "start": False, "length": False, "zero_start": False}
224
224
 
225
225
 
226
226
  class SubstringIndex(Expression, Func):
@@ -234,6 +234,7 @@ class Generator:
234
234
  exp.ProjectionPolicyColumnConstraint: lambda self, e: (
235
235
  f"PROJECTION POLICY {self.sql(e, 'this')}"
236
236
  ),
237
+ exp.InvisibleColumnConstraint: lambda self, e: "INVISIBLE",
237
238
  exp.ZeroFillColumnConstraint: lambda self, e: "ZEROFILL",
238
239
  exp.Put: lambda self, e: self.get_put_sql(e),
239
240
  exp.RemoteWithConnectionModelProperty: lambda self, e: (
@@ -320,6 +321,9 @@ class Generator:
320
321
  # Whether MERGE ... WHEN MATCHED BY SOURCE is allowed
321
322
  MATCHED_BY_SOURCE = True
322
323
 
324
+ # Whether MERGE ... WHEN MATCHED/NOT MATCHED THEN UPDATE/INSERT ... WHERE is supported
325
+ SUPPORTS_MERGE_WHERE = False
326
+
323
327
  # Whether the INTERVAL expression works only with values like '1 day'
324
328
  SINGLE_STRING_INTERVAL = False
325
329
 
@@ -1681,6 +1685,7 @@ class Generator:
1681
1685
  return f"{local}DIRECTORY {self.sql(expression, 'this')}{row_format}"
1682
1686
 
1683
1687
  def delete_sql(self, expression: exp.Delete) -> str:
1688
+ hint = self.sql(expression, "hint")
1684
1689
  this = self.sql(expression, "this")
1685
1690
  this = f" FROM {this}" if this else ""
1686
1691
  using = self.expressions(expression, key="using")
@@ -1697,7 +1702,7 @@ class Generator:
1697
1702
  expression_sql = f"{this}{using}{cluster}{where}{returning}{order}{limit}"
1698
1703
  else:
1699
1704
  expression_sql = f"{returning}{this}{using}{cluster}{where}{order}{limit}"
1700
- return self.prepend_ctes(expression, f"DELETE{tables}{expression_sql}")
1705
+ return self.prepend_ctes(expression, f"DELETE{hint}{tables}{expression_sql}")
1701
1706
 
1702
1707
  def drop_sql(self, expression: exp.Drop) -> str:
1703
1708
  this = self.sql(expression, "this")
@@ -2463,6 +2468,7 @@ class Generator:
2463
2468
  return (join_sql, "")
2464
2469
 
2465
2470
  def update_sql(self, expression: exp.Update) -> str:
2471
+ hint = self.sql(expression, "hint")
2466
2472
  this = self.sql(expression, "this")
2467
2473
  join_sql, from_sql = self._update_from_joins_sql(expression)
2468
2474
  set_sql = self.expressions(expression, flat=True)
@@ -2476,7 +2482,7 @@ class Generator:
2476
2482
  expression_sql = f"{returning}{from_sql}{where_sql}"
2477
2483
  options = self.expressions(expression, key="options")
2478
2484
  options = f" OPTION({options})" if options else ""
2479
- sql = f"UPDATE {this}{join_sql} SET {set_sql}{expression_sql}{order}{limit}{options}"
2485
+ sql = f"UPDATE{hint} {this}{join_sql} SET {set_sql}{expression_sql}{order}{limit}{options}"
2480
2486
  return self.prepend_ctes(expression, sql)
2481
2487
 
2482
2488
  def values_sql(self, expression: exp.Values, values_as_table: bool = True) -> str:
@@ -2811,10 +2817,20 @@ class Generator:
2811
2817
  return self._replace_line_breaks(text).replace(delimiter, escaped_delimiter)
2812
2818
 
2813
2819
  def loaddata_sql(self, expression: exp.LoadData) -> str:
2820
+ is_overwrite = expression.args.get("overwrite")
2821
+ overwrite = " OVERWRITE" if is_overwrite else ""
2822
+ this = self.sql(expression, "this")
2823
+
2824
+ files = expression.args.get("files")
2825
+ if files:
2826
+ files_sql = self.expressions(files, flat=True)
2827
+ files_sql = f"FILES{self.wrap(files_sql)}"
2828
+ this = f" {this}" if is_overwrite else f" INTO TABLE {this}"
2829
+ return f"LOAD DATA{overwrite}{this} FROM {files_sql}"
2830
+
2814
2831
  local = " LOCAL" if expression.args.get("local") else ""
2815
2832
  inpath = f" INPATH {self.sql(expression, 'inpath')}"
2816
- overwrite = " OVERWRITE" if expression.args.get("overwrite") else ""
2817
- this = f" INTO TABLE {self.sql(expression, 'this')}"
2833
+ this = f" INTO TABLE {this}"
2818
2834
  partition = self.sql(expression, "partition")
2819
2835
  partition = f" {partition}" if partition else ""
2820
2836
  input_format = self.sql(expression, "input_format")
@@ -4448,9 +4464,16 @@ class Generator:
4448
4464
  else:
4449
4465
  expressions_sql = self.expressions(then_expression)
4450
4466
  then = f"UPDATE SET{self.sep()}{expressions_sql}" if expressions_sql else "UPDATE"
4451
-
4452
4467
  else:
4453
4468
  then = self.sql(then_expression)
4469
+
4470
+ if isinstance(then_expression, (exp.Insert, exp.Update)):
4471
+ where = self.sql(then_expression, "where")
4472
+ if where and not self.SUPPORTS_MERGE_WHERE:
4473
+ kind = "INSERT" if isinstance(then_expression, exp.Insert) else "UPDATE"
4474
+ self.unsupported(f"WHERE clause in MERGE {kind} is not supported")
4475
+ where = ""
4476
+ then = f"{then}{where}"
4454
4477
  return f"WHEN {matched}{source}{condition} THEN {then}"
4455
4478
 
4456
4479
  def whens_sql(self, expression: exp.Whens) -> str:
@@ -5899,3 +5922,8 @@ class Generator:
5899
5922
  def usingproperty_sql(self, expression: exp.UsingProperty) -> str:
5900
5923
  kind = expression.args.get("kind")
5901
5924
  return f"USING {kind} {self.sql(expression, 'this')}"
5925
+
5926
+ def renameindex_sql(self, expression: exp.RenameIndex) -> str:
5927
+ this = self.sql(expression, "this")
5928
+ to = self.sql(expression, "to")
5929
+ return f"RENAME INDEX {this} TO {to}"
@@ -272,6 +272,9 @@ class BigQueryGenerator(generator.Generator):
272
272
 
273
273
  TRANSFORMS = {
274
274
  **generator.Generator.TRANSFORMS,
275
+ exp.AIEmbed: rename_func("EMBED"),
276
+ exp.AIGenerate: rename_func("GENERATE"),
277
+ exp.AISimilarity: rename_func("SIMILARITY"),
275
278
  exp.ApproxTopK: rename_func("APPROX_TOP_COUNT"),
276
279
  exp.ApproxDistinct: rename_func("APPROX_COUNT_DISTINCT"),
277
280
  exp.ArgMax: arg_max_or_min_no_count("MAX_BY"),
@@ -416,6 +416,32 @@ class ClickHouseGenerator(generator.Generator):
416
416
  exp.DType.MULTIPOLYGON,
417
417
  }
418
418
 
419
+ def groupconcat_sql(self, expression: exp.GroupConcat) -> str:
420
+ this = expression.this
421
+ separator = expression.args.get("separator")
422
+
423
+ if isinstance(this, exp.Limit) and this.this:
424
+ limit = this
425
+ this = limit.this.pop()
426
+ return self.sql(
427
+ exp.ParameterizedAgg(
428
+ this="groupConcat",
429
+ params=[this],
430
+ expressions=[separator, limit.expression],
431
+ )
432
+ )
433
+
434
+ if separator:
435
+ return self.sql(
436
+ exp.ParameterizedAgg(
437
+ this="groupConcat",
438
+ params=[this],
439
+ expressions=[separator],
440
+ )
441
+ )
442
+
443
+ return self.func("groupConcat", this)
444
+
419
445
  def offset_sql(self, expression: exp.Offset) -> str:
420
446
  offset = super().offset_sql(expression)
421
447