sqlglot 30.23.0__tar.gz → 30.25.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 (342) hide show
  1. {sqlglot-30.23.0 → sqlglot-30.25.0}/CHANGELOG.md +146 -0
  2. {sqlglot-30.23.0 → sqlglot-30.25.0}/Makefile +12 -2
  3. {sqlglot-30.23.0/sqlglot.egg-info → sqlglot-30.25.0}/PKG-INFO +3 -3
  4. {sqlglot-30.23.0 → sqlglot-30.25.0}/pyproject.toml +1 -0
  5. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/_version.py +3 -3
  6. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/athena.py +35 -12
  7. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/bigquery.py +1 -0
  8. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/clickhouse.py +1 -0
  9. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/dialect.py +36 -5
  10. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/duckdb.py +3 -0
  11. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/oracle.py +1 -0
  12. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/postgres.py +4 -0
  13. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/snowflake.py +1 -0
  14. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/sqlite.py +4 -0
  15. sqlglot-30.25.0/sqlglot/dialects/starrocks.py +60 -0
  16. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/array.py +5 -5
  17. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/builders.py +1 -1
  18. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/constraints.py +2 -1
  19. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/core.py +7 -8
  20. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/datatypes.py +3 -1
  21. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/ddl.py +8 -0
  22. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/query.py +16 -3
  23. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generator.py +104 -21
  24. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/bigquery.py +143 -1
  25. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/clickhouse.py +9 -8
  26. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/databricks.py +1 -0
  27. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/duckdb.py +107 -46
  28. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/exasol.py +3 -6
  29. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/fabric.py +5 -0
  30. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/hive.py +8 -1
  31. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/mysql.py +3 -0
  32. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/oracle.py +0 -3
  33. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/postgres.py +43 -5
  34. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/presto.py +21 -9
  35. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/python.py +5 -0
  36. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/snowflake.py +18 -7
  37. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/spark2.py +22 -1
  38. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/sqlite.py +6 -2
  39. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/starrocks.py +35 -4
  40. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/teradata.py +11 -1
  41. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/tsql.py +4 -1
  42. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/helper.py +17 -0
  43. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/annotate_types.py +171 -106
  44. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/canonicalize.py +2 -2
  45. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/canonicalize_internal_names.py +11 -10
  46. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/eliminate_joins.py +19 -10
  47. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/merge_subqueries.py +6 -0
  48. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/optimize_joins.py +6 -1
  49. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/pushdown_predicates.py +4 -0
  50. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/qualify_columns.py +98 -138
  51. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/resolver.py +57 -8
  52. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/scope.py +24 -9
  53. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/simplify.py +28 -6
  54. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/unnest_subqueries.py +73 -3
  55. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parser.py +186 -44
  56. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/clickhouse.py +11 -5
  57. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/doris.py +3 -3
  58. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/dremio.py +3 -0
  59. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/drill.py +3 -0
  60. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/duckdb.py +115 -10
  61. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/hive.py +13 -0
  62. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/mysql.py +71 -3
  63. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/oracle.py +16 -1
  64. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/postgres.py +36 -6
  65. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/presto.py +2 -0
  66. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/prql.py +2 -8
  67. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/redshift.py +3 -1
  68. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/singlestore.py +3 -0
  69. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/snowflake.py +4 -4
  70. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/spark2.py +4 -1
  71. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/sqlite.py +46 -2
  72. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/starrocks.py +73 -10
  73. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/teradata.py +15 -0
  74. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/trino.py +6 -1
  75. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/tokenizer_core.py +3 -0
  76. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/transforms.py +3 -3
  77. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/__init__.py +1 -1
  78. {sqlglot-30.23.0 → sqlglot-30.25.0/sqlglot.egg-info}/PKG-INFO +3 -3
  79. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot.egg-info/SOURCES.txt +1 -0
  80. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot.egg-info/requires.txt +2 -2
  81. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot.egg-info/scm_file_list.json +1 -0
  82. sqlglot-30.25.0/sqlglot.egg-info/scm_version.json +8 -0
  83. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglotc/pyproject.toml +1 -0
  84. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglotc/setup.py +17 -0
  85. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_athena.py +44 -1
  86. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_bigquery.py +81 -2
  87. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_clickhouse.py +32 -0
  88. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_databricks.py +19 -0
  89. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_dialect.py +197 -13
  90. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_duckdb.py +420 -58
  91. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_exasol.py +2 -2
  92. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_fabric.py +7 -0
  93. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_hive.py +47 -13
  94. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_mysql.py +107 -1
  95. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_oracle.py +46 -2
  96. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_postgres.py +146 -1
  97. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_presto.py +11 -16
  98. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_snowflake.py +62 -37
  99. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_spark.py +28 -11
  100. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_sqlite.py +133 -2
  101. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_starrocks.py +130 -0
  102. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_teradata.py +38 -1
  103. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_trino.py +125 -0
  104. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_tsql.py +4 -0
  105. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/canonicalize.sql +34 -5
  106. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/canonicalize_internal_names.sql +30 -0
  107. sqlglot-30.25.0/tests/fixtures/optimizer/eliminate_joins.sql +636 -0
  108. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/merge_subqueries.sql +48 -0
  109. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/optimizer.sql +57 -13
  110. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns.sql +81 -2
  111. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +32 -0
  112. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/simplify.sql +70 -0
  113. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +3 -1
  114. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/unnest_subqueries.sql +159 -0
  115. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/helpers.py +6 -1
  116. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_build.py +2 -0
  117. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_executor.py +11 -0
  118. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_expressions.py +21 -0
  119. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_generator.py +11 -0
  120. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_helper.py +21 -1
  121. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_optimizer.py +655 -6
  122. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_parser.py +143 -6
  123. sqlglot-30.25.0/tests/test_sqlglotc.py +126 -0
  124. sqlglot-30.23.0/sqlglot/dialects/starrocks.py +0 -34
  125. sqlglot-30.23.0/sqlglot.egg-info/scm_version.json +0 -8
  126. sqlglot-30.23.0/tests/fixtures/optimizer/eliminate_joins.sql +0 -336
  127. {sqlglot-30.23.0 → sqlglot-30.25.0}/.gitignore +0 -0
  128. {sqlglot-30.23.0 → sqlglot-30.25.0}/.gitmodules +0 -0
  129. {sqlglot-30.23.0 → sqlglot-30.25.0}/.gitpod.yml +0 -0
  130. {sqlglot-30.23.0 → sqlglot-30.25.0}/.pre-commit-config.yaml +0 -0
  131. {sqlglot-30.23.0 → sqlglot-30.25.0}/AGENTS.md +0 -0
  132. {sqlglot-30.23.0 → sqlglot-30.25.0}/CLAUDE.md +0 -0
  133. {sqlglot-30.23.0 → sqlglot-30.25.0}/CONTRIBUTING.md +0 -0
  134. {sqlglot-30.23.0 → sqlglot-30.25.0}/LICENSE +0 -0
  135. {sqlglot-30.23.0 → sqlglot-30.25.0}/MANIFEST.in +0 -0
  136. {sqlglot-30.23.0 → sqlglot-30.25.0}/README.md +0 -0
  137. {sqlglot-30.23.0 → sqlglot-30.25.0}/setup.cfg +0 -0
  138. {sqlglot-30.23.0 → sqlglot-30.25.0}/setup.py +0 -0
  139. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/__init__.py +0 -0
  140. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/__main__.py +0 -0
  141. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/_typing.py +0 -0
  142. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/anonymize.py +0 -0
  143. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/__init__.py +0 -0
  144. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/databricks.py +0 -0
  145. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/dax.py +0 -0
  146. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/doris.py +0 -0
  147. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/dremio.py +0 -0
  148. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/drill.py +0 -0
  149. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/druid.py +0 -0
  150. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/dune.py +0 -0
  151. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/exasol.py +0 -0
  152. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/fabric.py +0 -0
  153. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/hive.py +0 -0
  154. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/materialize.py +0 -0
  155. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/mysql.py +0 -0
  156. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/presto.py +0 -0
  157. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/prql.py +0 -0
  158. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/redshift.py +0 -0
  159. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/risingwave.py +0 -0
  160. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/singlestore.py +0 -0
  161. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/solr.py +0 -0
  162. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/spark.py +0 -0
  163. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/spark2.py +0 -0
  164. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/tableau.py +0 -0
  165. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/teradata.py +0 -0
  166. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/trino.py +0 -0
  167. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/dialects/tsql.py +0 -0
  168. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/diff.py +0 -0
  169. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/errors.py +0 -0
  170. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/executor/__init__.py +0 -0
  171. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/executor/context.py +0 -0
  172. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/executor/env.py +0 -0
  173. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/executor/python.py +0 -0
  174. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/executor/table.py +0 -0
  175. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/__init__.py +0 -0
  176. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/aggregate.py +0 -0
  177. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/dml.py +0 -0
  178. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/functions.py +0 -0
  179. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/json.py +0 -0
  180. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/math.py +0 -0
  181. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/properties.py +0 -0
  182. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/string.py +0 -0
  183. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/expressions/temporal.py +0 -0
  184. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/__init__.py +0 -0
  185. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/athena.py +0 -0
  186. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/dax.py +0 -0
  187. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/doris.py +0 -0
  188. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/dremio.py +0 -0
  189. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/drill.py +0 -0
  190. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/druid.py +0 -0
  191. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/dune.py +0 -0
  192. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/materialize.py +0 -0
  193. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/prql.py +0 -0
  194. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/redshift.py +0 -0
  195. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/risingwave.py +0 -0
  196. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/singlestore.py +0 -0
  197. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/solr.py +0 -0
  198. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/spark.py +0 -0
  199. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/tableau.py +0 -0
  200. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/generators/trino.py +0 -0
  201. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/jsonpath.py +0 -0
  202. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/lineage.py +0 -0
  203. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/__init__.py +0 -0
  204. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  205. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  206. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/helpers.py +0 -0
  207. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  208. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/journal.py +0 -0
  209. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/normalize.py +0 -0
  210. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  211. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/optimizer.py +0 -0
  212. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  213. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/qualify.py +0 -0
  214. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/optimizer/qualify_tables.py +0 -0
  215. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/__init__.py +0 -0
  216. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/athena.py +0 -0
  217. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/base.py +0 -0
  218. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/bigquery.py +0 -0
  219. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/databricks.py +0 -0
  220. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/dax.py +0 -0
  221. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/druid.py +0 -0
  222. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/dune.py +0 -0
  223. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/exasol.py +0 -0
  224. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/fabric.py +0 -0
  225. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/materialize.py +0 -0
  226. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/risingwave.py +0 -0
  227. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/solr.py +0 -0
  228. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/spark.py +0 -0
  229. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/tableau.py +0 -0
  230. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/parsers/tsql.py +0 -0
  231. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/planner.py +0 -0
  232. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/py.typed +0 -0
  233. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/schema.py +0 -0
  234. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/serde.py +0 -0
  235. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/time.py +0 -0
  236. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/tokens.py +0 -0
  237. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/trie.py +0 -0
  238. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/bigquery.py +0 -0
  239. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/clickhouse.py +0 -0
  240. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/databricks.py +0 -0
  241. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/duckdb.py +0 -0
  242. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/hive.py +0 -0
  243. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/mysql.py +0 -0
  244. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/postgres.py +0 -0
  245. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/presto.py +0 -0
  246. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/redshift.py +0 -0
  247. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/snowflake.py +0 -0
  248. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/spark.py +0 -0
  249. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/spark2.py +0 -0
  250. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot/typing/tsql.py +0 -0
  251. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  252. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot.egg-info/top_level.txt +0 -0
  253. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglot.png +0 -0
  254. {sqlglot-30.23.0 → sqlglot-30.25.0}/sqlglotc/MANIFEST.in +0 -0
  255. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/__init__.py +0 -0
  256. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/__init__.py +0 -0
  257. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_dax.py +0 -0
  258. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_doris.py +0 -0
  259. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_dremio.py +0 -0
  260. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_drill.py +0 -0
  261. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_druid.py +0 -0
  262. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_dune.py +0 -0
  263. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_materialize.py +0 -0
  264. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_pipe_syntax.py +0 -0
  265. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_prql.py +0 -0
  266. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_redshift.py +0 -0
  267. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_risingwave.py +0 -0
  268. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_singlestore.py +0 -0
  269. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_solr.py +0 -0
  270. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/dialects/test_tableau.py +0 -0
  271. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/identity.sql +0 -0
  272. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  273. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/jsonpath/cts.json +0 -0
  274. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/annotate_functions.sql +0 -0
  275. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  276. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  277. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  278. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  279. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  280. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  281. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  282. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  283. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  284. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  285. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  286. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  287. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  288. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  289. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  290. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  291. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  292. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  293. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  294. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  295. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  296. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  297. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  298. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  299. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  300. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  301. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  302. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  303. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  304. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  305. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  306. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  307. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  308. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  309. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  310. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  311. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  312. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  313. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  314. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  315. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  316. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  317. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  318. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  319. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  320. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  321. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  322. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/partial.sql +0 -0
  323. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/fixtures/pretty.sql +0 -0
  324. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/gen_fixtures.py +0 -0
  325. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/leakcheck.py +0 -0
  326. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/sqlglot/__init__.py +0 -0
  327. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_anonymize.py +0 -0
  328. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_dialect_entry_points.py +0 -0
  329. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_dialect_imports.py +0 -0
  330. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_diff.py +0 -0
  331. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_docs.py +0 -0
  332. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_errors.py +0 -0
  333. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_integration_loader.py +0 -0
  334. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_jsonpath.py +0 -0
  335. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_lineage.py +0 -0
  336. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_schema.py +0 -0
  337. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_serde.py +0 -0
  338. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_time.py +0 -0
  339. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_tokens.py +0 -0
  340. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_transforms.py +0 -0
  341. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_transpile.py +0 -0
  342. {sqlglot-30.23.0 → sqlglot-30.25.0}/tests/test_typing.py +0 -0
@@ -1,6 +1,150 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v30.24.0] - 2026-10-20
5
+ ### :boom: BREAKING CHANGES
6
+ - due to [`094509a`](https://github.com/tobymao/sqlglot/commit/094509aad83fff575f1b4d198e4d03c21c432e58) - merge SortArray into ArraySort with explicit NULL ordering *(PR [#8643](https://github.com/tobymao/sqlglot/pull/8643) by [@tobymao](https://github.com/tobymao))*:
7
+
8
+ merge SortArray into ArraySort with explicit NULL ordering (#8643)
9
+
10
+ - due to [`7af2aa8`](https://github.com/tobymao/sqlglot/commit/7af2aa8db5e9b9df0afea07201574ceeb9e66098) - register CTE reference alias when pivoted *(PR [#8667](https://github.com/tobymao/sqlglot/pull/8667) by [@ansh-rohilla](https://github.com/ansh-rohilla))*:
11
+
12
+ register CTE reference alias when pivoted (#8667)
13
+
14
+ - due to [`1e5c649`](https://github.com/tobymao/sqlglot/commit/1e5c649cc4157bf4451bba1361a3898d9504745b) - map ISO week format patterns IYYY and IW [CLAUDE] *(PR [#8672](https://github.com/tobymao/sqlglot/pull/8672) by [@vidigoat](https://github.com/vidigoat))*:
15
+
16
+ map ISO week format patterns IYYY and IW [CLAUDE] (#8672)
17
+
18
+ - due to [`479c4ca`](https://github.com/tobymao/sqlglot/commit/479c4cae0e38d60d10f4aac833c4091d5c2304e2) - respect dialect precedence of IS predicates *(PR [#8676](https://github.com/tobymao/sqlglot/pull/8676) by [@georgesittas](https://github.com/georgesittas))*:
19
+
20
+ respect dialect precedence of IS predicates (#8676)
21
+
22
+
23
+ ### :sparkles: New Features
24
+ - [`2444b6d`](https://github.com/tobymao/sqlglot/commit/2444b6db78f336b70c6f7aa980e43036367c7b0d) - **optimizer**: paste join support *(commit by [@georgesittas](https://github.com/georgesittas))*
25
+ - [`ec24376`](https://github.com/tobymao/sqlglot/commit/ec24376a58200dff16820fddcd15db102b6ead2e) - **starrocks**: parse admin and job-control statements as commands [CLAUDE] *(PR [#8681](https://github.com/tobymao/sqlglot/pull/8681) by [@nytai](https://github.com/nytai))*
26
+
27
+ ### :bug: Bug Fixes
28
+ - [`f814e4c`](https://github.com/tobymao/sqlglot/commit/f814e4cb2a8743bba63e8818bae25207bbd3966f) - **mysql**: preserve population and sample aggregate semantics [CODEX] *(PR [#8632](https://github.com/tobymao/sqlglot/pull/8632) by [@yousefissa](https://github.com/yousefissa))*
29
+ - :arrow_lower_right: *fixes issue [#8626](https://github.com/tobymao/sqlglot/issues/8626) opened by [@bhargaviHQ](https://github.com/bhargaviHQ)*
30
+ - [`5527744`](https://github.com/tobymao/sqlglot/commit/552774469174ee686def95e6bcb2da46f61e047b) - **starrocks**: keep DATEDIFF's date-part semantics [CLAUDE] *(PR [#8636](https://github.com/tobymao/sqlglot/pull/8636) by [@nytai](https://github.com/nytai))*
31
+ - [`03744a2`](https://github.com/tobymao/sqlglot/commit/03744a2a8376af5f5f70230b04d1c5fbfb71dc61) - **hive,spark**: parse ALTER TABLE REPLACE COLUMNS [CLAUDE] *(PR [#8633](https://github.com/tobymao/sqlglot/pull/8633) by [@tsamaras](https://github.com/tsamaras))*
32
+ - [`021991f`](https://github.com/tobymao/sqlglot/commit/021991fb9a63060e2f71aeac48e134f67c77227f) - **optimizer**: evict dead refs from the type annotator cache *(PR [#8642](https://github.com/tobymao/sqlglot/pull/8642) by [@georgesittas](https://github.com/georgesittas))*
33
+ - :arrow_lower_right: *fixes issue [#8637](https://github.com/tobymao/sqlglot/issues/8637) opened by [@naveen-baton](https://github.com/naveen-baton)*
34
+ - [`00fce66`](https://github.com/tobymao/sqlglot/commit/00fce66dffd3dba4f90cda5534ec8df595bb1865) - **optimizer**: ensure generated decorrelation JOIN comes before reference in ON clause *(PR [#8638](https://github.com/tobymao/sqlglot/pull/8638) by [@treysp](https://github.com/treysp))*
35
+ - [`97134ff`](https://github.com/tobymao/sqlglot/commit/97134ffd3cd161222a42405b001a8a30a0a2c6f5) - **optimizer**: preserve precedence when unwrapping parens inside Mul *(PR [#8620](https://github.com/tobymao/sqlglot/pull/8620) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
36
+ - [`d747f5b`](https://github.com/tobymao/sqlglot/commit/d747f5b20dd71a379437dd3cf251ec130edd94b3) - don't materialize huge interval literals in simplify and the Postgres generator *(PR [#8641](https://github.com/tobymao/sqlglot/pull/8641) by [@tobymao](https://github.com/tobymao))*
37
+ - [`f321207`](https://github.com/tobymao/sqlglot/commit/f321207c8dcc2973d149744fcaa4d1a13edb0026) - **starrocks**: preserve LIKE argument order [CODEX] *(PR [#8645](https://github.com/tobymao/sqlglot/pull/8645) by [@01zhas](https://github.com/01zhas))*
38
+ - [`954cca1`](https://github.com/tobymao/sqlglot/commit/954cca1268ae38ae0384d5197e54fe50322ee9e3) - **starrocks**: preserve native TO_DAYS [CODEX] *(PR [#8648](https://github.com/tobymao/sqlglot/pull/8648) by [@01zhas](https://github.com/01zhas))*
39
+ - [`ce7f6e3`](https://github.com/tobymao/sqlglot/commit/ce7f6e39dbbbaa61ff01a307226ff867a3a9efb6) - **starrocks**: don't treat # as a comment [CLAUDE] *(PR [#8644](https://github.com/tobymao/sqlglot/pull/8644) by [@nytai](https://github.com/nytai))*
40
+ - [`c388227`](https://github.com/tobymao/sqlglot/commit/c388227a73fe4e6652e311db0a04b8d838c7c821) - remove obsolete sqlglotc extensions during builds *(PR [#8653](https://github.com/tobymao/sqlglot/pull/8653) by [@georgesittas](https://github.com/georgesittas))*
41
+ - [`d17c768`](https://github.com/tobymao/sqlglot/commit/d17c7680b70bccb5fda677aaf63980b2663224dc) - **bigquery**: transpile Trino date parts, FROM_BASE, APPROX_PERCENTILE, ARRAY_SORT and ARRAY_DISTINCT *(PR [#8639](https://github.com/tobymao/sqlglot/pull/8639) by [@tobymao](https://github.com/tobymao))*
42
+ - [`cb57d80`](https://github.com/tobymao/sqlglot/commit/cb57d80214bcd4a165194344b34bc930ef5318b8) - **optimizer**: clear child scope caches when projections are merged *(PR [#8646](https://github.com/tobymao/sqlglot/pull/8646) by [@treysp](https://github.com/treysp))*
43
+ - [`b50e43e`](https://github.com/tobymao/sqlglot/commit/b50e43e4407e010d15da9b313ff99df1b1099343) - **clickhouse**: parse PASTE JOIN instead of aliasing the table *(PR [#8662](https://github.com/tobymao/sqlglot/pull/8662) by [@spicysharkco](https://github.com/spicysharkco))*
44
+ - [`7af2aa8`](https://github.com/tobymao/sqlglot/commit/7af2aa8db5e9b9df0afea07201574ceeb9e66098) - **optimizer**: register CTE reference alias when pivoted *(PR [#8667](https://github.com/tobymao/sqlglot/pull/8667) by [@ansh-rohilla](https://github.com/ansh-rohilla))*
45
+ - :arrow_lower_right: *fixes issue [#8663](https://github.com/tobymao/sqlglot/issues/8663) opened by [@rob2244](https://github.com/rob2244)*
46
+ - [`513beed`](https://github.com/tobymao/sqlglot/commit/513beedd3753a22c1ce234059bd5d831f64e48f0) - **teradata**: drop LOCKING request modifier for other dialects instead of crashing [CLAUDE] *(PR [#8666](https://github.com/tobymao/sqlglot/pull/8666) by [@bhuvan-uda](https://github.com/bhuvan-uda))*
47
+ - :arrow_lower_right: *fixes issue [#8665](https://github.com/tobymao/sqlglot/issues/8665) opened by [@bhuvan-uda](https://github.com/bhuvan-uda)*
48
+ - [`9beb4ab`](https://github.com/tobymao/sqlglot/commit/9beb4ab2807839088f3439a2b937d222e598b617) - **transforms**: don't hoist explodes from nested queries in explode_projection_to_unnest [CLAUDE] *(PR [#8664](https://github.com/tobymao/sqlglot/pull/8664) by [@rob2244](https://github.com/rob2244))*
49
+ - :arrow_lower_right: *fixes issue [#8242](https://github.com/tobymao/sqlglot/issues/8242) opened by [@rob2244](https://github.com/rob2244)*
50
+ - [`f8c314c`](https://github.com/tobymao/sqlglot/commit/f8c314c449080860604b9ddd716d6bc75c89155f) - **teradata**: transpile SAMPLE row counts and fractions [CLAUDE] *(PR [#8670](https://github.com/tobymao/sqlglot/pull/8670) by [@bhuvan-uda](https://github.com/bhuvan-uda))*
51
+ - :arrow_lower_right: *fixes issue [#8669](https://github.com/tobymao/sqlglot/issues/8669) opened by [@bhuvan-uda](https://github.com/bhuvan-uda)*
52
+ - [`1e5c649`](https://github.com/tobymao/sqlglot/commit/1e5c649cc4157bf4451bba1361a3898d9504745b) - **postgres**: map ISO week format patterns IYYY and IW [CLAUDE] *(PR [#8672](https://github.com/tobymao/sqlglot/pull/8672) by [@vidigoat](https://github.com/vidigoat))*
53
+ - [`b06ed8e`](https://github.com/tobymao/sqlglot/commit/b06ed8ea3fc5dbf3771f86ee2a44a2134df0ed00) - **starrocks**: don't default column names for multi-array UNNEST [CLAUDE] *(PR [#8671](https://github.com/tobymao/sqlglot/pull/8671) by [@nytai](https://github.com/nytai))*
54
+ - [`9e57e44`](https://github.com/tobymao/sqlglot/commit/9e57e448de90bc273a926e63f77f4fdf788d0fac) - **oracle**: map ISO week-numbering year IYYY to %G [CLAUDE] *(PR [#8675](https://github.com/tobymao/sqlglot/pull/8675) by [@vidigoat](https://github.com/vidigoat))*
55
+ - [`f536a82`](https://github.com/tobymao/sqlglot/commit/f536a8233b4f9aa1efac982dd9d6b098ed3982a4) - **bigquery**: correct percentile and distinct-array transpilation *(PR [#8674](https://github.com/tobymao/sqlglot/pull/8674) by [@georgesittas](https://github.com/georgesittas))*
56
+ - [`e3d0dfb`](https://github.com/tobymao/sqlglot/commit/e3d0dfb2279d390dfed6e86cc353ed65cb2b97bb) - **optimizer**: give order aliases independent expression nodes *(PR [#8678](https://github.com/tobymao/sqlglot/pull/8678) by [@georgesittas](https://github.com/georgesittas))*
57
+ - [`40dcaab`](https://github.com/tobymao/sqlglot/commit/40dcaabdd29a6c3cda7f4ce29dedcdcffa3e49a0) - **starrocks**: generate PIVOT instead of dropping it [CLAUDE] *(PR [#8679](https://github.com/tobymao/sqlglot/pull/8679) by [@nytai](https://github.com/nytai))*
58
+ - [`fdd0e9a`](https://github.com/tobymao/sqlglot/commit/fdd0e9a464f0f9ec425c56ae83fc87a5e2052087) - **mysql**: relative xor/or/and precedence closes [#8684](https://github.com/tobymao/sqlglot/pull/8684) *(PR [#8686](https://github.com/tobymao/sqlglot/pull/8686) by [@georgesittas](https://github.com/georgesittas))*
59
+ - :arrow_lower_right: *fixes issue [#8684](https://github.com/tobymao/sqlglot/issues/8684) opened by [@pbottine](https://github.com/pbottine)*
60
+ - [`8955d75`](https://github.com/tobymao/sqlglot/commit/8955d752acc88ee23955dd6e07d567542a8cfaf8) - **mysql**: preserve exclamation mark operator precedence *(PR [#8687](https://github.com/tobymao/sqlglot/pull/8687) by [@georgesittas](https://github.com/georgesittas))*
61
+ - :arrow_lower_right: *fixes issue [#8683](https://github.com/tobymao/sqlglot/issues/8683) opened by [@pbottine](https://github.com/pbottine)*
62
+ - [`b1fd4e9`](https://github.com/tobymao/sqlglot/commit/b1fd4e9edf05ee6211656c235a62040e0f055bf0) - **mysql**: respect bitwise operator precedence *(PR [#8688](https://github.com/tobymao/sqlglot/pull/8688) by [@georgesittas](https://github.com/georgesittas))*
63
+ - :arrow_lower_right: *fixes issue [#8685](https://github.com/tobymao/sqlglot/issues/8685) opened by [@pbottine](https://github.com/pbottine)*
64
+ - [`fc1472a`](https://github.com/tobymao/sqlglot/commit/fc1472a0d54c4e8d0d6700b0a4dbe66f0f32707b) - **starrocks**: parse map{...} literals as maps [CLAUDE] *(PR [#8682](https://github.com/tobymao/sqlglot/pull/8682) by [@nytai](https://github.com/nytai))*
65
+ - [`115ce02`](https://github.com/tobymao/sqlglot/commit/115ce02b002ed63ff23a4c99a24ad025ec1efbb4) - **starrocks**: infer static pivot output columns [CODEX] *(PR [#8689](https://github.com/tobymao/sqlglot/pull/8689) by [@georgesittas](https://github.com/georgesittas))*
66
+ - [`479c4ca`](https://github.com/tobymao/sqlglot/commit/479c4cae0e38d60d10f4aac833c4091d5c2304e2) - **parser**: respect dialect precedence of IS predicates *(PR [#8676](https://github.com/tobymao/sqlglot/pull/8676) by [@georgesittas](https://github.com/georgesittas))*
67
+ - :arrow_lower_right: *fixes issue [#8661](https://github.com/tobymao/sqlglot/issues/8661) opened by [@laravioli](https://github.com/laravioli)*
68
+ - [`7e4d995`](https://github.com/tobymao/sqlglot/commit/7e4d995f75dac9fb6ed110109b80bf12f24cdea5) - **clickhouse**: stop re-wrapping parenthesized CTAS queries with COMMENT [CLAUDE] *(PR [#8698](https://github.com/tobymao/sqlglot/pull/8698) by [@vidigoat](https://github.com/vidigoat))*
69
+ - [`d44db25`](https://github.com/tobymao/sqlglot/commit/d44db25a534d86ba593958dd0cc533f8310daef0) - **parser**: support PARTITION BY EXCLUDING *(PR [#8690](https://github.com/tobymao/sqlglot/pull/8690) by [@geooo109](https://github.com/geooo109))*
70
+ - [`2d3d3ff`](https://github.com/tobymao/sqlglot/commit/2d3d3ff7b8b8b475a68d70ffe3529ac110c96f4b) - **fabric**: don't re-wrap AT TIME ZONE that is already cast to DATETIME2 [CLAUDE] *(PR [#8699](https://github.com/tobymao/sqlglot/pull/8699) by [@vidigoat](https://github.com/vidigoat))*
71
+ - [`68cd4a2`](https://github.com/tobymao/sqlglot/commit/68cd4a2d8f766132e338721df8676e0b42d6b7ca) - **duckdb**: quote identifiers that are DuckDB reserved keywords [CLAUDE] *(PR [#8700](https://github.com/tobymao/sqlglot/pull/8700) by [@vidigoat](https://github.com/vidigoat))*
72
+ - [`55bff61`](https://github.com/tobymao/sqlglot/commit/55bff6129f36820c78efccf920c877443dc7fb70) - **optimizer**: retain nodes in type annotation caches *(PR [#8691](https://github.com/tobymao/sqlglot/pull/8691) by [@georgesittas](https://github.com/georgesittas))*
73
+ - [`5d588c0`](https://github.com/tobymao/sqlglot/commit/5d588c0f32d17a08191898638f67ff27bb0a13ff) - **optimizer**: preserve unsupported struct star operands *(PR [#8692](https://github.com/tobymao/sqlglot/pull/8692) by [@georgesittas](https://github.com/georgesittas))*
74
+
75
+ ### :recycle: Refactors
76
+ - [`094509a`](https://github.com/tobymao/sqlglot/commit/094509aad83fff575f1b4d198e4d03c21c432e58) - merge SortArray into ArraySort with explicit NULL ordering *(PR [#8643](https://github.com/tobymao/sqlglot/pull/8643) by [@tobymao](https://github.com/tobymao))*
77
+
78
+ ### :wrench: Chores
79
+ - [`cd41eee`](https://github.com/tobymao/sqlglot/commit/cd41eeef32e13db1a2517d0a0dc5432ec2b89eb5) - refactor starrocks tests for LIKE *(commit by [@geooo109](https://github.com/geooo109))*
80
+ - [`af2b577`](https://github.com/tobymao/sqlglot/commit/af2b57734d67082ecc4db97cb5da1e8743918af0) - simplify starrocks tests *(commit by [@geooo109](https://github.com/geooo109))*
81
+ - [`df5b53f`](https://github.com/tobymao/sqlglot/commit/df5b53f92e31247e82bc37a512fab0abd4b54031) - refactor starrocks TO_DAYS test *(commit by [@geooo109](https://github.com/geooo109))*
82
+
83
+
84
+ ## [v30.23.0] - 2026-10-14
85
+ ### :boom: BREAKING CHANGES
86
+ - 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))*:
87
+
88
+ hash flag for case-sensitive nodes [CLAUDE] (#8599)
89
+
90
+ - 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))*:
91
+
92
+ generate JSONExtractRaw for JSON-valued extraction (#8601)
93
+
94
+ - 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))*:
95
+
96
+ infer correct types for temporal interval arithmetic (#8622)
97
+
98
+
99
+ ### :sparkles: New Features
100
+ - [`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))*
101
+ - [`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))*
102
+ - :arrow_lower_right: *addresses issue [#8584](https://github.com/tobymao/sqlglot/issues/8584) opened by [@kaya-abdullah](https://github.com/kaya-abdullah)*
103
+ - [`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))*
104
+ - [`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))*
105
+ - [`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))*
106
+ - [`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))*
107
+ - [`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))*
108
+ - [`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))*
109
+ - [`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))*
110
+
111
+ ### :bug: Bug Fixes
112
+ - [`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))*
113
+ - [`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))*
114
+ - [`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))*
115
+ - [`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))*
116
+ - :arrow_lower_right: *fixes issue [#8587](https://github.com/tobymao/sqlglot/issues/8587) opened by [@cofin](https://github.com/cofin)*
117
+ - [`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))*
118
+ - :arrow_lower_right: *fixes issue [#8590](https://github.com/tobymao/sqlglot/issues/8590) opened by [@jackr-xceleration](https://github.com/jackr-xceleration)*
119
+ - [`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))*
120
+ - [`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))*
121
+ - [`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))*
122
+ - :arrow_lower_right: *fixes issue [#8595](https://github.com/tobymao/sqlglot/issues/8595) opened by [@bhuvan-uda](https://github.com/bhuvan-uda)*
123
+ - [`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))*
124
+ - :arrow_lower_right: *fixes issue [#8598](https://github.com/tobymao/sqlglot/issues/8598) opened by [@laravioli](https://github.com/laravioli)*
125
+ - [`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))*
126
+ - [`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))*
127
+ - [`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))*
128
+ - [`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))*
129
+ - [`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))*
130
+ - [`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))*
131
+ - :arrow_lower_right: *fixes issue [#8580](https://github.com/tobymao/sqlglot/issues/8580) opened by [@cmodiano](https://github.com/cmodiano)*
132
+ - [`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))*
133
+ - [`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))*
134
+ - [`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))*
135
+ - [`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))*
136
+ - [`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))*
137
+ - [`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))*
138
+ - [`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))*
139
+ - [`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))*
140
+ - :arrow_lower_right: *fixes issue [#8628](https://github.com/tobymao/sqlglot/issues/8628) opened by [@masiljangajji](https://github.com/masiljangajji)*
141
+ - [`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))*
142
+
143
+ ### :wrench: Chores
144
+ - [`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))*
145
+ - [`c0a9457`](https://github.com/tobymao/sqlglot/commit/c0a945740e55facdc7120c17cda2771dc55c7903) - **mysql**: tests for named FOREIGN KEY indexes *(commit by [@geooo109](https://github.com/geooo109))*
146
+
147
+
4
148
  ## [v30.22.0] - 2026-10-09
5
149
  ### :boom: BREAKING CHANGES
6
150
  - 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))*:
@@ -16239,3 +16383,5 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
16239
16383
  [v30.20.0]: https://github.com/tobymao/sqlglot/compare/v30.19.0...v30.20.0
16240
16384
  [v30.21.0]: https://github.com/tobymao/sqlglot/compare/v30.20.0...v30.21.0
16241
16385
  [v30.22.0]: https://github.com/tobymao/sqlglot/compare/v30.21.0...v30.22.0
16386
+ [v30.23.0]: https://github.com/tobymao/sqlglot/compare/v30.22.0...v30.23.0
16387
+ [v30.24.0]: https://github.com/tobymao/sqlglot/compare/v30.23.0...v30.24.0
@@ -48,14 +48,24 @@ PY_GE_310 := $(shell python -c "import sys; print(int(sys.version_info >= (3, 10
48
48
 
49
49
  install-devc:
50
50
  @if [ "$(PY_GE_310)" = "1" ]; then \
51
- cd sqlglotc && MYPYC_OPT=0 python setup.py build_ext --inplace -j $(NPROC); \
51
+ echo "Building sqlglotc (log: .sqlglotc-build.log)"; \
52
+ (cd sqlglotc && MYPYC_OPT=0 python setup.py build_ext --inplace -j $(NPROC)) > .sqlglotc-build.log 2>&1 || { \
53
+ status=$$?; \
54
+ echo "sqlglotc build failed. See .sqlglotc-build.log for details." >&2; \
55
+ exit $$status; \
56
+ }; \
52
57
  else \
53
58
  echo "Skipping sqlglotc build: requires Python 3.10+"; \
54
59
  fi
55
60
 
56
61
  install-devc-release: clean
57
62
  @if [ "$(PY_GE_310)" = "1" ]; then \
58
- cd sqlglotc && python setup.py build_ext --inplace -j $(NPROC); \
63
+ echo "Building sqlglotc (log: .sqlglotc-build.log)"; \
64
+ (cd sqlglotc && python setup.py build_ext --inplace -j $(NPROC)) > .sqlglotc-build.log 2>&1 || { \
65
+ status=$$?; \
66
+ echo "sqlglotc build failed. See .sqlglotc-build.log for details." >&2; \
67
+ exit $$status; \
68
+ }; \
59
69
  else \
60
70
  echo "Skipping sqlglotc build: requires Python 3.10+"; \
61
71
  fi
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 30.23.0
3
+ Version: 30.25.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.23.0; python_version >= "3.10" and extra == "c"
37
+ Requires-Dist: sqlglotc==30.25.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.23.0; python_version >= "3.10" and extra == "rs"
40
+ Requires-Dist: sqlglotc==30.25.0; python_version >= "3.10" and extra == "rs"
41
41
  Dynamic: license-file
42
42
  Dynamic: provides-extra
43
43
 
@@ -31,6 +31,7 @@ include-package-data = false
31
31
 
32
32
  [tool.setuptools_scm]
33
33
  version_file = "sqlglot/_version.py"
34
+ write_to_source = true
34
35
  fallback_version = "0.0.0"
35
36
  local_scheme = "no-local-version"
36
37
 
@@ -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.23.0'
22
- __version_tuple__ = version_tuple = (30, 23, 0)
21
+ __version__ = version = '30.25.0'
22
+ __version_tuple__ = version_tuple = (30, 25, 0)
23
23
 
24
- __commit_id__ = commit_id = 'gad8764a04'
24
+ __commit_id__ = commit_id = 'g9d2966ed3'
@@ -75,33 +75,56 @@ class Athena(Trino):
75
75
  self._trino_tokenizer = _TrinoTokenizer(Trino())
76
76
 
77
77
  def tokenize(self, sql: str) -> list[Token]:
78
+ # DML only needs Trino's tokenizer; possible Hive statements need disambiguation.
79
+ try:
80
+ trino_tokens: list[Token] | None = self._trino_tokenizer.tokenize(sql)
81
+ except TokenError:
82
+ trino_tokens = None
83
+
84
+ if trino_tokens is not None and not _may_be_hive(trino_tokens):
85
+ return trino_tokens
86
+
78
87
  try:
79
88
  tokens = super().tokenize(sql)
80
89
  except TokenError:
81
90
  # 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
91
+ if trino_tokens is not None and not _tokenize_as_hive(trino_tokens):
92
+ return trino_tokens
93
+
94
+ try:
95
+ tokens = self._hive_tokenizer.tokenize(sql)
96
+ except TokenError:
97
+ pass
98
+ else:
99
+ if _tokenize_as_hive(tokens):
100
+ return [Token(TokenType.HIVE_TOKEN_STREAM, "")] + tokens
93
101
  raise
94
102
 
95
103
  if _tokenize_as_hive(tokens):
96
104
  return [Token(TokenType.HIVE_TOKEN_STREAM, "")] + self._hive_tokenizer.tokenize(sql)
97
105
 
98
- return self._trino_tokenizer.tokenize(sql)
106
+ return trino_tokens if trino_tokens is not None else self._trino_tokenizer.tokenize(sql)
99
107
 
100
108
  Parser = AthenaParser
101
109
 
102
110
  Generator = AthenaGenerator
103
111
 
104
112
 
113
+ _MAYBE_HIVE_TOKENS = {
114
+ TokenType.ALTER,
115
+ TokenType.CREATE,
116
+ TokenType.DESCRIBE,
117
+ TokenType.DROP,
118
+ TokenType.SHOW,
119
+ }
120
+
121
+
122
+ def _may_be_hive(tokens: list[Token]) -> bool:
123
+ return bool(tokens) and (
124
+ tokens[0].token_type in _MAYBE_HIVE_TOKENS or tokens[0].text.upper() == "MSCK"
125
+ )
126
+
127
+
105
128
  def _tokenize_as_hive(tokens: list[Token]) -> bool:
106
129
  if len(tokens) < 2:
107
130
  return False
@@ -36,6 +36,7 @@ class BigQuery(Dialect):
36
36
  ANNOTATE_ALL_SCOPES = True
37
37
  PROJECTION_ALIASES_SHADOW_SOURCE_NAMES = True
38
38
  TABLES_REFERENCEABLE_AS_COLUMNS = True
39
+ TABLE_ALIASES_SHADOW_COLUMN_NAMES = True
39
40
  SUPPORTS_STRUCT_STAR_EXPANSION = True
40
41
  EXCLUDES_PSEUDOCOLUMNS_FROM_STAR = True
41
42
  QUERY_RESULTS_ARE_STRUCTS = True
@@ -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,
@@ -59,6 +59,10 @@ DATETIME_DELTA = t.Union[
59
59
  ]
60
60
  DATETIME_ADD = (exp.DateAdd, exp.TimeAdd, exp.DatetimeAdd, exp.TsOrDsAdd, exp.TimestampAdd)
61
61
 
62
+ # JSON paths that need parentheses when used as the right operand of -> / ->>.
63
+ # CONCAT may be generated as a chain of || operators, which would bind looser than the arrow
64
+ WRAPPED_JSON_PATH_EXPRESSIONS = (exp.Binary, exp.Predicate, exp.Not, exp.Concat)
65
+
62
66
  if t.TYPE_CHECKING:
63
67
  from sqlglot._typing import B, E, F, GeneratorArgs, ParserArgs, BuilderArgs
64
68
  from typing_extensions import Unpack
@@ -635,6 +639,11 @@ class Dialect(metaclass=_Dialect):
635
639
  with "custom_fields" in GROUP BY/HAVING.
636
640
  """
637
641
 
642
+ TABLE_ALIASES_SHADOW_COLUMN_NAMES = False
643
+ """
644
+ Whether a whole-row reference to a table alias takes precedence over a same-named column.
645
+ """
646
+
638
647
  TABLES_REFERENCEABLE_AS_COLUMNS = False
639
648
  """
640
649
  Whether table names can be referenced as columns (treated as structs).
@@ -1357,7 +1366,7 @@ def arrow_json_extract_sql(
1357
1366
  if self.JSON_TYPE_REQUIRED_FOR_EXTRACTION and isinstance(this, exp.Literal) and this.is_string:
1358
1367
  this.replace(exp.cast(this, exp.DType.JSON))
1359
1368
 
1360
- if isinstance(expression.expression, (exp.Binary, exp.Predicate, exp.Not)):
1369
+ if isinstance(expression.expression, WRAPPED_JSON_PATH_EXPRESSIONS):
1361
1370
  expression.set("expression", exp.paren(expression.expression, copy=False))
1362
1371
 
1363
1372
  op = op or ("->" if isinstance(expression, exp.JSONExtract) else "->>")
@@ -1608,7 +1617,11 @@ def generate_series_sql(
1608
1617
  if expression.args.get("is_end_exclusive"):
1609
1618
  if exclusive_func_name:
1610
1619
  return self.func(exclusive_func_name, start, end, step)
1611
- adjusted_end = exp.Sub(this=end, expression=exp.Literal.number(1))
1620
+ # The last value is one before the end in the direction of the step
1621
+ if step and step.is_int and t.cast(int, step.to_py()) < 0:
1622
+ adjusted_end: exp.Expr = exp.Add(this=end, expression=exp.Literal.number(1))
1623
+ else:
1624
+ adjusted_end = exp.Sub(this=end, expression=exp.Literal.number(1))
1612
1625
  return self.func(func_name, start, adjusted_end, step)
1613
1626
 
1614
1627
  return self.func(func_name, start, end, step)
@@ -2140,7 +2153,10 @@ def is_parse_json(expression: exp.Expr) -> bool:
2140
2153
 
2141
2154
 
2142
2155
  def isnull_to_is_null(args: BuilderArgs) -> exp.Expr:
2143
- return exp.Paren(this=exp.Is(this=seq_get(args, 0), expression=exp.null()))
2156
+ this = seq_get(args, 0)
2157
+ if isinstance(this, (exp.Predicate, exp.Connector, exp.Not)):
2158
+ this = exp.Paren(this=this)
2159
+ return exp.Paren(this=exp.Is(this=this, expression=exp.null()))
2144
2160
 
2145
2161
 
2146
2162
  def generatedasidentitycolumnconstraint_sql(
@@ -2701,9 +2717,13 @@ def no_make_interval_sql(self: Generator, expression: exp.MakeInterval, sep: str
2701
2717
  if isinstance(value, exp.Kwarg):
2702
2718
  value = value.expression
2703
2719
 
2704
- args.append(f"{value} {unit}")
2720
+ if value is None:
2721
+ continue
2722
+
2723
+ value_sql = value.name if value.is_string else self.sql(value)
2724
+ args.append(f"{value_sql} {unit}")
2705
2725
 
2706
- return f"INTERVAL '{self.format_args(*args, sep=sep)}'"
2726
+ return f"INTERVAL {self.sql(exp.Literal.string(self.format_args(*args, sep=sep)))}"
2707
2727
 
2708
2728
 
2709
2729
  def length_or_char_length_sql(self: Generator, expression: exp.Length) -> str:
@@ -2774,6 +2794,17 @@ def build_timetostr_or_tochar(
2774
2794
  return exp.ToChar.from_arg_list(args)
2775
2795
 
2776
2796
 
2797
+ def array_sort_order(expression: exp.ArraySort) -> tuple[bool, bool | None] | None:
2798
+ """Whether an ArraySort is ascending and puts NULLs first, or None if either isn't a literal."""
2799
+ asc = expression.args.get("asc") or exp.true()
2800
+ nulls_first = expression.args.get("nulls_first")
2801
+ if not isinstance(asc, exp.Boolean):
2802
+ return None
2803
+ if nulls_first is None:
2804
+ return asc.this, None
2805
+ return (asc.this, nulls_first.this) if isinstance(nulls_first, exp.Boolean) else None
2806
+
2807
+
2777
2808
  def build_replace_with_optional_replacement(args: BuilderArgs) -> exp.Replace:
2778
2809
  return exp.Replace(
2779
2810
  this=seq_get(args, 0),
@@ -24,6 +24,7 @@ class DuckDB(Dialect):
24
24
  SUPPORTS_LIMIT_ALL = True
25
25
  SUPPORTS_FIXED_SIZE_ARRAYS = True
26
26
  TABLES_REFERENCEABLE_AS_COLUMNS = True
27
+ QUERY_RESULTS_ARE_STRUCTS = True
27
28
  STRICT_JSON_PATH_SYNTAX = False
28
29
  NUMBERS_CAN_BE_UNDERSCORE_SEPARATED = True
29
30
  UUID_IS_STRING_TYPE = False
@@ -94,8 +95,10 @@ class DuckDB(Dialect):
94
95
  "BITSTRING": TokenType.BIT,
95
96
  "BPCHAR": TokenType.TEXT,
96
97
  "CHAR": TokenType.TEXT,
98
+ "CONNECT": TokenType.CONNECT,
97
99
  "DATETIME": TokenType.TIMESTAMPNTZ,
98
100
  "DETACH": TokenType.DETACH,
101
+ "DISCONNECT": TokenType.DISCONNECT,
99
102
  "FORCE": TokenType.FORCE,
100
103
  "INSTALL": TokenType.INSTALL,
101
104
  "INT8": TokenType.BIGINT,
@@ -37,6 +37,7 @@ class Oracle(Dialect):
37
37
  "HH12": "%I", # alias for HH
38
38
  "HH24": "%H", # Hour of day (0-23)
39
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
40
41
  "MI": "%M", # Minute (0-59)
41
42
  "MM": "%m", # Month (01-12; January = 01)
42
43
  "MON": "%b", # Abbreviated name of month
@@ -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
@@ -38,6 +38,7 @@ class Snowflake(Dialect):
38
38
  # https://docs.snowflake.com/en/sql-reference/functions/split_to_table
39
39
  DEFAULT_FUNCTIONS_COLUMN_NAMES = {
40
40
  exp.SplitToTable: ("seq", "index", "value"),
41
+ exp.StrtokSplitToTable: ("seq", "index", "value"),
41
42
  }
42
43
 
43
44
  EXPRESSION_METADATA = EXPRESSION_METADATA.copy()
@@ -33,8 +33,12 @@ class SQLite(Dialect):
33
33
  **tokens.Tokenizer.KEYWORDS,
34
34
  "ATTACH": TokenType.ATTACH,
35
35
  "DETACH": TokenType.DETACH,
36
+ # REAL, FLOAT and DOUBLE are all 8-byte IEEE floats in SQLite (REAL affinity),
37
+ # so they must not become a 4-byte float in dialects where REAL/FLOAT means FLOAT4
38
+ "FLOAT": TokenType.DOUBLE,
36
39
  "INDEXED BY": TokenType.INDEXED_BY,
37
40
  "MATCH": TokenType.MATCH,
41
+ "REAL": TokenType.DOUBLE,
38
42
  }
39
43
 
40
44
  KEYWORDS.pop("/*+")
@@ -0,0 +1,60 @@
1
+ from __future__ import annotations
2
+
3
+ from sqlglot import exp
4
+ from sqlglot.dialects.dialect import UsingColumnOrder
5
+ from sqlglot.dialects.mysql import MySQL
6
+ from sqlglot.generators.starrocks import StarRocksGenerator
7
+ from sqlglot.parsers.starrocks import StarRocksParser
8
+ from sqlglot.tokens import TokenType
9
+
10
+
11
+ class StarRocks(MySQL):
12
+ STRICT_JSON_PATH_SYNTAX = False
13
+ INDEX_OFFSET = 1
14
+ USING_COLUMN_ORDER = UsingColumnOrder.USING_LIST
15
+
16
+ DEFAULT_FUNCTIONS_COLUMN_NAMES = {
17
+ exp.GenerateSeries: "generate_series",
18
+ }
19
+
20
+ class Tokenizer(MySQL.Tokenizer):
21
+ # Unlike MySQL, "#" doesn't start a comment
22
+ COMMENTS = ["--", ("/*", "*/")]
23
+ DASH_COMMENT_REQUIRES_BOUNDARY = False
24
+ COMMENTS_TERMINATE_AT_NEWLINE_ONLY = False
25
+
26
+ KEYWORDS = {
27
+ **MySQL.Tokenizer.KEYWORDS,
28
+ "ADD BACKEND BLACKLIST": TokenType.COMMAND,
29
+ "ADD COMPUTE NODE BLACKLIST": TokenType.COMMAND,
30
+ "ADD SQL DIGEST BLACKLIST": TokenType.COMMAND,
31
+ "ADD SQLBLACKLIST": TokenType.COMMAND,
32
+ "ADMIN": TokenType.COMMAND,
33
+ "BACKUP": TokenType.COMMAND,
34
+ "CANCEL": TokenType.COMMAND,
35
+ "DEALLOCATE": TokenType.COMMAND,
36
+ "DELETE BACKEND BLACKLIST": TokenType.COMMAND,
37
+ "DELETE COMPUTE NODE BLACKLIST": TokenType.COMMAND,
38
+ "DELETE SQL DIGEST BLACKLIST": TokenType.COMMAND,
39
+ "DELETE SQLBLACKLIST": TokenType.COMMAND,
40
+ "EXPORT": TokenType.COMMAND,
41
+ "HLL": TokenType.HLLSKETCH,
42
+ "INSTALL": TokenType.COMMAND,
43
+ "LARGEINT": TokenType.INT128,
44
+ "PAUSE": TokenType.COMMAND,
45
+ "RECOVER": TokenType.COMMAND,
46
+ "REFRESH": TokenType.REFRESH,
47
+ "RESTORE": TokenType.COMMAND,
48
+ "RESUME": TokenType.COMMAND,
49
+ "STOP": TokenType.COMMAND,
50
+ "SUBMIT": TokenType.COMMAND,
51
+ "TRANSLATE TRINO": TokenType.COMMAND,
52
+ "UNINSTALL": TokenType.COMMAND,
53
+ }
54
+ KEYWORDS.pop("IGNORE")
55
+ KEYWORDS.pop("#>")
56
+ KEYWORDS.pop("#>>")
57
+
58
+ Parser = StarRocksParser
59
+
60
+ Generator = StarRocksGenerator
@@ -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
 
@@ -258,6 +254,10 @@ class SplitToTable(Expression, Func, UDTF):
258
254
  arg_types = {"this": True, "expression": True}
259
255
 
260
256
 
257
+ class StrtokSplitToTable(Expression, Func, UDTF):
258
+ arg_types = {"this": True, "expression": False}
259
+
260
+
261
261
  class Stack(Expression, Func, UDTF):
262
262
  arg_types = {"this": True, "expressions": True}
263
263
  is_var_len_args = True
@@ -921,7 +921,7 @@ def replace_placeholders(expression: Expr, *args: object, **kwargs: t.Any) -> Ex
921
921
  def _replace_placeholders(node: Expr, args: Iterator[object], **kwargs: object) -> Expr:
922
922
  if isinstance(node, Placeholder):
923
923
  if node.this:
924
- new_name = kwargs.get(node.this)
924
+ new_name = kwargs.get(node.name)
925
925
  if new_name is not None:
926
926
  return _replace_placeholder(node, convert(new_name))
927
927
  else:
@@ -161,7 +161,7 @@ class OnUpdateColumnConstraint(Expression, ColumnConstraintKind):
161
161
 
162
162
 
163
163
  class PrimaryKeyColumnConstraint(Expression, ColumnConstraintKind):
164
- arg_types = {"desc": False, "options": False}
164
+ arg_types = {"desc": False, "options": False, "include": False}
165
165
 
166
166
 
167
167
  class TitleColumnConstraint(Expression, ColumnConstraintKind):
@@ -175,6 +175,7 @@ class UniqueColumnConstraint(Expression, ColumnConstraintKind):
175
175
  "on_conflict": False,
176
176
  "nulls": False,
177
177
  "options": False,
178
+ "include": False,
178
179
  }
179
180
 
180
181