sqlglot 30.22.0__tar.gz → 30.23.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 (339) hide show
  1. {sqlglot-30.22.0 → sqlglot-30.23.0}/CHANGELOG.md +194 -0
  2. {sqlglot-30.22.0/sqlglot.egg-info → sqlglot-30.23.0}/PKG-INFO +3 -3
  3. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/_version.py +3 -3
  4. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/anonymize.py +1 -0
  5. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/athena.py +17 -1
  6. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/databricks.py +1 -0
  7. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/dialect.py +25 -0
  8. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/oracle.py +27 -0
  9. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/snowflake.py +5 -0
  10. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/starrocks.py +1 -0
  11. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/builders.py +54 -5
  12. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/constraints.py +1 -0
  13. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/core.py +13 -3
  14. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/ddl.py +2 -0
  15. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/json.py +1 -0
  16. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/properties.py +17 -0
  17. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/query.py +9 -0
  18. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generator.py +13 -1
  19. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/athena.py +5 -1
  20. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/clickhouse.py +33 -1
  21. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/doris.py +6 -0
  22. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/duckdb.py +9 -2
  23. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/oracle.py +22 -0
  24. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/presto.py +2 -1
  25. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/spark2.py +2 -1
  26. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/starrocks.py +21 -0
  27. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/teradata.py +19 -0
  28. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/merge_subqueries.py +3 -3
  29. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/qualify_columns.py +3 -3
  30. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/qualify_tables.py +4 -1
  31. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parser.py +32 -12
  32. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/athena.py +8 -0
  33. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/clickhouse.py +5 -1
  34. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/doris.py +40 -0
  35. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/duckdb.py +7 -0
  36. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/mysql.py +13 -0
  37. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/oracle.py +77 -2
  38. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/postgres.py +1 -0
  39. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/spark2.py +7 -4
  40. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/starrocks.py +72 -1
  41. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/teradata.py +44 -0
  42. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/tokenizer_core.py +3 -1
  43. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/tokens.py +3 -0
  44. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/duckdb.py +18 -0
  45. {sqlglot-30.22.0 → sqlglot-30.23.0/sqlglot.egg-info}/PKG-INFO +3 -3
  46. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot.egg-info/requires.txt +2 -2
  47. sqlglot-30.23.0/sqlglot.egg-info/scm_version.json +8 -0
  48. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_athena.py +36 -1
  49. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_bigquery.py +1 -1
  50. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_clickhouse.py +104 -0
  51. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_databricks.py +23 -0
  52. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_dialect.py +6 -4
  53. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_doris.py +63 -1
  54. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_duckdb.py +44 -0
  55. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_mysql.py +22 -0
  56. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_oracle.py +265 -0
  57. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_postgres.py +34 -2
  58. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_snowflake.py +2 -2
  59. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_spark.py +24 -0
  60. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_starrocks.py +104 -1
  61. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_teradata.py +38 -0
  62. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +4 -0
  63. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/merge_subqueries.sql +4 -0
  64. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/optimizer.sql +18 -0
  65. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/qualify_columns.sql +10 -0
  66. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/qualify_tables.sql +25 -0
  67. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_anonymize.py +1 -0
  68. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_expressions.py +111 -0
  69. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_parser.py +1 -0
  70. sqlglot-30.22.0/sqlglot.egg-info/scm_version.json +0 -8
  71. {sqlglot-30.22.0 → sqlglot-30.23.0}/.gitignore +0 -0
  72. {sqlglot-30.22.0 → sqlglot-30.23.0}/.gitmodules +0 -0
  73. {sqlglot-30.22.0 → sqlglot-30.23.0}/.gitpod.yml +0 -0
  74. {sqlglot-30.22.0 → sqlglot-30.23.0}/.pre-commit-config.yaml +0 -0
  75. {sqlglot-30.22.0 → sqlglot-30.23.0}/AGENTS.md +0 -0
  76. {sqlglot-30.22.0 → sqlglot-30.23.0}/CLAUDE.md +0 -0
  77. {sqlglot-30.22.0 → sqlglot-30.23.0}/CONTRIBUTING.md +0 -0
  78. {sqlglot-30.22.0 → sqlglot-30.23.0}/LICENSE +0 -0
  79. {sqlglot-30.22.0 → sqlglot-30.23.0}/MANIFEST.in +0 -0
  80. {sqlglot-30.22.0 → sqlglot-30.23.0}/Makefile +0 -0
  81. {sqlglot-30.22.0 → sqlglot-30.23.0}/README.md +0 -0
  82. {sqlglot-30.22.0 → sqlglot-30.23.0}/pyproject.toml +0 -0
  83. {sqlglot-30.22.0 → sqlglot-30.23.0}/setup.cfg +0 -0
  84. {sqlglot-30.22.0 → sqlglot-30.23.0}/setup.py +0 -0
  85. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/__init__.py +0 -0
  86. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/__main__.py +0 -0
  87. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/_typing.py +0 -0
  88. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/__init__.py +0 -0
  89. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/bigquery.py +0 -0
  90. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/clickhouse.py +0 -0
  91. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/dax.py +0 -0
  92. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/doris.py +0 -0
  93. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/dremio.py +0 -0
  94. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/drill.py +0 -0
  95. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/druid.py +0 -0
  96. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/duckdb.py +0 -0
  97. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/dune.py +0 -0
  98. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/exasol.py +0 -0
  99. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/fabric.py +0 -0
  100. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/hive.py +0 -0
  101. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/materialize.py +0 -0
  102. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/mysql.py +0 -0
  103. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/postgres.py +0 -0
  104. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/presto.py +0 -0
  105. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/prql.py +0 -0
  106. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/redshift.py +0 -0
  107. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/risingwave.py +0 -0
  108. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/singlestore.py +0 -0
  109. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/solr.py +0 -0
  110. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/spark.py +0 -0
  111. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/spark2.py +0 -0
  112. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/sqlite.py +0 -0
  113. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/tableau.py +0 -0
  114. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/teradata.py +0 -0
  115. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/trino.py +0 -0
  116. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/dialects/tsql.py +0 -0
  117. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/diff.py +0 -0
  118. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/errors.py +0 -0
  119. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/executor/__init__.py +0 -0
  120. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/executor/context.py +0 -0
  121. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/executor/env.py +0 -0
  122. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/executor/python.py +0 -0
  123. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/executor/table.py +0 -0
  124. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/__init__.py +0 -0
  125. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/aggregate.py +0 -0
  126. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/array.py +0 -0
  127. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/datatypes.py +0 -0
  128. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/dml.py +0 -0
  129. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/functions.py +0 -0
  130. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/math.py +0 -0
  131. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/string.py +0 -0
  132. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/expressions/temporal.py +0 -0
  133. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/__init__.py +0 -0
  134. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/bigquery.py +0 -0
  135. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/databricks.py +0 -0
  136. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/dax.py +0 -0
  137. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/dremio.py +0 -0
  138. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/drill.py +0 -0
  139. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/druid.py +0 -0
  140. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/dune.py +0 -0
  141. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/exasol.py +0 -0
  142. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/fabric.py +0 -0
  143. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/hive.py +0 -0
  144. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/materialize.py +0 -0
  145. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/mysql.py +0 -0
  146. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/postgres.py +0 -0
  147. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/prql.py +0 -0
  148. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/python.py +0 -0
  149. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/redshift.py +0 -0
  150. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/risingwave.py +0 -0
  151. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/singlestore.py +0 -0
  152. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/snowflake.py +0 -0
  153. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/solr.py +0 -0
  154. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/spark.py +0 -0
  155. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/sqlite.py +0 -0
  156. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/tableau.py +0 -0
  157. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/trino.py +0 -0
  158. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/generators/tsql.py +0 -0
  159. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/helper.py +0 -0
  160. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/jsonpath.py +0 -0
  161. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/lineage.py +0 -0
  162. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/__init__.py +0 -0
  163. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/annotate_types.py +0 -0
  164. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/canonicalize.py +0 -0
  165. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/canonicalize_internal_names.py +0 -0
  166. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  167. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  168. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  169. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/helpers.py +0 -0
  170. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  171. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/journal.py +0 -0
  172. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/normalize.py +0 -0
  173. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  174. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  175. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/optimizer.py +0 -0
  176. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
  177. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  178. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/qualify.py +0 -0
  179. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/resolver.py +0 -0
  180. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/scope.py +0 -0
  181. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/simplify.py +0 -0
  182. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/optimizer/unnest_subqueries.py +3 -3
  183. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/__init__.py +0 -0
  184. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/base.py +0 -0
  185. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/bigquery.py +0 -0
  186. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/databricks.py +0 -0
  187. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/dax.py +0 -0
  188. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/dremio.py +0 -0
  189. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/drill.py +0 -0
  190. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/druid.py +0 -0
  191. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/dune.py +0 -0
  192. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/exasol.py +0 -0
  193. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/fabric.py +0 -0
  194. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/hive.py +0 -0
  195. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/materialize.py +0 -0
  196. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/presto.py +0 -0
  197. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/prql.py +0 -0
  198. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/redshift.py +0 -0
  199. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/risingwave.py +0 -0
  200. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/singlestore.py +0 -0
  201. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/snowflake.py +0 -0
  202. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/solr.py +0 -0
  203. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/spark.py +0 -0
  204. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/sqlite.py +0 -0
  205. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/tableau.py +0 -0
  206. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/trino.py +0 -0
  207. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/parsers/tsql.py +0 -0
  208. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/planner.py +0 -0
  209. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/py.typed +0 -0
  210. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/schema.py +0 -0
  211. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/serde.py +0 -0
  212. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/time.py +0 -0
  213. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/transforms.py +0 -0
  214. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/trie.py +0 -0
  215. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/__init__.py +0 -0
  216. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/bigquery.py +0 -0
  217. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/clickhouse.py +0 -0
  218. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/databricks.py +0 -0
  219. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/hive.py +0 -0
  220. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/mysql.py +0 -0
  221. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/postgres.py +0 -0
  222. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/presto.py +0 -0
  223. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/redshift.py +0 -0
  224. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/snowflake.py +0 -0
  225. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/spark.py +0 -0
  226. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/spark2.py +0 -0
  227. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot/typing/tsql.py +0 -0
  228. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot.egg-info/SOURCES.txt +0 -0
  229. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  230. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot.egg-info/scm_file_list.json +0 -0
  231. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot.egg-info/top_level.txt +0 -0
  232. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglot.png +0 -0
  233. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglotc/MANIFEST.in +0 -0
  234. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglotc/pyproject.toml +0 -0
  235. {sqlglot-30.22.0 → sqlglot-30.23.0}/sqlglotc/setup.py +0 -0
  236. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/__init__.py +0 -0
  237. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/__init__.py +0 -0
  238. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_dax.py +0 -0
  239. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_dremio.py +0 -0
  240. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_drill.py +0 -0
  241. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_druid.py +0 -0
  242. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_dune.py +0 -0
  243. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_exasol.py +0 -0
  244. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_fabric.py +0 -0
  245. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_hive.py +0 -0
  246. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_materialize.py +0 -0
  247. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_pipe_syntax.py +0 -0
  248. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_presto.py +0 -0
  249. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_prql.py +0 -0
  250. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_redshift.py +0 -0
  251. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_risingwave.py +0 -0
  252. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_singlestore.py +0 -0
  253. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_solr.py +0 -0
  254. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_sqlite.py +0 -0
  255. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_tableau.py +0 -0
  256. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_trino.py +0 -0
  257. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/dialects/test_tsql.py +0 -0
  258. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/identity.sql +0 -0
  259. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  260. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/jsonpath/cts.json +0 -0
  261. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/annotate_functions.sql +0 -0
  262. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  263. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  264. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/canonicalize_internal_names.sql +0 -0
  265. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  266. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  267. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  268. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  269. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  270. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  271. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  272. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  273. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  274. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  275. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  276. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  277. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  278. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/simplify.sql +0 -0
  279. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  280. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  281. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  282. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  283. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  284. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  285. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  286. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  287. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  288. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  289. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  290. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  291. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  292. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  293. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  294. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  295. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  296. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  297. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  298. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  299. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  300. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  301. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  302. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  303. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  304. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  305. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  306. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  307. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  308. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  309. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  310. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  311. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  312. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  313. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  314. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/partial.sql +0 -0
  315. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/fixtures/pretty.sql +0 -0
  316. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/gen_fixtures.py +0 -0
  317. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/helpers.py +0 -0
  318. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/leakcheck.py +0 -0
  319. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/sqlglot/__init__.py +0 -0
  320. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_build.py +0 -0
  321. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_dialect_entry_points.py +0 -0
  322. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_dialect_imports.py +0 -0
  323. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_diff.py +0 -0
  324. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_docs.py +0 -0
  325. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_errors.py +0 -0
  326. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_executor.py +0 -0
  327. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_generator.py +0 -0
  328. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_helper.py +0 -0
  329. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_integration_loader.py +0 -0
  330. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_jsonpath.py +0 -0
  331. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_lineage.py +0 -0
  332. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_optimizer.py +0 -0
  333. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_schema.py +0 -0
  334. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_serde.py +0 -0
  335. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_time.py +0 -0
  336. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_tokens.py +0 -0
  337. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_transforms.py +0 -0
  338. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_transpile.py +0 -0
  339. {sqlglot-30.22.0 → sqlglot-30.23.0}/tests/test_typing.py +0 -0
@@ -1,6 +1,199 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v30.22.0] - 2026-10-09
5
+ ### :boom: BREAKING CHANGES
6
+ - due to [`5d997d9`](https://github.com/tobymao/sqlglot/commit/5d997d94d8041ed12db5abe7a1155b30df057b43) - Parse bare `ALTER TABLE ... DROP c`. *(PR [#8432](https://github.com/tobymao/sqlglot/pull/8432) by [@burnison](https://github.com/burnison))*:
7
+
8
+ Parse bare `ALTER TABLE ... DROP c`. (#8432)
9
+
10
+ - due to [`fdc0339`](https://github.com/tobymao/sqlglot/commit/fdc0339b219da56b4433198e3cd53e7604d53188) - decode string escapes and preserve byte literals *(PR [#8479](https://github.com/tobymao/sqlglot/pull/8479) by [@georgesittas](https://github.com/georgesittas))*:
11
+
12
+ decode string escapes and preserve byte literals (#8479)
13
+
14
+ - due to [`5cc5ef0`](https://github.com/tobymao/sqlglot/commit/5cc5ef046e8213dcb373c82f6c00fcf918fb4a5b) - preserve backslashes in string literals *(PR [#8481](https://github.com/tobymao/sqlglot/pull/8481) by [@georgesittas](https://github.com/georgesittas))*:
15
+
16
+ preserve backslashes in string literals (#8481)
17
+
18
+ - due to [`5fe5606`](https://github.com/tobymao/sqlglot/commit/5fe5606b905f38930017149c4a6e3d1b3a3a5616) - correct PostgreSQL, DuckDB, Redshift, and ClickHouse string escapes *(PR [#8484](https://github.com/tobymao/sqlglot/pull/8484) by [@georgesittas](https://github.com/georgesittas))*:
19
+
20
+ correct PostgreSQL, DuckDB, Redshift, and ClickHouse string escapes (#8484)
21
+
22
+ - due to [`fc4964b`](https://github.com/tobymao/sqlglot/commit/fc4964bbe8a8efdf28d2c4cbc7a5d66b160e7946) - support mixed-operation `ALTER`s. *(PR [#8419](https://github.com/tobymao/sqlglot/pull/8419) by [@burnison](https://github.com/burnison))*:
23
+
24
+ support mixed-operation `ALTER`s. (#8419)
25
+
26
+ - due to [`47b94d4`](https://github.com/tobymao/sqlglot/commit/47b94d424a05768a2e3b416cc4282b8449f8197f) - MySQL accepts non-CSV table options. *(PR [#8503](https://github.com/tobymao/sqlglot/pull/8503) by [@burnison](https://github.com/burnison))*:
27
+
28
+ MySQL accepts non-CSV table options. (#8503)
29
+
30
+ - due to [`a980f01`](https://github.com/tobymao/sqlglot/commit/a980f017130a5d9c485c53c878982155362ca4de) - scope preserved function names to their dialect *(PR [#8512](https://github.com/tobymao/sqlglot/pull/8512) by [@georgesittas](https://github.com/georgesittas))*:
31
+
32
+ scope preserved function names to their dialect (#8512)
33
+
34
+ - due to [`ee7567c`](https://github.com/tobymao/sqlglot/commit/ee7567c86d9a418cc517f80194e6fc35e075be4a) - expand stars in the order sources appear in FROM *(PR [#8529](https://github.com/tobymao/sqlglot/pull/8529) by [@VaggelisD](https://github.com/VaggelisD))*:
35
+
36
+ expand stars in the order sources appear in FROM (#8529)
37
+
38
+ - due to [`e3ed748`](https://github.com/tobymao/sqlglot/commit/e3ed74860fd5a44d31347b2e2cf62cf5030e9222) - support FROM-first multi-table INSERT [CLAUDE] *(PR [#8527](https://github.com/tobymao/sqlglot/pull/8527) by [@LeeChaeRok](https://github.com/LeeChaeRok))*:
39
+
40
+ support FROM-first multi-table INSERT [CLAUDE] (#8527)
41
+
42
+ - due to [`5b7b413`](https://github.com/tobymao/sqlglot/commit/5b7b413451e2a7a35bfc8c076d3b3636f8a7b203) - expand nested join constructs in qualify_tables *(PR [#8530](https://github.com/tobymao/sqlglot/pull/8530) by [@VaggelisD](https://github.com/VaggelisD))*:
43
+
44
+ expand nested join constructs in qualify_tables (#8530)
45
+
46
+ - due to [`6de29fd`](https://github.com/tobymao/sqlglot/commit/6de29fdce762e564002e0ae0d8d09c388ebc4cfb) - FROM-first multi-table INSERT cleanup *(PR [#8535](https://github.com/tobymao/sqlglot/pull/8535) by [@geooo109](https://github.com/geooo109))*:
47
+
48
+ FROM-first multi-table INSERT cleanup (#8535)
49
+
50
+ - due to [`e1e0d2e`](https://github.com/tobymao/sqlglot/commit/e1e0d2e52f45247bfa0ab815eb8a7388ea50a0e8) - preserve precision for timestamp and time literals ([#8534](https://github.com/tobymao/sqlglot/pull/8534)) *(PR [#8538](https://github.com/tobymao/sqlglot/pull/8538) by [@ansh-rohilla](https://github.com/ansh-rohilla))*:
51
+
52
+ preserve precision for timestamp and time literals (#8534) (#8538)
53
+
54
+ - due to [`f5dd70b`](https://github.com/tobymao/sqlglot/commit/f5dd70bff7ebce048d6bdd3f782328104c6c119d) - truncate integer division towards zero instead of rounding *(PR [#8532](https://github.com/tobymao/sqlglot/pull/8532) by [@georgesittas](https://github.com/georgesittas))*:
55
+
56
+ truncate integer division towards zero instead of rounding (#8532)
57
+
58
+ - due to [`b7e5153`](https://github.com/tobymao/sqlglot/commit/b7e515399a589e720b2bd081e5bb395f408feff8) - preserve bracket flags in gen serialization *(commit by [@georgesittas](https://github.com/georgesittas))*:
59
+
60
+ preserve bracket flags in gen serialization
61
+
62
+ - due to [`aa64321`](https://github.com/tobymao/sqlglot/commit/aa64321744bcb38828146b33ead1c0529dd64652) - expand USING columns first in star expansion *(PR [#8536](https://github.com/tobymao/sqlglot/pull/8536) by [@VaggelisD](https://github.com/VaggelisD))*:
63
+
64
+ expand USING columns first in star expansion (#8536)
65
+
66
+ - due to [`f2b81bf`](https://github.com/tobymao/sqlglot/commit/f2b81bfb2d2cf5b14b01be5211e022b23b6bec19) - annotate FLOOR, CEIL and SIGN by their arg type *(PR [#8547](https://github.com/tobymao/sqlglot/pull/8547) by [@georgesittas](https://github.com/georgesittas))*:
67
+
68
+ annotate FLOOR, CEIL and SIGN by their arg type (#8547)
69
+
70
+ - due to [`7f1cf60`](https://github.com/tobymao/sqlglot/commit/7f1cf60c884868a295f76dfd42745b931dd9cfbb) - Make `ALTER` actions optional. *(PR [#8539](https://github.com/tobymao/sqlglot/pull/8539) by [@burnison](https://github.com/burnison))*:
71
+
72
+ Make `ALTER` actions optional. (#8539)
73
+
74
+ - due to [`1e2cc21`](https://github.com/tobymao/sqlglot/commit/1e2cc210e2a336defd9037dfc66d9dae1e72780e) - preserve CASE branches before always-true conditions *(PR [#8572](https://github.com/tobymao/sqlglot/pull/8572) by [@georgesittas](https://github.com/georgesittas))*:
75
+
76
+ preserve CASE branches before always-true conditions (#8572)
77
+
78
+ - due to [`9f2f4cd`](https://github.com/tobymao/sqlglot/commit/9f2f4cd5a2d25e967142d0c90d107128d4dc70e5) - resolve correlated UNNEST fields from projection types *(PR [#8571](https://github.com/tobymao/sqlglot/pull/8571) by [@georgesittas](https://github.com/georgesittas))*:
79
+
80
+ resolve correlated UNNEST fields from projection types (#8571)
81
+
82
+ - due to [`6683ad2`](https://github.com/tobymao/sqlglot/commit/6683ad28a45a8b803de0ce650d737adec609fbd4) - resolve correlated UNNEST fields from projection types *(PR [#8571](https://github.com/tobymao/sqlglot/pull/8571) by [@georgesittas](https://github.com/georgesittas))*:
83
+
84
+ resolve correlated UNNEST fields from projection types (#8571)
85
+
86
+ - due to [`51864e7`](https://github.com/tobymao/sqlglot/commit/51864e76b42b26f1fdeb829e349bd43db4d81598) - edge case in array generation *(commit by [@georgesittas](https://github.com/georgesittas))*:
87
+
88
+ edge case in array generation
89
+
90
+ - due to [`1d8e1c9`](https://github.com/tobymao/sqlglot/commit/1d8e1c9963e36652a57dd837989b3e4bcb7fc90a) - annotate sha2 for redshift properly *(PR [#8577](https://github.com/tobymao/sqlglot/pull/8577) by [@georgesittas](https://github.com/georgesittas))*:
91
+
92
+ annotate sha2 for redshift properly (#8577)
93
+
94
+ - due to [`b8333a8`](https://github.com/tobymao/sqlglot/commit/b8333a81f02fafaa040bb3b8535f1c17eb9caf0c) - remove infer_schema from optimizer *(PR [#8552](https://github.com/tobymao/sqlglot/pull/8552) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*:
95
+
96
+ remove infer_schema from optimizer (#8552)
97
+
98
+
99
+ ### :sparkles: New Features
100
+ - [`5d997d9`](https://github.com/tobymao/sqlglot/commit/5d997d94d8041ed12db5abe7a1155b30df057b43) - **parser**: Parse bare `ALTER TABLE ... DROP c`. *(PR [#8432](https://github.com/tobymao/sqlglot/pull/8432) by [@burnison](https://github.com/burnison))*
101
+ - [`db3931c`](https://github.com/tobymao/sqlglot/commit/db3931c8bac748038751ce20f40fd6c54619a7e1) - **mysql**: Fix sqlglot tokenizer to incorporate mysql rules *(PR [#8465](https://github.com/tobymao/sqlglot/pull/8465) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
102
+ - [`fc4964b`](https://github.com/tobymao/sqlglot/commit/fc4964bbe8a8efdf28d2c4cbc7a5d66b160e7946) - **parser**: support mixed-operation `ALTER`s. *(PR [#8419](https://github.com/tobymao/sqlglot/pull/8419) by [@burnison](https://github.com/burnison))*
103
+ - [`47b94d4`](https://github.com/tobymao/sqlglot/commit/47b94d424a05768a2e3b416cc4282b8449f8197f) - **parser**: MySQL accepts non-CSV table options. *(PR [#8503](https://github.com/tobymao/sqlglot/pull/8503) by [@burnison](https://github.com/burnison))*
104
+ - [`e3ed748`](https://github.com/tobymao/sqlglot/commit/e3ed74860fd5a44d31347b2e2cf62cf5030e9222) - **hive**: support FROM-first multi-table INSERT [CLAUDE] *(PR [#8527](https://github.com/tobymao/sqlglot/pull/8527) by [@LeeChaeRok](https://github.com/LeeChaeRok))*
105
+ - [`7f1cf60`](https://github.com/tobymao/sqlglot/commit/7f1cf60c884868a295f76dfd42745b931dd9cfbb) - **parser**: Make `ALTER` actions optional. *(PR [#8539](https://github.com/tobymao/sqlglot/pull/8539) by [@burnison](https://github.com/burnison))*
106
+ - [`54e1455`](https://github.com/tobymao/sqlglot/commit/54e1455fd7566b2f0b8450a49b5c274b6161d625) - **databricks**: Retain LIMIT ALL in recursive CTEs during roundtrip *(PR [#8537](https://github.com/tobymao/sqlglot/pull/8537) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
107
+ - :arrow_lower_right: *addresses issue [#8513](https://github.com/tobymao/sqlglot/issues/8513) opened by [@paddy-devan](https://github.com/paddy-devan)*
108
+ - [`2471dd6`](https://github.com/tobymao/sqlglot/commit/2471dd6f91b10bdba2a26d012e454ce3923d427e) - **optimizer**: ! annotate function Mode for duckdb *(PR [#8560](https://github.com/tobymao/sqlglot/pull/8560) by [@Anuja006](https://github.com/Anuja006))*
109
+ - [`9214453`](https://github.com/tobymao/sqlglot/commit/921445341b7fc8afa40359bebb8b59f53a86916c) - **mysql**: parse ASCII and UNICODE. *(PR [#8561](https://github.com/tobymao/sqlglot/pull/8561) by [@burnison](https://github.com/burnison))*
110
+ - [`54005bf`](https://github.com/tobymao/sqlglot/commit/54005bf19b32d1dbcaecbd9f752059bc647339c5) - **bigquery,tsql**: rewrite AGG(...) FILTER (WHERE cond) into conditional aggregates [CLAUDE] *(PR [#8563](https://github.com/tobymao/sqlglot/pull/8563) by [@VaggelisD](https://github.com/VaggelisD))*
111
+ - [`ffe2c73`](https://github.com/tobymao/sqlglot/commit/ffe2c73694fc88e5b44b0deff1f1fb92a6a9fe95) - **spark**: parse dotted column identifiers in column definitions [CLAUDE] *(PR [#8570](https://github.com/tobymao/sqlglot/pull/8570) by [@tsamaras](https://github.com/tsamaras))*
112
+
113
+ ### :bug: Bug Fixes
114
+ - [`61fc386`](https://github.com/tobymao/sqlglot/commit/61fc386dc713e281523768d41ff2bb8b5450e751) - **clickhouse**: generate toDayOfMonth and toDayOfYear *(PR [#8473](https://github.com/tobymao/sqlglot/pull/8473) by [@ekut](https://github.com/ekut))*
115
+ - [`4afe079`](https://github.com/tobymao/sqlglot/commit/4afe079f91f06440b2f4c4a2cad754e0ee8d23fa) - **ci**: wait for sqlglotc before publishing sqlglot [CODEX] *(commit by [@tobymao](https://github.com/tobymao))*
116
+ - [`cb5d8da`](https://github.com/tobymao/sqlglot/commit/cb5d8da1bac8eafb2b64618ff205dddbe53664f7) - **duckdb**: check for an empty regexp pattern before embedding flags *(PR [#8474](https://github.com/tobymao/sqlglot/pull/8474) by [@ekut](https://github.com/ekut))*
117
+ - [`ac084c5`](https://github.com/tobymao/sqlglot/commit/ac084c5bdb2f188ff878687000273ae2247db24b) - **builders**: allow None table name in table_ for sqlglotc *(PR [#8476](https://github.com/tobymao/sqlglot/pull/8476) by [@VaggelisD](https://github.com/VaggelisD))*
118
+ - :arrow_lower_right: *fixes issue [#8475](https://github.com/tobymao/sqlglot/issues/8475) opened by [@asikeero](https://github.com/asikeero)*
119
+ - [`c7778cf`](https://github.com/tobymao/sqlglot/commit/c7778cf56d90e409c75e59b82842544b118fa850) - **parser**: bare ALTER DROP refactor and indexes named concurrently *(commit by [@geooo109](https://github.com/geooo109))*
120
+ - [`15a77f1`](https://github.com/tobymao/sqlglot/commit/15a77f1d89c3c6baac93230173e48b626497027d) - **mysql**: decode backslash string escapes *(PR [#8471](https://github.com/tobymao/sqlglot/pull/8471) by [@georgesittas](https://github.com/georgesittas))*
121
+ - [`49d6ed4`](https://github.com/tobymao/sqlglot/commit/49d6ed436647447a775f4bba5f1af94702f31055) - **hive**: decode backslash string escapes *(PR [#8478](https://github.com/tobymao/sqlglot/pull/8478) by [@georgesittas](https://github.com/georgesittas))*
122
+ - [`fdc0339`](https://github.com/tobymao/sqlglot/commit/fdc0339b219da56b4433198e3cd53e7604d53188) - **bigquery**: decode string escapes and preserve byte literals *(PR [#8479](https://github.com/tobymao/sqlglot/pull/8479) by [@georgesittas](https://github.com/georgesittas))*
123
+ - [`5cc5ef0`](https://github.com/tobymao/sqlglot/commit/5cc5ef046e8213dcb373c82f6c00fcf918fb4a5b) - **drill**: preserve backslashes in string literals *(PR [#8481](https://github.com/tobymao/sqlglot/pull/8481) by [@georgesittas](https://github.com/georgesittas))*
124
+ - [`13463de`](https://github.com/tobymao/sqlglot/commit/13463de608e9d74d36fb57da045c537e0ce1a7f6) - **clickhouse**: parse isInfinite *(PR [#8487](https://github.com/tobymao/sqlglot/pull/8487) by [@ekut](https://github.com/ekut))*
125
+ - [`5fe5606`](https://github.com/tobymao/sqlglot/commit/5fe5606b905f38930017149c4a6e3d1b3a3a5616) - correct PostgreSQL, DuckDB, Redshift, and ClickHouse string escapes *(PR [#8484](https://github.com/tobymao/sqlglot/pull/8484) by [@georgesittas](https://github.com/georgesittas))*
126
+ - [`268ad02`](https://github.com/tobymao/sqlglot/commit/268ad021b8bfaf164be3b0774657952c3d70bed4) - **parser**: parse ALTER TABLE DROP with multiple columns *(PR [#8486](https://github.com/tobymao/sqlglot/pull/8486) by [@Madin-H23](https://github.com/Madin-H23))*
127
+ - :arrow_lower_right: *fixes issue [#8485](https://github.com/tobymao/sqlglot/issues/8485) opened by [@ultrabear](https://github.com/ultrabear)*
128
+ - [`1d2a99b`](https://github.com/tobymao/sqlglot/commit/1d2a99b9cc0acf671fd2688ef02097a69404057d) - **parser**: ALTER DROP/ALTER COLUMN cleanups *(commit by [@geooo109](https://github.com/geooo109))*
129
+ - [`5fc93a9`](https://github.com/tobymao/sqlglot/commit/5fc93a9eab142393c0ef688c82d898329bcddb67) - **snowflake**: support for SPLIT_TO_TABLE *(PR [#8488](https://github.com/tobymao/sqlglot/pull/8488) by [@andrjohns](https://github.com/andrjohns))*
130
+ - [`b65592b`](https://github.com/tobymao/sqlglot/commit/b65592b45831df5e7f13d418e50f24c4cea118f0) - **postgres**: parse ^@ as STARTS_WITH closes [#8490](https://github.com/tobymao/sqlglot/pull/8490) *(commit by [@geooo109](https://github.com/geooo109))*
131
+ - [`bffcdef`](https://github.com/tobymao/sqlglot/commit/bffcdefc16b01527ee252ad2bf322b0bbff33bc8) - **snowflake**: parse (+) outer join markers *(PR [#8492](https://github.com/tobymao/sqlglot/pull/8492) by [@DG47](https://github.com/DG47))*
132
+ - [`0ceaf13`](https://github.com/tobymao/sqlglot/commit/0ceaf1319e6506fe7644021c0825c10af4f0ae6a) - **clickhouse**: map ISO calendar functions in both directions [CLAUDE] *(PR [#8494](https://github.com/tobymao/sqlglot/pull/8494) by [@ekut](https://github.com/ekut))*
133
+ - [`a6698b7`](https://github.com/tobymao/sqlglot/commit/a6698b765b006b4b3b181fcdc75319f7f990164f) - drop wrong Dialect cast in build_formatted_time [CLAUDE] *(commit by [@tobymao](https://github.com/tobymao))*
134
+ - [`5e6887a`](https://github.com/tobymao/sqlglot/commit/5e6887adc805ee13b359e25b1d17e062b0a60342) - **tsql**: parse bare table hints [CODEX: GPT-6.1 Sol] *(PR [#8493](https://github.com/tobymao/sqlglot/pull/8493) by [@mikamikasuki](https://github.com/mikamikasuki))*
135
+ - [`f337c70`](https://github.com/tobymao/sqlglot/commit/f337c70ee42614bb3224fe8c54b7af5be286eb85) - **snowflake**: parse LIST and LS stage commands [GPT-6.1] *(PR [#8502](https://github.com/tobymao/sqlglot/pull/8502) by [@tekumara](https://github.com/tekumara))*
136
+ - :arrow_lower_right: *fixes issue [#8500](https://github.com/tobymao/sqlglot/issues/8500) opened by [@tekumara](https://github.com/tekumara)*
137
+ - [`7fb054f`](https://github.com/tobymao/sqlglot/commit/7fb054f17f0b86bf572884a524067ca9eb883fb4) - **clickhouse**: generate POSITION(...) > 0 for Contains *(PR [#8507](https://github.com/tobymao/sqlglot/pull/8507) by [@ekut](https://github.com/ekut))*
138
+ - [`a980f01`](https://github.com/tobymao/sqlglot/commit/a980f017130a5d9c485c53c878982155362ca4de) - scope preserved function names to their dialect *(PR [#8512](https://github.com/tobymao/sqlglot/pull/8512) by [@georgesittas](https://github.com/georgesittas))*
139
+ - :arrow_lower_right: *fixes issue [#8497](https://github.com/tobymao/sqlglot/issues/8497) opened by [@ekut](https://github.com/ekut)*
140
+ - [`c7957e8`](https://github.com/tobymao/sqlglot/commit/c7957e8c867e42654d91b1d9c20d5e9b77ddf5b9) - **generator**: only resolve a query's own ORDER BY aliases in NULLS simulation *(PR [#8514](https://github.com/tobymao/sqlglot/pull/8514) by [@geooo109](https://github.com/geooo109))*
141
+ - :arrow_lower_right: *fixes issue [#8489](https://github.com/tobymao/sqlglot/issues/8489) opened by [@goldmedal](https://github.com/goldmedal)*
142
+ - [`51587ff`](https://github.com/tobymao/sqlglot/commit/51587ffdecfc8b2c08ee1da24b543312ded90d39) - **mysql**: Parse `DROP KEY`, `DROP CHECK` and `SIGNED`. *(PR [#8515](https://github.com/tobymao/sqlglot/pull/8515) by [@burnison](https://github.com/burnison))*
143
+ - [`50d7ce4`](https://github.com/tobymao/sqlglot/commit/50d7ce4a9808aed6beb4127c4f60d309219c664d) - **duckdb**: read the UNIFORM seed set by the Databricks parser *(PR [#8519](https://github.com/tobymao/sqlglot/pull/8519) by [@Ayoubhm07](https://github.com/Ayoubhm07))*
144
+ - :arrow_lower_right: *fixes issue [#8518](https://github.com/tobymao/sqlglot/issues/8518) opened by [@Ayoubhm07](https://github.com/Ayoubhm07)*
145
+ - [`ee7567c`](https://github.com/tobymao/sqlglot/commit/ee7567c86d9a418cc517f80194e6fc35e075be4a) - **optimizer**: expand stars in the order sources appear in FROM *(PR [#8529](https://github.com/tobymao/sqlglot/pull/8529) by [@VaggelisD](https://github.com/VaggelisD))*
146
+ - [`fc8178e`](https://github.com/tobymao/sqlglot/commit/fc8178edd3e4717db5acf1c735a03aeb67951c92) - **parser**: `DROP INDEX` accepts `db.t` syntax. *(PR [#8526](https://github.com/tobymao/sqlglot/pull/8526) by [@burnison](https://github.com/burnison))*
147
+ - [`d5d436b`](https://github.com/tobymao/sqlglot/commit/d5d436bc32030c019ca07e1dcb4a247f5b4a0f53) - **generator**: escape identifier escape chars when generating quoted identifiers *(PR [#8533](https://github.com/tobymao/sqlglot/pull/8533) by [@georgesittas](https://github.com/georgesittas))*
148
+ - [`5b7b413`](https://github.com/tobymao/sqlglot/commit/5b7b413451e2a7a35bfc8c076d3b3636f8a7b203) - **optimizer**: expand nested join constructs in qualify_tables *(PR [#8530](https://github.com/tobymao/sqlglot/pull/8530) by [@VaggelisD](https://github.com/VaggelisD))*
149
+ - :arrow_lower_right: *fixes issue [#8505](https://github.com/tobymao/sqlglot/issues/8505) opened by [@laravioli](https://github.com/laravioli)*
150
+ - :arrow_lower_right: *fixes issue [#8508](https://github.com/tobymao/sqlglot/issues/8508) opened by [@yousefissa](https://github.com/yousefissa)*
151
+ - [`30958d6`](https://github.com/tobymao/sqlglot/commit/30958d61522b84765973a8fa6c76ea03d7f97373) - **optimizer**: column resolution for TVFs, PIVOTs, and Snowflake schemas *(PR [#8472](https://github.com/tobymao/sqlglot/pull/8472) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
152
+ - [`48beaa6`](https://github.com/tobymao/sqlglot/commit/48beaa64b8d3348c31a8eab2e7daf90836d151b2) - **optimizer**: preserve all OR arms during DNF pushdown for multi-table branches *(PR [#8525](https://github.com/tobymao/sqlglot/pull/8525) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
153
+ - [`8184834`](https://github.com/tobymao/sqlglot/commit/818483464bf50a1b41d6982dbc172e7934141c52) - **duckdb**: preserve Spark array slice length *(PR [#8524](https://github.com/tobymao/sqlglot/pull/8524) by [@subotac](https://github.com/subotac))*
154
+ - :arrow_lower_right: *fixes issue [#8520](https://github.com/tobymao/sqlglot/issues/8520) opened by [@Sharpiro](https://github.com/Sharpiro)*
155
+ - [`e1e0d2e`](https://github.com/tobymao/sqlglot/commit/e1e0d2e52f45247bfa0ab815eb8a7388ea50a0e8) - **trino**: preserve precision for timestamp and time literals ([#8534](https://github.com/tobymao/sqlglot/pull/8534)) *(PR [#8538](https://github.com/tobymao/sqlglot/pull/8538) by [@ansh-rohilla](https://github.com/ansh-rohilla))*
156
+ - :arrow_lower_right: *fixes issue [#8534](https://github.com/tobymao/sqlglot/issues/8534) opened by [@ramcasa](https://github.com/ramcasa)*
157
+ - [`f5dd70b`](https://github.com/tobymao/sqlglot/commit/f5dd70bff7ebce048d6bdd3f782328104c6c119d) - truncate integer division towards zero instead of rounding *(PR [#8532](https://github.com/tobymao/sqlglot/pull/8532) by [@georgesittas](https://github.com/georgesittas))*
158
+ - :arrow_lower_right: *fixes issue [#8531](https://github.com/tobymao/sqlglot/issues/8531) opened by [@ramcasa](https://github.com/ramcasa)*
159
+ - [`f8606fe`](https://github.com/tobymao/sqlglot/commit/f8606fe8f97a10a3ba00f42104836add1299966f) - **tsql**: treat `output` as a valid identifier closes [#8545](https://github.com/tobymao/sqlglot/pull/8545) *(commit by [@georgesittas](https://github.com/georgesittas))*
160
+ - [`3096a59`](https://github.com/tobymao/sqlglot/commit/3096a591d65b1b00ba9abdf482fc7b7973a6e6af) - **duckdb**: transpile Spark CONCAT_WS on arrays to ARRAY_TO_STRING ([#8521](https://github.com/tobymao/sqlglot/pull/8521)) *(PR [#8523](https://github.com/tobymao/sqlglot/pull/8523) by [@ansh-rohilla](https://github.com/ansh-rohilla))*
161
+ - :arrow_lower_right: *fixes issue [#8521](https://github.com/tobymao/sqlglot/issues/8521) opened by [@Sharpiro](https://github.com/Sharpiro)*
162
+ - [`b7e5153`](https://github.com/tobymao/sqlglot/commit/b7e515399a589e720b2bd081e5bb395f408feff8) - **optimizer**: preserve bracket flags in gen serialization *(commit by [@georgesittas](https://github.com/georgesittas))*
163
+ - [`aa64321`](https://github.com/tobymao/sqlglot/commit/aa64321744bcb38828146b33ead1c0529dd64652) - **optimizer**: expand USING columns first in star expansion *(PR [#8536](https://github.com/tobymao/sqlglot/pull/8536) by [@VaggelisD](https://github.com/VaggelisD))*
164
+ - :arrow_lower_right: *fixes issue [#8516](https://github.com/tobymao/sqlglot/issues/8516) opened by [@laravioli](https://github.com/laravioli)*
165
+ - [`022bb41`](https://github.com/tobymao/sqlglot/commit/022bb41fc5f9b35ab303a5989edd1f9544ec11bb) - **duckdb**: generate USING SAMPLE before ORDER BY and LIMIT [CLAUDE] *(PR [#8550](https://github.com/tobymao/sqlglot/pull/8550) by [@Fcabla](https://github.com/Fcabla))*
166
+ - :arrow_lower_right: *fixes issue [#8546](https://github.com/tobymao/sqlglot/issues/8546) opened by [@Fcabla](https://github.com/Fcabla)*
167
+ - [`f2b81bf`](https://github.com/tobymao/sqlglot/commit/f2b81bfb2d2cf5b14b01be5211e022b23b6bec19) - **optimizer**: annotate FLOOR, CEIL and SIGN by their arg type *(PR [#8547](https://github.com/tobymao/sqlglot/pull/8547) by [@georgesittas](https://github.com/georgesittas))*
168
+ - [`97a2fa2`](https://github.com/tobymao/sqlglot/commit/97a2fa2ed6351835f07303bd839fec96a01c472e) - **mysql**: Misplaced table and index options. *(PR [#8553](https://github.com/tobymao/sqlglot/pull/8553) by [@burnison](https://github.com/burnison))*
169
+ - [`025a2f4`](https://github.com/tobymao/sqlglot/commit/025a2f46f9a29fcfc68d88ad0290c9c7f7e05320) - **clickhouse**: map bitwise aggregates to groupBitAnd/Or/Xor *(PR [#8556](https://github.com/tobymao/sqlglot/pull/8556) by [@ekut](https://github.com/ekut))*
170
+ - [`93aa16d`](https://github.com/tobymao/sqlglot/commit/93aa16deb98a0f85b4613405e2cfd2a5685bc3fb) - **mysql**: keep the CHAR length in CHARACTER SET casts [CLAUDE] *(PR [#8559](https://github.com/tobymao/sqlglot/pull/8559) by [@DylanMerigaud](https://github.com/DylanMerigaud))*
171
+ - [`507cbf9`](https://github.com/tobymao/sqlglot/commit/507cbf99ca3f34b7f7f7fc26a90a94031c2452cd) - **optimizer**: qualify DuckDB list comprehension variables *(PR [#8557](https://github.com/tobymao/sqlglot/pull/8557) by [@georgesittas](https://github.com/georgesittas))*
172
+ - [`862fd55`](https://github.com/tobymao/sqlglot/commit/862fd55467e09527e07240725c6e78c793099ff1) - **trino**: preserve precision for all temporal literals *(PR [#8564](https://github.com/tobymao/sqlglot/pull/8564) by [@georgesittas](https://github.com/georgesittas))*
173
+ - :arrow_lower_right: *fixes issue [#8562](https://github.com/tobymao/sqlglot/issues/8562) opened by [@ansh-rohilla](https://github.com/ansh-rohilla)*
174
+ - [`1a0fc42`](https://github.com/tobymao/sqlglot/commit/1a0fc4299add581c61a21c92d0c41d13698b20c5) - **parser**: `ALTER` actions/options in any order. *(PR [#8565](https://github.com/tobymao/sqlglot/pull/8565) by [@burnison](https://github.com/burnison))*
175
+ - [`56910fd`](https://github.com/tobymao/sqlglot/commit/56910fd955e62d8e20ba85c1264123656698c178) - **optimizer**: allow simplification to scalar subqueries *(PR [#8573](https://github.com/tobymao/sqlglot/pull/8573) by [@georgesittas](https://github.com/georgesittas))*
176
+ - :arrow_lower_right: *fixes issue [#8568](https://github.com/tobymao/sqlglot/issues/8568) opened by [@laravioli](https://github.com/laravioli)*
177
+ - [`1e2cc21`](https://github.com/tobymao/sqlglot/commit/1e2cc210e2a336defd9037dfc66d9dae1e72780e) - **optimizer**: preserve CASE branches before always-true conditions *(PR [#8572](https://github.com/tobymao/sqlglot/pull/8572) by [@georgesittas](https://github.com/georgesittas))*
178
+ - :arrow_lower_right: *fixes issue [#8567](https://github.com/tobymao/sqlglot/issues/8567) opened by [@laravioli](https://github.com/laravioli)*
179
+ - [`9f2f4cd`](https://github.com/tobymao/sqlglot/commit/9f2f4cd5a2d25e967142d0c90d107128d4dc70e5) - **optimizer**: resolve correlated UNNEST fields from projection types *(PR [#8571](https://github.com/tobymao/sqlglot/pull/8571) by [@georgesittas](https://github.com/georgesittas))*
180
+ - [`6683ad2`](https://github.com/tobymao/sqlglot/commit/6683ad28a45a8b803de0ce650d737adec609fbd4) - **optimizer**: resolve correlated UNNEST fields from projection types *(PR [#8571](https://github.com/tobymao/sqlglot/pull/8571) by [@georgesittas](https://github.com/georgesittas))*
181
+ - [`361b23b`](https://github.com/tobymao/sqlglot/commit/361b23b87b5ee3a3a301c07daaf02d703aad21fe) - **parser**: allow SEARCH + CYCLE and CYCLE TO ... DEFAULT [CLAUDE] *(PR [#8574](https://github.com/tobymao/sqlglot/pull/8574) by [@DylanMerigaud](https://github.com/DylanMerigaud))*
182
+ - :arrow_lower_right: *fixes issue [#8569](https://github.com/tobymao/sqlglot/issues/8569) opened by [@hustontrevor](https://github.com/hustontrevor)*
183
+ - [`bea35b3`](https://github.com/tobymao/sqlglot/commit/bea35b336cba03cb528a6e34c17b265c84ed9793) - **bigquery,duckdb**: don't drop array elements after a subquery *(PR [#8575](https://github.com/tobymao/sqlglot/pull/8575) by [@blackmad-cradle](https://github.com/blackmad-cradle))*
184
+ - [`51864e7`](https://github.com/tobymao/sqlglot/commit/51864e76b42b26f1fdeb829e349bd43db4d81598) - **bigquery**: edge case in array generation *(commit by [@georgesittas](https://github.com/georgesittas))*
185
+ - [`1d8e1c9`](https://github.com/tobymao/sqlglot/commit/1d8e1c9963e36652a57dd837989b3e4bcb7fc90a) - **optimizer**: annotate sha2 for redshift properly *(PR [#8577](https://github.com/tobymao/sqlglot/pull/8577) by [@georgesittas](https://github.com/georgesittas))*
186
+ - [`b8333a8`](https://github.com/tobymao/sqlglot/commit/b8333a81f02fafaa040bb3b8535f1c17eb9caf0c) - **optimizer**: remove infer_schema from optimizer *(PR [#8552](https://github.com/tobymao/sqlglot/pull/8552) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
187
+
188
+ ### :wrench: Chores
189
+ - [`8f0d751`](https://github.com/tobymao/sqlglot/commit/8f0d751dd28b5cfa610c33691ca371d6389d392e) - fix multi-processing py313 CI warnings *(PR [#8477](https://github.com/tobymao/sqlglot/pull/8477) by [@georgesittas](https://github.com/georgesittas))*
190
+ - [`b12b50f`](https://github.com/tobymao/sqlglot/commit/b12b50fc068730fd04f864a3757cd8d356afccfa) - remove qualify for SPLIT_TO_TABLE *(commit by [@geooo109](https://github.com/geooo109))*
191
+ - [`971d004`](https://github.com/tobymao/sqlglot/commit/971d004474ff010eaf247f186d71dc39ae1151f9) - switch sqlglot[c] from sqlglot-mypy to upstream mypy *(PR [#8517](https://github.com/tobymao/sqlglot/pull/8517) by [@VaggelisD](https://github.com/VaggelisD))*
192
+ - [`6de29fd`](https://github.com/tobymao/sqlglot/commit/6de29fdce762e564002e0ae0d8d09c388ebc4cfb) - FROM-first multi-table INSERT cleanup *(PR [#8535](https://github.com/tobymao/sqlglot/pull/8535) by [@geooo109](https://github.com/geooo109))*
193
+ - [`aa58ce6`](https://github.com/tobymao/sqlglot/commit/aa58ce602e3f50b87192f2e1bd2994d56da10c3c) - **optimizer**: optionally copy input ast *(PR [#8566](https://github.com/tobymao/sqlglot/pull/8566) by [@georgesittas](https://github.com/georgesittas))*
194
+ - [`b78bd9c`](https://github.com/tobymao/sqlglot/commit/b78bd9cc28aef86e94f05031538a0c32ee6980f8) - avoid compiling schema.py *(PR [#8576](https://github.com/tobymao/sqlglot/pull/8576) by [@geooo109](https://github.com/geooo109))*
195
+
196
+
4
197
  ## [v30.21.0] - 2026-09-30
5
198
  ### :boom: BREAKING CHANGES
6
199
  - due to [`2be1e0e`](https://github.com/tobymao/sqlglot/commit/2be1e0e2addc0ef01cfa3fd3cf2ef751cdbf411d) - annotate `bit_xor` for duckdb *(PR [#8452](https://github.com/tobymao/sqlglot/pull/8452) by [@opencode13241-eng](https://github.com/opencode13241-eng))*:
@@ -16045,3 +16238,4 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
16045
16238
  [v30.19.0]: https://github.com/tobymao/sqlglot/compare/v30.18.0...v30.19.0
16046
16239
  [v30.20.0]: https://github.com/tobymao/sqlglot/compare/v30.19.0...v30.20.0
16047
16240
  [v30.21.0]: https://github.com/tobymao/sqlglot/compare/v30.20.0...v30.21.0
16241
+ [v30.22.0]: https://github.com/tobymao/sqlglot/compare/v30.21.0...v30.22.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 30.22.0
3
+ Version: 30.23.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
@@ -34,10 +34,10 @@ Requires-Dist: types-pytz; extra == "dev"
34
34
  Requires-Dist: typing_extensions; extra == "dev"
35
35
  Requires-Dist: pyperf; extra == "dev"
36
36
  Provides-Extra: c
37
- Requires-Dist: sqlglotc==30.22.0; python_version >= "3.10" and extra == "c"
37
+ Requires-Dist: sqlglotc==30.23.0; python_version >= "3.10" and extra == "c"
38
38
  Provides-Extra: rs
39
39
  Requires-Dist: sqlglotrs==0.13.0; extra == "rs"
40
- Requires-Dist: sqlglotc==30.22.0; python_version >= "3.10" and extra == "rs"
40
+ Requires-Dist: sqlglotc==30.23.0; python_version >= "3.10" and extra == "rs"
41
41
  Dynamic: license-file
42
42
  Dynamic: provides-extra
43
43
 
@@ -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.22.0'
22
- __version_tuple__ = version_tuple = (30, 22, 0)
21
+ __version__ = version = '30.23.0'
22
+ __version_tuple__ = version_tuple = (30, 23, 0)
23
23
 
24
- __commit_id__ = commit_id = 'gb8333a81f'
24
+ __commit_id__ = commit_id = 'gad8764a04'
@@ -15,6 +15,7 @@ ANONYMIZED_TYPES = {
15
15
  TokenType.HEX_STRING,
16
16
  TokenType.HEREDOC_STRING,
17
17
  TokenType.IDENTIFIER,
18
+ TokenType.NATIONAL_RAW_STRING,
18
19
  TokenType.NATIONAL_STRING,
19
20
  TokenType.NUMBER,
20
21
  TokenType.RAW_STRING,
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
 
4
4
  from sqlglot import tokens
5
5
  from sqlglot.dialects.dialect import DialectType
6
+ from sqlglot.errors import TokenError
6
7
  from sqlglot.generators.athena import AthenaGenerator
7
8
  from sqlglot.parsers.athena import AthenaParser
8
9
  from sqlglot.tokens import TokenType, Token
@@ -74,7 +75,22 @@ class Athena(Trino):
74
75
  self._trino_tokenizer = _TrinoTokenizer(Trino())
75
76
 
76
77
  def tokenize(self, sql: str) -> list[Token]:
77
- tokens = super().tokenize(sql)
78
+ try:
79
+ tokens = super().tokenize(sql)
80
+ except TokenError:
81
+ # Combined rules can reject literals valid in only one engine.
82
+ for tokenizer, hive in (
83
+ (self._trino_tokenizer, False),
84
+ (self._hive_tokenizer, True),
85
+ ):
86
+ try:
87
+ tokens = tokenizer.tokenize(sql)
88
+ except TokenError:
89
+ continue
90
+
91
+ if _tokenize_as_hive(tokens) == hive:
92
+ return [Token(TokenType.HIVE_TOKEN_STREAM, "")] + tokens if hive else tokens
93
+ raise
78
94
 
79
95
  if _tokenize_as_hive(tokens):
80
96
  return [Token(TokenType.HIVE_TOKEN_STREAM, "")] + self._hive_tokenizer.tokenize(sql)
@@ -33,6 +33,7 @@ class Databricks(Spark):
33
33
  class Tokenizer(Spark.Tokenizer):
34
34
  KEYWORDS = {
35
35
  **Spark.Tokenizer.KEYWORDS,
36
+ "MATCH_RECOGNIZE": TokenType.MATCH_RECOGNIZE,
36
37
  "STREAM": TokenType.STREAM,
37
38
  "VOID": TokenType.VOID,
38
39
  }
@@ -1304,6 +1304,31 @@ def bracket_to_element_at_sql(self: Generator, expression: exp.Bracket) -> str:
1304
1304
  return self.func("ELEMENT_AT", expression.this, index)
1305
1305
 
1306
1306
 
1307
+ def array_slice_to_slice_sql(self: Generator, expression: exp.ArraySlice) -> str:
1308
+ start = expression.args["start"]
1309
+ end = expression.args.get("end")
1310
+
1311
+ # Preserve unmarked slices and bounds that require runtime normalization or narrowing.
1312
+ if (
1313
+ expression.args.get("is_length") is False
1314
+ and expression.args.get("step") is None
1315
+ and start.is_int
1316
+ and 0 <= start.to_py() <= 2**31 - 1
1317
+ and end is not None
1318
+ and end.is_int
1319
+ and 0 <= end.to_py() <= 2**31 - 1
1320
+ ):
1321
+ start_value = max(start.to_py(), 1)
1322
+ return self.func(
1323
+ "SLICE",
1324
+ expression.this,
1325
+ exp.Literal.number(start_value),
1326
+ exp.Literal.number(max(end.to_py() - start_value + 1, 0)),
1327
+ )
1328
+
1329
+ return rename_func("SLICE")(self, expression)
1330
+
1331
+
1307
1332
  @unsupported_args("accuracy")
1308
1333
  def approx_count_distinct_sql(self: Generator, expression: exp.ApproxDistinct) -> str:
1309
1334
  return self.func("APPROX_COUNT_DISTINCT", expression.this)
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import string
3
4
  import typing as t
4
5
 
5
6
  from sqlglot import exp, tokens
@@ -65,6 +66,31 @@ class Oracle(Dialect):
65
66
  for prefix in ("U", "u")
66
67
  ]
67
68
 
69
+ # https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Literals.html
70
+ # Alternative quoting, e.g. q'[it's]': the delimiters are part of the quote, so the
71
+ # text in between is taken as is, without escapes
72
+ RAW_STRINGS = [
73
+ (f"{prefix}'{start}", f"{end}'")
74
+ for prefix in ("q", "Q")
75
+ for start, end in (
76
+ ("[", "]"),
77
+ ("{", "}"),
78
+ ("(", ")"),
79
+ ("<", ">"),
80
+ *(
81
+ (c, c)
82
+ for c in string.ascii_letters + string.digits + string.punctuation
83
+ if c not in "[{(<"
84
+ ),
85
+ )
86
+ ]
87
+ NATIONAL_RAW_STRINGS = [
88
+ (prefix + start, end)
89
+ for start, end in t.cast(list[tuple[str, str]], RAW_STRINGS)
90
+ for prefix in ("n", "N")
91
+ ]
92
+ STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS = False
93
+
68
94
  NESTED_COMMENTS = False
69
95
 
70
96
  KEYWORDS = {
@@ -82,6 +108,7 @@ class Oracle(Dialect):
82
108
  "ORDER SIBLINGS BY": TokenType.ORDER_SIBLINGS_BY,
83
109
  "SAMPLE": TokenType.TABLE_SAMPLE,
84
110
  "START": TokenType.BEGIN,
111
+ "SUBPARTITION": TokenType.PARTITION,
85
112
  "TOP": TokenType.TOP,
86
113
  "VARCHAR2": TokenType.VARCHAR,
87
114
  "SYSTIMESTAMP": TokenType.SYSTIMESTAMP,
@@ -35,6 +35,11 @@ class Snowflake(Dialect):
35
35
  UUID_IS_STRING_TYPE = True
36
36
  STAR_ILIKE_BACKSLASH_ESCAPE = True
37
37
 
38
+ # https://docs.snowflake.com/en/sql-reference/functions/split_to_table
39
+ DEFAULT_FUNCTIONS_COLUMN_NAMES = {
40
+ exp.SplitToTable: ("seq", "index", "value"),
41
+ }
42
+
38
43
  EXPRESSION_METADATA = EXPRESSION_METADATA.copy()
39
44
 
40
45
  # https://docs.snowflake.com/en/en/sql-reference/functions/initcap
@@ -23,6 +23,7 @@ class StarRocks(MySQL):
23
23
 
24
24
  KEYWORDS = {
25
25
  **MySQL.Tokenizer.KEYWORDS,
26
+ "HLL": TokenType.HLLSKETCH,
26
27
  "LARGEINT": TokenType.INT128,
27
28
  "REFRESH": TokenType.REFRESH,
28
29
  }
@@ -10,14 +10,25 @@ from sqlglot.errors import ParseError, TokenError
10
10
  from sqlglot.expressions.core import (
11
11
  Alias,
12
12
  Anonymous,
13
+ AtTimeZone,
14
+ Between,
15
+ Binary,
16
+ BitwiseNot,
13
17
  Boolean,
18
+ Bracket,
14
19
  Column,
15
20
  Condition,
21
+ Dot,
16
22
  EQ,
17
23
  Expr,
24
+ Func,
18
25
  Identifier,
26
+ In,
19
27
  Literal,
28
+ Neg,
29
+ Not,
20
30
  Null,
31
+ Paren,
21
32
  Placeholder,
22
33
  TABLE_PARTS,
23
34
  Var,
@@ -36,6 +47,8 @@ from sqlglot.expressions.query import (
36
47
  From,
37
48
  Schema,
38
49
  Select,
50
+ SetOperation,
51
+ Subquery,
39
52
  Table,
40
53
  TableAlias,
41
54
  Tuple,
@@ -44,7 +57,7 @@ from sqlglot.expressions.query import (
44
57
  With,
45
58
  Query,
46
59
  )
47
- from sqlglot.expressions.ddl import Alter, AlterRename, RenameColumn
60
+ from sqlglot.expressions.ddl import Alter, AlterRename, Create, RenameColumn
48
61
  from sqlglot.expressions.dml import Delete, Insert, Merge, Update, When, Whens
49
62
  from sqlglot.expressions.functions import Case, Cast
50
63
  from sqlglot.expressions.array import Array
@@ -53,11 +66,10 @@ from sqlglot.expressions.array import Array
53
66
  if t.TYPE_CHECKING:
54
67
  from collections.abc import Sequence, Iterable, Iterator
55
68
  from sqlglot.dialects.dialect import DialectType
56
- from sqlglot.expressions.core import ExpOrStr, Func
69
+ from sqlglot.expressions.core import ExpOrStr
57
70
  from sqlglot.expressions.datatypes import DATA_TYPE
58
71
  from sqlglot._typing import ParserArgs, ParserNoDialectArgs, E, P
59
72
  from typing_extensions import Unpack, Concatenate
60
- from sqlglot.expressions.core import Dot
61
73
 
62
74
 
63
75
  def select(
@@ -849,6 +861,43 @@ def replace_tables(
849
861
  return expression.transform(_replace_tables, copy=copy) # type: ignore
850
862
 
851
863
 
864
+ OPERATORS = (AtTimeZone, Between, Binary, BitwiseNot, In, Neg, Not)
865
+
866
+
867
+ def _is_operand(placeholder: Placeholder) -> bool:
868
+ parent = placeholder.parent
869
+ if isinstance(parent, (Bracket, In)):
870
+ return placeholder.arg_key == "this"
871
+ return isinstance(parent, OPERATORS)
872
+
873
+
874
+ def _takes_query(placeholder: Placeholder) -> bool:
875
+ parent = placeholder.parent
876
+ if isinstance(parent, In):
877
+ return placeholder.arg_key == "expressions" and len(parent.expressions) == 1
878
+ if isinstance(parent, Func):
879
+ return len(list(parent.iter_expressions())) == 1
880
+ if isinstance(parent, Table):
881
+ return isinstance(parent.parent, (Create, Subquery))
882
+ return not parent or isinstance(parent, (CTE, Paren, SetOperation))
883
+
884
+
885
+ def _replace_placeholder(placeholder: Placeholder, expression: Expr) -> Expr:
886
+ if (
887
+ isinstance(expression, Query)
888
+ and not isinstance(expression, Subquery)
889
+ and not _takes_query(placeholder)
890
+ ):
891
+ return expression.subquery(copy=False)
892
+ if (
893
+ _is_operand(placeholder)
894
+ and isinstance(expression, OPERATORS)
895
+ and not isinstance(expression, Dot)
896
+ ):
897
+ return Paren(this=expression)
898
+ return expression
899
+
900
+
852
901
  def replace_placeholders(expression: Expr, *args: object, **kwargs: t.Any) -> Expr:
853
902
  """Replace placeholders in an expression.
854
903
 
@@ -874,10 +923,10 @@ def replace_placeholders(expression: Expr, *args: object, **kwargs: t.Any) -> Ex
874
923
  if node.this:
875
924
  new_name = kwargs.get(node.this)
876
925
  if new_name is not None:
877
- return convert(new_name)
926
+ return _replace_placeholder(node, convert(new_name))
878
927
  else:
879
928
  try:
880
- return convert(next(args))
929
+ return _replace_placeholder(node, convert(next(args)))
881
930
  except StopIteration:
882
931
  pass
883
932
  return node
@@ -208,6 +208,7 @@ class Constraint(Expression):
208
208
 
209
209
  class ForeignKey(Expression):
210
210
  arg_types = {
211
+ "this": False,
211
212
  "expressions": False,
212
213
  "reference": False,
213
214
  "delete": False,
@@ -867,7 +867,7 @@ class Expression(Expr):
867
867
  for k in sorted(node.args):
868
868
  v = node.args[k]
869
869
  if v:
870
- hash_ = hash((hash_, k, v))
870
+ hash_ = hash((hash_, k, tuple(v) if type(v) is list else v))
871
871
  else:
872
872
  for k in sorted(node.args):
873
873
  v = node.args[k]
@@ -1595,7 +1595,14 @@ class Uncache(Expression):
1595
1595
 
1596
1596
 
1597
1597
  class Refresh(Expression):
1598
- arg_types = {"this": True, "kind": True}
1598
+ arg_types = {
1599
+ "this": True,
1600
+ "kind": True,
1601
+ "partition_start": False,
1602
+ "partition_end": False,
1603
+ "force": False,
1604
+ "mode": False,
1605
+ }
1599
1606
 
1600
1607
 
1601
1608
  class LockingStatement(Expression):
@@ -1859,6 +1866,7 @@ class SessionParameter(Expression, Condition):
1859
1866
 
1860
1867
  class Placeholder(Expression, Condition):
1861
1868
  arg_types = {"this": False, "kind": False, "widget": False, "jdbc": False}
1869
+ _hash_raw_args = True
1862
1870
 
1863
1871
  @property
1864
1872
  def name(self) -> str:
@@ -1994,6 +2002,7 @@ class Typeof(Expression, Func):
1994
2002
 
1995
2003
  class ParameterizedAgg(Expression, AggFunc):
1996
2004
  arg_types = {"this": True, "expressions": True, "params": True}
2005
+ _hash_raw_args = True
1997
2006
 
1998
2007
 
1999
2008
  class Anonymous(Expression, Func):
@@ -2008,6 +2017,7 @@ class Anonymous(Expression, Func):
2008
2017
  class AnonymousAggFunc(Expression, AggFunc):
2009
2018
  arg_types = {"this": True, "expressions": False}
2010
2019
  is_var_len_args = True
2020
+ _hash_raw_args = True
2011
2021
 
2012
2022
 
2013
2023
  class CombinedAggFunc(AnonymousAggFunc):
@@ -2211,7 +2221,7 @@ class Like(Expression, Binary, Predicate):
2211
2221
 
2212
2222
 
2213
2223
  class Match(Expression, Binary, Predicate):
2214
- pass
2224
+ arg_types = {"this": True, "expression": True, "kind": False, "analyzer": False}
2215
2225
 
2216
2226
 
2217
2227
  class LT(Expression, Binary, Predicate):
@@ -176,6 +176,7 @@ class Set(Expression):
176
176
 
177
177
  class Heredoc(Expression):
178
178
  arg_types = {"this": True, "tag": False}
179
+ _hash_raw_args = True
179
180
 
180
181
 
181
182
  class SetItem(Expression):
@@ -382,6 +383,7 @@ class Undrop(Expression):
382
383
 
383
384
  class Command(Expression):
384
385
  arg_types = {"this": True, "expression": False}
386
+ _hash_raw_args = True
385
387
 
386
388
 
387
389
  class Transaction(Expression):
@@ -100,6 +100,7 @@ class JSONExists(Expression, Func):
100
100
  "on_condition": False,
101
101
  "from_dcolonqmark": False,
102
102
  }
103
+ _hash_raw_args = True
103
104
 
104
105
 
105
106
  class JSONExtract(Expression, Binary, Func):