sqlglot 30.22.0__tar.gz → 30.24.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 (340) hide show
  1. {sqlglot-30.22.0 → sqlglot-30.24.0}/CHANGELOG.md +259 -0
  2. {sqlglot-30.22.0/sqlglot.egg-info → sqlglot-30.24.0}/PKG-INFO +3 -3
  3. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/_version.py +3 -3
  4. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/anonymize.py +1 -0
  5. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/athena.py +17 -1
  6. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/clickhouse.py +1 -0
  7. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/databricks.py +1 -0
  8. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/dialect.py +40 -1
  9. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/oracle.py +28 -0
  10. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/postgres.py +4 -0
  11. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/snowflake.py +5 -0
  12. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/starrocks.py +18 -0
  13. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/array.py +1 -5
  14. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/builders.py +54 -5
  15. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/constraints.py +1 -0
  16. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/core.py +13 -3
  17. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/ddl.py +2 -0
  18. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/json.py +1 -0
  19. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/properties.py +17 -0
  20. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/query.py +17 -0
  21. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generator.py +44 -2
  22. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/athena.py +5 -1
  23. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/bigquery.py +142 -1
  24. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/clickhouse.py +35 -2
  25. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/doris.py +6 -0
  26. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/duckdb.py +45 -42
  27. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/fabric.py +5 -0
  28. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/hive.py +4 -0
  29. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/mysql.py +3 -0
  30. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/oracle.py +22 -0
  31. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/postgres.py +8 -3
  32. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/presto.py +16 -8
  33. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/snowflake.py +15 -7
  34. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/spark2.py +24 -2
  35. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/starrocks.py +56 -4
  36. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/teradata.py +30 -1
  37. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/helper.py +17 -0
  38. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/annotate_types.py +24 -16
  39. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/merge_subqueries.py +7 -3
  40. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/optimize_joins.py +5 -1
  41. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/qualify_columns.py +36 -12
  42. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/qualify_tables.py +4 -1
  43. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/scope.py +8 -7
  44. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/simplify.py +23 -5
  45. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/unnest_subqueries.py +32 -3
  46. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parser.py +177 -44
  47. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/athena.py +8 -0
  48. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/clickhouse.py +11 -1
  49. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/doris.py +40 -0
  50. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/dremio.py +3 -0
  51. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/drill.py +3 -0
  52. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/duckdb.py +41 -8
  53. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/hive.py +13 -0
  54. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/mysql.py +84 -3
  55. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/oracle.py +80 -3
  56. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/postgres.py +4 -1
  57. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/presto.py +2 -0
  58. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/prql.py +2 -8
  59. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/redshift.py +3 -1
  60. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/singlestore.py +3 -0
  61. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/snowflake.py +4 -4
  62. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/spark2.py +11 -5
  63. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/sqlite.py +14 -1
  64. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/starrocks.py +145 -11
  65. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/teradata.py +59 -0
  66. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/trino.py +6 -1
  67. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/tokenizer_core.py +4 -1
  68. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/tokens.py +3 -0
  69. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/transforms.py +3 -3
  70. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/__init__.py +1 -1
  71. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/duckdb.py +18 -0
  72. {sqlglot-30.22.0 → sqlglot-30.24.0/sqlglot.egg-info}/PKG-INFO +3 -3
  73. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot.egg-info/SOURCES.txt +1 -0
  74. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot.egg-info/requires.txt +2 -2
  75. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot.egg-info/scm_file_list.json +1 -0
  76. sqlglot-30.24.0/sqlglot.egg-info/scm_version.json +8 -0
  77. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglotc/setup.py +17 -0
  78. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_athena.py +36 -1
  79. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_bigquery.py +74 -2
  80. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_clickhouse.py +108 -0
  81. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_databricks.py +23 -0
  82. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_dialect.py +199 -13
  83. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_doris.py +63 -1
  84. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_duckdb.py +108 -30
  85. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_fabric.py +7 -0
  86. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_hive.py +32 -13
  87. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_mysql.py +124 -0
  88. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_oracle.py +277 -0
  89. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_postgres.py +124 -2
  90. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_presto.py +10 -16
  91. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_snowflake.py +10 -19
  92. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_spark.py +52 -11
  93. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_sqlite.py +40 -0
  94. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_starrocks.py +220 -1
  95. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_teradata.py +76 -1
  96. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_trino.py +125 -0
  97. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +4 -0
  98. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/merge_subqueries.sql +52 -0
  99. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/optimizer.sql +18 -0
  100. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/qualify_columns.sql +21 -0
  101. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/qualify_tables.sql +25 -0
  102. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/simplify.sql +64 -0
  103. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_anonymize.py +1 -0
  104. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_build.py +2 -0
  105. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_expressions.py +111 -0
  106. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_generator.py +9 -0
  107. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_helper.py +21 -1
  108. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_optimizer.py +197 -0
  109. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_parser.py +132 -6
  110. sqlglot-30.24.0/tests/test_sqlglotc.py +113 -0
  111. sqlglot-30.22.0/sqlglot.egg-info/scm_version.json +0 -8
  112. {sqlglot-30.22.0 → sqlglot-30.24.0}/.gitignore +0 -0
  113. {sqlglot-30.22.0 → sqlglot-30.24.0}/.gitmodules +0 -0
  114. {sqlglot-30.22.0 → sqlglot-30.24.0}/.gitpod.yml +0 -0
  115. {sqlglot-30.22.0 → sqlglot-30.24.0}/.pre-commit-config.yaml +0 -0
  116. {sqlglot-30.22.0 → sqlglot-30.24.0}/AGENTS.md +0 -0
  117. {sqlglot-30.22.0 → sqlglot-30.24.0}/CLAUDE.md +0 -0
  118. {sqlglot-30.22.0 → sqlglot-30.24.0}/CONTRIBUTING.md +0 -0
  119. {sqlglot-30.22.0 → sqlglot-30.24.0}/LICENSE +0 -0
  120. {sqlglot-30.22.0 → sqlglot-30.24.0}/MANIFEST.in +0 -0
  121. {sqlglot-30.22.0 → sqlglot-30.24.0}/Makefile +0 -0
  122. {sqlglot-30.22.0 → sqlglot-30.24.0}/README.md +0 -0
  123. {sqlglot-30.22.0 → sqlglot-30.24.0}/pyproject.toml +0 -0
  124. {sqlglot-30.22.0 → sqlglot-30.24.0}/setup.cfg +0 -0
  125. {sqlglot-30.22.0 → sqlglot-30.24.0}/setup.py +0 -0
  126. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/__init__.py +0 -0
  127. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/__main__.py +0 -0
  128. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/_typing.py +0 -0
  129. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/__init__.py +0 -0
  130. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/bigquery.py +0 -0
  131. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/dax.py +0 -0
  132. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/doris.py +0 -0
  133. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/dremio.py +0 -0
  134. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/drill.py +0 -0
  135. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/druid.py +0 -0
  136. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/duckdb.py +0 -0
  137. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/dune.py +0 -0
  138. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/exasol.py +0 -0
  139. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/fabric.py +0 -0
  140. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/hive.py +0 -0
  141. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/materialize.py +0 -0
  142. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/mysql.py +0 -0
  143. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/presto.py +0 -0
  144. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/prql.py +0 -0
  145. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/redshift.py +0 -0
  146. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/risingwave.py +0 -0
  147. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/singlestore.py +0 -0
  148. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/solr.py +0 -0
  149. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/spark.py +0 -0
  150. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/spark2.py +0 -0
  151. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/sqlite.py +0 -0
  152. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/tableau.py +0 -0
  153. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/teradata.py +0 -0
  154. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/trino.py +0 -0
  155. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/dialects/tsql.py +0 -0
  156. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/diff.py +0 -0
  157. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/errors.py +0 -0
  158. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/executor/__init__.py +0 -0
  159. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/executor/context.py +0 -0
  160. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/executor/env.py +0 -0
  161. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/executor/python.py +0 -0
  162. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/executor/table.py +0 -0
  163. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/__init__.py +0 -0
  164. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/aggregate.py +0 -0
  165. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/datatypes.py +0 -0
  166. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/dml.py +0 -0
  167. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/functions.py +0 -0
  168. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/math.py +0 -0
  169. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/string.py +0 -0
  170. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/expressions/temporal.py +0 -0
  171. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/__init__.py +0 -0
  172. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/databricks.py +0 -0
  173. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/dax.py +0 -0
  174. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/dremio.py +0 -0
  175. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/drill.py +0 -0
  176. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/druid.py +0 -0
  177. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/dune.py +0 -0
  178. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/exasol.py +0 -0
  179. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/materialize.py +0 -0
  180. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/prql.py +0 -0
  181. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/python.py +0 -0
  182. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/redshift.py +0 -0
  183. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/risingwave.py +0 -0
  184. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/singlestore.py +0 -0
  185. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/solr.py +0 -0
  186. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/spark.py +0 -0
  187. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/sqlite.py +0 -0
  188. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/tableau.py +0 -0
  189. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/trino.py +0 -0
  190. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/generators/tsql.py +0 -0
  191. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/jsonpath.py +0 -0
  192. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/lineage.py +0 -0
  193. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/__init__.py +0 -0
  194. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/canonicalize.py +0 -0
  195. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/canonicalize_internal_names.py +0 -0
  196. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  197. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  198. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  199. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/helpers.py +0 -0
  200. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  201. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/journal.py +0 -0
  202. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/normalize.py +0 -0
  203. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  204. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/optimizer.py +0 -0
  205. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
  206. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  207. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/qualify.py +0 -0
  208. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/optimizer/resolver.py +0 -0
  209. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/__init__.py +0 -0
  210. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/base.py +0 -0
  211. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/bigquery.py +0 -0
  212. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/databricks.py +0 -0
  213. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/dax.py +0 -0
  214. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/druid.py +0 -0
  215. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/dune.py +0 -0
  216. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/exasol.py +0 -0
  217. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/fabric.py +0 -0
  218. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/materialize.py +0 -0
  219. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/risingwave.py +0 -0
  220. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/solr.py +0 -0
  221. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/spark.py +0 -0
  222. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/tableau.py +0 -0
  223. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/parsers/tsql.py +0 -0
  224. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/planner.py +0 -0
  225. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/py.typed +0 -0
  226. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/schema.py +0 -0
  227. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/serde.py +0 -0
  228. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/time.py +0 -0
  229. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/trie.py +0 -0
  230. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/bigquery.py +0 -0
  231. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/clickhouse.py +0 -0
  232. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/databricks.py +0 -0
  233. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/hive.py +0 -0
  234. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/mysql.py +0 -0
  235. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/postgres.py +0 -0
  236. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/presto.py +0 -0
  237. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/redshift.py +0 -0
  238. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/snowflake.py +0 -0
  239. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/spark.py +0 -0
  240. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/spark2.py +0 -0
  241. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot/typing/tsql.py +0 -0
  242. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  243. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot.egg-info/top_level.txt +0 -0
  244. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglot.png +0 -0
  245. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglotc/MANIFEST.in +0 -0
  246. {sqlglot-30.22.0 → sqlglot-30.24.0}/sqlglotc/pyproject.toml +0 -0
  247. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/__init__.py +0 -0
  248. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/__init__.py +0 -0
  249. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_dax.py +0 -0
  250. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_dremio.py +0 -0
  251. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_drill.py +0 -0
  252. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_druid.py +0 -0
  253. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_dune.py +0 -0
  254. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_exasol.py +0 -0
  255. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_materialize.py +0 -0
  256. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_pipe_syntax.py +0 -0
  257. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_prql.py +0 -0
  258. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_redshift.py +0 -0
  259. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_risingwave.py +0 -0
  260. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_singlestore.py +0 -0
  261. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_solr.py +0 -0
  262. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_tableau.py +0 -0
  263. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/dialects/test_tsql.py +0 -0
  264. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/identity.sql +0 -0
  265. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  266. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/jsonpath/cts.json +0 -0
  267. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/annotate_functions.sql +0 -0
  268. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  269. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  270. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/canonicalize_internal_names.sql +0 -0
  271. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  272. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  273. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  274. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  275. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  276. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  277. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  278. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  279. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  280. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  281. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  282. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  283. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  284. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  285. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  286. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  287. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  288. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  289. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  290. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  291. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  292. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  293. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  294. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  295. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  296. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  297. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  298. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  299. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  300. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  301. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  302. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  303. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  304. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  305. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  306. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  307. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  308. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  309. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  310. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  311. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  312. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  313. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  314. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  315. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  316. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  317. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  318. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  319. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/partial.sql +0 -0
  320. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/fixtures/pretty.sql +0 -0
  321. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/gen_fixtures.py +0 -0
  322. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/helpers.py +0 -0
  323. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/leakcheck.py +0 -0
  324. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/sqlglot/__init__.py +0 -0
  325. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_dialect_entry_points.py +0 -0
  326. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_dialect_imports.py +0 -0
  327. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_diff.py +0 -0
  328. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_docs.py +0 -0
  329. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_errors.py +0 -0
  330. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_executor.py +0 -0
  331. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_integration_loader.py +0 -0
  332. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_jsonpath.py +0 -0
  333. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_lineage.py +0 -0
  334. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_schema.py +0 -0
  335. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_serde.py +0 -0
  336. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_time.py +0 -0
  337. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_tokens.py +0 -0
  338. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_transforms.py +0 -0
  339. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_transpile.py +0 -0
  340. {sqlglot-30.22.0 → sqlglot-30.24.0}/tests/test_typing.py +0 -0
@@ -1,6 +1,263 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v30.23.0] - 2026-10-14
5
+ ### :boom: BREAKING CHANGES
6
+ - due to [`cf39265`](https://github.com/tobymao/sqlglot/commit/cf39265a3e8efd8c32bab7f9c9b4f123fdfbf682) - hash flag for case-sensitive nodes [CLAUDE] *(PR [#8599](https://github.com/tobymao/sqlglot/pull/8599) by [@laravioli](https://github.com/laravioli))*:
7
+
8
+ hash flag for case-sensitive nodes [CLAUDE] (#8599)
9
+
10
+ - due to [`4d7d7ca`](https://github.com/tobymao/sqlglot/commit/4d7d7ca94250269dc1903d7175b7b8aa96e9a480) - generate JSONExtractRaw for JSON-valued extraction *(PR [#8601](https://github.com/tobymao/sqlglot/pull/8601) by [@ebarkhordar](https://github.com/ebarkhordar))*:
11
+
12
+ generate JSONExtractRaw for JSON-valued extraction (#8601)
13
+
14
+ - due to [`623dc88`](https://github.com/tobymao/sqlglot/commit/623dc8889ba7bffa9b006fd1d1641715b73d5ce4) - infer correct types for temporal interval arithmetic *(PR [#8622](https://github.com/tobymao/sqlglot/pull/8622) by [@georgesittas](https://github.com/georgesittas))*:
15
+
16
+ infer correct types for temporal interval arithmetic (#8622)
17
+
18
+
19
+ ### :sparkles: New Features
20
+ - [`8abe7f8`](https://github.com/tobymao/sqlglot/commit/8abe7f8382c80f95cb1e5a8a985969f6c11fd03a) - **starrocks**: parse TIME_SLICE into exp.TimeSlice [CLAUDE] *(PR [#8555](https://github.com/tobymao/sqlglot/pull/8555) by [@nytai](https://github.com/nytai))*
21
+ - [`f3a6eb9`](https://github.com/tobymao/sqlglot/commit/f3a6eb95e424ef03bf20fca05a0431a666946e90) - **doris**: parse full-text search operators [CLAUDE] *(PR [#8585](https://github.com/tobymao/sqlglot/pull/8585) by [@kaya-abdullah](https://github.com/kaya-abdullah))*
22
+ - :arrow_lower_right: *addresses issue [#8584](https://github.com/tobymao/sqlglot/issues/8584) opened by [@kaya-abdullah](https://github.com/kaya-abdullah)*
23
+ - [`3ba19ee`](https://github.com/tobymao/sqlglot/commit/3ba19eedd7b381f990f9926266457eda7a60095b) - **starrocks**: support AGGREGATE KEY tables [CLAUDE] *(PR [#8591](https://github.com/tobymao/sqlglot/pull/8591) by [@nytai](https://github.com/nytai))*
24
+ - [`9114355`](https://github.com/tobymao/sqlglot/commit/9114355463fd02a9b505c869edb0561503a07b19) - **mysql**: Allow constraints without names. *(PR [#8600](https://github.com/tobymao/sqlglot/pull/8600) by [@burnison](https://github.com/burnison))*
25
+ - [`6202d94`](https://github.com/tobymao/sqlglot/commit/6202d94764305621117dc6229cda79575ca103e5) - **starrocks**: support HLL columns and the HLL_UNION aggregation type [CLAUDE] *(PR [#8612](https://github.com/tobymao/sqlglot/pull/8612) by [@nytai](https://github.com/nytai))*
26
+ - [`0b00178`](https://github.com/tobymao/sqlglot/commit/0b0017821590b08497529d37387396adb6c3aa5b) - **spark**: parse all ALTER TABLE DROP COLUMN[S] forms [CLAUDE] *(PR [#8611](https://github.com/tobymao/sqlglot/pull/8611) by [@tsamaras](https://github.com/tsamaras))*
27
+ - [`59a96d8`](https://github.com/tobymao/sqlglot/commit/59a96d868a6b8ed114ac3e216201106fea8bc351) - **starrocks**: support REFRESH MATERIALIZED VIEW options [CLAUDE] *(PR [#8613](https://github.com/tobymao/sqlglot/pull/8613) by [@nytai](https://github.com/nytai))*
28
+ - [`676ba36`](https://github.com/tobymao/sqlglot/commit/676ba365497215dadf89c3fa57f4872529745650) - **mysql**: Support named `FOREIGN KEY` indexes. *(PR [#8615](https://github.com/tobymao/sqlglot/pull/8615) by [@burnison](https://github.com/burnison))*
29
+ - [`b679d0c`](https://github.com/tobymao/sqlglot/commit/b679d0cf8cad5bab7bb5004d9b8f8ce51d542b42) - **databricks**: match_recognize support closes [#8617](https://github.com/tobymao/sqlglot/pull/8617) *(commit by [@georgesittas](https://github.com/georgesittas))*
30
+
31
+ ### :bug: Bug Fixes
32
+ - [`a00dc2e`](https://github.com/tobymao/sqlglot/commit/a00dc2e5c489214bea53bacbbeba8713f21ebce1) - **postgres**: improve json_value support closes [#8579](https://github.com/tobymao/sqlglot/pull/8579) *(commit by [@georgesittas](https://github.com/georgesittas))*
33
+ - [`ffb9721`](https://github.com/tobymao/sqlglot/commit/ffb9721df98984c62817701ec8cd895cb3b1ee82) - **oracle**: tokenize q'...' quoted string literals [CLAUDE] *(PR [#8582](https://github.com/tobymao/sqlglot/pull/8582) by [@DylanMerigaud](https://github.com/DylanMerigaud))*
34
+ - [`e237d59`](https://github.com/tobymao/sqlglot/commit/e237d5980e8084cd2eceb874280efc3f3369c0ba) - **optimizer**: keep the alias outside of COALESCE when unnesting a COUNT subquery [CLAUDE] *(PR [#8589](https://github.com/tobymao/sqlglot/pull/8589) by [@anishmehta24](https://github.com/anishmehta24))*
35
+ - [`98bedf6`](https://github.com/tobymao/sqlglot/commit/98bedf649b244d321782a213944320d54f7cc868) - **oracle**: parse partition clauses and flashback queries [CODEX] *(PR [#8588](https://github.com/tobymao/sqlglot/pull/8588) by [@yousefissa](https://github.com/yousefissa))*
36
+ - :arrow_lower_right: *fixes issue [#8587](https://github.com/tobymao/sqlglot/issues/8587) opened by [@cofin](https://github.com/cofin)*
37
+ - [`09481ce`](https://github.com/tobymao/sqlglot/commit/09481cec085106bc77fb584e4d322f7e179a5a11) - **optimizer**: qualify bare USING columns after SEMI/ANTI JOIN closes [#8590](https://github.com/tobymao/sqlglot/pull/8590) *(PR [#8592](https://github.com/tobymao/sqlglot/pull/8592) by [@ansh-rohilla](https://github.com/ansh-rohilla))*
38
+ - :arrow_lower_right: *fixes issue [#8590](https://github.com/tobymao/sqlglot/issues/8590) opened by [@jackr-xceleration](https://github.com/jackr-xceleration)*
39
+ - [`df0a300`](https://github.com/tobymao/sqlglot/commit/df0a3006c485010e2bde4f2b6ce16594885772f0) - **duckdb**: append on 1-based ARRAY_INSERT -1 *(PR [#8597](https://github.com/tobymao/sqlglot/pull/8597) by [@siddharthsarda](https://github.com/siddharthsarda))*
40
+ - [`7d9a6cd`](https://github.com/tobymao/sqlglot/commit/7d9a6cd599c41e4bd886c757e1b9e60b39bef70c) - allow `EXTERNAL FUNCTION` in Athena `CTAS` *(PR [#8602](https://github.com/tobymao/sqlglot/pull/8602) by [@matthias-Q](https://github.com/matthias-Q))*
41
+ - [`e38929e`](https://github.com/tobymao/sqlglot/commit/e38929edd78a20f74fc19fee819e14ac23add687) - **teradata**: default window aggregate frame to the whole partition [CLAUDE] *(PR [#8596](https://github.com/tobymao/sqlglot/pull/8596) by [@bhuvan-uda](https://github.com/bhuvan-uda))*
42
+ - :arrow_lower_right: *fixes issue [#8595](https://github.com/tobymao/sqlglot/issues/8595) opened by [@bhuvan-uda](https://github.com/bhuvan-uda)*
43
+ - [`cf39265`](https://github.com/tobymao/sqlglot/commit/cf39265a3e8efd8c32bab7f9c9b4f123fdfbf682) - **expressions**: hash flag for case-sensitive nodes [CLAUDE] *(PR [#8599](https://github.com/tobymao/sqlglot/pull/8599) by [@laravioli](https://github.com/laravioli))*
44
+ - :arrow_lower_right: *fixes issue [#8598](https://github.com/tobymao/sqlglot/issues/8598) opened by [@laravioli](https://github.com/laravioli)*
45
+ - [`ab0a291`](https://github.com/tobymao/sqlglot/commit/ab0a291f91f1ba8c32058340bf76738c4ea685ea) - **oracle**: normalize flashback timestamps and simplify parsing *(PR [#8608](https://github.com/tobymao/sqlglot/pull/8608) by [@georgesittas](https://github.com/georgesittas))*
46
+ - [`a0cc28b`](https://github.com/tobymao/sqlglot/commit/a0cc28b91c3d186801d478e83967e967b86c90dd) - **doris**: round-trip MATCH operands and quoted analyzers *(PR [#8607](https://github.com/tobymao/sqlglot/pull/8607) by [@georgesittas](https://github.com/georgesittas))*
47
+ - [`4d7d7ca`](https://github.com/tobymao/sqlglot/commit/4d7d7ca94250269dc1903d7175b7b8aa96e9a480) - **clickhouse**: generate JSONExtractRaw for JSON-valued extraction *(PR [#8601](https://github.com/tobymao/sqlglot/pull/8601) by [@ebarkhordar](https://github.com/ebarkhordar))*
48
+ - [`1f8d15b`](https://github.com/tobymao/sqlglot/commit/1f8d15bbd68586704666533b21a5b35d710d68f0) - convert DuckDB ARRAY_SLICE endpoints to SLICE lengths *(PR [#8609](https://github.com/tobymao/sqlglot/pull/8609) by [@georgesittas](https://github.com/georgesittas))*
49
+ - [`61c3ca4`](https://github.com/tobymao/sqlglot/commit/61c3ca4479c167d9c90d51f73184568769fa0635) - **oracle**: parse CREATE TABLE TABLESPACE *(PR [#8605](https://github.com/tobymao/sqlglot/pull/8605) by [@cmodiano](https://github.com/cmodiano))*
50
+ - [`08f2405`](https://github.com/tobymao/sqlglot/commit/08f2405cfddc874f4366cbcca9e25233fcb11281) - **oracle**: expand alternative quoting and support national literals *(PR [#8606](https://github.com/tobymao/sqlglot/pull/8606) by [@georgesittas](https://github.com/georgesittas))*
51
+ - :arrow_lower_right: *fixes issue [#8580](https://github.com/tobymao/sqlglot/issues/8580) opened by [@cmodiano](https://github.com/cmodiano)*
52
+ - [`5b949bd`](https://github.com/tobymao/sqlglot/commit/5b949bd6b7f1db1474a87ac34d3a9246fa7de237) - **oracle**: parse CREATE TABLE physical attributes and storage clauses closes [#8581](https://github.com/tobymao/sqlglot/pull/8581) *(commit by [@georgesittas](https://github.com/georgesittas))*
53
+ - [`ba643d3`](https://github.com/tobymao/sqlglot/commit/ba643d33285475774c3253551e1ed18ac89e6c22) - **clickhouse**: transpile RegexpCount to countMatches [CLAUDE] *(PR [#8616](https://github.com/tobymao/sqlglot/pull/8616) by [@ekut](https://github.com/ekut))*
54
+ - [`623dc88`](https://github.com/tobymao/sqlglot/commit/623dc8889ba7bffa9b006fd1d1641715b73d5ce4) - **duckdb**: infer correct types for temporal interval arithmetic *(PR [#8622](https://github.com/tobymao/sqlglot/pull/8622) by [@georgesittas](https://github.com/georgesittas))*
55
+ - [`b1b244b`](https://github.com/tobymao/sqlglot/commit/b1b244b1f38a3000c94a7b21ee6dfae1959dd4b2) - **optimizer**: qualify columns for SPLIT_TO_TABLE *(PR [#8625](https://github.com/tobymao/sqlglot/pull/8625) by [@andrjohns](https://github.com/andrjohns))*
56
+ - [`e92c222`](https://github.com/tobymao/sqlglot/commit/e92c22287ff73a66e9dece115acedb81133f0dbf) - **duckdb**: cast array elements to text before applying the ARRAY_TO_STRING null replacement [CLAUDE] *(PR [#8627](https://github.com/tobymao/sqlglot/pull/8627) by [@anishmehta24](https://github.com/anishmehta24))*
57
+ - [`fbda0b9`](https://github.com/tobymao/sqlglot/commit/fbda0b91481d679f17844af15fb998cc559533be) - **parser**: keep the whole statement when REFRESH falls back to a cmd *(PR [#8621](https://github.com/tobymao/sqlglot/pull/8621) by [@nytai](https://github.com/nytai))*
58
+ - [`fdba492`](https://github.com/tobymao/sqlglot/commit/fdba492cec5a1fbe012add7f1aed18f46739c2a3) - **optimizer**: include semi/anti join refs when identifying alias collisions *(PR [#8623](https://github.com/tobymao/sqlglot/pull/8623) by [@treysp](https://github.com/treysp))*
59
+ - [`2c7b928`](https://github.com/tobymao/sqlglot/commit/2c7b928071ed32e72b218011a1a3c011dba26b24) - **athena**: route by each engine's rules when the combined tokenizer fails [CLAUDE] *(PR [#8629](https://github.com/tobymao/sqlglot/pull/8629) by [@masiljangajji](https://github.com/masiljangajji))*
60
+ - :arrow_lower_right: *fixes issue [#8628](https://github.com/tobymao/sqlglot/issues/8628) opened by [@masiljangajji](https://github.com/masiljangajji)*
61
+ - [`ad8764a`](https://github.com/tobymao/sqlglot/commit/ad8764a0436a7b5c500b783ebe50dbf20c1e477c) - keep a replacement's grouping in replace_placeholders *(PR [#8624](https://github.com/tobymao/sqlglot/pull/8624) by [@tobymao](https://github.com/tobymao))*
62
+
63
+ ### :wrench: Chores
64
+ - [`579789d`](https://github.com/tobymao/sqlglot/commit/579789dc3d368daf6aa0919ed5c0994187472a4b) - add support for Python 3.15 *(PR [#8586](https://github.com/tobymao/sqlglot/pull/8586) by [@Viicos](https://github.com/Viicos))*
65
+ - [`c0a9457`](https://github.com/tobymao/sqlglot/commit/c0a945740e55facdc7120c17cda2771dc55c7903) - **mysql**: tests for named FOREIGN KEY indexes *(commit by [@geooo109](https://github.com/geooo109))*
66
+
67
+
68
+ ## [v30.22.0] - 2026-10-09
69
+ ### :boom: BREAKING CHANGES
70
+ - 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))*:
71
+
72
+ Parse bare `ALTER TABLE ... DROP c`. (#8432)
73
+
74
+ - 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))*:
75
+
76
+ decode string escapes and preserve byte literals (#8479)
77
+
78
+ - 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))*:
79
+
80
+ preserve backslashes in string literals (#8481)
81
+
82
+ - 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))*:
83
+
84
+ correct PostgreSQL, DuckDB, Redshift, and ClickHouse string escapes (#8484)
85
+
86
+ - 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))*:
87
+
88
+ support mixed-operation `ALTER`s. (#8419)
89
+
90
+ - 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))*:
91
+
92
+ MySQL accepts non-CSV table options. (#8503)
93
+
94
+ - 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))*:
95
+
96
+ scope preserved function names to their dialect (#8512)
97
+
98
+ - 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))*:
99
+
100
+ expand stars in the order sources appear in FROM (#8529)
101
+
102
+ - 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))*:
103
+
104
+ support FROM-first multi-table INSERT [CLAUDE] (#8527)
105
+
106
+ - 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))*:
107
+
108
+ expand nested join constructs in qualify_tables (#8530)
109
+
110
+ - 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))*:
111
+
112
+ FROM-first multi-table INSERT cleanup (#8535)
113
+
114
+ - 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))*:
115
+
116
+ preserve precision for timestamp and time literals (#8534) (#8538)
117
+
118
+ - 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))*:
119
+
120
+ truncate integer division towards zero instead of rounding (#8532)
121
+
122
+ - due to [`b7e5153`](https://github.com/tobymao/sqlglot/commit/b7e515399a589e720b2bd081e5bb395f408feff8) - preserve bracket flags in gen serialization *(commit by [@georgesittas](https://github.com/georgesittas))*:
123
+
124
+ preserve bracket flags in gen serialization
125
+
126
+ - 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))*:
127
+
128
+ expand USING columns first in star expansion (#8536)
129
+
130
+ - 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))*:
131
+
132
+ annotate FLOOR, CEIL and SIGN by their arg type (#8547)
133
+
134
+ - 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))*:
135
+
136
+ Make `ALTER` actions optional. (#8539)
137
+
138
+ - 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))*:
139
+
140
+ preserve CASE branches before always-true conditions (#8572)
141
+
142
+ - 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))*:
143
+
144
+ resolve correlated UNNEST fields from projection types (#8571)
145
+
146
+ - 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))*:
147
+
148
+ resolve correlated UNNEST fields from projection types (#8571)
149
+
150
+ - due to [`51864e7`](https://github.com/tobymao/sqlglot/commit/51864e76b42b26f1fdeb829e349bd43db4d81598) - edge case in array generation *(commit by [@georgesittas](https://github.com/georgesittas))*:
151
+
152
+ edge case in array generation
153
+
154
+ - 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))*:
155
+
156
+ annotate sha2 for redshift properly (#8577)
157
+
158
+ - 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))*:
159
+
160
+ remove infer_schema from optimizer (#8552)
161
+
162
+
163
+ ### :sparkles: New Features
164
+ - [`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))*
165
+ - [`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))*
166
+ - [`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))*
167
+ - [`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))*
168
+ - [`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))*
169
+ - [`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))*
170
+ - [`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))*
171
+ - :arrow_lower_right: *addresses issue [#8513](https://github.com/tobymao/sqlglot/issues/8513) opened by [@paddy-devan](https://github.com/paddy-devan)*
172
+ - [`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))*
173
+ - [`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))*
174
+ - [`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))*
175
+ - [`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))*
176
+
177
+ ### :bug: Bug Fixes
178
+ - [`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))*
179
+ - [`4afe079`](https://github.com/tobymao/sqlglot/commit/4afe079f91f06440b2f4c4a2cad754e0ee8d23fa) - **ci**: wait for sqlglotc before publishing sqlglot [CODEX] *(commit by [@tobymao](https://github.com/tobymao))*
180
+ - [`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))*
181
+ - [`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))*
182
+ - :arrow_lower_right: *fixes issue [#8475](https://github.com/tobymao/sqlglot/issues/8475) opened by [@asikeero](https://github.com/asikeero)*
183
+ - [`c7778cf`](https://github.com/tobymao/sqlglot/commit/c7778cf56d90e409c75e59b82842544b118fa850) - **parser**: bare ALTER DROP refactor and indexes named concurrently *(commit by [@geooo109](https://github.com/geooo109))*
184
+ - [`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))*
185
+ - [`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))*
186
+ - [`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))*
187
+ - [`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))*
188
+ - [`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))*
189
+ - [`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))*
190
+ - [`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))*
191
+ - :arrow_lower_right: *fixes issue [#8485](https://github.com/tobymao/sqlglot/issues/8485) opened by [@ultrabear](https://github.com/ultrabear)*
192
+ - [`1d2a99b`](https://github.com/tobymao/sqlglot/commit/1d2a99b9cc0acf671fd2688ef02097a69404057d) - **parser**: ALTER DROP/ALTER COLUMN cleanups *(commit by [@geooo109](https://github.com/geooo109))*
193
+ - [`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))*
194
+ - [`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))*
195
+ - [`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))*
196
+ - [`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))*
197
+ - [`a6698b7`](https://github.com/tobymao/sqlglot/commit/a6698b765b006b4b3b181fcdc75319f7f990164f) - drop wrong Dialect cast in build_formatted_time [CLAUDE] *(commit by [@tobymao](https://github.com/tobymao))*
198
+ - [`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))*
199
+ - [`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))*
200
+ - :arrow_lower_right: *fixes issue [#8500](https://github.com/tobymao/sqlglot/issues/8500) opened by [@tekumara](https://github.com/tekumara)*
201
+ - [`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))*
202
+ - [`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))*
203
+ - :arrow_lower_right: *fixes issue [#8497](https://github.com/tobymao/sqlglot/issues/8497) opened by [@ekut](https://github.com/ekut)*
204
+ - [`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))*
205
+ - :arrow_lower_right: *fixes issue [#8489](https://github.com/tobymao/sqlglot/issues/8489) opened by [@goldmedal](https://github.com/goldmedal)*
206
+ - [`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))*
207
+ - [`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))*
208
+ - :arrow_lower_right: *fixes issue [#8518](https://github.com/tobymao/sqlglot/issues/8518) opened by [@Ayoubhm07](https://github.com/Ayoubhm07)*
209
+ - [`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))*
210
+ - [`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))*
211
+ - [`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))*
212
+ - [`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))*
213
+ - :arrow_lower_right: *fixes issue [#8505](https://github.com/tobymao/sqlglot/issues/8505) opened by [@laravioli](https://github.com/laravioli)*
214
+ - :arrow_lower_right: *fixes issue [#8508](https://github.com/tobymao/sqlglot/issues/8508) opened by [@yousefissa](https://github.com/yousefissa)*
215
+ - [`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))*
216
+ - [`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))*
217
+ - [`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))*
218
+ - :arrow_lower_right: *fixes issue [#8520](https://github.com/tobymao/sqlglot/issues/8520) opened by [@Sharpiro](https://github.com/Sharpiro)*
219
+ - [`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))*
220
+ - :arrow_lower_right: *fixes issue [#8534](https://github.com/tobymao/sqlglot/issues/8534) opened by [@ramcasa](https://github.com/ramcasa)*
221
+ - [`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))*
222
+ - :arrow_lower_right: *fixes issue [#8531](https://github.com/tobymao/sqlglot/issues/8531) opened by [@ramcasa](https://github.com/ramcasa)*
223
+ - [`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))*
224
+ - [`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))*
225
+ - :arrow_lower_right: *fixes issue [#8521](https://github.com/tobymao/sqlglot/issues/8521) opened by [@Sharpiro](https://github.com/Sharpiro)*
226
+ - [`b7e5153`](https://github.com/tobymao/sqlglot/commit/b7e515399a589e720b2bd081e5bb395f408feff8) - **optimizer**: preserve bracket flags in gen serialization *(commit by [@georgesittas](https://github.com/georgesittas))*
227
+ - [`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))*
228
+ - :arrow_lower_right: *fixes issue [#8516](https://github.com/tobymao/sqlglot/issues/8516) opened by [@laravioli](https://github.com/laravioli)*
229
+ - [`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))*
230
+ - :arrow_lower_right: *fixes issue [#8546](https://github.com/tobymao/sqlglot/issues/8546) opened by [@Fcabla](https://github.com/Fcabla)*
231
+ - [`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))*
232
+ - [`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))*
233
+ - [`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))*
234
+ - [`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))*
235
+ - [`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))*
236
+ - [`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))*
237
+ - :arrow_lower_right: *fixes issue [#8562](https://github.com/tobymao/sqlglot/issues/8562) opened by [@ansh-rohilla](https://github.com/ansh-rohilla)*
238
+ - [`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))*
239
+ - [`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))*
240
+ - :arrow_lower_right: *fixes issue [#8568](https://github.com/tobymao/sqlglot/issues/8568) opened by [@laravioli](https://github.com/laravioli)*
241
+ - [`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))*
242
+ - :arrow_lower_right: *fixes issue [#8567](https://github.com/tobymao/sqlglot/issues/8567) opened by [@laravioli](https://github.com/laravioli)*
243
+ - [`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))*
244
+ - [`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))*
245
+ - [`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))*
246
+ - :arrow_lower_right: *fixes issue [#8569](https://github.com/tobymao/sqlglot/issues/8569) opened by [@hustontrevor](https://github.com/hustontrevor)*
247
+ - [`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))*
248
+ - [`51864e7`](https://github.com/tobymao/sqlglot/commit/51864e76b42b26f1fdeb829e349bd43db4d81598) - **bigquery**: edge case in array generation *(commit by [@georgesittas](https://github.com/georgesittas))*
249
+ - [`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))*
250
+ - [`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))*
251
+
252
+ ### :wrench: Chores
253
+ - [`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))*
254
+ - [`b12b50f`](https://github.com/tobymao/sqlglot/commit/b12b50fc068730fd04f864a3757cd8d356afccfa) - remove qualify for SPLIT_TO_TABLE *(commit by [@geooo109](https://github.com/geooo109))*
255
+ - [`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))*
256
+ - [`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))*
257
+ - [`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))*
258
+ - [`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))*
259
+
260
+
4
261
  ## [v30.21.0] - 2026-09-30
5
262
  ### :boom: BREAKING CHANGES
6
263
  - 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 +16302,5 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
16045
16302
  [v30.19.0]: https://github.com/tobymao/sqlglot/compare/v30.18.0...v30.19.0
16046
16303
  [v30.20.0]: https://github.com/tobymao/sqlglot/compare/v30.19.0...v30.20.0
16047
16304
  [v30.21.0]: https://github.com/tobymao/sqlglot/compare/v30.20.0...v30.21.0
16305
+ [v30.22.0]: https://github.com/tobymao/sqlglot/compare/v30.21.0...v30.22.0
16306
+ [v30.23.0]: https://github.com/tobymao/sqlglot/compare/v30.22.0...v30.23.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 30.22.0
3
+ Version: 30.24.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.24.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.24.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.24.0'
22
+ __version_tuple__ = version_tuple = (30, 24, 0)
23
23
 
24
- __commit_id__ = commit_id = 'gb8333a81f'
24
+ __commit_id__ = commit_id = 'g5d588c0f3'
@@ -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)
@@ -116,6 +116,7 @@ class ClickHouse(Dialect):
116
116
  "UINT8": TokenType.UTINYINT,
117
117
  "IPV4": TokenType.IPV4,
118
118
  "IPV6": TokenType.IPV6,
119
+ "PASTE": TokenType.PASTE,
119
120
  "POINT": TokenType.POINT,
120
121
  "PROJECTION": TokenType.PROJECTION,
121
122
  "RING": TokenType.RING,
@@ -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)
@@ -2115,7 +2140,10 @@ def is_parse_json(expression: exp.Expr) -> bool:
2115
2140
 
2116
2141
 
2117
2142
  def isnull_to_is_null(args: BuilderArgs) -> exp.Expr:
2118
- return exp.Paren(this=exp.Is(this=seq_get(args, 0), expression=exp.null()))
2143
+ this = seq_get(args, 0)
2144
+ if isinstance(this, (exp.Predicate, exp.Connector, exp.Not)):
2145
+ this = exp.Paren(this=this)
2146
+ return exp.Paren(this=exp.Is(this=this, expression=exp.null()))
2119
2147
 
2120
2148
 
2121
2149
  def generatedasidentitycolumnconstraint_sql(
@@ -2749,6 +2777,17 @@ def build_timetostr_or_tochar(
2749
2777
  return exp.ToChar.from_arg_list(args)
2750
2778
 
2751
2779
 
2780
+ def array_sort_order(expression: exp.ArraySort) -> tuple[bool, bool | None] | None:
2781
+ """Whether an ArraySort is ascending and puts NULLs first, or None if either isn't a literal."""
2782
+ asc = expression.args.get("asc") or exp.true()
2783
+ nulls_first = expression.args.get("nulls_first")
2784
+ if not isinstance(asc, exp.Boolean):
2785
+ return None
2786
+ if nulls_first is None:
2787
+ return asc.this, None
2788
+ return (asc.this, nulls_first.this) if isinstance(nulls_first, exp.Boolean) else None
2789
+
2790
+
2752
2791
  def build_replace_with_optional_replacement(args: BuilderArgs) -> exp.Replace:
2753
2792
  return exp.Replace(
2754
2793
  this=seq_get(args, 0),
@@ -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
@@ -36,6 +37,7 @@ class Oracle(Dialect):
36
37
  "HH12": "%I", # alias for HH
37
38
  "HH24": "%H", # Hour of day (0-23)
38
39
  "IW": "%V", # Calendar week of year (1-52 or 1-53), as defined by the ISO 8601 standard
40
+ "IYYY": "%G", # 4-digit year of the ISO 8601 week-numbering calendar
39
41
  "MI": "%M", # Minute (0-59)
40
42
  "MM": "%m", # Month (01-12; January = 01)
41
43
  "MON": "%b", # Abbreviated name of month
@@ -65,6 +67,31 @@ class Oracle(Dialect):
65
67
  for prefix in ("U", "u")
66
68
  ]
67
69
 
70
+ # https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Literals.html
71
+ # Alternative quoting, e.g. q'[it's]': the delimiters are part of the quote, so the
72
+ # text in between is taken as is, without escapes
73
+ RAW_STRINGS = [
74
+ (f"{prefix}'{start}", f"{end}'")
75
+ for prefix in ("q", "Q")
76
+ for start, end in (
77
+ ("[", "]"),
78
+ ("{", "}"),
79
+ ("(", ")"),
80
+ ("<", ">"),
81
+ *(
82
+ (c, c)
83
+ for c in string.ascii_letters + string.digits + string.punctuation
84
+ if c not in "[{(<"
85
+ ),
86
+ )
87
+ ]
88
+ NATIONAL_RAW_STRINGS = [
89
+ (prefix + start, end)
90
+ for start, end in t.cast(list[tuple[str, str]], RAW_STRINGS)
91
+ for prefix in ("n", "N")
92
+ ]
93
+ STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS = False
94
+
68
95
  NESTED_COMMENTS = False
69
96
 
70
97
  KEYWORDS = {
@@ -82,6 +109,7 @@ class Oracle(Dialect):
82
109
  "ORDER SIBLINGS BY": TokenType.ORDER_SIBLINGS_BY,
83
110
  "SAMPLE": TokenType.TABLE_SAMPLE,
84
111
  "START": TokenType.BEGIN,
112
+ "SUBPARTITION": TokenType.PARTITION,
85
113
  "TOP": TokenType.TOP,
86
114
  "VARCHAR2": TokenType.VARCHAR,
87
115
  "SYSTIMESTAMP": TokenType.SYSTIMESTAMP,
@@ -44,6 +44,10 @@ class Postgres(Dialect):
44
44
  "FMSS": "%-S", # Second
45
45
  "HH12": "%I", # 09
46
46
  "HH24": "%H", # 09
47
+ "iw": "%V", # ISO 8601 week of year
48
+ "IW": "%V", # ISO 8601 week of year
49
+ "iyyy": "%G", # ISO 8601 week-numbering year
50
+ "IYYY": "%G", # ISO 8601 week-numbering year
47
51
  "mi": "%M", # zero padded minute
48
52
  "MI": "%M", # zero padded minute
49
53
  "mm": "%m", # 01
@@ -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
@@ -18,15 +18,33 @@ class StarRocks(MySQL):
18
18
  }
19
19
 
20
20
  class Tokenizer(MySQL.Tokenizer):
21
+ # Unlike MySQL, "#" doesn't start a comment
22
+ COMMENTS = ["--", ("/*", "*/")]
21
23
  DASH_COMMENT_REQUIRES_BOUNDARY = False
22
24
  COMMENTS_TERMINATE_AT_NEWLINE_ONLY = False
23
25
 
24
26
  KEYWORDS = {
25
27
  **MySQL.Tokenizer.KEYWORDS,
28
+ "ADMIN": TokenType.COMMAND,
29
+ "BACKUP": TokenType.COMMAND,
30
+ "CANCEL": TokenType.COMMAND,
31
+ "DEALLOCATE": TokenType.COMMAND,
32
+ "EXPORT": TokenType.COMMAND,
33
+ "HLL": TokenType.HLLSKETCH,
34
+ "INSTALL": TokenType.COMMAND,
26
35
  "LARGEINT": TokenType.INT128,
36
+ "PAUSE": TokenType.COMMAND,
37
+ "RECOVER": TokenType.COMMAND,
27
38
  "REFRESH": TokenType.REFRESH,
39
+ "RESTORE": TokenType.COMMAND,
40
+ "RESUME": TokenType.COMMAND,
41
+ "STOP": TokenType.COMMAND,
42
+ "SUBMIT": TokenType.COMMAND,
43
+ "UNINSTALL": TokenType.COMMAND,
28
44
  }
29
45
  KEYWORDS.pop("IGNORE")
46
+ KEYWORDS.pop("#>")
47
+ KEYWORDS.pop("#>>")
30
48
 
31
49
  Parser = StarRocksParser
32
50
 
@@ -98,17 +98,13 @@ class ArraySlice(Expression, Func):
98
98
 
99
99
 
100
100
  class ArraySort(Expression, Func):
101
- arg_types = {"this": True, "expression": False}
101
+ arg_types = {"this": True, "expression": False, "asc": False, "nulls_first": False}
102
102
 
103
103
 
104
104
  class Shuffle(Expression, Func):
105
105
  pass
106
106
 
107
107
 
108
- class SortArray(Expression, Func):
109
- arg_types = {"this": True, "asc": False, "nulls_first": False}
110
-
111
-
112
108
  # Array predicates / search
113
109
 
114
110