sqlglot 30.24.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 (341) hide show
  1. {sqlglot-30.24.0 → sqlglot-30.25.0}/CHANGELOG.md +81 -0
  2. {sqlglot-30.24.0 → sqlglot-30.25.0}/Makefile +12 -2
  3. {sqlglot-30.24.0/sqlglot.egg-info → sqlglot-30.25.0}/PKG-INFO +3 -3
  4. {sqlglot-30.24.0 → sqlglot-30.25.0}/pyproject.toml +1 -0
  5. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/_version.py +3 -3
  6. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/athena.py +35 -12
  7. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/bigquery.py +1 -0
  8. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/dialect.py +21 -4
  9. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/duckdb.py +3 -0
  10. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/snowflake.py +1 -0
  11. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/sqlite.py +4 -0
  12. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/starrocks.py +9 -0
  13. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/array.py +4 -0
  14. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/builders.py +1 -1
  15. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/constraints.py +2 -1
  16. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/core.py +7 -8
  17. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/datatypes.py +3 -1
  18. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/ddl.py +8 -0
  19. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/query.py +8 -3
  20. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generator.py +73 -20
  21. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/bigquery.py +1 -0
  22. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/clickhouse.py +7 -7
  23. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/databricks.py +1 -0
  24. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/duckdb.py +72 -7
  25. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/exasol.py +3 -6
  26. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/hive.py +4 -1
  27. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/oracle.py +0 -3
  28. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/postgres.py +35 -2
  29. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/presto.py +7 -2
  30. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/python.py +5 -0
  31. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/snowflake.py +3 -0
  32. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/sqlite.py +6 -2
  33. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/tsql.py +4 -1
  34. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/annotate_types.py +150 -93
  35. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/canonicalize.py +2 -2
  36. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/canonicalize_internal_names.py +11 -10
  37. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/eliminate_joins.py +19 -10
  38. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/merge_subqueries.py +2 -0
  39. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/optimize_joins.py +3 -2
  40. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/pushdown_predicates.py +4 -0
  41. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/qualify_columns.py +94 -158
  42. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/resolver.py +57 -8
  43. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/scope.py +16 -2
  44. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/simplify.py +5 -1
  45. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/unnest_subqueries.py +44 -3
  46. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parser.py +41 -12
  47. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/clickhouse.py +5 -5
  48. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/duckdb.py +81 -2
  49. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/oracle.py +13 -0
  50. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/postgres.py +33 -5
  51. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/sqlite.py +32 -1
  52. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/tokenizer_core.py +2 -0
  53. {sqlglot-30.24.0 → sqlglot-30.25.0/sqlglot.egg-info}/PKG-INFO +3 -3
  54. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.egg-info/requires.txt +2 -2
  55. sqlglot-30.25.0/sqlglot.egg-info/scm_version.json +8 -0
  56. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglotc/pyproject.toml +1 -0
  57. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_athena.py +44 -1
  58. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_bigquery.py +8 -1
  59. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_clickhouse.py +28 -0
  60. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_databricks.py +19 -0
  61. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_dialect.py +4 -4
  62. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_duckdb.py +356 -28
  63. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_exasol.py +2 -2
  64. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_hive.py +15 -0
  65. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_mysql.py +5 -1
  66. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_oracle.py +34 -2
  67. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_postgres.py +56 -1
  68. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_presto.py +1 -0
  69. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_snowflake.py +54 -20
  70. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_sqlite.py +93 -2
  71. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_starrocks.py +14 -0
  72. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_tsql.py +4 -0
  73. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/canonicalize.sql +34 -5
  74. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/canonicalize_internal_names.sql +30 -0
  75. sqlglot-30.25.0/tests/fixtures/optimizer/eliminate_joins.sql +636 -0
  76. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/optimizer.sql +57 -13
  77. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns.sql +70 -2
  78. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +32 -0
  79. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/simplify.sql +6 -0
  80. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +3 -1
  81. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/unnest_subqueries.sql +159 -0
  82. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/helpers.py +6 -1
  83. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_executor.py +11 -0
  84. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_expressions.py +21 -0
  85. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_generator.py +3 -1
  86. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_optimizer.py +494 -42
  87. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_parser.py +12 -0
  88. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_sqlglotc.py +17 -4
  89. sqlglot-30.24.0/sqlglot.egg-info/scm_version.json +0 -8
  90. sqlglot-30.24.0/tests/fixtures/optimizer/eliminate_joins.sql +0 -336
  91. {sqlglot-30.24.0 → sqlglot-30.25.0}/.gitignore +0 -0
  92. {sqlglot-30.24.0 → sqlglot-30.25.0}/.gitmodules +0 -0
  93. {sqlglot-30.24.0 → sqlglot-30.25.0}/.gitpod.yml +0 -0
  94. {sqlglot-30.24.0 → sqlglot-30.25.0}/.pre-commit-config.yaml +0 -0
  95. {sqlglot-30.24.0 → sqlglot-30.25.0}/AGENTS.md +0 -0
  96. {sqlglot-30.24.0 → sqlglot-30.25.0}/CLAUDE.md +0 -0
  97. {sqlglot-30.24.0 → sqlglot-30.25.0}/CONTRIBUTING.md +0 -0
  98. {sqlglot-30.24.0 → sqlglot-30.25.0}/LICENSE +0 -0
  99. {sqlglot-30.24.0 → sqlglot-30.25.0}/MANIFEST.in +0 -0
  100. {sqlglot-30.24.0 → sqlglot-30.25.0}/README.md +0 -0
  101. {sqlglot-30.24.0 → sqlglot-30.25.0}/setup.cfg +0 -0
  102. {sqlglot-30.24.0 → sqlglot-30.25.0}/setup.py +0 -0
  103. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/__init__.py +0 -0
  104. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/__main__.py +0 -0
  105. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/_typing.py +0 -0
  106. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/anonymize.py +0 -0
  107. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/__init__.py +0 -0
  108. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/clickhouse.py +0 -0
  109. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/databricks.py +0 -0
  110. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/dax.py +0 -0
  111. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/doris.py +0 -0
  112. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/dremio.py +0 -0
  113. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/drill.py +0 -0
  114. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/druid.py +0 -0
  115. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/dune.py +0 -0
  116. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/exasol.py +0 -0
  117. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/fabric.py +0 -0
  118. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/hive.py +0 -0
  119. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/materialize.py +0 -0
  120. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/mysql.py +0 -0
  121. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/oracle.py +0 -0
  122. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/postgres.py +0 -0
  123. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/presto.py +0 -0
  124. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/prql.py +0 -0
  125. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/redshift.py +0 -0
  126. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/risingwave.py +0 -0
  127. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/singlestore.py +0 -0
  128. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/solr.py +0 -0
  129. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/spark.py +0 -0
  130. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/spark2.py +0 -0
  131. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/tableau.py +0 -0
  132. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/teradata.py +0 -0
  133. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/trino.py +0 -0
  134. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/dialects/tsql.py +0 -0
  135. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/diff.py +0 -0
  136. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/errors.py +0 -0
  137. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/executor/__init__.py +0 -0
  138. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/executor/context.py +0 -0
  139. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/executor/env.py +0 -0
  140. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/executor/python.py +0 -0
  141. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/executor/table.py +0 -0
  142. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/__init__.py +0 -0
  143. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/aggregate.py +0 -0
  144. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/dml.py +0 -0
  145. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/functions.py +0 -0
  146. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/json.py +0 -0
  147. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/math.py +0 -0
  148. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/properties.py +0 -0
  149. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/string.py +0 -0
  150. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/expressions/temporal.py +0 -0
  151. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/__init__.py +0 -0
  152. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/athena.py +0 -0
  153. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/dax.py +0 -0
  154. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/doris.py +0 -0
  155. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/dremio.py +0 -0
  156. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/drill.py +0 -0
  157. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/druid.py +0 -0
  158. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/dune.py +0 -0
  159. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/fabric.py +0 -0
  160. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/materialize.py +0 -0
  161. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/mysql.py +0 -0
  162. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/prql.py +0 -0
  163. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/redshift.py +0 -0
  164. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/risingwave.py +0 -0
  165. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/singlestore.py +0 -0
  166. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/solr.py +0 -0
  167. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/spark.py +0 -0
  168. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/spark2.py +0 -0
  169. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/starrocks.py +0 -0
  170. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/tableau.py +0 -0
  171. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/teradata.py +0 -0
  172. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/generators/trino.py +0 -0
  173. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/helper.py +0 -0
  174. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/jsonpath.py +0 -0
  175. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/lineage.py +0 -0
  176. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/__init__.py +0 -0
  177. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  178. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  179. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/helpers.py +0 -0
  180. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  181. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/journal.py +0 -0
  182. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/normalize.py +0 -0
  183. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  184. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/optimizer.py +0 -0
  185. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  186. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/qualify.py +0 -0
  187. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/optimizer/qualify_tables.py +0 -0
  188. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/__init__.py +0 -0
  189. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/athena.py +0 -0
  190. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/base.py +0 -0
  191. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/bigquery.py +0 -0
  192. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/databricks.py +0 -0
  193. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/dax.py +0 -0
  194. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/doris.py +0 -0
  195. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/dremio.py +0 -0
  196. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/drill.py +0 -0
  197. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/druid.py +0 -0
  198. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/dune.py +0 -0
  199. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/exasol.py +0 -0
  200. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/fabric.py +0 -0
  201. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/hive.py +0 -0
  202. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/materialize.py +0 -0
  203. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/mysql.py +0 -0
  204. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/presto.py +0 -0
  205. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/prql.py +0 -0
  206. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/redshift.py +0 -0
  207. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/risingwave.py +0 -0
  208. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/singlestore.py +0 -0
  209. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/snowflake.py +0 -0
  210. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/solr.py +0 -0
  211. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/spark.py +0 -0
  212. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/spark2.py +0 -0
  213. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/starrocks.py +0 -0
  214. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/tableau.py +0 -0
  215. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/teradata.py +0 -0
  216. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/trino.py +0 -0
  217. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/parsers/tsql.py +0 -0
  218. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/planner.py +0 -0
  219. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/py.typed +0 -0
  220. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/schema.py +0 -0
  221. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/serde.py +0 -0
  222. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/time.py +0 -0
  223. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/tokens.py +0 -0
  224. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/transforms.py +0 -0
  225. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/trie.py +0 -0
  226. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/__init__.py +0 -0
  227. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/bigquery.py +0 -0
  228. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/clickhouse.py +0 -0
  229. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/databricks.py +0 -0
  230. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/duckdb.py +0 -0
  231. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/hive.py +0 -0
  232. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/mysql.py +0 -0
  233. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/postgres.py +0 -0
  234. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/presto.py +0 -0
  235. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/redshift.py +0 -0
  236. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/snowflake.py +0 -0
  237. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/spark.py +0 -0
  238. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/spark2.py +0 -0
  239. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot/typing/tsql.py +0 -0
  240. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.egg-info/SOURCES.txt +0 -0
  241. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  242. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.egg-info/scm_file_list.json +0 -0
  243. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.egg-info/top_level.txt +0 -0
  244. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglot.png +0 -0
  245. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglotc/MANIFEST.in +0 -0
  246. {sqlglot-30.24.0 → sqlglot-30.25.0}/sqlglotc/setup.py +0 -0
  247. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/__init__.py +0 -0
  248. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/__init__.py +0 -0
  249. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_dax.py +0 -0
  250. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_doris.py +0 -0
  251. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_dremio.py +0 -0
  252. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_drill.py +0 -0
  253. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_druid.py +0 -0
  254. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_dune.py +0 -0
  255. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_fabric.py +0 -0
  256. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_materialize.py +0 -0
  257. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_pipe_syntax.py +0 -0
  258. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_prql.py +0 -0
  259. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_redshift.py +0 -0
  260. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_risingwave.py +0 -0
  261. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_singlestore.py +0 -0
  262. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_solr.py +0 -0
  263. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_spark.py +0 -0
  264. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_tableau.py +0 -0
  265. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_teradata.py +0 -0
  266. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/dialects/test_trino.py +0 -0
  267. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/identity.sql +0 -0
  268. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  269. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/jsonpath/cts.json +0 -0
  270. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/annotate_functions.sql +0 -0
  271. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  272. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  273. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  274. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  275. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
  276. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  277. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  278. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  279. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  280. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  281. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  282. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  283. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  284. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  285. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  286. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  287. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  288. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  289. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  290. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  291. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  292. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  293. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  294. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  295. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  296. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  297. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  298. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  299. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  300. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  301. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  302. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  303. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  304. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  305. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  306. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  307. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  308. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  309. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  310. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  311. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  312. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  313. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  314. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  315. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  316. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  317. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  318. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  319. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/partial.sql +0 -0
  320. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/fixtures/pretty.sql +0 -0
  321. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/gen_fixtures.py +0 -0
  322. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/leakcheck.py +0 -0
  323. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/sqlglot/__init__.py +0 -0
  324. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_anonymize.py +0 -0
  325. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_build.py +0 -0
  326. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_dialect_entry_points.py +0 -0
  327. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_dialect_imports.py +0 -0
  328. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_diff.py +0 -0
  329. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_docs.py +0 -0
  330. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_errors.py +0 -0
  331. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_helper.py +0 -0
  332. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_integration_loader.py +0 -0
  333. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_jsonpath.py +0 -0
  334. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_lineage.py +0 -0
  335. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_schema.py +0 -0
  336. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_serde.py +0 -0
  337. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_time.py +0 -0
  338. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_tokens.py +0 -0
  339. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_transforms.py +0 -0
  340. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_transpile.py +0 -0
  341. {sqlglot-30.24.0 → sqlglot-30.25.0}/tests/test_typing.py +0 -0
@@ -1,6 +1,86 @@
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
+
4
84
  ## [v30.23.0] - 2026-10-14
5
85
  ### :boom: BREAKING CHANGES
6
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))*:
@@ -16304,3 +16384,4 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
16304
16384
  [v30.21.0]: https://github.com/tobymao/sqlglot/compare/v30.20.0...v30.21.0
16305
16385
  [v30.22.0]: https://github.com/tobymao/sqlglot/compare/v30.21.0...v30.22.0
16306
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.24.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.24.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.24.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.24.0'
22
- __version_tuple__ = version_tuple = (30, 24, 0)
21
+ __version__ = version = '30.25.0'
22
+ __version_tuple__ = version_tuple = (30, 25, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g5d588c0f3'
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
@@ -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)
@@ -2704,9 +2717,13 @@ def no_make_interval_sql(self: Generator, expression: exp.MakeInterval, sep: str
2704
2717
  if isinstance(value, exp.Kwarg):
2705
2718
  value = value.expression
2706
2719
 
2707
- 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}")
2708
2725
 
2709
- return f"INTERVAL '{self.format_args(*args, sep=sep)}'"
2726
+ return f"INTERVAL {self.sql(exp.Literal.string(self.format_args(*args, sep=sep)))}"
2710
2727
 
2711
2728
 
2712
2729
  def length_or_char_length_sql(self: Generator, expression: exp.Length) -> str:
@@ -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,
@@ -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("/*+")
@@ -25,10 +25,18 @@ class StarRocks(MySQL):
25
25
 
26
26
  KEYWORDS = {
27
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,
28
32
  "ADMIN": TokenType.COMMAND,
29
33
  "BACKUP": TokenType.COMMAND,
30
34
  "CANCEL": TokenType.COMMAND,
31
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,
32
40
  "EXPORT": TokenType.COMMAND,
33
41
  "HLL": TokenType.HLLSKETCH,
34
42
  "INSTALL": TokenType.COMMAND,
@@ -40,6 +48,7 @@ class StarRocks(MySQL):
40
48
  "RESUME": TokenType.COMMAND,
41
49
  "STOP": TokenType.COMMAND,
42
50
  "SUBMIT": TokenType.COMMAND,
51
+ "TRANSLATE TRINO": TokenType.COMMAND,
43
52
  "UNINSTALL": TokenType.COMMAND,
44
53
  }
45
54
  KEYWORDS.pop("IGNORE")
@@ -254,6 +254,10 @@ class SplitToTable(Expression, Func, UDTF):
254
254
  arg_types = {"this": True, "expression": True}
255
255
 
256
256
 
257
+ class StrtokSplitToTable(Expression, Func, UDTF):
258
+ arg_types = {"this": True, "expression": False}
259
+
260
+
257
261
  class Stack(Expression, Func, UDTF):
258
262
  arg_types = {"this": True, "expressions": True}
259
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
 
@@ -1734,13 +1734,13 @@ class Column(Expression, Condition):
1734
1734
  return self.name
1735
1735
 
1736
1736
  @property
1737
- def parts(self) -> list[Identifier | Star]:
1737
+ def parts(self) -> list[Expr]:
1738
1738
  """Return the parts of a column in order catalog, db, table, name."""
1739
1739
  return [
1740
1740
  self.args[part] for part in ("catalog", "db", "table", "this") if self.args.get(part)
1741
1741
  ]
1742
1742
 
1743
- def to_dot(self, include_dots: bool = True) -> Dot | Identifier | Star:
1743
+ def to_dot(self, include_dots: bool = True) -> Expr:
1744
1744
  """Converts the column into a dot expression."""
1745
1745
  parts = self.parts
1746
1746
  parent = self.parent
@@ -3071,7 +3071,7 @@ def alias_(
3071
3071
 
3072
3072
  @t.overload
3073
3073
  def column(
3074
- col: str | Identifier,
3074
+ col: str | Expr,
3075
3075
  table: str | Identifier | None = None,
3076
3076
  db: str | Identifier | None = None,
3077
3077
  catalog: str | Identifier | None = None,
@@ -3085,7 +3085,7 @@ def column(
3085
3085
 
3086
3086
  @t.overload
3087
3087
  def column(
3088
- col: str | Identifier | Star,
3088
+ col: str | Expr,
3089
3089
  table: str | Identifier | None = None,
3090
3090
  db: str | Identifier | None = None,
3091
3091
  catalog: str | Identifier | None = None,
@@ -3111,19 +3111,18 @@ def column(
3111
3111
  Build a Column.
3112
3112
 
3113
3113
  Args:
3114
- col: Column name.
3114
+ col: Column name or expression.
3115
3115
  table: Table name.
3116
3116
  db: Database name.
3117
3117
  catalog: Catalog name.
3118
3118
  fields: Additional fields using dots.
3119
3119
  quoted: Whether to force quotes on the column's identifiers.
3120
- copy: Whether to copy identifiers if passed in.
3120
+ copy: Whether to copy expressions if passed in.
3121
3121
 
3122
3122
  Returns:
3123
3123
  The new Column instance.
3124
3124
  """
3125
- if not isinstance(col, Star):
3126
- col = to_identifier(col, quoted=quoted, copy=copy)
3125
+ col = maybe_copy(col, copy) if isinstance(col, Expr) else to_identifier(col, quoted=quoted)
3127
3126
 
3128
3127
  this: Column | Dot = Column(
3129
3128
  this=col,
@@ -461,7 +461,9 @@ class IntervalSpan(DataType):
461
461
 
462
462
 
463
463
  class Interval(_TimeUnit):
464
- arg_types = {"this": False, "unit": False}
464
+ # fraction_in_string: a fractional amount was written with its unit in one string, e.g.
465
+ # INTERVAL '1.5 DAY', which differs from INTERVAL '1.5' DAY in e.g. DuckDB and Postgres
466
+ arg_types = {"this": False, "unit": False, "fraction_in_string": False}
465
467
 
466
468
 
467
469
  DATA_TYPE = t.Union[str, Identifier, Dot, DataType, DType]
@@ -131,6 +131,14 @@ class Describe(Expression):
131
131
  }
132
132
 
133
133
 
134
+ class ConnectTo(Expression):
135
+ pass
136
+
137
+
138
+ class Disconnect(Expression):
139
+ arg_types = {}
140
+
141
+
134
142
  class Attach(Expression):
135
143
  arg_types = {"this": True, "exists": False, "expressions": False}
136
144
 
@@ -663,7 +663,7 @@ class GroupingSets(Expression):
663
663
 
664
664
 
665
665
  class Lambda(Expression):
666
- arg_types = {"this": True, "expressions": True, "colon": False}
666
+ arg_types = {"this": True, "expressions": True}
667
667
 
668
668
 
669
669
  class Limit(Expression):
@@ -699,8 +699,9 @@ class Join(Expression):
699
699
  "method": False,
700
700
  "global_": False,
701
701
  "hint": False,
702
- "match_condition": False, # Snowflake
703
- "directed": False, # Snowflake
702
+ "match_condition": False,
703
+ "nearest": False,
704
+ "directed": False,
704
705
  "expressions": False,
705
706
  "pivots": False,
706
707
  }
@@ -817,6 +818,10 @@ class Join(Expression):
817
818
  return join
818
819
 
819
820
 
821
+ class Nearest(Expression):
822
+ arg_types = {"this": True, "count": True, "approximate": False, "similarity": False}
823
+
824
+
820
825
  class Lateral(Expression, UDTF):
821
826
  arg_types = {
822
827
  "this": True,